math/pgen.c, math/pgen-simul.c: Add Baillie--PSW testers.
[catacomb] / math / pgen.c
index f90a3c7..b7163b9 100644 (file)
@@ -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@ --- *