int pbc_param_init_d(pbc_param_ptr par, struct symtab_s *tab) { d_param_init(par); d_param_ptr p = par->data; char s[80]; int i, d; int err = 0; err += lookup_mpz(p->q, tab, "q"); err += lookup_mpz(p->n, tab, "n"); err += lookup_mpz(p->h, tab, "h"); err += lookup_mpz(p->r, tab, "r"); err += lookup_mpz(p->a, tab, "a"); err += lookup_mpz(p->b, tab, "b"); err += lookup_int(&p->k, tab, "k"); err += lookup_mpz(p->nk, tab, "nk"); err += lookup_mpz(p->hk, tab, "hk"); err += lookup_mpz(p->nqr, tab, "nqr"); d = p->k / 2; p->coeff = pbc_realloc(p->coeff, sizeof(mpz_t) * d); for (i=0; i<d; i++) { sprintf(s, "coeff%d", i); mpz_init(p->coeff[i]); err += lookup_mpz(p->coeff[i], tab, s); } return err; }
void darray_append(darray_ptr a, void *p) { if (a->count == a->max) { if (!a->max) a->max = max_init; else a->max *= 2; a->item = pbc_realloc(a->item, sizeof(void *) * a->max); } a->item[a->count] = p; a->count++; }
// Reads next token from `input`. // Returns 1 on reaching `end` (if not NULL) or '\0' is read, 0 otherwise. static const char *token_get(token_t tok, const char *input, const char *end) { char *buf; int n = 32; int i; char c; #define get() (((!end || input < end) && *input) ? (c = *input++, 0) : 1) // Skip whitespace and comments. for(;;) { do { if (get()) { tok->type = token_eof; return input; } } while (strchr(" \t\r\n", c)); if (c == '#') { do { if (get()) { tok->type = token_eof; return input; } } while (c != '\n'); } else break; } tok->type = token_word; pbc_free(tok->s); buf = (char *) pbc_malloc(n); i = 0; for (;;) { buf[i] = c; i++; if (i == n) { n += 32; buf = (char *) pbc_realloc(buf, n); } if (get() || strchr(" \t\r\n</>", c)) break; } buf[i] = 0; tok->s = buf; return input; #undef get }
void pbc_param_init_d_gen(pbc_param_ptr p, pbc_cm_ptr cm) { d_param_init(p); d_param_ptr param = p->data; field_t Fq, Fqx, Fqd; element_t irred, nqr; int d = cm->k / 2; int i; compute_cm_curve(param, cm); field_init_fp(Fq, param->q); field_init_poly(Fqx, Fq); element_init(irred, Fqx); do { poly_random_monic(irred, d); } while (!poly_is_irred(irred)); field_init_polymod(Fqd, irred); // Find a quadratic nonresidue of Fqd lying in Fq. element_init(nqr, Fqd); do { element_random(((element_t *) nqr->data)[0]); } while (element_is_sqr(nqr)); param->coeff = pbc_realloc(param->coeff, sizeof(mpz_t) * d); for (i=0; i<d; i++) { mpz_init(param->coeff[i]); element_to_mpz(param->coeff[i], element_item(irred, i)); } element_to_mpz(param->nqr, ((element_t *) nqr->data)[0]); element_clear(nqr); element_clear(irred); field_clear(Fqx); field_clear(Fqd); field_clear(Fq); }
static void darray_realloc(darray_ptr a, int size) { a->max = size; a->item = pbc_realloc(a->item, sizeof(void *) * a->max); }