大素数高效算法判断

来源:互联网 发布:触摸屏设备 软件开发 编辑:程序博客网 时间:2024/04/29 14:11


前段日子我也在做素数,下面是我的一个总结,看到那个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;}

 
 
0 0
原创粉丝点击