大素数高效算法判断

转载 2015年07月09日 18:08:17


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


 
 

相关文章推荐

素数判断算法(高效率)

chuanbindeng 的 素数判断算法关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法。看了以后相信对大家一定有帮助。    正如大家都知...

判断一个数是否为质数/素数——从普通判断算法到高效判断算法思路

定义:约数只有1和本身的整数称为质数,或称素数。计算机或者相关专业,基本上大一新生开始学编程都会接触的一个问题就是判断质数,下面分享几个判断方法,从普通到高效。 1)直观判断法 最直观的方法,根据定...

大数是否为素数【费马小定理+Carmichael数判断】

作为判断一个大数是否为素数的模板。 代码如下: #include #include #include using namespace std; long long multi(long ...

大素数判断_fermat素性测试+Miller-Rabin素性测试

一、朴素的判断一个数是否为素数: 原理:若一个数为合数,那么必然存在这样的两个数:2 解法:从 2 到 sqrt(n) 枚举,若存在数字 a 为数 n 的因子,那么数字 n 即为合数。若不存在,则数字...

蓝桥杯-找素数【筛选法】

算法提高 找素数   时间限制:1.0s   内存限制:256.0MB 问题描述   给定区间[L, R] , 请计算区间中素数的个数。 输入格式   两个数...
  • ACM_TH
  • ACM_TH
  • 2016年05月23日 10:38
  • 731

素数算法

一、引言 在平时做题目或者进行预算的时候,素数的出现次数总是十分频繁。今天我们就来一点一点的说一说关于素数的一些算法。 二、朴素判断素数算法 就判断素数而言,事实上是非常简单的了。根据定义,判断一...
  • Snow_Me
  • Snow_Me
  • 2016年09月19日 21:23
  • 3193

米勒拉宾大素数生成算法

package password;import java.math.BigInteger;public class BigPrime { public BigInteger p; st...

素数判断算法(高效率)

chuanbindeng 的 素数判断算法 关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法。看了以后相信 对大家一定有帮助。     ...
  • Aiphis
  • Aiphis
  • 2015年08月21日 16:29
  • 562

大素数测试

先列出几篇已经写过的大素数测试的文章基本都是用Miller_Rabin的测试方法http://blog.csdn.net/fisher_jiang/archive/2006/07/27/986654....
  • techq
  • techq
  • 2011年01月09日 20:32
  • 9008

唯一分解定理

唯一分解定律:又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。 当题目有大数相除,求余数时,精度要求高时....就要运用唯一分解定律...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大素数高效算法判断
举报原因:
原因补充:

(最多只允许输入30个字)