diff options
| author | J08nY | 2017-09-30 17:43:45 +0200 |
|---|---|---|
| committer | J08nY | 2017-09-30 17:43:45 +0200 |
| commit | 5658389849ad450bbafd54f12f0d2d05ac7bff93 (patch) | |
| tree | 759a0376bf290a2f4f85411746bc4d6cd4d0b152 | |
| parent | 64ccc59f390cb3a3a2f0347c8807fe4091bb5cd8 (diff) | |
| parent | 6187e06d92adfe093d47791b9028ebf45c8afa75 (diff) | |
| download | ecgen-5658389849ad450bbafd54f12f0d2d05ac7bff93.tar.gz ecgen-5658389849ad450bbafd54f12f0d2d05ac7bff93.tar.zst ecgen-5658389849ad450bbafd54f12f0d2d05ac7bff93.zip | |
| -rw-r--r-- | src/gen/order.c | 31 |
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) { |
