aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2017-09-30 17:43:45 +0200
committerJ08nY2017-09-30 17:43:45 +0200
commit5658389849ad450bbafd54f12f0d2d05ac7bff93 (patch)
tree759a0376bf290a2f4f85411746bc4d6cd4d0b152
parent64ccc59f390cb3a3a2f0347c8807fe4091bb5cd8 (diff)
parent6187e06d92adfe093d47791b9028ebf45c8afa75 (diff)
downloadecgen-5658389849ad450bbafd54f12f0d2d05ac7bff93.tar.gz
ecgen-5658389849ad450bbafd54f12f0d2d05ac7bff93.tar.zst
ecgen-5658389849ad450bbafd54f12f0d2d05ac7bff93.zip
-rw-r--r--src/gen/order.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/gen/order.c b/src/gen/order.c
index 2e20294..1ad7a93 100644
--- a/src/gen/order.c
+++ b/src/gen/order.c
@@ -48,21 +48,36 @@ GENERATOR(order_gen_smallfact) {
pari_ulong smallfact = *(pari_ulong *)args->args;
pari_sp ltop = avma;
GEN fact = mpfact(smallfact);
+ pari_ulong lfact = 0;
if (lgefint(fact) > 3) {
- smallfact = 0;
+ lfact = 0;
} else {
- smallfact = itou(fact);
+ lfact = itou(fact);
}
- GEN order = ellsea(curve->curve, smallfact);
- if (gequal0(order) || gequal1(gcdii(order, fact))) {
+ GEN order = ellsea(curve->curve, lfact);
+ if (gequal0(order)) {
avma = ltop;
return -4;
- } else {
- curve->order = order;
- obj_insert_shallow(curve->curve, 1, curve->order);
- return 1;
}
+
+ GEN factors = factor(order);
+ GEN primes = gel(factors, 1);
+ GEN powers = gel(factors, 2);
+ long len = glength(primes);
+ GEN total = gen_1;
+ for (long i = 1; i < len; ++i) {
+ GEN pow = powii(gel(primes, i), gel(powers, i));
+ total = mulii(total, pow);
+ if (abscmpiu(total, smallfact) > 0) {
+ avma = ltop;
+ return -4;
+ }
+ }
+
+ curve->order = gerepileupto(ltop, order);
+ obj_insert_shallow(curve->curve, 1, curve->order);
+ return 1;
}
GENERATOR(order_gen_prime) {