| Gerhard Niklasch on Mon, 29 Jun 1998 17:58:44 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| SEGV in factorint (fwd) |
With Karim's blessing, here's the patch that cures the occasional
segfaults in factorint(_,1) in 2.0.9.alpha. (It is still possible
after applying this to cause memory corruption and other funny things
by hitting Ctrl-C in the middle of an MPQS run; this is known and
fixed for 2.0.10. If you want to see the factorizers at work, type
first
gp > default(debug,4);default(primelimit,66000);
and then a series of factorint(_,2)s. Higher debug levels are even
more verbose; at level 7, MPQS will create nice visual effects by
printing the huge binary matrices before and after Gauss over F_2...)
Enjoy, Gerhard
Forwarded message:
From: Karim BELABAS <Karim.Belabas@math.u-psud.fr>
Date: Wed, 17 Jun 1998 13:33:14 +0200
Message-Id: <199806171133.NAA01347@geo.math.u-psud.fr>
To: nikl@mathematik.tu-muenchen.de
Subject: SEGV in factorint
should be cured by the following patch [GN: remainder of commentary
censored -- Karim asks you NOT to read the code being replaced by
this ;^]
*** src/basemath/ifactor1.c.orig Tue Jun 16 16:44:49 1998
--- src/basemath/ifactor1.c Wed Jun 17 13:27:24 1998
***************
*** 1,6 ****
/* $Id: ifactor1.c,v 2.0.0.9 1998/06/09 11:47:19 belabas Exp belabas $ */
#include "pari.h"
- static GEN N;
/*********************************************************************/
/** **/
--- 1,5 ----
***************
*** 10,47 ****
static GEN sqrt1, sqrt2, t1, t;
static long r1;
! static void
init_miller(GEN n)
{
- N = (signe(n) < 0)? absi(n): n;
t=subis(n,1); r1=vali(t); t1 = shifti(t,-r1);
sqrt1=cgeti(lg(t)); sqrt1[1]=evalsigne(0)|evallgefint(2);
sqrt2=cgeti(lg(t)); sqrt2[1]=evalsigne(0)|evallgefint(2);
}
! /* is N strong pseudo-prime for base a ? `End matching' (check for square
* roots of -1) added by GN */
static int
! bad_for_base(GEN a)
{
! GEN c2, c = powmodulo(a,t1,N);
long r;
if (!is_pm1(c) && !egalii(t,c)) /* go fishing for -1, not for 1 */
{
for (r=r1-1; r; r--) /* (this saves one squaring/reduction) */
{
! c2=c; c=modii(sqri(c),N);
if (egalii(t,c)) break;
}
if (!r) return 1;
/* sqrt(-1) seen, compare or remember */
if (signe(sqrt1)) /* we saw one earlier: compare */
{
! /* check if too many sqrt(-1)s mod N */
if (!egalii(c2,sqrt1) && !egalii(c2,sqrt2)) return 1;
}
! else { affii(c2,sqrt1); affii(subii(N,c2),sqrt2); } /* remember */
}
return 0;
}
--- 9,46 ----
static GEN sqrt1, sqrt2, t1, t;
static long r1;
! static GEN
init_miller(GEN n)
{
t=subis(n,1); r1=vali(t); t1 = shifti(t,-r1);
sqrt1=cgeti(lg(t)); sqrt1[1]=evalsigne(0)|evallgefint(2);
sqrt2=cgeti(lg(t)); sqrt2[1]=evalsigne(0)|evallgefint(2);
+ return (signe(n) < 0)? absi(n): n;
}
! /* is n strong pseudo-prime for base a ? `End matching' (check for square
* roots of -1) added by GN */
static int
! bad_for_base(GEN n, GEN a)
{
! GEN c2, c = powmodulo(a,t1,n);
long r;
if (!is_pm1(c) && !egalii(t,c)) /* go fishing for -1, not for 1 */
{
for (r=r1-1; r; r--) /* (this saves one squaring/reduction) */
{
! c2=c; c=modii(sqri(c),n);
if (egalii(t,c)) break;
}
if (!r) return 1;
/* sqrt(-1) seen, compare or remember */
if (signe(sqrt1)) /* we saw one earlier: compare */
{
! /* check if too many sqrt(-1)s mod n */
if (!egalii(c2,sqrt1) && !egalii(c2,sqrt2)) return 1;
}
! else { affii(c2,sqrt1); affii(subii(n,c2),sqrt2); } /* remember */
}
return 0;
}
***************
*** 57,67 ****
if (lgefint(n)==3 && (ulong)(n[2])<=3) return (n[2] != 1);
if (!mod2(n)) return 0;
! init_miller(n); av2=avma;
for (i=1; i<=k; i++)
{
do r = smodsi(mymyrand(),n); while (!r);
! if (bad_for_base(stoi(r))) { avma=av; return 0; }
avma=av2;
}
avma=av; return 1;
--- 56,66 ----
if (lgefint(n)==3 && (ulong)(n[2])<=3) return (n[2] != 1);
if (!mod2(n)) return 0;
! n = init_miller(n); av2=avma;
for (i=1; i<=k; i++)
{
do r = smodsi(mymyrand(),n); while (!r);
! if (bad_for_base(n, stoi(r))) { avma=av; return 0; }
avma=av2;
}
avma=av; return 1;
***************
*** 78,88 ****
static long pr[] = {0, 2,3,5,7,11,13,17,19,23,29};
if (!mod2(n)) return 0;
! init_miller(n); av2=avma;
for (i=1; i<=k; i++)
{
r = smodsi(pr[i],n); if (!r) break;
! if (bad_for_base(stoi(r))) { avma = av; return 0; }
avma=av2;
}
avma=av; return 1;
--- 77,87 ----
static long pr[] = {0, 2,3,5,7,11,13,17,19,23,29};
if (!mod2(n)) return 0;
! n = init_miller(n); av2=avma;
for (i=1; i<=k; i++)
{
r = smodsi(pr[i],n); if (!r) break;
! if (bad_for_base(n, stoi(r))) { avma = av; return 0; }
avma=av2;
}
avma=av; return 1;
***************
*** 163,169 ****
/** is composite, and has no small prime divisor (P^-(N) > 65.536). **/
/** **/
/***********************************************************************/
! static GEN gl, *W;
#define nbc 10
static int
--- 162,168 ----
/** is composite, and has no small prime divisor (P^-(N) > 65.536). **/
/** **/
/***********************************************************************/
! static GEN N, gl, *W;
#define nbc 10
static int
--
Karim Belabas email: Karim.Belabas@math.u-psud.fr
Dep. de Mathematiques, Bat. 425
Universite Paris-Sud Tel: (33 1) 01 69 15 57 48
F-91405 Orsay (France) Fax: (33 1) 01 69 15 60 19
--
PARI/GP Home Page: http://pari.home.ml.org