diff options
author | Tom Smeding <hallo@tomsmeding.nl> | 2016-10-24 14:22:24 +0200 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2016-10-24 19:33:53 +0200 |
commit | 7cca53ede2ee4900fce30334fb561a24d1b5d2de (patch) | |
tree | 50ab1737c28d718efa672caef8c1c82ff47475e9 /primes.cpp | |
parent | df6c0e07bc74a4137ccb8719a28f58b50ba946c6 (diff) |
ACTUALLY fix strongPseudoPrime2
Diffstat (limited to 'primes.cpp')
-rw-r--r-- | primes.cpp | 19 |
1 files changed, 6 insertions, 13 deletions
@@ -109,22 +109,15 @@ bool strongPseudoPrime2(const Bigint &n){ nm1-=1; Bigint d(nm1); - int zerobits=0; - while(d.even()){ - Bigint::slongdigit_t lowdig=d.lowdigits(); - int trzeros; - if(lowdig==0){ - trzeros=8*sizeof(Bigint::slongdigit_t)-1; - } else { - trzeros=__builtin_ctz(d.lowdigits()); - } - zerobits+=trzeros; - d>>=trzeros; - } + int zerobits=d.trailingZeros(); + d>>=zerobits-1; + assert(d.even()); + d>>=1; + assert(d.odd()); Bigint bi(expmod(Bigint::two,d,n)); if(bi==1||bi==nm1)return true; for(int i=1;i<zerobits;i++){ - d<<=1; + bi=(bi*bi).divmod(n).second; if(bi==nm1)return true; } |