筛选一万亿内的素数

筛选一万亿内的素数
筛选一万亿内的素数

我发现了筛法的计算公式(最后稿)

我发现了筛法的计算公式 孟庆馀[江苏连云港] 2010年5月 [摘要]: 笔者在探索中,发现了有关素数与合数关系的三条主要规律: 1、区段(区域)性的规律。 2、逐项相除四舍五入的规律。 3、随从数的规律。 根据这三条规律推导出一个公式, 它可以计算出任一已知素数后边紧跟的那个素数和任意大的一个自然数之前共有多少个素数的问题。 这个公式是: m p = 2N -N [ (211p p +311p p -3211p p p ±…±13211-n p p p p Λ)+ ( )1111132131211-±±++-n p p p p p p p p p ΛΛ(-n p 1)]+(1-n ) [关键词]: 筛法公式、逐项相除、四舍五入、区段、随从数。 [正文]: 笔者在多年的探索中,发现了有关素数与合数关系的一些规律,根据这些规律找到了一个可以对埃拉多斯染尼氏(Eratosthenes )筛法进行计算的公式,即“筛法计算公式”(它包括计算素数和计算奇合数两个公式),计算素数的公式也可以称为“素数公式"。给素数找出一个通项表达式,即已知任一素数后边紧跟的那个素数的公式,这是一个缠绕着数学家的世界难题,时至今日都没有解决。笔者的这个公式能较好地解决任一已知素数后边紧跟的那个素数的问题。 一、“筛法计算公式”(用于计算素数) m p = 2N -N [ (211p p +311p p -3211p p p ±…±13211-n p p p p Λ)+ ()1111132131211-±±++-n p p p p p p p p p ΛΛ(-n p 1)]+(1-n ) …(1) 式中m p 为1~N 数列中素数个数;N 为任意大的自然数(2n p ≤N <21+n p ) ;n p p p p ,,,,321K 为素数,其中:1p = 2,2p = 3,3p = 5,…,6p = 13,…;n ≥2 。

素数普遍公式

素数普遍公式 目录[隐藏] 一、引言 二、素数普遍公式 三、素数的个数 四、公式的用途 五、素数普遍公式在认识形成中的作用和意义 思考题 一、引言 二、素数普遍公式 三、素数的个数 四、公式的用途 五、素数普遍公式在认识形成中的作用和意义 思考题 [编辑本段] 一、引言 2000多年前欧几里德在证明素数无穷多时就埋下了寻求素数普遍公式的伏笔 素数普遍公式 ,以布劳维尔为首的直觉主义学派认为:“你没有给出第n个素数是如何构造的,就不能算是好的证明”。2000多年来,数论学最重要的一个任务,就是寻找素数普遍公式,为此,一代又一代数学精英,耗费了巨大的心血,始终未获成功。黎曼曾想用他的ζ函数数的“零点”来逼近素数普遍公式,至今未获成功。也有人反向思考,用素数普遍公式逼近“零点”来解决黎曼猜想。希尔伯特在1900年的国际数学家大会上说:对黎曼公式进行了彻底讨论之后,或许就能够严格解决哥德巴赫问题和孪生素数问题。实际在哲学上,只要有一个明确的定义,就应该有一个公式。 [编辑本段] 二、素数普遍公式

公元前250年同样是古希腊的数学家埃拉托塞尼提出一种筛法: (一)“要得到不大于某个自然数N的所有素数,只要在2---N中将不大于√N的素数的倍数全部划去即可”。 (二)将上面的内容等价转换:“如果N是合数,则它有一个因子d满足1

C 使用筛选法求100以内的素数

C 使用筛选法求100以内的素数 C++使用筛选法求100以内的素数,具体问题分析及其代码如下: 【问题分析】 我们可以把100个数看作是沙子和石子,素数是石子,非素数的是沙子,弄个筛子,将沙子筛掉,剩下的就是素数。 1至100这些自然数可以分为三类: (1) 单位数:仅有一个数1. (2) 素数:这个数大于1,且只有它本身和1这样两个正因数。 (3) 合数:除了1和他自身以外,还有其他的正因数。 【代码如下】 /******************************************************** /* 程序名:素数筛选 /* 编程时间:2009年7月27日 /* 主要功能:求素数 *********************************************************/ #include using namespace std;//编译命令 #include const int MAX=100;//定义常量MAX int main()//主函数 { int prime[MAX+100]={0};//定义变量并初始化 int i,j,k=sqrt(MAX); for(i=2; i<=k; i++)//枚举筛数 { if(prime[i]==0)//如果这个数没被筛,就看看 { j=i*2;//将原数扩大二倍初始化给j do { prime[j]=1;//将j筛掉 j+=i; //再扩大一倍 } while(j<=MAX);//直到最大 } } for(i=2; i<=MAX; i++) { if(prime[i]==0)//循环输出 cout<

筛法求素数

筛法求素数 目录 基本思想 C语言实现 pascal实现: 1C++实现: 2python 实现: 基本思想 用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列,1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。如有: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是: 3 5 7 9 11 13 15 17 19 21 23 25 27 29 剩下的数中3最小,是素数,去掉3的倍数,如此下去直到所有的数都被筛完,求出的素数为: 2 3 5 7 11 13 17 19 23 29 C语言实现 1、算法一:令A为素数,则A*N(N>1;N为自然数)都不是素数。 #define range 2000 bool IsPrime[range+1]; //set函数确定i是否为素数,结果储存在IsPrime[i]中,此函数在DEV C++中测试通过 void set(bool IsPrime[]) { int i,j; for(i=0;i<=range;++i) IsPrime[i]=true; IsPrime[0]=IsPrime[1]=false; for(i=2;i<=range;++i) { if(IsPrime[i]) { for(j=2*i;j<=range;j+=i) IsPrime[j]=false; } } } 2、 说明:解决这个问题的诀窍是如何安排删除的次序,使得每一个非质数都只被删除一次。中学时学过一个因式分解定理,他说任何一个非质(合)数都可以分解成质数的连乘积。例如,16=4^2,18=2 * 3^2,691488=2^5 * 3^2 * 7^4等。如果把因式分解中最小质数写在最左边,有16=4^2,18=2*9,691488=2^5 * 21609,;换句话说,把合数N写成N=p^k * q,此时q当然是大于p的,因为p是因式分解中最小的质数。由于因式分解的唯一性,任何一个合数N,写成N=p^k * q;的方式也是唯一的。由于q>=p的关系,因此在删除非质数时,如果已知p是质数,可以先删除P^2,p^3,p^4,... ,再删除pq,p^2*q,p^3*q,...,(q是比p大而没有被删除的数),一直到pq>N为止。 因为每个非质数都只被删除一次,可想而知,这个程序的速度一定相当快。依据Gries与Misra的文章,线性的时间,也就是与N成正比的时间就足够了(此时要找出2N的质数)。(摘自《C语言名题精选百则(技巧篇)》,冼镜光编著,机械工业出版社,2005年7月第一版第一次印刷)。代码如下: #include #include using namespace std; int main() { int N; cin>>N; int *Location=new int[N+1]; for(int i=0;i!=N+1;++i) Location[i]=i; Location[1]=0; //筛除部分int p,q,end; end=sqrt((double)N)+1; for(p=2;p!=end;++p) { if(Location[p]) { for(q=p;p*q<=N;++q) { if(Location[q]) { for(int k=p*q;k<=N;k*=p) Location[k]=0; } } } } int m=0; for(int i=1;i!=N+1;++i) { if(Location[i]!=0) { cout<

用筛法求出100以内的全部素数

例6、用筛法求出100以内的全部素数,并按每行五个数显示。 【问题分析】 ⑴把2到100的自然数放入a[2]到a[100]中(所放入的数与下标号相同); ⑵在数组元素中,以下标为序,按顺序找到未曾找过的最小素数minp,和它的位置p(即下标号); ⑶从p+1开始,把凡是能被minp整除的各元素值从a数组中划去(筛掉),也就是给该元素值置0; ⑷让p=p+1,重复执行第②、③步骤,直到minp>Trunc(sqrt(N)) 为止; ⑸打印输出a数组中留下来、未被筛掉的各元素值,并按每行五个数显示。 用筛法求素数的过程示意如下(图中用下划线作删去标志): ① 2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 {置数} ② 2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 {筛去被2整除的数} ③ 2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 {筛去被3整除的数} …… 2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 {筛去被整除的数} Program Exam53; const N=100; type xx=1 .. N; {自定义子界类型xx(类型名)} Var a: array[xx] of boolean; i,j: integer; Begin Fillchar(a,sizeof(a),true); a[1] := False; for i:=2 to Trunc(sqrt(N)) do if a[I] then for j := 2 to N div I do a[I*j]:= False; t:=0; for i:=2 to N do if a[i] then Begin write(a[ i ]:5); inc(t); if t mod 5=0 then writeln end; End. 【例3】输入十个正整数,把这十个数按由大到小的顺序排列(将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序中的“简单选择排序”是一种较简单的方法) 分析:要把十个数按从大到小顺序排列,则排完后,第一个数最大,第二个数次大,……;因此,我们第一步可将第一个数与其后的各个数依次比较,若发现,比它大的,则与之交换,比较结束后,则第一个数已是最大的数。同理,第二步,将第二个数与其后各个数再依次比较,又可得出次大的数。如此方法进行比较,最后一次,将第九个数与第十个数比较,以决定次小的数。于是十个数的顺序排列结束。 例如下面对5个进行排序,这个五个数分别为829105。按选择排序方法,过程如

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

PS:本来没有决心把这个东西写完的,结果早上写到一半,出去吃个饭,没保存,回来手一抖直接关掉了,好不容易写了一大半了,只能重新写了,坑爹啊,但就是这个插曲,本来还没有决心的我,一下子却坚定了信念,一点要把这个东西写完。就这样开始吧 BY:Lee 下面,我们重新开始 ═══════════════════════════════════════════ 如何判断一个数是否是素数呢 ═══════════════════════════════════════════也许你会认为这是一个简单的问题,但事实上,世界上任何一个问题,都没有你想象中的那么简单1 + 1 是否等于2 ,这便是一个简单而又复杂的问题,呵呵。 突然想把这个东西换一种风格来写了,就这样扯淡扯下去吧。扯的时候文章中多少有内容来自于网络,没有侵权的意思,如果作者看到还请见谅。 ═══════════════════════════════════════════下面正式进入正题 ═══════════════════════════════════════════ 一、朴素判断素数 ═══════════════════════════════════════════1. 这种方法被誉为笨蛋的做法: 一个数去除以比它的一半还要大的数,一定除不尽的,这还用判断吗?? 很容易发现的,这种方法判断素数,对于一个整数n,需要n-2 次判断,时间复杂度是O(n)在n非常大或者测试量很大的时候,这种笨蛋做法肯定是不可取的。

2. 改进一下下小学生的做法: 3. 再改进一下聪明的小学生的做法 对于一个小于n的整数X,如果n不能整除X,则n必定不能整除n/X。反之相同一个明显的优化,就是只要从2枚举到√n 即可。 因为在判断2的同时也判断了n/2。到√n时就把2到n-1都判断过了。 在这里,这个聪明的小学生还用了i*i <= n 来代替sqrt(n), 这里是避免了调用函数sqrt(),其消耗时间很大, 特别是在大量数据测试的时候消耗很明显。 这个算法的时间复杂度,与最前面的笨蛋做法就好多了, 不过这里好像用sqrt()也没问题啊,,,,这个就不太清楚了。 但是做一个测试发现,如果是这样额话,每一次判断都要计算i*i,

素数的线性筛法

素数的线性筛法 //整体思想是从自然数 2 开始与所有之前已经确定的素数相乘后的数标记为合数就能把素数一个不漏地找出来 #include #include #include #include #include #include #include #include #include #include #include #include #define MID(x,y) ( ( x + y ) >> 1 ) #define L(x) ( x << 1 ) #define R(x) ( x << 1 1 ) #define FOR(i,s,t) for(int i=(s); i<(t); i++) #define FORD(i,s,t) for(int i=(s-1); i>=t; i--) #define BUG puts("here!!!") #define STOP system("pause") #define file_r(x) freopen(x, "r", stdin) #define file_w(x) freopen(x, "w", stdout) using namespace std; const int SULEN = 1000000; bool flag[SULEN+1];// 是否为素数 int prime[1000001];// 存储的素数 int sum[SULEN+1];//n 的所有质因子的和 void xianxingshai(void) { int count,i,j; fill( flag,flag+SULEN,true ); // 初始化假设每个都为素数 fill( sum ,sum +SULEN, 0 ); //初始化质因子和为0 flag[0] = flag[1] = false; //0 和 1 不是素数 for( count = 0, i = 2; i <= SULEN; i++ )// 从 2 开始判断是否为素数 { if( flag[i] ) // 如果是素数 { prime[count++] = i;sum[i] = i; //将值传到prime 数组中 } for( j = 0; j < count && i*prime[j] <= SULEN; j++ ) // 将包含该质因数的合数都 标为 false

线性筛法求素数的原理与实现

何为线性筛法,顾名思义,就是在线性时间内(也就是O(n))用筛选的方法把素数找出来的一种算法,没用过线性筛素数法的人可能会奇怪,用遍历取余判定素数不是也是线性时间的吗,没错,但是确切的说线性筛法并不是判定素数的,而是在线性时间内求出一个素数表,需要判定是否是素数的时候只要看该数是否在表内就可以瞬间知道是不是素数。 比如想求10000以内的素数,定义表int a[10000],进行线性筛选后,a[n]的值就代表n是不是素数,a[n]如果是1,就代表n是素数,a[n]如果是0,就代表n不是素数,这就是查表。再判定其他的素数也是一样,不用再做任何计算。 而如果用遍历取余,那么每判定一个数都要从头开始再遍历一遍,而线性筛法只在开始一次性运算完,以后只要查表即可,查表通常只需要1条语句。所以如果你的程序从始至终只需要判定那么几次素数那么用遍历取余即可,但是如果需要多次判定素数,而且这个数还不是很小的话,那么线性筛法就会体现出巨大的优越性来。 线性筛法的核心原理就是一句话:每个合数必有一个最大因子(不包括它本身),用这个因子把合数筛掉,还有另一种说法(每个合数必有一个最小素因子,用这个因子筛掉合数,其实都一样,但是我觉得这种方法不太容易说明,这种方法我会在最后给出简略说明)。这个很容易证明:这个小学就知道合数一定有因子,既然是几个数,就一定有最大的一个。最大因子是唯一的,所以合数只会被它自己唯一的因子筛掉一次,把所有合数筛掉后剩下的就全是素数了。 先假设一个数i,一个合数t,i是t最大的因数,t显然可能并不唯一(例如30和45的最大因数都是15)。那么如何通过i知道t呢,t必然等于i乘以一个比i小的素数。先来说这个数为什么一定要比i小,这很显然,如果是i乘上一个比它大的素数,那么i显然不能是t 最大的因子。再来说为什么要是素数,因为如果乘上一个合数,我们知道合数一定可以被分解成几个素数相乘的结果,如果乘上的这个合数x=p1*p2*……,那么 t = i * x = i * p1 * p2……很显然p1* i也是一个因数,而且大于i。所以必须乘上一个素数。 比i小的素数一定有不少,那么该乘哪一个呢,既然t不唯一,那么是不是都乘一遍呢?很显然不行,虽然t不唯一,但全乘一遍很显然筛掉的数的数量远远超过合数的数量。我们先给出结论: 任意一个数i = p1*p2*……*pn,p1、p2、……pn都是素数,p1是其中最小的素数, 设T 为i * M的积(显然T就成了一个合数),也就是T = i * M,(M是素数,并且M<=p1),那么T的最大的因数就是i。 是的,乘上的数要小于等于i最小的质因数。

求素数的算法及其复杂度分析

求素数的算法及其复杂度分析2008-04-05 17:46关于搜寻一定范围内素数的算法及其复杂度分析 ——曾晓奇 关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法。看了以后相信 对大家一定有帮助。 正如大家都知道的那样,一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n)--n的开方,那么我们可以用这个性质用最直观的方法 来求出小于等于n的所有的素数。 num = 0; for(i=2; i<=n; i++) { for(j=2; j<=sqrt(i); j++) if( j%i==0 ) break; if( j>sqrt(i) ) prime[num++] = i; //这个prime[]是int型,跟下面讲的不同。 } 这就是最一般的求解n以内素数的算法。复杂度是o(n*sqrt(n)),如果n 很小的话,这种算法(其实这是不是算法我都怀疑,没有水平。当然没 接触过程序竞赛之前我也只会这一种求n以内素数的方法。-_-~)不会耗时很多. 但是当n很大的时候,比如n=10000000时,n*sqrt(n)>30000000000,数量级相当大。在一般的机子它不是一秒钟跑不出结果,它是好几分钟都跑不 出结果,这可不是我瞎掰的,想锻炼耐心的同学不妨试一试~。。。。 在程序设计竞赛中就必须要设计出一种更好的算法要求能在几秒钟甚至一秒钟之内找出n以内的所有素数。于是就有了素数筛法。 (我表达得不清楚的话不要骂我,见到我的时候扁我一顿我不说一句话。。。) 素数筛法是这样的: 1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false. 2.然后: for( i=3; i<=sqrt(n); i+=2 ) { if(prime[i]) for( j=i+i; j<=n; j+=i ) prime[j]=false; } 3.最后输出bool数组中的值为true的单元的下标,就是所求的n以内的素数了。 原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数。如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质 数的倍数筛掉。 一个简单的筛素数的过程:n=30。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

ACM 筛素数总结

【总结】关于求素数的说【两种筛法】 (学习小结,请无视) 素数大家都很熟了,不多说了,这里只想说一下求素数。 当然先是唯一素因子分解定理:合数a仅能以一种方式,写成如下的乘积形式:a=p1e1p2e2…prer 其中pi为素数,p1sqrt(n)时筛中剩下的数就已经都是素数了。 //用数组prime[MAXN]记录是否为素数; //prime[i]为0表示i为素数,否则为合数 int prime[MAXN]={0}; for(i=2;i*i<=n;i++) { if(prime[i]==0) { for(j=i+i;j<=n;j+=i) prime[j]=1; }

查找满足要求的素数c++课程设计

河北工业大学计算机软件基础(vc) 学院:电气信息类班级:电信c1124 姓名:李悠学号:110706 一,题目:查找满足要求的素数 二,设计思路 1,总体设计 (1)分析程序的功能,用来判断整数d是否为素数,任意输入一个数d,判断是否为可逆素数,如果皆为素数的话,该数d 为可逆素数,在d为可逆素数的基础上xd=d+1为偶数,找 出满足xd=d1+d2的所有数时,其中要求d1与d2均为素数(2)系统总体的机构 每一次查找的过程可以由这几部分完成,编制函数void prim()用筛选法求素数,编制函数void compose(in d)将一个数分解为两个素数的形式,编制主函数int main()将输入的数值设置为字符型。正序赋值给整数得到数值n,当输入的不是数值时提示重复输入直到纠正为止,然后将整数逆序得到m,先判断n是否为素数输出不是素数,若为素数再判断m是否为素数,若都为素数将n+1分解成两个素数 每一次查找关注的结果有三个:(1)是否输入的为数字,若不

是反复输入直到输入的是数字为止,(2)是否为素数(3)是否为可逆素数(4)将素数分解成两个素数相加的形式并输出结果2各功能模块的设计:说明各功能模块的实现方法 (1)prim模块 该函数没有返回值所以函数类型为void型,要实现的功能是用筛选法求出素数,将数组中下,标为0和1的元素设置为0,下标为n-2的元素设置为1,然后从下标为2的元素开始查找当发现当前位置的数组元素为1时,将下标是当前下标的2倍3倍……的那些元素全部设置为0。重复(2)直到考查了数组全部元素,那些值依旧为1的元素下标都是素数,数组元素的值为1是素数,为0不是素数 (2)compose模块 该函数没有返回值,所以函数类型为void型,要实现的功能是将一个数分解为两个素数,通过判断条件prim【i】是否1来判断分解的数是否为素数,最后找出满足条件的数对(3)m ain函数 将输入的数值设置为字符型,当输入的是数值时正序赋值给整数得到数值n,当输入的不是数值时提示重复输入直到正确为止,然后将整数逆序得到m,通过判断prim【n】的值判断n 是否为素数,若为0则输出结果n不是素数,若为1则输出结果为素数。然后判断prim【m】的值,若为1输出它且是可逆素数,并调用函数compose进行素数分解,若prim【m】的值

孪生素数筛法

孪生素数筛法 齐宸 首先研究一下个位为3的合数。 要想两数相乘的结果个位为3,这两数字的个位有且只有两种组合1、3或7、9。自然数(10k+1)乘以自然数(10i+3),可以利用初中数学将其转化为10[(10i+3)k+i]+3形式。去个位后转换为(10i+3)k+i。 同法可得个位为1、3、7、9全部无个位合数公式,结果如下: 个位为1:(10i+1)k+i、(10i+3)k+7i+2、(10i+9)k+9i+8 个位为3:(10i+3)k+i、(10i+7)k+9i+6 个位为7:(10i+7)k+i、(10i+3)k+9i+2 个位为9:(10i+9)k+i、(10i+3)k+3i、(10i+7)k+7i+4 这里的关键是去掉个位。 显然个位为1的无个位合数公式可以求得所有个位为1的合数,计算结果中没有的数字必是个位为1的素数,也就说可以筛出所有个位为1的素数。这实际上就是个位为1的素数筛法。 同样个位1和个位为3的5组无个位合数公式合用,可以计算得到所有个位为1和个位为3的合数,也就等同于得到了任意一个自然数内所有个位为1和3的非孪生素数。而剩余数字全部是孪生素数。此时的非孪生素数与孪生素数不是2个数字,全部是一个数字。比如个位1和个位为3的5组无个位合数公式合用能计算出10以下9个数字中的6个数字,分别是2、3、5、6、8、9,这些无个位数字分别填上个位数字1、3后变成两个数字,如2变成21-23显然这组不是孪生素数。同样,31-33、51-53、61-63、81-83、91-93也不是孪生素数。而计算结果中没有的数字1、4、7,这3个数字填上个位1和3后分别变成了11-13、41-43、71-73,全部是孪生素数。这种方法实质上就是孪生素数筛法。当然仅是个位为1和3的这类孪生素数。(17-19和29-31这样类型的孪生素数变换公式后也可求出)。 这里有三个新观点: 1、孪生素数可以用一个数字指代。 如用1指代孪生素数11-13,用4指代孪生素数41-43。相反的如2、3是非孪生素,分别对应的是21-23和31-33。 2、孪生素数存在补集:非孪生素数。

2012计算机二级上级类型题--素数

素数 1. 程序填空 用筛选法可得到2—n(n<10000)之间的所有素数,方法是:首先从素数2开始,将所有2的倍数的数从数表中删去(把数表中相应位置的值置成0);接着从数表中找下一个非0数,并从数表中删去该数的所有倍数,依此类推,直到所找的下一个数等于n为止。这样会得到一个序列:2、3、5、7、11、13、17、19、23……函数fun用筛选法找出所有小于等于n的素数,并统计素数的个数作为函数值返回。第一处for(j=a[i]*2;j<=n;j+=a[i]) 第二处while(a[i]= =0) 第三处if(a[i]!=0) 1 程序填空 给定程序中,函数fun的功能是:统计所有<=n(n>2)的素数的个数,素数的个数作为函数值返回。 第1处for ( j=2; j=i) 2. 程序修改 给定程序MODI1.C中函数fun的功能是:计算并输出high以内最大的10个素数之和。high的值由主函数传给fun函数。 /**found**/ while((2<=high)&&(n<10)) /**found**/ yes=0;break; 2. 程序修改 给定程序MODI1.C中函数fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。 /**found**/ y=1; /**foune**/ d=a-i; 2 程序修改 给定程序MODI1.C中函数fun的功能是:找出一个大于形参m且紧随m的素数,并作为函数值带回。 /**found**/ if(i%k= =0) /**found**/ if(k>=i) } 1程序修改 给定程序MODI1.C中函数fun的功能是:读入一个整数k(2≤k≤10000)打印它的所有质因子(即所有为素数的因子)。 /**found**/ IsPrime (int n) /**found**/ if (!(n%i)) 2 程序修改 给定程序MODI1.C中函数fun的功能是:判断一个整数是否是素数,若是返回1,否则返回0. /**found**/ K++; /**found**/ if (m==k) 3. 程序设计 编写函数fun,函数的功能是求出小于或等于lim的所有素数并放在aa数组中,函数返回所求出的素数的个数。函数fun中给出的语句仅供参考。 #include #define MAX100 int fun(int lim,int aa[MAX]) {int i,j,k=0; for(i=2;i<=lim;i++) { for(j=2;j<=(i/2);j++) if(i%j==0)break; if(j>(i/2))aa[k++]=i; } return k;} 3程序设计 请编写函数fun,函数的功能是:将大于形参m且紧靠m的k个素数存入xx所指的数组中。19,23,29,31,37,函数fun中给出的语句仅供参考。

用筛法求素数

输出素数表,方法之一就是舍弃空间,换取时间,也就是用一个大数组来存放每一个数是不是素数。这样用筛法求素,大大的减少了时间。下面的筛法求素程序求(不输出,即不定义OUT)1亿以内的素数只需要十几秒的时间,远小于输出所需的时间。 这个程序用一个char数组来存放每一个奇数是不是素数的信息。一个char是一个字节8位,存放8个数。 Program prime_char.cpp: #include #include #include //#define DEBUG #define OUT using namespace std; //常量定义 const long MAX=100000000; const long CHAR_MAX=int(MAX/16+1); const char byt[8]={128,64,32,16,8,4,2,1}; // 变量定义 /********************************** prime saves whether n is a prime the value of n is like: prime[0]: 3, 5, 7, 9,11,13,15,17 prime[1]:19,21,23,25,27,29,31,33 **********************************/ unsigned char prime[CHAR_MAX]; // 函数声明 inline bool isprime(long); inline void setcomposite(long); void primeinitiate(void); void out(long); //函数定义 /**************************************** *Function main * ****************************************/ int main() { #ifdef DEBUG test(); #else long n,m; primeinitiate(); n=5; while(n*n<=MAX) { if (isprime(n))

黎曼假设(2)素数个数公式

黎曼假设(2)素数个数公式《黎曼假设》(2)突破性解答 素数分布规则③——素数个数公式 千禧年世界数学难题之四解答 1900年希尔伯特23个问题第8题 世界数学难题解答 作者:中国数论研究者 江西景德镇 乐平林登发 (经济师) 邮箱:2208831455@https://www.360docs.net/doc/904550119.html, 2015.7.8

㈠前言 随着《黎曼假设》素数分布被级数筛法突破性解答,《孪生素数猜想》素数对被序号筛法突破性解答,在数论史上还有关于素数无限发展,无限延伸从0至∞的发展趋势,它们的数量计算还是渺茫,难以捉摸。 古今很多学者創造过一些计算素数个数公式,不是属于数理逻辑推导出来的,而是捕风捉影硬套产生的,所以很多公式一用就失效,目前世界上还沒有素数个数精确公式,那怕局部区域使用的也沒有,大家都在渴望,期盼着…… 当前是万民创业,万众创新时代,陷入僵局的素数分布问题应运而生,应运而解,上可顺乎天意,下和谐接地气,素数分布个数公式要出世了,古老数论将有突破性进展。 ㈡基础理论引导 自然数是素数及素数变換形态模式共同产生的混合体,六进制1633规则级数筛法揭露自然数中素数分布规则,只有在阳奇数6N+1和在阴奇数6N-1中有素数存在。 阳奇数中的素数叫阳素数,阴奇数中的素数叫阴素数,从此知道素数也有阴阳之分。 由六进制中6分解:6=1X2x3中得到1,2,3,是0号原始素数。 因此素数理念革命性改变了,素数有三种:原始素数,阳素数,阴素数。因此 素數数量精确公式: ∑全体素数分布数量个数 =∑原始素数+∑阳素数+∑阴素数。 后二种统称普通素数,1是先天性原始素数。 在阳奇数中除阳素數以外,还有阳复合“积”合数,可以用十字街规则把它筛选出来。同样在阴奇数除阴素数以外,还有阴复合“积”合数,也可以用十字街规则把它筛选出来。 这些复合“积”合数在相对区域来说数量是变化的,是动态的。随区域变化而变化,分布数量十分不均匀。所以在无数次探索中釆取以动制动求解,才符合数理逻辑。只有转换思维方法,简单而直接的答案就可能是最合理可行的。 ㈢主题: 素数分布规则③——素数个数公式 从铁路规则双轨数中结构分析: ①原始素数即0号素数1,2,3,共三个。

计算机题目33题(附带题解)

第1~10题为基础题,第11~20题为提高题,第21~33为综合题 每位同学分别从基础题、提高题、综合题中各选一题,按学号顺序循环选择,用word写报告。每班评出优秀的9名同学,上台做报告,每人期末成绩额外加5分。请每班自己定出评分标准。 占总分的15% 基础题: 【1 Prime Frequency】 【问题描述】 给出一个仅包含字母和数字(0-9, A-Z 以及a-z)的字符串,请您计算频率(字符出现的次数),并仅报告哪些字符的频率是素数。 输入: 输入的第一行给出一个整数T( 0

小规模素数筛法效率及复杂度分析

小规模素数筛法效率及复杂度分析 全规模筛法,开方筛法,Eratosthenes筛法的复杂性分析讨论 和Miller Rabin筛法的实现难点分析 计算机学院2011级1班计算机科学与技术(师范)张季伦 本文主要讨论几种小规模教学常用的素数筛法的算法时间复杂性以及实现难度,这几种算法分别是全规模筛法,开方筛法,Eratosthenes筛法和Miller Rabin筛法。其中我将对前三种算法进行较为全面的分析,计算证明和代码实现;对于Miller Rabin算法(它其实是一种随机算法),我将给出一个并不完美但包含其主要思想的算法实现。 我将从思想,原理,复杂度和实现代码几个方面来讨论我所提到的算法。 1.全规模遍历筛法: a)原理:根据素数的基本定义:只能被1或本身整除的数。我们通过用小于其本 身大于等于2的数去除它,判断余数过后方可知道其素性。 b)伪代码: 1.INPUT N; 2.DEFINE FLAG=0; 3.DEFINE I; 4.FOR(I=2;I

用筛法求100以内的素数

1. 用筛法求100以内的素数。 算法:先将1~100放置于一个一维数组中,然后依次判断每个数是否素数,若不是素数将该元素置0,最后输出不为0的数。 如何判断一个数是否素数?素数定义是只能被1和本身整除的数,设置除数n=2~a[i]-1 特殊的两个数1、2,不需要判断 定义变量:int a[100],i,n; 输入数据:循环赋值,for(i=0;i<100;i++) a[i]=i+1; 处理:双重循环,外层循环控制访问数组元素,内层循环控制除数的变化 for(i=2;i<100;i++) for(n=2;n<=a[i]/2;n++) if(a[i]%n==0) a[i]=0; 输出:for(i=0;i<100;i++)if(a[i]!=0) printf(“%3d”,a[i]); 2. 编写一个程序,计算若干学生的某门功课的平均成绩、标准差,找出最高分和最低分。算法:循环输入成绩,需要求和,然后求平均成绩;循环sqrt(求和(xi-aver)*(xi-aver))定义变量:float grade[N],max,min,aver,bzc,sum;int i; 输入数据:for(i=0;igrade[i]) min=grade[i];} aver=sum/N; sum=0; for(i=0;ia[j]) p=j; if(p!=i) { t=a[p];a[p]=a[i];a[i]=t;}} 设置一个变量p,去记住最小值的下标, 4. 根据上题的内容1,编一程序在数组中查找一个数。要求: ⑴若有该数,则输出该数,否则输出找不到的信息; ⑵用顺序查找实现; ⑶用折半查找实现。 顺序查找:输入要查找的数x,for(i=0;i