static void fq_set_multiz(element_ptr e, multiz m) { eptr p = e->data; if (multiz_is_z(m)) { element_set_multiz(p->x, m); element_set0(p->y); return; } element_set_multiz(p->x, multiz_at(m, 0)); if (2 > multiz_count(m)) element_set0(p->y); else element_set_multiz(p->y, multiz_at(m, 1)); }
static val_ptr v_field_cast(val_ptr v, tree_ptr t) { // TODO: Check args, x is an element. val_ptr x = tree_eval((tree_ptr)darray_at(t->child, 0)); element_ptr e = x->elem; if (e->field == M) { if (v->field == M) return x; element_ptr e2 = element_new(v->field); if (element_is0(e)) // if 'set0' is not 'set1' in base field of GT, but we hope 'GT(0)' calls 'set1', we may directly call 'element_set0' here element_set0(e2); else if (element_is1(e)) // reason is same as above element_set1(e2); else element_set_multiz(e2, (multiz)e->data); x->elem = e2; return x; } if (v->field == M) { // Map to/from integer. TODO: Map to/from multiz instead. mpz_t z; mpz_init(z); element_to_mpz(z, e); element_clear(e); element_init(e, v->field); element_set_mpz(e, z); mpz_clear(z); } return x; }
static void curve_set_multiz(element_ptr a, multiz m) { if (multiz_is_z(m)) { if (multiz_is0(m)) { element_set0(a); return; } pbc_warn("bad multiz"); return; } else { if (multiz_count(m) < 2) { pbc_warn("multiz has too few coefficients"); return; } point_ptr p = (point_ptr)a->data; p->inf_flag = 0; element_set_multiz(p->x, multiz_at(m, 0)); element_set_multiz(p->y, multiz_at(m, 1)); } }
static val_ptr run_extend(val_ptr v[]) { // TODO: Check v[1] is multiz poly. field_ptr fx = (field_ptr)pbc_malloc(sizeof(*fx)); field_init_poly(fx, v[0]->field); element_ptr poly = element_new(fx); element_set_multiz(poly, (multiz)(v[1]->elem->data)); field_ptr f = (field_ptr)pbc_malloc(sizeof(*f)); field_init_polymod(f, poly); element_free(poly); return val_new_field(f); }
static val_ptr v_field_cast(val_ptr v, tree_ptr t) { // TODO: Check args, x is an element. val_ptr x = tree_eval(darray_at(t->child, 0)); element_ptr e = x->elem; if (e->field == M) { if (v->field == M) return x; element_ptr e2 = element_new(v->field); element_set_multiz(e2, e->data); x->elem = e2; return x; } if (v->field == M) { // Map to/from integer. TODO: Map to/from multiz instead. mpz_t z; mpz_init(z); element_to_mpz(z, e); element_clear(e); element_init(e, v->field); element_set_mpz(e, z); mpz_clear(z); } return x; }
static void mulg_set_multiz(element_ptr e, multiz m) { return element_set_multiz(e->data, m); }