aboutsummaryrefslogtreecommitdiff
path: root/src/math/field.c
diff options
context:
space:
mode:
authorJ08nY2017-02-14 03:14:57 +0100
committerJ08nY2017-02-14 03:14:57 +0100
commit0c5ff628d52678bb44b9c595daf1289833d0e532 (patch)
tree913d36f318b30e7984aced1a654d00656d117eb3 /src/math/field.c
parent4230a5eb009c92cf7ffe83658e6bf926bccb1400 (diff)
downloadecgen-0c5ff628d52678bb44b9c595daf1289833d0e532.tar.gz
ecgen-0c5ff628d52678bb44b9c595daf1289833d0e532.tar.zst
ecgen-0c5ff628d52678bb44b9c595daf1289833d0e532.zip
Diffstat (limited to 'src/math/field.c')
-rw-r--r--src/math/field.c60
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);