关闭

大素数高效算法判断

标签: ACMHDUHDUOJ
3361人阅读 评论(0) 收藏 举报
分类:


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


 
 
2
1
查看评论

素数判断算法(高效率)

chuanbindeng 的 素数判断算法关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法。看了以后相信对大家一定有帮助。    正如大家都知道的那样,一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n...
  • liukehua123
  • liukehua123
  • 2010-04-13 21:58
  • 160493

Hiho 数论一·Miller-Rabin质数测试,大素数判断

题目1 : 数论一·Miller-Rabin质数测试 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近突然对密码学产生了兴趣,其中有个叫RSA的公钥密码算法。RSA算法的计算过程中,需要找一些很大的质数。 小Ho:...
  • tham_
  • tham_
  • 2016-04-18 21:37
  • 1116

素数判定Miller_Rabin 算法详解

素数判定Miller_Rabin  算法详解 上次说好的要把素数判定和大数分解(见另一篇博文)的快速随机化算法解决了,于是乎今天就来解决,不得不说理解起来真的有困难。我只能大概的将思路理一下,若有错漏还请担待。
  • maxichu
  • maxichu
  • 2015-05-03 14:09
  • 7918

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

定义:约数只有1和本身的整数称为质数,或称素数。计算机或者相关专业,基本上大一新生开始学编程都会接触的一个问题就是判断质数,下面分享几个判断方法,从普通到高效。 1)直观判断法 最直观的方法,根据定义,因为质数除了1和本身之外没有其他约数,所以判断n是否为质数,根据定义直接判断从2到n-1是否存在...
  • huang_miao_xin
  • huang_miao_xin
  • 2016-05-06 15:00
  • 38758

关于解决快速判断longlong型的整数是否为素数

核心做法是米勒罗宾定理。 测试n(n很大) 在(1,n-1)中选出一个a,a
  • qq2442438699
  • qq2442438699
  • 2017-04-13 21:27
  • 213

判断素数的几种方法的总结

素数,又称质数,定义是:除了1和它本身以外不再有其他的除数整除。方法一按照定义,从2到n-1判断有没有能整除n的数。如果有,则不是素数,否则,是素数bool is_prime(int n){ if (n < 2){ return false; } int...
  • qq_21120027
  • qq_21120027
  • 2016-04-09 22:36
  • 14088

判断素数系列

def isprime(n): for i in range(2,(int(n**0.5))+1): if n % i == 0: return False return True检查一个正整数N是否为素数,最简单的方法就是试除法,将该数N用小...
  • koko66
  • koko66
  • 2014-09-25 16:09
  • 1041

ACM-判素数

筛法,整数分解,欧拉定理,
  • u011787119
  • u011787119
  • 2014-10-21 22:38
  • 867

ACM模板——快速判断素数

提供: Mr. Coffee //Written by Coffee. 判断素数 bool isPrime(int num) { if (num == 2 || num == 3) { return true; } if (num % 6 != 1 && num % 6...
  • Kiritow
  • Kiritow
  • 2016-08-03 12:35
  • 716

ACM素数的几种判断方法和实现

  • 2013-10-31 22:50
  • 637KB
  • 下载
    个人资料
    • 访问:749144次
    • 积分:5628
    • 等级:
    • 排名:第5580名
    • 原创:213篇
    • 转载:25篇
    • 译文:0篇
    • 评论:97条
    博客专栏
    最新评论