【数学】素数相关算法、结论总结

弱菜开始学数论了,不定时更新。。。

一.素数定理:

素数分布:小于x的素数大约有 x/ln(x)个

推论:如果Pn为第n个素数 那个Pn约等于n*ln(n);

二.素数测试

1.sqrt(n)的朴素测试。这个就不多说了,数据范围小的时候比较方便

2.nlogn的筛法

void setprime()
{
    memset(prime, 0, sizeof(prime)); //为了方便赋值。令prime[i]=0 表示 i是素数  for (int i=2;  i<N;  i++)
      if (!prime[i])
      {          for (int k=i*i; k<N; k+=i)
            prime[k]=1;
      }
    return;
}   

3.线性筛

2中筛法会重复筛掉部分合数,因此复杂度还可以优化,得到线性筛

void setprime()
{
         for(long i = 2 ; i < N ; i ++)
           {
        if(! isNotPrime[i])
             prime[num_prime ++]=i;
        for(long j = 0 ; j < num_prime && i * prime[j] <  N ; j ++)
            {
                  isNotPrime[i * prime[j]] = 1;
              if( !(i % prime[j] ) )
                break;    //关键优化
        }
    }
    return ;
}  

此筛法的关键在于注释中的break。prime[]数组记录素数。当i可以整除prime[j]的时候break,原理见 http://blog.csdn.net/leolin_/article/details/6642126

2,3中的筛法单独使用都只能筛出较小范围的素数,范围较大,如1e9时,数组开不了,时间也是不允许的

4.改进的筛法素数测试

此方法是2.3中方法的应用和延伸,用来筛超大范围的质数。。由1中朴素判断法我们可以知道,判断素数只需要判断sqrt范围内有没有因子即可,所以在范围变大的时候,我们可以先用筛法筛出

sqrt(n)中的素数并保存在数组中。范围1e9的话只需要筛出30000多内的素数即可,再用保存下来的素数去对更大范围的数进行素数测试。如poj2689(最大所测试数达到了2147483647)

就是这种方法的直接应用

AC代码:

#include<stdio.h>
#include<string.h>
#include <algorithm>
using namespace std;
#define N 100007
bool isprime0[50000];
int prime0[50000];
long long prime[100000];
bool isprime[1000010];
int num0;
int num;
long long x,y;
void setprime()
{
    num=0;
    for(int i=2;i<=50000;i++)
    {
        if(!isprime0[i])
            prime0[num0++]=i;
        for(int j=0;j<num0&&prime0[j]*i<=50000;j++)
        {
            isprime0[i*prime0[j]]=1;
            if(!(i%prime0[j]))
                break;
        }
    }
}
void setprime1()
{
    memset(isprime,0,sizeof(isprime));
    for(int i=0;i<num0;i++)
    {
        long long j=x/prime0[i];
        while(j*prime0[i]<x)
            j++;
        for(j=j*prime0[i];j<=y;j+=prime0[i])
            if(j/prime0[i]>1)
                isprime[j-x]=1;
    }
    if(x==1)
        isprime[0]=1;
    num=0;
    for(long long i=0;i<=y-x;i++)
    {
        if(!isprime[i])
            prime[num++]=x+i;
    }
}
int main()
{
    setprime();
    while(scanf("%I64d%I64d",&x,&y)!=EOF)
    {
        setprime1();
        long long a,b,c,d;
        long long mi=10000000,ma=0;
        if(num<2)
        {
            puts("There are no adjacent primes.");
            continue;
        }
        for(int i=0;i+1<num;i++)
        {
            long long p=prime[i+1]-prime[i];
            if(p<mi)
            {
                a=prime[i];
                b=prime[i+1];
                mi=p;
            }
            if(p>ma)
            {
                c=prime[i];
                d=prime[i+1];
                ma=p;
            }
        }
        printf("%I64d,%I64d are closest, %I64d,%I64d are most distant.\n",a,b,c,d);
    }
    return 0;
}
时间: 2024-11-10 12:58:02

【数学】素数相关算法、结论总结的相关文章

数学计算相关算法原理及实现

http://blog.csdn.net/pipisorry/article/details/46008603 欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 计算原理 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r ,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r ,因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,

素数相关算法

1.素性测试 //素性测试o(sqrt(n)) 1 int is_prime(int n) 2 { 3 for(int i=2;i*i<=n;i++){ 4 if(n%i==0) return 0; 5 } 6 return n!=1; 7 } //约束枚举o(sqrt(n)) 1 vector<int> divisor(int n) { 2 vector<int> res; 3 for(int i=2;i*i<=n;i++) { 4 if(n%i==0) { 5 re

素数相关?(有关素数的题持续更新中)x

素数(大体举几个栗子): 素数相关知识: 素数概念: 最大公约数只有1和它本身的数叫做质数(素数) 素数小性质: 1.大于一的整数必有素因数. 2.设p是素数,n是任意一个整数 能够推出p|n,(p,n)=1; 3.设p是素数,a,b为整数,若p|ab,则ab中至少有一个能被p整除 4.素数有无穷多个证明: (素数与整数之间的关系:1整除2互素) 假定正整数中只有有限个素数 设p1,p2……pk为从小到大排列起来的数 且N=p1*p2*……pk 设M=N+1 如果M为素数,那么M要大于p1,p2

采样方法(二)MCMC相关算法介绍及代码实现

采样方法(二)MCMC相关算法介绍及代码实现 2017-12-30 15:32:14 Dark_Scope 阅读数 10509更多 分类专栏: 机器学习 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Dark_Scope/article/details/78937731 0.引子 书接前文,在采样方法(一)中我们讲到了拒绝采样.重要性采样一系列的蒙特卡洛采样方法,但这些方法在高维空间时都

探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤(转)

第 2 部分: 深入推荐引擎相关算法 - 协同过滤 本系列的第一篇为读者概要介绍了推荐引擎,下面几篇文章将深入介绍推荐引擎的相关算法,并帮助读者高效的实现这些算法. 在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.它以其方法模型简单,数据依赖性低,数据方便采集 , 推荐效果较优等多个优点成为大众眼里的推荐算法“No.1”.本文将带你深入了解协同过滤的秘密,并给出基于 Apache Mahout 的协同过滤算法的高效实现.Apache Mahout 是 ASF 的一个

素数推断算法(高效率)

chuanbindeng 的 素数推断算法 关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法.看了以后相信 对大家一定有帮助. 正如大家都知道的那样,一个数 n 假设是合数,那么它的全部的因子不超过sqrt(n)--n的开方,那么我们能够用这个性质用最直观的方法 来求出小于等于n的全部的素数. num = 0; for(i=2; i<=n; i++) {  for(j=2; j<=sqrt(i); j++) if( j%i==0 ) b

数学解题和算法的关系(自己的一些想法)

那么在写这篇随笔的时候,我在想我是不是要到数学系深造几年再回来,后来想了想,算了自己搞搞吧,去数学系没那个精力和时间,倒不如自己结交几个数学系的朋友,自己平时研究研究.ok,言归正传,下面是我的一些思考,关于数学解题和算法的关系(呐,我才大一,可能对这方面理解不是很深刻,只是自己的一些思考)我在想数学解题和算法是如此的相似,我们在高中时,老师会和我们说想不到简便办法,就用通法,确实如此,算法也是为了解决问题,方便解决问题,但如果一直追求简便,可能花费太多时间,反而不划算,倒不如先放一放,过段时间

linux学习之路之加密类型及其相关算法

加密类型及其相关算法 随着互联网越演越烈,互联网上的各种攻击层出不穷,因此在互联网上相互传递的信息越来越不安全,因此为了防止用户在互联网上传递的数据被窃取,因此我们很有必须加强传递的数据的安全性. 数据的安全性主要包括以下三个方面: 数据的机密性:保证传递的数据不被读取 要想使传递的数据不被读取,可以对这些数据进行加密,因为默认这些数据是以明文来传递的 整个加密过程可以这么来理解: 加密:plaintext--->转换规则--->ciphertext 解密:ciphertext--->转

深入推荐引擎相关算法 - 协同过滤

集体智慧和协同过滤 什么是集体智慧 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web 应用中利用集体智慧构建更加有趣的应用或者得到更好的用户体验.集体智慧是指在大量的人群的行为和数据中收集答案,帮助你对整个人群得到统计意义上的结论,这些结论是我们在单个个体上无法得到的,它往往是某种趋势或者人群中共性的部分. Wikipedia 和 Google 是两个典型的利用集体智慧的 Web 2.0 应用: Wikip