math/pgen.c, math/pgen-simul.c: Add Baillie--PSW testers.
[catacomb] / math / pgen-simul.c
index 7321362..d817513 100644 (file)
@@ -165,4 +165,54 @@ int pgen_simultest(int rq, pgen_event *ev, void *p)
   return (rc);
 }
 
+/* --- @pgen_simulbailliepswtest@ --- *
+ *
+ * Test a collection of numbers simultaneously.
+ */
+
+int pgen_simulbailliepswtest(int rq, pgen_event *ev, void *p)
+{
+  pgen_simulctx *ss = p;
+  pgen_simulprime *sp;
+  int rc = -1;
+  unsigned i;
+  rabin r;
+
+  assert(ss->n);
+  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:
+         for (i = 0; i < ss->n; i++) {
+           sp = &ss->v[i];
+           rabin_create(&r, sp->p.m);
+           rc = rabin_test(&r, MP_TWO);
+           rabin_destroy(&r);
+           if (rc != PGEN_PASS) break;
+         }
+         break;
+       case 1:
+         for (i = 0; i < ss->n; i++) {
+           sp = &ss->v[i];
+           rc = pgen_granfrob(sp->p.m, 0, 0);
+           if (rc != PGEN_PASS) break;
+         }
+         break;
+       default:
+         rc = PGEN_ABORT;
+         break;
+      }
+  }
+  return (rc);
+}
+
 /*----- That's all, folks -------------------------------------------------*/