int main(void) { field_t c; field_t Z19; element_t P, Q, R; mpz_t q, z; element_t a; int i; mpz_init(q); mpz_init(z); mpz_set_ui(q, 19); field_init_fp(Z19, q); element_init(a, Z19); field_init_curve_singular_with_node(c, Z19); element_init(P, c); element_init(Q, c); element_init(R, c); //(3,+/-6) is a generator //we have an isomorphism from E_ns to F_19^* // (3,6) --> 3 //(generally (x,y) --> (y+x)/(y-x) curve_set_si(R, 3, 6); for (i=1; i<=18; i++) { mpz_set_si(z, i); element_mul_mpz(Q, R, z); element_printf("%dR = %B\n", i, Q); } mpz_set_ui(z, 6); element_mul_mpz(P, R, z); //P has order 3 element_printf("P = %B\n", P); for (i=1; i<=3; i++) { mpz_set_si(z, i); element_mul_mpz(Q, R, z); tate_3(a, P, Q, R); element_printf("e_3(P,%dP) = %B\n", i, a); } element_double(P, R); //P has order 9 element_printf("P = %B\n", P); for (i=1; i<=9; i++) { mpz_set_si(z, i); element_mul_mpz(Q, P, z); tate_9(a, P, Q, R); element_printf("e_9(P,%dP) = %B\n", i, a); } return 0; }
void pairing_init_singular_with_node(pairing_t pairing, mpz_t q) { sn_pairing_data_ptr p; mpz_init(pairing->r); mpz_sub_ui(pairing->r, q, 1); field_init_fp(pairing->Zr, pairing->r); pairing->map = sn_pairing; p = pairing->data = pbc_malloc(sizeof(sn_pairing_data_t)); field_init_fp(p->Fq, q); field_init_curve_singular_with_node(p->Eq, p->Fq); //mpz_init(p->tateexp); //mpz_sub_ui(p->tateexp, p->Fq->order, 1); //mpz_divexact(p->tateexp, p->tateexp, pairing->r); pairing->G2 = pairing->G1 = p->Eq; pairing_GT_init(pairing, p->Fq); }