pgen: Implement general simultaneous-primality searching.
[u/mdw/catacomb] / pgen.h
diff --git a/pgen.h b/pgen.h
index 4bc9046..52e62bb 100644 (file)
--- a/pgen.h
+++ b/pgen.h
@@ -145,7 +145,7 @@ typedef struct pgen_filterctx {
   pfilt f;                             /* The rapid prime filter */
 } pgen_filterctx;
 
-extern int pgen_filter(int /*rq*/, pgen_event */*ev*/, void */*p*/);
+extern pgen_proc pgen_filter;
 
 /* --- @pgen_jump@ --- *
  *
@@ -158,7 +158,7 @@ typedef struct pgen_jumpctx {
   pfilt f;
 } pgen_jumpctx;
 
-extern int pgen_jump(int /*rq*/, pgen_event */*ev*/, void */*p*/);
+extern pgen_proc pgen_jump;
 
 /* --- @pgen_test@ --- *
  *
@@ -166,7 +166,43 @@ extern int pgen_jump(int /*rq*/, pgen_event */*ev*/, void */*p*/);
  * @rabin@ context.
  */
 
-extern int pgen_test(int /*rq*/, pgen_event */*ev*/, void */*p*/);
+extern pgen_proc pgen_test;
+
+/*----- Simultaneous primality checking -----------------------------------*/
+
+typedef struct pgen_simulprime {
+  mp *mul, *add;                       /* Arguments from the client */
+  unsigned f;                          /* Flags, set by client, changed */
+#define PGENF_KEEP 1u                  /*   Keep this prime's value */
+#define PGENF_JUMP 8u                  /*   Use jump table, not stepping */
+  pfilt p;                             /* This prime's filter */
+  rabin r;                             /* Rabin testing context */
+  union {
+    mpw step;                          /* The simple step to use */
+    pfilt *jump;                       /* The jump to move by */
+    mp *x;                             /* The result, if wanted */
+  } u;
+} pgen_simulprime;
+
+typedef struct pgen_simulctx {
+  pgen_simulprime *v;                  /* Vector of related primes */
+  unsigned n;                          /* Size of the vector */
+  mp *step;                            /* Basic stepping value */
+} pgen_simulctx;
+  
+/* --- @pgen_simulstep@ --- *
+ *
+ * Step a collection of numbers simultaneously.
+ */
+
+extern pgen_proc pgen_simulstep;
+
+/* --- @pgen_simultest@ --- *
+ *
+ * Test a collection of numbers simultaneously.
+ */
+
+extern pgen_proc pgen_simultest;
 
 /*----- Safe prime functions ----------------------------------------------*/
 
@@ -180,7 +216,7 @@ typedef struct pgen_safestepctx {
   pfilt q, p;
 } pgen_safestepctx;
 
-extern int pgen_safestep(int /*rq*/, pgen_event */*ev*/, void */*p*/);
+extern pgen_proc pgen_safestep;
 
 /* --- @pgen_safejump@ --- *
  *
@@ -193,7 +229,7 @@ typedef struct pgen_safejumpctx {
   pfilt p, jp;
 } pgen_safejumpctx;
 
-extern int pgen_safejump(int /*rq*/, pgen_event */*ev*/, void */*p*/);
+extern pgen_proc pgen_safejump;
 
 /* --- @pgen_safetest@ --- *
  *
@@ -205,7 +241,7 @@ typedef struct pgen_safetestctx {
   rabin q, p;
 } pgen_safetestctx;
 
-extern int pgen_safetest(int /*rq*/, pgen_event */*ev*/, void */*p*/);
+extern pgen_proc pgen_safetest;
 
 /*----- Miscellaneous steppers and testers --------------------------------*/
 
@@ -223,7 +259,7 @@ typedef struct pgen_gcdstepctx {
  * %$\gcd(p, r) \le max$%.
  */
 
-extern int pgen_gcdstep(int /*rq*/, pgen_event */*ev*/, void */*p*/);
+extern pgen_proc pgen_gcdstep;
 
 /*----- Standard event handlers -------------------------------------------*/
 
@@ -232,21 +268,21 @@ extern int pgen_gcdstep(int /*rq*/, pgen_event */*ev*/, void */*p*/);
  * Displays a spinning baton to show progress.
  */
 
-extern int pgen_evspin(int /*rq*/, pgen_event */*ev*/, void */*p*/);
+extern pgen_proc pgen_evspin;
 
 /* --- @pgen_ev@ --- *
  *
  * Traditional event handler, shows dots for each test.
  */
 
-extern int pgen_ev(int /*rq*/, pgen_event */*ev*/, void */*p*/);
+extern pgen_proc pgen_ev;
 
 /* --- @pgen_subev@ --- *
  *
  * Subsidiary event handler, mainly for Lim-Lee searches and so on.
  */
 
-extern int pgen_subev(int /*rq*/, pgen_event */*ev*/, void */*p*/);
+extern pgen_proc pgen_subev;
 
 /*----- The main driver ---------------------------------------------------*/