aboutsummaryrefslogtreecommitdiff
path: root/src/gen/gens.c
diff options
context:
space:
mode:
authorJ08nY2017-10-17 00:16:37 +0200
committerJ08nY2017-10-17 00:16:37 +0200
commit5307f9318a01ed29a11202ad0915efae9dec44d0 (patch)
treef3a0aad1773e954ee15d3a6fef24a742d65d929e /src/gen/gens.c
parent029ae4d5e19a69e22272755febb8825402594cc7 (diff)
downloadecgen-5307f9318a01ed29a11202ad0915efae9dec44d0.tar.gz
ecgen-5307f9318a01ed29a11202ad0915efae9dec44d0.tar.zst
ecgen-5307f9318a01ed29a11202ad0915efae9dec44d0.zip
Diffstat (limited to 'src/gen/gens.c')
-rw-r--r--src/gen/gens.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/gen/gens.c b/src/gen/gens.c
index f5f9fcb..d40de67 100644
--- a/src/gen/gens.c
+++ b/src/gen/gens.c
@@ -3,6 +3,8 @@
* Copyright (C) 2017 J08nY
*/
#include "gens.h"
+#include <misc/types.h>
+#include "exhaustive/arg.h"
#include "point.h"
static int gens_put(curve_t *curve, GEN generators, long len) {
@@ -37,6 +39,44 @@ GENERATOR(gens_gen_one) {
return gens_put(curve, generators, len);
}
+CHECK(gens_check_anomalous) {
+ if (cfg->field == FIELD_BINARY) return 1;
+ pari_sp ltop = avma;
+ for (size_t i = 0; i < curve->ngens; ++i) {
+ if (mpcmp(curve->field, curve->generators[i]->order) == 0) {
+ avma = ltop;
+ return -5;
+ }
+ }
+ return 1;
+}
+
+CHECK(gens_check_embedding) {
+ HAS_ARG(args);
+ if (cfg->field == FIELD_BINARY) return 1;
+ pari_sp ltop = avma;
+
+ const char *min_degree = args->args;
+ GEN mind = strtoi(min_degree);
+
+ for (size_t i = 0; i < curve->ngens; ++i) {
+ GEN power = gen_0;
+ GEN pm;
+ do {
+ power = addii(power, gen_1);
+ GEN ppow = powii(curve->field, power);
+ pm = subii(ppow, gen_1);
+ } while (!dvdii(pm, curve->generators[i]->order));
+
+ if (mpcmp(power, mind) <= 0) {
+ avma = ltop;
+ return -5;
+ }
+ }
+ avma = ltop;
+ return 1;
+}
+
UNROLL(gens_unroll) {
if (curve->generators) {
points_free_deep(&curve->generators, curve->ngens);