static void fp_invert(element_ptr e, element_ptr a) { mpz_t z; mpz_init(z); fp_to_mpz(z, a); mpz_invert(z, z, e->field->order); from_mpz(e, z); mpz_clear(z); }
static void fp_pow_mpz(element_ptr c, element_ptr a, mpz_ptr op) { mpz_t z; mpz_init(z); fp_to_mpz(z, a); mpz_powm(z, z, op, c->field->order); from_mpz(c, z); mpz_clear(z); }
static size_t fp_out_str(FILE *stream, int base, element_ptr e) { size_t result; mpz_t z; mpz_init(z); fp_to_mpz(z, e); result = mpz_out_str(stream, base, z); mpz_clear(z); return result; }
static void fp_invert(element_ptr c, element_ptr a) { pbc_mpui *r = c->data; mpz_t z; mpz_init(z); fp_to_mpz(z, a); mpz_invert(z, z, a->field->order); *r = mpz_get_ui(z); mpz_clear(z); }
static void fp_pow_mpz(element_ptr c, element_ptr a, mpz_ptr op) { pbc_mpui *r = c->data; mpz_t z; mpz_init(z); fp_to_mpz(z, a); mpz_powm(z, z, op, a->field->order); *r = mpz_get_ui(z); mpz_clear(z); }
static int fp_snprint(char *s, size_t n, element_ptr e) { int result; mpz_t z; mpz_init(z); fp_to_mpz(z, e); result = gmp_snprintf(s, n, "%Zd", z); mpz_clear(z); return result; }
static int fp_to_bytes(unsigned char *data, element_t a) { mpz_t z; int n = a->field->fixed_length_in_bytes; mpz_init(z); fp_to_mpz(z, a); pbc_mpz_out_raw_n(data, n, z); mpz_clear(z); return n; }
static int fp_is_sqr(element_ptr a) { int res; mpz_t z; mpz_init(z); //0 is a square if (fp_is0(a)) return 1; fp_to_mpz(z, a); res = mpz_legendre(z, a->field->order) == 1; mpz_clear(z); return res; }
static int fp_is_sqr(element_ptr a) { eptr ad = (eptr)a->data; int res; mpz_t z; mpz_init(z); // 0 is a square. if (!ad->flag) return 1; fp_to_mpz(z, a); res = mpz_legendre(z, a->field->order) == 1; mpz_clear(z); return res; }
static int fp_sgn_odd(element_ptr a) { eptr ad = (eptr)a->data; if (!ad->flag) return 0; else { mpz_t z; mpz_init(z); int res; fp_to_mpz(z, a); res = mpz_odd_p(z) ? 1 : -1; mpz_clear(z); return res; } }
static void fp_pow_mpz(element_ptr c, element_ptr a, mpz_ptr op) { // Alternative: rewrite GMP mpz_powm(). fptr p = (fptr)a->field->data; eptr ad = (eptr)a->data; eptr cd = (eptr)c->data; if (!ad->flag) cd->flag = 0; else { mpz_t z; mpz_init(z); fp_to_mpz(z, a); mpz_powm(z, z, op, a->field->order); mpz_mul_2exp(z, z, p->bytes * 8); mpz_mod(z, z, a->field->order); set_limbs(cd->d, z, p->limbs); mpz_clear(z); cd->flag = 2; } }