| Gerhard Niklasch on Wed, 22 Jul 1998 14:37:47 +0200 (MET DST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: ispseudoprime behavior |
In response to:
> Message-Id: <19980721160057.Q25633@io.txc.com>
> Date: Tue, 21 Jul 1998 16:00:57 -0400
> From: Igor Schein <igor@txc.com>
> Hi, consider the following function
>
> f(n)=while(1,print(ispseudoprime(n)))
>
> Now let n be a negative integer whose absolute
> value is an odd composite integer. For example
> let n=-9. In a few iterations you'll see the
> following:
> *** impossible inverse modulo: Mod(3, 9).
>
> I was trying to figure out what's going on in
> the code, I noticed that negative sign gets
> stripped out by the time millerrabin() is called,
> but couldn't figure out where.
It used to get stripped out in init_miller() (in src/basemath/ifactor1.c),
_after_ subtracting 1 from it to get the appropriate exponent, so a nega-
tive n will lead to an exponent which is (a) negative and (b) doesn't
have the correct absolute value either. Thanks for spotting this --
another one of the sort `if you know exactly what the code is supposed
to be doing, you'll never see it'. ;^/
(The addsi() instead of subis() is a minor optimization.)
Enjoy, Gerhard
bash$ diff -u src/basemath/ifactor1.c.gn19980721 src/basemath/ifactor1.c
--- src/basemath/ifactor1.c.gn19980721 Wed Jul 22 14:16:21 1998
+++ src/basemath/ifactor1.c Wed Jul 22 14:23:11 1998
@@ -12,10 +12,11 @@
static GEN
init_miller(GEN n)
{
- t=subis(n,1); r1=vali(t); t1 = shifti(t,-r1);
+ if (signe(n) < 0) n = absi(n);
+ t=addsi(-1,n); 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;
+ return n;
}
/* is n strong pseudo-prime for base a ? `End matching' (check for square