aboutsummaryrefslogtreecommitdiff
path: root/src/gen/gens.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gen/gens.c')
-rw-r--r--src/gen/gens.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/gen/gens.c b/src/gen/gens.c
index 2cffbc4..e2c624e 100644
--- a/src/gen/gens.c
+++ b/src/gen/gens.c
@@ -40,16 +40,25 @@ GENERATOR(gens_gen_one) {
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;
}
+GEN gens_get_embedding(GEN prime, GEN order) {
+ pari_sp ltop = avma;
+ GEN power = gen_1;
+ GEN pm;
+ do {
+ power = mulii(power, prime);
+ pm = subii(power, gen_1);
+ } while (!dvdii(pm, order));
+ return gerepilecopy(ltop, power);
+}
+
CHECK(gens_check_embedding) {
HAS_ARG(args);
if (cfg->field == FIELD_BINARY) return 1;
@@ -59,13 +68,8 @@ CHECK(gens_check_embedding) {
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));
+ GEN power =
+ gens_get_embedding(curve->field, curve->generators[i]->order);
if (mpcmp(power, mind) <= 0) {
avma = ltop;