diff options
| -rw-r--r-- | primes.cpp | 23 | 
1 files changed, 19 insertions, 4 deletions
@@ -108,11 +108,26 @@ bool strongPseudoPrime2(const Bigint &n){  	Bigint nm1(n);  	nm1-=1;  	Bigint d(nm1); -	while(d.even()){ //TODO: optimise using __builtin_ctz -		d>>=1; -		if(expmod(Bigint::two,d,n)==nm1)return true; + +	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; +	} +	Bigint bi(expmod(Bigint::two,d,n)); +	if(bi==1||bi==nm1)return true; +	for(int i=1;i<zerobits;i++){ +		d<<=1; +		if(bi==nm1)return true;  	} -	if(expmod(Bigint::two,d,n)==1)return true; +  	return false;  }  | 
