diff options
| author | J08nY | 2017-10-17 00:16:37 +0200 |
|---|---|---|
| committer | J08nY | 2017-10-17 00:16:37 +0200 |
| commit | 5307f9318a01ed29a11202ad0915efae9dec44d0 (patch) | |
| tree | f3a0aad1773e954ee15d3a6fef24a742d65d929e /src | |
| parent | 029ae4d5e19a69e22272755febb8825402594cc7 (diff) | |
| download | ecgen-5307f9318a01ed29a11202ad0915efae9dec44d0.tar.gz ecgen-5307f9318a01ed29a11202ad0915efae9dec44d0.tar.zst ecgen-5307f9318a01ed29a11202ad0915efae9dec44d0.zip | |
Diffstat (limited to 'src')
| -rw-r--r-- | src/exhaustive/arg.h | 1 | ||||
| -rw-r--r-- | src/gen/gens.c | 40 | ||||
| -rw-r--r-- | src/gen/gens.h | 18 | ||||
| -rw-r--r-- | src/gen/order.c | 63 | ||||
| -rw-r--r-- | src/gen/order.h | 24 |
5 files changed, 144 insertions, 2 deletions
diff --git a/src/exhaustive/arg.h b/src/exhaustive/arg.h index 0b10715..62cafd0 100644 --- a/src/exhaustive/arg.h +++ b/src/exhaustive/arg.h @@ -8,6 +8,7 @@ #ifndef ECGEN_ARG_H #define ECGEN_ARG_H +#include "io/output.h" #include "misc/types.h" #define HAS_ARG(args) \ 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); diff --git a/src/gen/gens.h b/src/gen/gens.h index ace1a88..18c9815 100644 --- a/src/gen/gens.h +++ b/src/gen/gens.h @@ -30,6 +30,24 @@ GENERATOR(gens_gen_any); GENERATOR(gens_gen_one); /** + * + * @param curve + * @param args + * @param state + * @return + */ +CHECK(gens_check_anomalous); + +/** + * + * @param curve + * @param args + * @param state + * @return + */ +CHECK(gens_check_embedding); + +/** * UNROLL(unroll_f) * * @param curve diff --git a/src/gen/order.c b/src/gen/order.c index 1ad7a93..92b1489 100644 --- a/src/gen/order.c +++ b/src/gen/order.c @@ -3,9 +3,9 @@ * Copyright (C) 2017 J08nY */ #include "order.h" +#include <misc/types.h> #include "exhaustive/arg.h" #include "io/input.h" -#include "io/output.h" GENERATOR(order_gen_input) { pari_sp ltop = avma; @@ -92,3 +92,64 @@ GENERATOR(order_gen_prime) { return 1; } } + +CHECK(order_check_pohlig_hellman) { + HAS_ARG(args); + pari_sp ltop = avma; + + const char *min_fact = args->args; + GEN minf = strtoi(min_fact); + + GEN factors = factor(curve->order); + GEN primes = gel(factors, 1); + + long len = glength(primes); + if (mpcmp(gel(primes, len), minf) <= 0) { + avma = ltop; + return -4; + } else { + avma = ltop; + return 1; + } +} + +CHECK(order_check_discriminant) { + HAS_ARG(args); + if (cfg->field == FIELD_BINARY) return 1; + pari_sp ltop = avma; + + const char *min_disc = args->args; + GEN mind = strtoi(min_disc); + + GEN t = negi(subii(curve->order, addii(curve->field, gen_1))); + GEN tp = subii(sqri(t), mulis(curve->field, 4)); + GEN tp_factors = factor(tp); + + GEN tp_primes = gel(tp_factors, 1); + GEN tp_pows = gel(tp_factors, 2); + long tp_pow_len = glength(tp_pows); + GEN max_value = gen_1; + for (long i = 1; i <= tp_pow_len; ++i) { + if (!dvdis(gel(tp_pows, i), 2)) { + continue; + } + + GEN value = powii(gel(tp_primes, i), gel(tp_pows, i)); + if (mpcmp(max_value, value) < 0) { + max_value = value; + } + } + GEN s = max_value; + + GEN D = divii(tp, s); + if (mod4(D) != 1) { + D = mulis(D, 4); + } + + if (mpcmp(D, mind) <= 0) { + avma = ltop; + return -4; + } + avma = ltop; + return 1; +}
\ No newline at end of file diff --git a/src/gen/order.h b/src/gen/order.h index da06de5..bd1a204 100644 --- a/src/gen/order.h +++ b/src/gen/order.h @@ -16,7 +16,7 @@ * * @param curve A curve_t being generated * @param args Current optional generator argument - * @return state diff + * @param state * @return state diff */ GENERATOR(order_gen_input); @@ -28,6 +28,7 @@ GENERATOR(order_gen_input); * * @param curve A curve_t being generated * @param args Current optional generator argument + * @param state * @return state diff */ GENERATOR(order_gen_any); @@ -38,6 +39,7 @@ GENERATOR(order_gen_any); * * @param curve A curve_t being generated * @param args unused + * @param state * @return state diff */ GENERATOR(order_gen_sea); @@ -47,6 +49,7 @@ GENERATOR(order_gen_sea); * * @param curve A curve_t being generated * @param args pari_ulong passed to ellsea(curve, smallfact) + * @param state * @return state diff */ GENERATOR(order_gen_smallfact); @@ -59,8 +62,27 @@ GENERATOR(order_gen_smallfact); * * @param curve A curve_t being generated * @param args unused + * @param state * @return state diff */ GENERATOR(order_gen_prime); +/** + * + * @param curve + * @param args + * @param state + * @return + */ +CHECK(order_check_pohlig_hellman); + +/** + * + * @param curve + * @param args + * @param state + * @return + */ +CHECK(order_check_discriminant); + #endif // ECGEN_ORDER_H |
