From 77e4c0a9d16d282cd45b0b473efb317a20e4e9df Mon Sep 17 00:00:00 2001 From: MITSUNARI Shigeo Date: Sat, 18 Jan 2020 11:34:39 +0900 Subject: [PATCH] compact h2_chain --- include/mcl/mapto_wb19.hpp | 236 +++++++------------------------------ 1 file changed, 45 insertions(+), 191 deletions(-) diff --git a/include/mcl/mapto_wb19.hpp b/include/mcl/mapto_wb19.hpp index 53598df..08178b5 100644 --- a/include/mcl/mapto_wb19.hpp +++ b/include/mcl/mapto_wb19.hpp @@ -393,198 +393,52 @@ struct MapToG2_WB19 { } assert(0); } - void h2_chain(G2& t1, const G2& P) const + void h2_chain(G2& out, const G2& P) const { - G2 t0, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15; - t0 = P; - dbl(t1, t0); - add(t4, t1, t0); - add(t2, t4, t1); - add(t3, t2, t1); - add(t11, t3, t1); - add(t9, t11, t1); - add(t10, t9, t1); - add(t5, t10, t1); - add(t7, t5, t1); - add(t15, t7, t1); - add(t13, t15, t1); - add(t6, t13, t1); - add(t14, t6, t1); - add(t12, t14, t1); - add(t8, t12, t1); - dbl(t1, t6); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t13); - for (size_t i = 0; i < 2; i++) dbl(t1, t1); - add(t1, t1, t0); - for (size_t i = 0; i < 9; i++) dbl(t1, t1); - add(t1, t1, t8); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t11); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t13); - for (size_t i = 0; i < 8; i++) dbl(t1, t1); - add(t1, t1, t2); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t5); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t0); - for (size_t i = 0; i < 8; i++) dbl(t1, t1); - add(t1, t1, t11); - for (size_t i = 0; i < 8; i++) dbl(t1, t1); - add(t1, t1, t8); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t2); - for (size_t i = 0; i < 9; i++) dbl(t1, t1); - add(t1, t1, t5); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t11); - for (size_t i = 0; i < 2; i++) dbl(t1, t1); - add(t1, t1, t0); - for (size_t i = 0; i < 9; i++) dbl(t1, t1); - add(t1, t1, t8); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t13); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t0); - for (size_t i = 0; i < 11; i++) dbl(t1, t1); - add(t1, t1, t9); - for (size_t i = 0; i < 7; i++) dbl(t1, t1); - add(t1, t1, t12); - for (size_t i = 0; i < 7; i++) dbl(t1, t1); - add(t1, t1, t7); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t12); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t14); - for (size_t i = 0; i < 8; i++) dbl(t1, t1); - add(t1, t1, t13); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t0); - for (size_t i = 0; i < 8; i++) dbl(t1, t1); - add(t1, t1, t9); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t13); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t10); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t2); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t10); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t2); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t0); - for (size_t i = 0; i < 10; i++) dbl(t1, t1); - add(t1, t1, t9); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t14); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t9); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t15); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t8); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t12); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t5); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t15); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t2); - for (size_t i = 0; i < 7; i++) dbl(t1, t1); - add(t1, t1, t5); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t9); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t15); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t14); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t8); - for (size_t i = 0; i < 10; i++) dbl(t1, t1); - add(t1, t1, t6); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t5); - for (size_t i = 0; i < 3; i++) dbl(t1, t1); - add(t1, t1, t0); - for (size_t i = 0; i < 9; i++) dbl(t1, t1); - add(t1, t1, t13); - for (size_t i = 0; i < 7; i++) dbl(t1, t1); - add(t1, t1, t12); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t5); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t2); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t11); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t10); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t4); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t10); - for (size_t i = 0; i < 7; i++) dbl(t1, t1); - add(t1, t1, t7); - for (size_t i = 0; i < 3; i++) dbl(t1, t1); - add(t1, t1, t2); - for (size_t i = 0; i < 4; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 8; i++) dbl(t1, t1); - add(t1, t1, t9); - for (size_t i = 0; i < 8; i++) dbl(t1, t1); - add(t1, t1, t9); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t8); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t7); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t6); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t5); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t4); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t5); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t4); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t4); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t5); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 7; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t4); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 3; i++) dbl(t1, t1); - add(t1, t1, t0); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 6; i++) dbl(t1, t1); - add(t1, t1, t3); - for (size_t i = 0; i < 5; i++) dbl(t1, t1); - add(t1, t1, t2); + G2 t[16]; + t[0] = P; + dbl(t[1], t[0]); + add(t[4], t[1], t[0]); + add(t[2], t[4], t[1]); + add(t[3], t[2], t[1]); + add(t[11], t[3], t[1]); + add(t[9], t[11], t[1]); + add(t[10], t[9], t[1]); + add(t[5], t[10], t[1]); + add(t[7], t[5], t[1]); + add(t[15], t[7], t[1]); + add(t[13], t[15], t[1]); + add(t[6], t[13], t[1]); + add(t[14], t[6], t[1]); + add(t[12], t[14], t[1]); + add(t[8], t[12], t[1]); + dbl(t[1], t[6]); + + const struct { + uint32_t n; + uint32_t idx; + } tbl[] = { + { 5, 13 }, { 2, 0 }, { 9, 8 }, { 5, 11 }, { 6, 13 }, { 8, 2 }, { 5, 3 }, + { 5, 3 }, { 4, 5 }, { 4, 0 }, { 8, 11 }, { 8, 8 }, { 4, 2 }, { 9, 5 }, + { 6, 11 }, { 2, 0 }, { 9, 8 }, { 5, 13 }, { 4, 0 }, { 11, 9 }, { 7, 12 }, + { 7, 7 }, { 5, 12 }, { 5, 14 }, { 8, 13 }, { 6, 3 }, { 5, 0 }, { 8, 9 }, + { 6, 13 }, { 4, 10 }, { 4, 2 }, { 6, 10 }, { 6, 2 }, { 4, 0 }, { 10, 9 }, + { 6, 14 }, { 4, 3 }, { 6, 9 }, { 6, 15 }, { 5, 8 }, { 5, 12 }, { 4, 5 }, + { 6, 15 }, { 6, 2 }, { 7, 5 }, { 6, 3 }, { 6, 9 }, { 6, 15 }, { 6, 14 }, + { 5, 8 }, { 10, 6 }, { 5, 5 }, { 3, 0 }, { 9, 13 }, { 7, 12 }, { 4, 5 }, + { 6, 2 }, { 6, 11 }, { 4, 10 }, { 4, 4 }, { 6, 10 }, { 7, 7 }, { 3, 2 }, + { 4, 3 }, { 8, 9 }, { 8, 9 }, { 6, 8 }, { 5, 7 }, { 5, 6 }, { 6, 5 }, + { 6, 4 }, { 5, 5 }, { 6, 4 }, { 6, 3 }, { 6, 4 }, { 6, 5 }, { 6, 3 }, + { 7, 3 }, { 6, 3 }, { 5, 4 }, { 6, 3 }, { 6, 3 }, { 3, 0 }, { 6, 3 }, + { 6, 3 }, + }; + for (size_t j = 0; j < CYBOZU_NUM_OF_ARRAY(tbl); j++) { + const uint32_t n = tbl[j].n; + for (size_t i = 0; i < n; i++) dbl(t[1], t[1]); + add(t[1], t[1], t[tbl[j].idx]); + } + for (size_t i = 0; i < 5; i++) dbl(t[1], t[1]); + add(out, t[1], t[2]); } void mx_chain(G2& Q, const G2& P) const {