diff options
| author | J08nY | 2017-10-01 02:56:56 +0200 |
|---|---|---|
| committer | J08nY | 2017-10-01 02:56:56 +0200 |
| commit | 7f2aee83a9d5771b4c8bfd5d32d1eaa1e96398fa (patch) | |
| tree | df19debd7b25f570a0ab4cc72fea2ec89121d229 | |
| parent | 6fea41693fa19734747103b5cf4d681613090bc1 (diff) | |
| download | ecgen-7f2aee83a9d5771b4c8bfd5d32d1eaa1e96398fa.tar.gz ecgen-7f2aee83a9d5771b4c8bfd5d32d1eaa1e96398fa.tar.zst ecgen-7f2aee83a9d5771b4c8bfd5d32d1eaa1e96398fa.zip | |
| -rw-r--r-- | src/gen/gp.c | 56 | ||||
| -rw-r--r-- | src/gen/gp.h | 10 |
2 files changed, 66 insertions, 0 deletions
diff --git a/src/gen/gp.c b/src/gen/gp.c index dff7ca1..7824a42 100644 --- a/src/gen/gp.c +++ b/src/gen/gp.c @@ -117,4 +117,60 @@ GENERATOR(gp_gen) { break; } return 1; +} + +CHECK(gp_check) { + HAS_ARG(args); + pari_sp ltop = avma; + GEN closure = compile_str(args->args); + GEN params = zerovec(state - OFFSET_SEED + 1); + + if (state >= OFFSET_SEED) { + if (curve->seed && curve->seed->seed) { + gel(params, 1) = bits_to_bitvec(curve->seed->seed); + } + } + + if (state >= OFFSET_FIELD) { + gel(params, 2) = curve->field; + } + + if (state >= OFFSET_A) { + gel(params, 3) = curve->a; + } + + if (state >= OFFSET_B) { + gel(params, 4) = curve->b; + } + + if (state >= OFFSET_CURVE) { + gel(params, 5) = curve->curve; + } + + if (state >= OFFSET_ORDER) { + gel(params, 6) = curve->order; + } + + if (state >= OFFSET_GENERATORS) { + GEN gens = zerovec(curve->ngens); + for (size_t i = 0; i < curve->ngens; ++i) { + gel(gens, i + 1) = curve->generators[i]->point; + } + gel(params, 7) = gens; + } + + if (state >= OFFSET_POINTS) { + GEN points = zerovec(curve->npoints); + for (size_t i = 0; i < curve->npoints; ++i) { + gel(points, i + 1) = curve->points[i]->point; + } + gel(params, 8) = points; + } + + GEN res = call0(closure, zerovec(0)); + res = call0(res, params); + + int result = (int)itos(res); + avma = ltop; + return result; }
\ No newline at end of file diff --git a/src/gen/gp.h b/src/gen/gp.h index c0ee1af..2f2f59d 100644 --- a/src/gen/gp.h +++ b/src/gen/gp.h @@ -16,4 +16,14 @@ */ GENERATOR(gp_gen); +/** + * @brief + * @param curve + * @param cfg + * @param args + * @param state + * @return + */ +CHECK(gp_check); + #endif // ECGEN_GP_H |
