Bill Allombert on Mon, 27 Sep 2004 21:41:45 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: storing primes found by factor.


On Mon, Sep 27, 2004 at 04:31:50PM +0200, Bill Allombert wrote:
> Hello PARI-dev,
> 
> Here a patch that add a new default, factor_add_primes 
> (turned on by default) that make factorint to automatically call
> addprimes on primes factor found larger than 2^24.  
> 
> In particular if you stop a factorisation you can get the factors
> already found using addprimes(), and they will be automatically
> reused if you restart it.

Following a suggestion of Gerhard Niklasch, I changed the patch so
that functions like moebius() that use the ifac machinery will 
record primes found.

Cheers,
Bill.


Index: src/basemath/ifactor1.c
===================================================================
RCS file: /home/cvs/pari/src/basemath/ifactor1.c,v
retrieving revision 1.67
diff -u -r1.67 ifactor1.c
--- src/basemath/ifactor1.c	26 Sep 2004 16:02:18 -0000	1.67
+++ src/basemath/ifactor1.c	27 Sep 2004 17:40:34 -0000
@@ -27,6 +27,8 @@
 extern ulong ucarrecomplet(ulong A);
 extern GEN mpqs(GEN N);/* returns a factor, a vector of factors, or NULL */
 
+int factor_add_primes = 1;
+
 /*C++ on ia64 do not like (long)NULL*/
 #define LNULL ((long)(GEN)NULL)
 /*********************************************************************/
@@ -3410,6 +3412,14 @@
 		 nf, (nf>1 ? "s" : ""));
     else
       fprintferr("IFAC: main loop: this was the last factor\n");
+  }
+  /* When factor_add_primes is set, ifac automatically add primes >2^24
+   * to the addprimes DB. BA2004Jun22*/
+  if (factor_add_primes && !(itos((GEN)((*partial)[2])) & 8))
+  {
+    GEN p=(GEN)here[0];
+    if (lgefint(p)>3 || expi(p)>24)
+      addprimes(p);
   }
   return here;
 }
Index: src/gp/gp.c
===================================================================
RCS file: /home/cvs/pari/src/gp/gp.c,v
retrieving revision 1.230
diff -u -r1.230 gp.c
--- src/gp/gp.c	26 Sep 2004 16:02:18 -0000	1.230
+++ src/gp/gp.c	27 Sep 2004 13:12:48 -0000
@@ -892,6 +892,10 @@
 }
 
 static GEN
+sd_factor_add_primes(char *v, int flag)
+{ return sd_toggle(v,flag,"factor_add_primes", &factor_add_primes); }
+
+static GEN
 sd_new_galois_format(char *v, int flag)
 { return sd_toggle(v,flag,"new_galois_format", &new_galois_format); }
 
@@ -1031,6 +1035,7 @@
   {"debugfiles",(void*)sd_debugfiles},
   {"debugmem",(void*)sd_debugmem},
   {"echo",(void*)sd_echo},
+  {"factor_add_primes",(void*)sd_factor_add_primes},
   {"format",(void*)sd_format},
   {"help",(void*)sd_help},
   {"histsize",(void*)sd_histsize},
Index: src/headers/paricom.h
===================================================================
RCS file: /home/cvs/pari/src/headers/paricom.h,v
retrieving revision 1.62
diff -u -r1.62 paricom.h
--- src/headers/paricom.h	23 Sep 2004 14:49:14 -0000	1.62
+++ src/headers/paricom.h	27 Sep 2004 13:12:48 -0000
@@ -151,6 +151,7 @@
 extern void* global_err_data;
 
 extern int new_galois_format;
+extern int factor_add_primes;
 
 enum manage_var_t {
     manage_var_create,			/* 0 */