static void fp_neg(element_ptr n, element_ptr a) { if (fp_is0(a)) { fp_set0(n); } else { fp_field_data_ptr p = a->field->data; mpn_sub_n(n->data, p->primelimbs, a->data, p->limbs); } }
static int fp_sgn_even(element_ptr a) { fp_field_data_ptr p = a->field->data; if (fp_is0(a)) return 0; mp_limb_t *sum = _alloca(p->limbs * sizeof(mp_limb_t)); int carry = mpn_add_n(sum, a->data, a->data, p->limbs); if (carry) return 1; return mpn_cmp(sum, p->primelimbs, p->limbs); }
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_sgn_odd(element_ptr a) { if (fp_is0(a)) return 0; mp_limb_t *lp = a->data; return lp[0] & 1 ? 1 : -1; }