【转】素数相关算法总结

转载 2012年07月08日 21:54:50

定义:除了1和其本身,没有其他约数的数。
测试:用n分别试除2到sqrt(n)的数,如果中间有一个能整除,即

为合数,否则即为素数

bool is_prime(int n)//判断n是否为素数,是素数返回1
{
    int i;
    bool flag = 1;
    for(i = 2; i <= sqrt(n); i++)
    {
        if(n % i == 0)
        {
            flag = 0;
            break;
        }
    }
    return flag;
}

小范围内筛素数(数据不太大):

#define Max 1000
int Prime[500];
int q;
void get_prime()
{
    q = -1;
    Prime[++q] = 2;
    Prime[1] = 3;
    int i;
    for(i = 5; i <= Max; i++)
    {
        for(j = 0; Prime[j]*Prime[j] <= i &&i%Prime[j] != 0; j++);
        if(Prime[j]*Prime[j] > i)Prime[++q] = i;
    }
}

大范围内筛素数的普通筛法(很慢):

#define Max 1000000
int Prime[500000];
bool IsPrime[Max] = {1};
int q;
void get_prime()
{
    q = -1;
    int i,j;
    for(i = 2; i*i < Max; i++)
    {
        if(IsPrime[i] == 1)
        {
            for(j = i+i; j < Max; j += i)
            {
                IsPrime[j] = 0;
            }
        }
    }
    for(i = 2; i < Max; i++)
    {
        if(IsPrime[i] == 1)
            Prime[++q] = i;
    }
}

大范围内素数的线性筛法(比普通筛法更快)

#define Max 1000000
int Prime[500000];
bool IsPrime[Max] = {1};
int q;
void get_prime()
{
    q = -1;
    int i,j;
    for(i = 2; i < Max; i++)
    {
        if(IsPrime[i] == 1)
            Prime[++q] = i;
        for(j = 0; j <= q && Prime[j] * i < Max; j++)
        {
            IsPrime[Prime[j] * i] = 0;
            if(i % Prime[j] == 0)break;
        }
    }
}

求某一区间(a,b)内的素数

有时候我们碰到的问题是要求求出a b间的素数,而a又比较大,

这种情况下就可以用这种方法实现(a>2)
注意:要先通过以上几种方法求出2到sqrt(a的最大取值)范围内

的素数存入Prime[].

int prime[500000];
bool isprime[1000000];
int qt;
void get_prime1(int a,int b)
{
    int i,j,k;
    for(i = 0; i <= b - a; i++)
    isprime[i] = 1;
    for(i = 0; Prime[i]*Prime[i] <= b && i <= q;i++){
            k = a/Prime[i];
            if (k*Prime[i] < a) k++;
            if (k <= 1) k++;
            while(k*Prime[i] <= b){
                isprime[k*Prime[i] - a] = 0;
                k++;
            }
    }
    qt = -1;
    for(i = 0; i <= b - a; i++)
    {
        if(isprime[i] == 1)
        prime[++qt] = i + a;
    }
}


关于树的算法的总结

之前总结过,主要分为liang'da'lie
  • binling
  • binling
  • 2014年09月21日 11:52
  • 1087

二叉树相关算法总结

 一、二叉树的遍历-前序、中序、后序以及层次遍历(递归与非递归) 参考另外一篇笔记《二叉树的遍历-递归与非递归 -海子 - 博客园》。   二、重建二叉树,依据前序遍历结果和中序遍历结果 ...
  • cyongxue
  • cyongxue
  • 2014年02月13日 19:31
  • 1358

[算法]猫扑素数的算法实现

猫扑素数的定义所谓猫扑数: 指以2开头,后面跟任意个3的十进制数。如:2、23、233等。 素数是指: 在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为素(质)数。 因此,猫...
  • u011386455
  • u011386455
  • 2017年07月08日 00:01
  • 550

素数算法的优化之路

素数算法的优化之路
  • s634772208
  • s634772208
  • 2015年06月02日 12:49
  • 1238

米勒拉宾大素数生成算法

package password;import java.math.BigInteger;public class BigPrime { public BigInteger p; st...
  • baidu_15113429
  • baidu_15113429
  • 2016年10月06日 16:52
  • 1750

算法-素数相关

素数定义: 整数p不等于0,正负1,正负p,且除了正负1,正负p外没有其他约数,那么称整数p为质数或者素数.如果不做特别说明,素数或质数指的是正整数中的质数或者素数. 问题1:判断一个数是否...
  • mydream20130314
  • mydream20130314
  • 2014年12月22日 13:39
  • 328

素数相关算法(一)

最近在网上看了不少关于素数的问题,也学习到了不少东西,决定整理一下,算是一个学习的总结吧。 首先想说明的是,虽然素数可以进行很深入的研究(如在RSA公共密钥系统的应用),但是由于我对数论的不甚熟悉,所...
  • hihihaha
  • hihihaha
  • 2004年07月09日 23:13
  • 1132

素数相关算法(二)

素数算法(二) 上次讨论了简单的素数判定的算法,不过这个算法对于位数较大(一般小于108)的素数判定就显得相当力不从心了。比如在素数目前最广泛的应用领域-公共密钥体系中,一般选择的素数都是相当大的(通...
  • hihihaha
  • hihihaha
  • 2004年07月11日 12:06
  • 2531

素数的相关算法

判断一个数是否为素数和 判断101-200之间有多少个素数,并输出所有素数。
  • sunrainamazing
  • sunrainamazing
  • 2017年01月19日 14:24
  • 131

数组算法的总结

数组相关算法的学习。
  • jiayichendddd
  • jiayichendddd
  • 2014年08月14日 14:08
  • 720
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【转】素数相关算法总结
举报原因:
原因补充:

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