diff options
Diffstat (limited to 'src/math/field.c')
| -rw-r--r-- | src/math/field.c | 60 |
1 files changed, 54 insertions, 6 deletions
diff --git a/src/math/field.c b/src/math/field.c index a4b038e..4d62c73 100644 --- a/src/math/field.c +++ b/src/math/field.c @@ -3,6 +3,7 @@ * Copyright (C) 2017 J08nY */ #include "field.h" +#include "io/input.h" #include "poly.h" #include "random.h" @@ -27,21 +28,68 @@ int field_random(curve_t *curve, config_t *config, ...) { curve->field = field_binaryr(config->bits); return 1; default: - return 0; /* NOT REACHABLE */ + return INT_MIN; /* NOT REACHABLE */ } } int field_input(curve_t *curve, config_t *config, ...) { - return INT_MIN; // NOT IMPLEMENTED + pari_sp ltop = avma; + switch (config->field) { + case FIELD_PRIME: { + GEN p = fread_prime(in, "p:", config->bits); + if (equalii(p, gen_m1)) { + avma = ltop; + return 0; + } + curve->field = p; + return 1; + } + case FIELD_BINARY: { + GEN e1 = fread_short(in, "e1:"); + if (equalii(e1, gen_m1)) { + avma = ltop; + return 0; + } + GEN e2 = fread_short(in, "e2:"); + if (equalii(e2, gen_m1)) { + avma = ltop; + return 0; + } + GEN e3 = fread_short(in, "e3:"); + if (equalii(e3, gen_m1)) { + avma = ltop; + return 0; + } + + if (isintzero(e1) && isintzero(e2) && isintzero(e3)) { + fprintf(stderr, "At least one exponent must be nonzero.\n"); + avma = ltop; + return 0; + } + + GEN v = gtovec0(gen_0, config->bits + 1); + gel(v, config->bits + 1) = gen_1; + if (gsigne(e1) == 1) gel(v, itos(e1) + 1) = gen_1; + if (gsigne(e2) == 1) gel(v, itos(e2) + 1) = gen_1; + if (gsigne(e3) == 1) gel(v, itos(e3) + 1) = gen_1; + gel(v, 1) = gen_1; + + GEN poly = gmul(gtopolyrev(v, -1), gmodulss(1, 2)); + + GEN field = gerepilecopy(ltop, ffgen(poly, -1)); + curve->field = field; + return 1; + } + default: + return INT_MIN; /* NOT REACHABLE */ + } } GEN field_params(GEN field) { pari_sp ltop = avma; if (typ(field) == t_INT) { - GEN p3 = cgetg(2, t_VEC); - gel(p3, 1) = gcopy(field); - return gerepilecopy(ltop, p3); + return gtovec(field); } GEN out = gtovec0(gen_0, 3); @@ -50,7 +98,7 @@ GEN field_params(GEN field) { long l2 = glength(member_mod(field)) - 2; { pari_sp btop = avma; - for (long i = 0; i <= l2; ++i) { + for (long i = l2; i > 0; --i) { GEN c = polcoeff0(member_mod(field), i, -1); if (cmpis(c, 0) != 0) { gel(out, j) = stoi(i); |
