大素数高效算法判断
Posted ACMer_Shadow
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大素数高效算法判断相关的知识,希望对你有一定的参考价值。
前段日子我也在做素数,下面是我的一个总结,看到那个2秒搞定的,我还真想去看看
当数字小于1000000时,可以用简单的判断
int isprime(int n)
int i;
for(i=2;i<=sqrt(n);i++)
if (n%i==0)
return 0;
return 1;
但当数值在1000000到100000000时
介绍一种方法
prime=2,3,5,7,11,13,17,……为事先做好的素数表 如果需要判断的数最大为100000000,则prime的最大元素为大于10000的最小素数即可
//素数表生成法:
int t[10010]=0,prime[3000];//3000可能有点大,具体多少运行了,就知道了
int len;
void getprime(void)
int i,j;
t[0]=t[1]=1; //t[i]=1,表示该数不是素数,被筛除
for(i=2;i <=sqrt(10010);i++)
if(!t[i])
for(j=i+i;j<10010;j+=i)
t[j]=1;
len=0;
for(i=2;i <10010;i++)
if(!t[i])
prime[len++]=i;
int isprime(long n)
int i;
while(prime[i]*prime[i] <=n)
if(n%prime[i]==0)
return 0;
i++;
return 1;
如果数值大于100000000时
可以用Miller-Rabbin素数测试法,判断是否为素数
int Miller_Rabbin(long long n)
long long i,s,a;
s=10; //s的值可以根据需要变大
// randomize();
for(i=0;i <s;i++)
a=long long(rand()%(n-1)+2); //自动生成受限
if(modular_exp(a,n-1,n)>1)
return 0;
return 1;
long long modular_exp(long long a,long long b,long long c)//求a^b%c该函数受限
if(a==0)
return 0;
if(b==0)
return 1;
if(b==1)
return a%c;
return (a*modular_exp(a,b-1,c))%c;
最普通的筛法:(算法竞赛必会)
#include<stdio.h>
#include<stdbool.h>
int main (void)
int n=100,i,j;
bool prime[101]; //C99 bool在#include<stdbool.h>中
memset(prime,1,sizeof(prime));//全定义为素数
prime[0]=prime[1]=0; //0和1不是素数
for (i=2; i<=sqrt(n); i++)
if(prime[i])
for(j=i*i; j<=n; j+=i)//j=i*i是j=i+i的优化
prime[j]=0;
int k=0;
for(i=0; i<=n; i++)
if(prime[i])
k++;
printf("%d ",i);
printf("\\n~~~%d ",k);
return 0;
以上是关于大素数高效算法判断的主要内容,如果未能解决你的问题,请参考以下文章
大素数判断和素因子分解(miller-rabin,Pollard_rho算法)
大素数判断和素因子分解(miller-rabin,Pollard_rho算法)