bn128_ate_G2_precomp bn128_ate_precompute_G2(const bn128_G2& Q) { enter_block("Call to bn128_ate_precompute_G2"); bn128_ate_G2_precomp result; bn::ecop::NormalizeJac(result.Q, Q.coord); Fp2 T[3]; T[0] = result.Q[0]; T[1] = result.Q[1]; T[2] = Fp2(1); Fp6 d; doubling_step_for_flipped_miller_loop(T, d); result.coeffs.emplace_back(d); Fp6 e; assert(Param::siTbl[1] == 1); mixed_addition_step_for_flipped_miller_loop(result.Q, T, e); result.coeffs.emplace_back(e); bn::Fp6 l; // 844kclk for (size_t i = 2; i < Param::siTblNum; i++) { doubling_step_for_flipped_miller_loop(T, l); result.coeffs.emplace_back(l); if (Param::siTbl[i]) { mixed_addition_step_for_flipped_miller_loop(result.Q, T, l); result.coeffs.emplace_back(l); } } // addition step Fp2 Q1[2]; bn::ecop::FrobEndOnTwist_1(Q1, result.Q); Fp2 Q2[2]; bn::ecop::FrobEndOnTwist_2(Q2, result.Q); Fp2::neg(Q2[1], Q2[1]); // @memo z < 0 if (0) { bn::Fp2::neg(T[1], T[1]); } mixed_addition_step_for_flipped_miller_loop(Q1, T, d); result.coeffs.emplace_back(d); mixed_addition_step_for_flipped_miller_loop(Q2, T, e); result.coeffs.emplace_back(e); leave_block("Call to bn128_ate_precompute_G2"); return result; }
void bench_graphe_grille(Pt2di sz,TGr41 & gr) { TPtSubGr41 GrAll; TPart41 Part; all_face_trigo ( gr, (TSubGr41 &) GrAll, Part ); ElFifo <Pt2dr> Fp2(2,true); BENCH_ASSERT(Part.nb() == ((sz.x-1)*(sz.y-1) +1)); INT nb4 =0; INT perim_th = (sz.x-1 + sz.y-1) * 2; for (INT f=0; f< Part.nb() ; f++) { INT nbf = Part[f].nb(); BENCH_ASSERT((nbf == 4) || (nbf==perim_th)); copy_on(Fp2,Part[f],PtArc41); REAL surf = surf_or_poly(Fp2); Pt2dr cdg = barrycentre(Fp2); if (nbf == 4) { nb4 ++; BENCH_ASSERT (std::abs(std::abs(surf)-1.0) < epsilon); REAL x = cdg.x - round_down(cdg.x); REAL y = cdg.y - round_down(cdg.y); BENCH_ASSERT ( (std::abs(x-0.5) < epsilon) && (std::abs(y-0.5) < epsilon) ); } else { BENCH_ASSERT (std::abs(surf-(sz.x-1)*(sz.y-1))< epsilon); BENCH_ASSERT(euclid(cdg,(Pt2dr(sz)-Pt2dr(1,1))/2.0) < epsilon); } } BENCH_ASSERT(Part.nb() == nb4+1); TSubGr41_xy2 Gr_xy2; all_face_trigo ( gr, (TSubGr41 &) Gr_xy2, Part ); BENCH_ASSERT(Part.nb() == (((sz.x-1)/2)*((sz.y-1)/2) +1)); TSubGr41_xeg Gr_xeq; all_face_trigo ( gr, (TSubGr41 &) Gr_xeq, Part ); BENCH_ASSERT(Part.nb() == sz.x); TSubGr41_xeg_y0 Gr_xeq_y0; all_face_trigo ( gr, (TSubGr41 &) Gr_xeq_y0, Part ); BENCH_ASSERT(Part.nb() == 1); }
int main() { SystemInit(); const Ec1 g1(-1, 1); const Ec2 g2( Fp2(Fp(g2c.aa), Fp(g2c.ab)), Fp2(Fp(g2c.ba), Fp(g2c.bb)) ); // assertBool g2 and g1 on curve assertBool("g1 is on EC", g1.isValid()); assertBool("g2 is on twist EC", g2.isValid()); puts("order of group"); const Mpz& r = GetParamR(); PUT(r); { Ec1 t = g1; t.mul(r); assertBool("orgder of g1 == r", t.isZero()); } { Ec2 t = g2; t.mul(r); assertBool("order of g2 == r", t.isZero()); } const Mpz a("123456789012345"); const Mpz b("998752342342342342424242421"); // scalar-multiplication sample { Mpz c = a; c.add(b); Ec1 Pa = g1; Pa.mul(a); Ec1 Pb = g1; Pb.mul(b); Ec1 Pc = g1; Pc.mul(c); Ec1 out = Pa; out.add(Pb); assertEqual("check g1 * c = g1 * a + g1 * b", Pc, out); } Fp12 e; // calc e : G2 x G1 -> G3 pairing e.pairing(g2, g1); // e = e(g2, g1) PUT(e); { Fp12 t = e; t.power(r); assertEqual("order of e == r", t, Fp12(1)); } Ec2 g2a = g2; g2a.mul(a); Fp12 ea1; ea1.pairing(g2a, g1); Fp12 ea2 = e; ea2.power(a); // ea2 = e^a assertEqual("e(g2 * a, g1) = e(g2, g1)^a", ea1, ea2); Ec1 g1b = g1; g1b.mul(b); Fp12 eb1; eb1.pairing(g2, g1b); // eb1 = e(g2, g1b) Fp12 eb2 = e; eb2.power(b); // eb2 = e^b assertEqual("e(g2a, g1 * b) = e(g2, g1)^b", eb1, eb2); Ec1 q1 = g1; q1.mul(12345); assertBool("q1 is on EC", q1.isValid()); Fp12 e1, e2; e1.pairing(g2, g1); // e1 = e(g2, g1) e2.pairing(g2, q1); // e2 = e(g2, q1) Ec1 q2 = g1; q2.add(q1); e.pairing(g2, q2); // e = e(g2, q2) e1.mul(e2); assertEqual("e = e1 * e2", e, e1); /* reduce one copy as the following */ g2a = g2; g2a.mul(a); g1b = g1; g1b.mul(b); Ec2 g2at = g2; g2at.mul(a); Ec1 g1bt = g1; g1bt.mul(b); assertEqual("g2a == g2 * a", g2a, g2at); assertEqual("g1b == g1 * b", g1b, g1bt); printf("errNum = %d\n", errNum); }