X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/a938be516ed8fd8313ff3d061dd4b0f2d9acfa0e..a889a2b3fd8065bc610a0db330b1b63820e4d3c9:/math/pgen.c diff --git a/math/pgen.c b/math/pgen.c index f10c163e..b7163b90 100644 --- a/math/pgen.c +++ b/math/pgen.c @@ -140,6 +140,47 @@ int pgen_test(int rq, pgen_event *ev, void *p) return (rc); } +/* --- @pgen_bailliepswtest@ --- */ + +int pgen_bailliepswtest(int rq, pgen_event *ev, void *p) +{ + rabin r; + int rc; + + switch (rq) { + case PGEN_BEGIN: + if (ev->tests != 2) rc = PGEN_ABORT; + else rc = PGEN_TRY; + break; + + case PGEN_DONE: + rc = PGEN_DONE; + break; + + case PGEN_TRY: + switch (ev->tests) { + case 2: + rabin_create(&r, ev->m); + rc = rabin_test(&r, MP_TWO); + rabin_destroy(&r); + break; + case 1: + rc = pgen_granfrob(ev->m, 0, 0); + break; + default: + rc = PGEN_ABORT; + break; + } + break; + + default: + rc = PGEN_ABORT; + break; + } + + return (rc); +} + /*----- The main driver ---------------------------------------------------*/ /* --- @pgen@ --- * @@ -181,8 +222,8 @@ mp *pgen(const char *name, mp *d, mp *m, pgen_proc *event, void *ectx, ev.m = MP_COPY(m); else ev.m = 0; - ev.steps = 0; - ev.tests = 0; + ev.steps = steps; + ev.tests = tests; ev.r = fibrand_create(0); /* --- Tell the event handler we're under way --- */ @@ -258,17 +299,17 @@ mp *pgen(const char *name, mp *d, mp *m, pgen_proc *event, void *ectx, /* --- If decrementing counters is requested, do that --- */ if ((act & A_STEP) && steps) { - ev.steps++; - if (ev.steps == steps) { + ev.steps--; + if (!ev.steps) { act |= A_EVENT | A_ENDSTEP | A_DONE; rc = PGEN_ABORT; } - ev.tests = 0; + ev.tests = tests; } if ((act & A_TEST) && tests) { - ev.tests++; - if (ev.tests == tests) { + ev.tests--; + if (!ev.tests) { act |= A_ENDTEST | A_ENDSTEP | A_DONE; rc = PGEN_DONE; }