素数筛法,产生num以内的素数表
public static int makePrimes(int primes[], int num)
{
int i, j, cnt;
primes[0] = 2;
primes[1] = 3;
for(i = 5, cnt = 2; i < num; i += 2)
{
boolean flag = true;
for(j = 1; primes[j]*primes[j] <= i; ++j)
{
if(i%primes[j] == 0)
{
flag = false;
break;
}
}
if(flag) primes[cnt++] = i;
}
return cnt;
}
根据素数表快速判断是否素数,只要打表到sqrt(n),就能快速判断n以内的数是否是素数
public static boolean isPrime(int primes[], int n)
{
if(n < 2)
return false;
for(int i = 0; primes[i]*primes[i] <= n; i++)
if(n%primes[i] == 0)
return false;
return true;
}
快速幂取模
public static long pow_mod(long a,long i,long n)
{
if(i==0)
return 1%n;
long temp=pow_mod(a, i>>1, n);
temp=(temp*temp)%n;
if((i&1)!=0)
temp=(temp*a)%n;
return temp;
}
素数测试
由于出现了long*long型的中间变量,所以只能测试Int范围以内,需要更大范围需使用BigDecimal/BigInteger
public static boolean isPrime(long n)
{
if(n<2)
return false;
int[] a={2,3,5,7,11,61}; //测试集合
for(int i=0;i<a.length;i++)
if(!test(n, a[i], n-1))
return false;
return true;
}
public static boolean test(long n,long a,long d)
{
if(n==2)
return true;
if(n==a)
return true;
if((n&1)==0)
return false;
while((d&1)==0)
d=d>>1;
long t =pow_mod(a, d, n);
while((d!=n-1)&&(t!=1)&&(t!=n-1))
{
t=(t*t)%n;
d=d<<1;
}
return (t==n-1||(d&1)==1);
}
public static long pow_mod(long a,long i,long n)
{
if(i==0)
return 1%n;
long temp=pow_mod(a, i>>1, n);
temp=(temp*temp)%n;
if((i&1)!=0)
temp=(temp*a)%n;
return temp;
}