| Karim Belabas on Mon, 31 Aug 2009 08:52:43 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Questions about primality certification in Pari |
* William Hart [2009-08-31 05:29]:
> I have two questions, the second one regarding what may be a bug:
First a remark: your questions concern pari-stable, but you should
rather study the current SVN code which is a bit different (and more
efficient).
> Q1) In arith2.c we have:
>
> int
> BSW_isprime(GEN x)
> {
> pari_sp av = avma;
> long l, res;
> GEN F, p, e;
> if (BSW_isprime_small(x)) return 1;
> F = auxdecomp(subis(x,1), 0);
> l = lg(gel(F,1))-1; p = gcoeff(F,l,1); e = gcoeff(F,l,2); F=gel(F,
> 1);
> if (cmpii(powgi(p, shifti(e,1)), x)<0)
> res = isprimeSelfridge(mkvec2(x,vecslice(F,1,l-1))); /* half-
> smooth */
> else if (BSW_psp(p))
> res = isprimeSelfridge(mkvec2(x,F)); /* smooth */
> else
> res = isprimeAPRCL(x);
> avma = av; return res;
> }
>
> long
> isprime(GEN x)
> {
> return BSW_psp(x) && BSW_isprime(x);
> }
>
> Now the BSW_psp test I understand. It is the Bailley-Selfridge-
> Wagstaff "pseudo"primality test. When x is small enough (< 10^13 in
> pari) it is a guaranteed primality test.
Actually, < 10^15 is still fine. Should be doable (and useful) to extend this
further, to 2^64 say.
> Now if x is too large for this to guarantee you have a prime, pari then
> (as can be seen) does some factoring of x-1. The factors it finds, it
> sticks in the vector F. There might be some cofactor p^e. The first
> thing it does is check whether (p^e)^2 < x. This is because the
> Pocklington-Lehmer test can then be applied by looking for what Pari
> calls witnesses for each of the factors of x-1.
N.B. Current code needs partial factorization up to x^(1/3), instead of x^(1/2).
> It is the next step I do not understand. Supposing p^e >= sqrt(x) they
> it checks if p is a BSW_psp. Again it basically does a Pocklington-
> Lehmer test if this is the case (they call it a Selfridge test).
>
> Now my question is, why can one get away with a psp test rather than a full primality test here?
isprimeSelfridge receives an integer N and a list of pseudoprime
divisors of N-1. It performs the BSW test proving the primality of N
under the assumption that the pseudoprimes are true primes, then
calls the primality prover recursively to prove the assumption.
Notice that in the second case ( p^(2e) >= x ) we do stick p in the
vector of pseudoprimes. Its primality will then be certified.
In the first one (p^(2e) < x), the vecslice() removes p from the list.
This code looks fine to me.
> Q2) Also in arith2.c:
>
> int
> BSW_isprime_small(GEN x)
> {
> long l = lgefint(x);
> if (l < 4) return 1;
> if (l == 4)
> {
> pari_sp av = avma;
> long t = cmpii(x, u2toi(0x918UL, 0x4e72a000UL)); /* 10^13 */
> avma = av;
> if (t < 0) return 1;
> }
> return 0;
> }
>
> This code is used to determine if the BSW test is sufficient to guarantee primality, by testing whether the number is < 10^13.
>
> But on a 64 bit machine, doesn't this always return 1 when x is a single limb integer? It looks like it was written for a 32 bit machine. Shouldn't it be checking if l == 3 on a 64 bit machine then checking if x < 10^13.
> My apologies if that is not right.
You are right: this one is a bug.
Thanks for reporting this !
K.B.
--
Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17
Universite Bordeaux 1 Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation http://www.math.u-bordeaux.fr/~belabas/
F-33405 Talence (France) http://pari.math.u-bordeaux.fr/ [PARI/GP]
`