prime generation: Deploy the new Baillie--PSW testers.
[catacomb] / math / limlee.c
index 28975d0..55959cc 100644 (file)
@@ -111,13 +111,12 @@ static int comb_next(octet *c, unsigned n, unsigned r)
 static void llgen(limlee_factor *f, unsigned pl, limlee_stepctx *l)
 {
   pgen_filterctx pf;
-  rabin r;
   mp *p;
 
   p = mprand(l->newp, pl, l->r, 1);
   pf.step = 2;
   p = pgen(l->u.s.name, p, p, l->iev, l->iec, 0, pgen_filter, &pf,
-          rabin_iters(pl), pgen_test, &r);
+          PGEN_BAILLIEPSWNTESTS, pgen_bailliepswtest, 0);
   f->p = p;
 }
 
@@ -390,6 +389,8 @@ mp *limlee(const char *name, mp *d, mp *newp,
 {
   limlee_stepctx l;
   rabin rr;
+  mp **v;
+  size_t i;
 
   l.f = 0; if (f) l.f |= LIMLEE_KEEPFACTORS;
   l.newp = newp;
@@ -400,17 +401,20 @@ mp *limlee(const char *name, mp *d, mp *newp,
   l.r = r;
 
   d = pgen(name, d, 0, oev, oec, on, limlee_step, &l,
-          rabin_iters(pl), pgen_test, &rr);
-
-  if (d && f) {
-    mp **v;
-    size_t i;
-    v = xmalloc(l.nf * sizeof(mp *));
-    for (i = 0; i < l.nf; i++)
-      v[i] = l.v[i].p;
-    xfree(l.v);
-    *f = v;
-    *nf = l.nf;
+          PGEN_BAILLIEPSWNTESTS, pgen_bailliepswtest, &rr);
+
+  if (f) {
+    if (!d) {
+      for (i = 0; i < l.nf; i++)
+       if (l.v[i].p) llfree(&l.v[i], &l);
+    } else {
+      v = xmalloc(l.nf * sizeof(mp *));
+      for (i = 0; i < l.nf; i++)
+       v[i] = l.v[i].p;
+      xfree(l.v);
+      *f = v;
+      *nf = l.nf;
+    }
   }
 
   return (d);