求素数的几种方法

求素数的几种方法
求素数的几种方法

求素数的几种方法

什么是素数?

质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。

方法(1)

由此定义可以得出求素数的第一种方法,也是最基本的方法,设要判断的数为M,就是把2到它本身M的数都遍历一遍,在遍历的过程中发现如果又被它整除的数,就记录这个数n,判断M是否和N相等,若M==N,就说明该数是素数。

#include

using namespace std;

int function(int &m)

{

int i,j;

for(i=2;i<=m;i++)

{

if(m%i==0)

{j=i;break;}

}

if(j==m)

return 1;

else

return 0;

}

int main()

{

int k,m;

cout<<"please input m"<

cin>>m;

k=function(m);

if(k==0)

cout<

else

cout<

return 0;

}

方法(2)

由于方法(1)采用的方法是从二开始它本身遍历的,这种方式遍历的太多,按照数分奇数、偶数的原则,可以把遍历的数过滤一半,过滤的原则就是先对一个数进行奇偶判断,若是奇数,只对从3到它本身的奇数进行求余运算,同理若是偶数,一定不是素数。

#include

using namespace std;

int function(int &m)

{

int i,j=1;

if(m%2==0)

return 0;

else

for(i=3;i<=m;i=i+2)

{

if(m%i==0)

{j=i;break;}

}

if(j==m)

return 1;

else

return 0;

}

int main()

{

int k,m;

cout<<"please input m"<

cin>>m;

k=function(m);

if(k==0)

cout<

else

cout<

return 0;

}

方法(3)

方法(2)采用的遍历的方式,遍历的是从二开始的它本身的奇数,这种遍历的方式遍历的数据还是有点多,其实要想判断一个数是否是素数,只需要判断到该数的一半即可,在方法(2)的基础上,遍历的数据量大大减少。这种方法采用的原理很简单,对该数进行判断是素数的过程中,如果超过它本身的一半,进行求余的结果永远不会为0,除非是该数对该数求余。

#include

#include

using namespace std;

int function(int &m)

{

int i;

if(m % 2 == 0)

return 0;

for( i=3;i<=m/2;i+=2)

if(m % i == 0)

return 0;

return 1;

}

int main()

{

int k,m;

cout<<"please input m"<

cin>>m;

k=function(m);

if(k==0)

cout<

else

cout<

return 0;

}

方法(4)

采用方法(3)进行筛选的数据量还是很大,为了是数据的筛选量减少,还可以采用将被判断数m,进行开方作为判断结束的条件。因为开平方后的数是M的最大因子,最大因子之后的数对判断该数是否是素数没有意义。

#include

#include

using namespace std;

int function(int &m)

{

int i;

if(m % 2 == 0)

return 0;

for( i=3;i<=sqrt(m);i+=2)

if(m % i == 0)

return 0;

return 1;

}

int main()

{

int k,m;

cout<<"please input m"<

cin>>m;

k=function(m);

if(k==0)

cout<

else

cout<

return 0;

}

C语言求质数

试编写一个程序,找出2->N之间的所有质数。希望用尽可能快的方法实现。 【问题分析】: 这个问题可以有两种解法:一种是用“筛子法”,另一种是从2->N检查,找出质数。 先来简单介绍一下“筛法”,求2~20的质数,它的做法是先把2~20这些数一字排开: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 先取出数组中最小的数,是2,则判断2是质数,把后面2的倍数全部删掉。 2 | 3 5 7 9 11 13 15 17 19 接下来的最小数是3,取出,再删掉3的倍数 2 3 | 5 7 11 13 17 19 一直这样下去,直到结束。 筛法求质数的问题时,非质数的数据有很多是重复的。例如,如果有一个数3×7×17×23,那么在删除3的倍数时会删到它,删7、17、23时同样也会删到它。有一种“线性筛法”,可以安排删除的次序,使得每一个非质数都只被删除一次。从而提高效率。因为“筛法”不是我要介绍的重点,所以就不介绍了。 现在我来介绍第二种方法。用这种方法,最先想到的就是让从2~N逐一检查。如果是就显示出来,如果不是,就检查下一个。这是正确的做法,但效率却不高。当然,2是质数,那么2的倍数就不是质数,如果令i从2到N,就很冤枉地测试了4、6、8……这些数?所以第一点改建就是只测试2与所有的奇数就足够了。同理,3是质数,但6、9、12……这些3的倍数却不是,因此,如果能够把2与3的倍数跳过去而不测试,任意连续的6个数中,就只会测试2个而已。以6n,6n+1,6n+2,6n+3,6n+4,6n+5为例,6n,6n+2,6n+4是偶数,又6n+3是3的倍数,所以如果2与3的倍数都不理会,只要测试的数就只留下6n+1和6n+5而已了,因而工作量只是前面想法的2/6=1/3,应该用这个方法编程。 还有个问题,就是如果判断一个数i是否为素数。按素数的定义,也就是只有1与本身可以整除,所以可以用2~i-1去除i,如果都除不尽,i就是素数。观点对,但却与上一点一样的笨拙。当i>2时,有哪一个数可以被i-1除尽的?没有,为什么?如果i不是质数,那么i=a×b,此地a与b既不是i又不是1;正因为a>1,a至少为2,因此b最多也是i/2而已,去除i的数用不着是2~i-1,而用2~i/2就可以了。不但如此,因为i=a×b,a与b不能大于sqrt(i),为什么呢?如果a>sqrt(i),b>sqrt(i),于是a×b>sqrt(i)*sqrt(i)=i,因此就都不能整除i了。如果i不是质数,它的因子最大就是sqrt(i);换言之,用2~sqrt(i)去检验就行了。 但是,用2~sqrt(i)去检验也是浪费。就像前面一样,2除不尽,2的倍数也除不尽;同理,3除不尽,3的倍数也除不尽……最理想的方法就是用质数去除i。 但问题是这些素数从何而来?这比较简单,可以准备一个数组prime[],用来存放找到的素数,一开始它里面有2、3、5。检查的时候,就用prime[]中小于sqrt(i)的数去除i即可,如果都除不尽,i就是素数,把它放如prime[]中,因此prime[]中的素数会越来越多,直到满足个数为止! 不妨用这段说明来编写这个程序,但是程序设计的时候会有两个小问题: 1.如果只检查6n+1和6n+5?不难发现,它们的距离是4、2、4、2……所以,可以先定义一个变量gab=4,然后gab=6-gab; 2.比较是不能用sqrt(i),因为它不精确。举个例子,i=121,在数学上,sqrt(i)自然是11,但计算机里的结果可能是10.9999999,于是去除的数就是2、3、5、7,而不含11,因此121就变成质数了。解决这个问题的方法很简单,不要用开方,用平方即可。例如,如果p*p<=i,则就用p去除i。而且它的效率比开方高。 【程序清单】: #include int creat_prime(int prime[],int n,int total)

北师版五年级数学上册第三单元测试题含答案

北师版五年级数学上册第三单元测试题含答案 (共4套) 第三单元跟踪检测卷 一、填一填。(第9题3分,其余每空1分,共24分) 1.一个数既是24的因数,又是24的倍数,这个数是(),它的因数有(),100以内它的倍数有()。 2.聪聪的QQ号码是一个六位数,这个数能同时被2,3,5整除。已知这个 数的前三个数字是469,后三个数字尽量最小,聪聪的QQ号码是()。 3.一个合数至少有()个因数,一个质数只有()个因数。4.同时是2,3,5的倍数的最小数是(),同时是2,3,5的倍数的最小三位数是()。 5.一个三位数同时是3和5的倍数,且百位上既是奇数又是合数,这个三位数最大是()。 6.36的最大因数是(),28的最小倍数是()。 7.76至少要加上()才是3的倍数;76至少要加上()才是5的倍数。8.按要求在方框里填上合适的数字。 (1)38(2和3的倍数) (2)945(2和5的倍数) (3)7015(3和5的倍数) (4)280(2,3和5的倍数) 9.在括号里填上合适的质数。

30=()+()+()40=()+()+() 10.两个质数的差是14,积是51,这两个数是()和();两个质数的和是20,积是91,这两个数是()和()。 二、辨一辨。(对的在括号里画“√”,错的画“×”)(每题1分,共5分) 1.自然数可以分为奇数和偶数,也可以分为质数和合数。() 2.个位是3,6,9的数一定是3的倍数。() 3.在自然数中,奇数都是质数,偶数都是合数。() 4.除2外,其他任意两个质数的和都是偶数。() 5.是6的倍数的数一定既是2的倍数也是3的倍数。() 三、选一选。(把正确答案的字母填在括号里)(每题2分,共10分) 1.2,3,5,7这四个数都是()。 A.奇数B.偶数C.质数D.合数 2.一个数既是8的倍数,又是48的因数,同时它还是2和3的倍数,这个数是()。 A.8 B.16 C.24或48 D.32 3.当a是自然数时,2a+1一定是()。 A.奇数B.偶数C.奇数或偶数D.不能确定 4.下列关系式中,不一定成立的是()。 A.奇数+奇数=偶数B.偶数+偶数=偶数 C.奇数×偶数=偶数D.质数+质数=合数 5.下列说法中,有()个是正确的。 ①一个数的最小的倍数是它本身②0是最小的自然数

筛法求素数

筛法求素数 目录 基本思想 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<

2020年五年级数学下册第二单元跟踪检测卷

第二单元跟踪检测卷 一、填一填。(第2、9题每题2分,其余每空1分,共24分) 1.一个数既是24的因数,又是24的倍数,这个数是(),它的因 数有(),100以内它的倍数有()。 2.聪聪的QQ号码是一个六位数,这个数能同时被2、3、 5整除。已知这个数的前三个数字是469,后三个数字 尽量最小,聪聪的QQ号码是()。 3.一个合数至少有()个因数,一个质数只有()个因数。 4.同时是2,3,5的倍数的最小数是(),最小三位数是()。 5.一个三位数同时是3和5的倍数,且百位上既是奇数又是合数,这 个三位数最大是()。 6. 36的最大因数是(),28的最小倍数是()。 7. 76至少要加上()才是3的倍数;至少要加上()才是5的 倍数。 8.按要求在方框里填上合适的数字。 (1)38(2和3的倍数) (2)945(2和5的倍数) (3)7015(3和5的倍数) (4)280(2、3和5的倍数) 9.在括号里填上合适的质数。 30=()+()+()40=()+()+()

10.两个质数的差是14,积是51,这两个数是()和();两个质 数的和是20,积是91,这两个数是()和()。 二、辨一辨。(对的在括号里打“√”,错的打“×”。每题1分,共5分) 1.自然数可以分为奇数和偶数,也可以分为质数和合数。() 2.个位是3、6、9的数一定是3的倍数。() 3.在自然数中,奇数都是质数,偶数都是合数。() 4.除2外,其他任意两个质数的和都是偶数。() 5.是6的倍数的数一定既是2的倍数也是3的倍数。() 三、选一选。(将正确答案的序号填在括号里。每题2分,共10分) 1.2,3,5,7这四个数都是()。 A.奇数B.偶数C.质数D.合数2.一个数既是8的倍数,又是48的因数,同时它还是2和3的倍数, 这个数是()。 A.8 B.16 C.24或48 D.32 3.当a是自然数时,2a+1一定是()。 A.奇数B.偶数 C.奇数或偶数D.不能确定 4.下列关系式中,不一定成立的是()。 A.奇数+奇数=偶数B.偶数+偶数=偶数 C.奇数×偶数=偶数D.质数+质数=合数 5.下列说法中,有()个是正确的。 ①一个数的最小的倍数是它本身②0是最小的自然数

素数普遍公式

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

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

不同算法的100到999之间的素数代码

//////////////////不同算法的100到999之間的素數代碼!///////////////////////////////////////// #include #include int main () { int a,i; for(a=100;a<=999;a++) { for(i=2;isqrt(a)) printf("%d ",a); } getch(); }//以"i>sqrt(a)"來判定a经过"a%i==0"到达i做大人为达到判定为合数的要求来确定素数

用筛法求出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。按选择排序方法,过程如

人教版小学数学五年级下册2单元测试卷(含答案及周测培优)

第2单元跟踪检测卷 因数与倍数 一、填一填。(2、9题每题2分,其余每空1分,共24分) 1.一个数既是24的因数,又是24的倍数,这个数是( ),它的因数有( ),100以内它的倍数有( )。 2.聪聪的QQ号码是一个六位数,这个数能同时2、3、5 整除。已知这个数的前三个数字是469,后三个 数字尽量最小,聪聪的QQ号码是( )。 3.一个合数至少有( )个因数,一个质数只有( )个因数。4.同时是2,3,5的倍数的最小数是( ),最小三位数是( )。5.一个三位数同时是3和5的倍数,且百位上既是奇数又是合数,这个三位数最大是( )。 6.36的最大因数是( ),28的最小倍数是( )。 7.76至少要加上( )才是3的倍数;至少要加上( )才是5的倍数。 8.按要求在方框里填上合适的数字。 (1)38(2和3的倍数) (2)945(2和5的倍数) (3)7015(3和5的倍数)

(4)280(2、3和5的倍数) 9.在括号里填上合适的质数。 30=( )+( )+( ) 40=( )+( )+( ) 10.两个质数的差是14,积是51,这两个数是( )和( );两个质数的和是20,积是91,这两个数是( )和( )。 二、辨一辨。(对的画“√”,错的画“×”)(每题1分,共5分) 1.自然数可以分为奇数和偶数,也可以分为质数和合数。( ) 2.个位是3、6、9的数一定是3的倍数。( ) 3.在自然数中,奇数都是质数,偶数都是合数。( ) 4.除2外,其他任意两个质数的和都是偶数。( ) 5.是6的倍数的数一定既是2的倍数也是3的倍数。( ) 三、选一选。(把正确答案的序号填在括号里)(每题2分,共10分) 1.2,3,5,7这四个数都是( )。 A.奇数B.偶数C.质数D.合数 2.一个数既是8的倍数,又是48的因数,同时它还是2和3的倍数,这个数是( )。 A.8 B.16 C.24或48 D.32 3.当a是自然数时,2a+1一定是( )。 A.奇数B.偶数C.奇数或偶数D.不能确定4.下列关系式中,不一定成立的是( )。 A.奇数+奇数=偶数B.偶数+偶数=偶数 C.奇数×偶数=偶数D.质数+质数=合数

孪生素数个数公式

孪生素数个数计算公式 李联忠 (营山中学 四川营山 637700) 摘要:孪生素数个数计算公式 ∑ -∑-∑-? ??? ????++ +??? ? ?? ???++??? ? ? ? ??++ =≠==p p p x p p x p x L i i i i j k j k j k kj i k k k I n n n n 2 112,12 11 )1() 1() 1(、 +q-h n 前的素数均是n 的约数时,孪生素数个数计算公式 p p p p p p i i n L 22 12 2 1 1 -? ?-?-? = +q-h 关键词:数论 孪生素数 公式 中图分类号: 文献标识号: 文章编号: 孪生素数:相差2的素数叫孪生素数。 引理:若 p p n i 21 i 2+≤< , p p p p p i i k 1 2 1 ,, ,, ,3, 2+== 为连续素数,则在1、2、 3…n 中去掉 p k 的倍数,余下的数(1除外)全为素数。 分析下面相差2的数组 (1,3) (2,4)…(m,m+2)…(n,n+2) (1≤m ≤n) 若 p p n i 21 i 2+≤< p p p p p i i k 1 2 1 ,, ,, ,3, 2+== 为连续素数,在1、2、3…n 中去 掉除以 p k 余0和余( 2-p k )的数,则余下的数组(m,m+2)中,m和(m+2) 都不是前i个素数的倍数,据引理,余下的数组全为孪生素数(若n 为素数,n+2=p i 21 +, (n,n+2)除外,i=1,(1,3)除外),仿照素数公式可得出类似的孪生素数计算公式 ∑ -∑ -∑ ∑ + + ++ + + + + - =≠≠=≠==] [][ ][ ][p p p x p p p x p p x p x L i i i i j k l j k l j k l lkj i j k j k j k kj i k k k i n n n n n 2 1 12,1,,3 ,1,1 ) 1() 1( =q-h ) )2,(),3,1(2101(该去而未去指或、倍数被去掉了;作为的孪生素数,因为它们 表不大于 +=n n h q p i ()(mod 20,),(mod 20);(mod 02 2 1 1p x p x p x i i 或或≡≡≡

素数基本定理及其应用

素数基本定理及其应用----求解j阶孪生素数对 吴敏金 (mjwu@https://www.360docs.net/doc/f74607617.html,) 1,从素数的埃氏筛法引出素数基本定理 【定理】素数基本定理设已知有限长度k的素数序列p1, p2, …, pk ={2,3,5,……},那么,不定方程组 Q=p1m1+b1 =p2m2+b2 …… =pkmk+bk (1) 其中,bi=1,…,pi-1, mi>0,在(pk, pk^2)的解呈如下形式,q=p1p2…pkt+s (2) 且为素数。反之,在(pk, pk^2)中的所有素数,如p(k+1)等, 必为此不定方程的解。 (注:在本文中, p,m,b,d后面的数字1,2,…,k,i及(…)都是下标。) 证明由中国剩余定理知,对于给定的b1,b2,…,bk,不定方程组(1)在p1p2…pk内必有唯一的同余类解。所以,对于不同的b1,b2,…bk,不定方程组(1)在p1p2…pk内有(p1-1)(p2-1)…(pk-1)个同余类解。 由素数判定定理:对于任意的n<=N,如果n不能被不超过

sqrt(N)的所有素数整除,那么n必为素数。取N=pk^2,当解在(pk, pk^2)范围内,解q=p1p2…pkt+s为素数。 反之也然。 (注:不定方程组(1)解的范围可扩大到(pk, p(k+1)^2),定理仍旧成立。但p(k+1)必须在解不定方程组之后才得到,确定稍许麻烦。) 素数基本定理等价于素数的埃氏筛法。事实上,在去除1的自然数列中,式(1-1)相当于保留p1=2,筛去2的倍数;式(1-2)相当于保留p2=3,筛去3的倍数,……式(1-k)相当于保留pk,筛去pk的数。此时自然数列余留下来的在(pk, pk*pk)之内的就是素数p(k+1),p(k+2),…等。 因此,不用埃氏筛法,而从k=1,p1=2出发,用辗转相除法等方法可求解不定方程组(1)。例如, k=1 q=2m1+1; 令m1=1, q<2*2则p2=3。 k=2,q1=2m1+1=3m2+1, q1=6t+1; 令t=1,q1=7<3*3 q2=2m1+1=3m2+2, q2=6t+5; 令t=0,q1=5<3*3 得p3=5, p4=7。 k=3,类似可得p5=11, p6=13, p7=17, p8=19, p9=23<5*5。 ………… 素数基本定理给出了素数的一个递推通式。它为素数的研究提供了强有力的工具[1]。下面给出实例。

求素数列表和判断素数的算法

求素数列表和判断素数的算法 有兴趣阅读本文的读者,应该对素数概念是十分熟悉的了。用计算机程序实现素数计算,集中在2个主要问题上: ?判断一个正整数是否是素数-(算法A) ?求一定范围内的素数列表- (算法B) 关于素数的算法,根据素数的数学性质,大家都会想到如下几个方面: ?用遍历求模的方式判断素数 ?素数都是奇数,可以在奇数数列中寻找素数 ?利用开方来缩小搜索的范围 然后,求素数的计算是复杂的,如果算法写得不好,则耗时较高。在百度百科“素数”条目中的算法程序,是值得商榷的。很多方法是O(N2)的算法。 为此,在本文中探讨了求素数列表和判断素数这两个算法,力图使算法可以达到O (N Log(N))优化级别。在本文中,算法语言选用C#。 1,判断素数的简单实现(算法A-1) ///

///算法A-1,判断素数 /// ///待测正整数 ///是否为素数(为了简化,1以下的整数皆为素数) public static bool IsPrime(int number) { // 为了简化,1以下的整数皆为素数 if(number <= 2) { return true; } // 奇偶性 if (number % 2 == 0) { return false; } // 利用开方缩小范围,优化效果十分明显 int range = (int)Math.Sqrt(number) + 1; // 从3开始的奇数列 for (int current = 3; current <= range; current += 2) { // 判断是否为素数 if (number % current == 0)

不定方程的解法

基本介绍编辑本段 不定方程是数论的一个分支,它有着悠久的历史与丰富的内容。所谓不定方程是指解的范围为整数、正整数、有理数或代数整数的方程或方程组,其未知数的个数通常多于方程的个数。 古希腊数学家丢番图于三世纪初就研究过若干这类方程,所以不定方程又称丢番图方程,是数论的重要分支学科,也是历史上最活跃的数学领域之一。不定方程的内容十分丰富,与代数数论、几何数论、集合数论等等都有较为密切的联系。1969年,莫德尔较系统地总结了这方面的研究成果。 2发展历史编辑本段 不定方程是数论中最古老的分支之一。古希腊的丢番图早在公元3世纪就开始研究不定方程,因此常称不定方程为丢番图方程。Diophantus,古代希腊人,被誉为代数学的鼻祖,流传下来关于他的生平事迹并不多。今天我们称整系数的不定方程为「Diophantus方程」,内容主要是探讨其整数解或有理数解。他有三本著作,其中最有名的是《算术》,当中包含了189个问题及其答案,而许多都是不定方程组(变量的个数大于方程的个数)或不定方程式(两个变数以上)。丢番图只考虑正有理数解,而不定方程通常有无穷多解的。 研究不定方程要解决三个问题:①判断何时有解。②有解时决定解的个数。③求出所有的解。中国是研究不定方程最早的国家,公元初的五家共井问题就是一个不定方程组问题,

公元5世纪的《张丘建算经》中的百鸡问题标志中国对不定方程理论有了系统研究。秦九韶的大衍求一术将不定方程与同余理论联系起来。百鸡问题说:“鸡翁一,直钱五,鸡母一,直钱三,鸡雏三,直钱一。百钱买百鸡,问鸡翁、母、雏各几何?”。设x,y,z分别表鸡翁、母、雏的个数,则此问题即为不定方程组的非负整数解x,y,z,这是一个三元不定方程组问题。 3常见类型编辑本段 ⑴求不定方程的解; ⑵判定不定方程是否有解; ⑶判定不定方程的解的个数(有限个还是无限个)。 4方程相关编辑本段 4.1一次不定方程 二元一次不定方程的一般形式为ax+by=c。其中 a,b,c 是整数,ab ≠ 0。此方程有整数解的充分必要条件是a、b的最大公约数整除c。若a、b互质,即它们的最大公约数为1,(x0,y0)是所给方程的一个解,则此方程的解可表为{(x=x0-bt,y=y0+at)|t为任意整数}。 S(?2)元一次不定方程的一般形式为a1x1+a2x2+…+asxs=n0a1,…,as,n为整数,且a1…as≠0。此方程有整数解的充分必要条件是a1,…,as的最大公约数整除n。 埃拉托塞尼筛法产生的素数普遍公式是一次不定方程公元前300年,古希腊数学家欧几里得就发现了数论的本质是素数,他自己证明了有无穷多个素数,公元前250年古希腊数学家埃拉托塞尼发明了一种筛法: 一“要得到不大于某个自然数N的所有素数,只要在2---N中将不大于√N的素数的倍数全部划去即可”。 二后来人们将上面的内容等价转换:“如果N是合数,则它有一个因子d满足1

VB常用算法——素数

VB常考算法(三)素数: 1、算法说明 所谓素数是指只能被1和它本身整除的数。 1)判断某数是否为素数。根据循环控制变量来判断。 算法说明:根据素数只能被1和它本身整除的性质,我们可以使用循环依次判断2到n-1(或者Sqr(n))之间有没有被它整除的数,一旦有退出循环,退出循环后通过检验循环变量的值来判断是不是素数。即,当循环正常退出,循环变量的值等于n时,该数是素数;当循环提前退出,循环变量的值小于等于n-1,该数不是素数。 程序代码如下: Private Sub Command1_Click() Dim n As Integer, i As Integer n = Val(Text1.Text) If n < 1 Then MsgBox "请正确输入数据" Else n = Val(Text1.Text) For i = 2 To n - 1 If n Mod i = 0 Then Exit For Next i If i = n Then MsgBox n & "是素数" Else MsgBox n & "不是素数" End If End If End Sub 2)判断某数是否为素数。根据标志位flg来判断。 Private Sub Command1_Click() Dim n As Integer, i As Integer Dim flg As Boolean flg = True n = Val(Text1.Text) If n < 1 Then MsgBox "请正确输入数据" Else n = Val(Text1.Text) For i = 2 To n - 1 If n Mod i = 0 Then flg = False Next i If flg = True Then MsgBox n & "是素数" Else MsgBox n & "不是素数"

质数

质数 ——数学小论文 质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没 法被其他自然数整除的数。比1大但不是素数的数称为合数。1和0既非 素数也非合数。 许多年来,数学家们一直致力于寻找一个公式,使之能够方便而迅捷 地导出所有的质数,但很遗憾的是他们并没有成功。 1.质数的个数 在研究如何导出这个公式之前,我们首先要弄清楚的一点就是,质数 的个数是否为有限个?换言之,是否存在一个最大的质数呢? 关于这一点,古希腊数学家欧几里得(Euclid)研究过,并在他的著作 《几何原本》中给出了一个简洁而优美的证明,这里他使用的是反证法。 为了研究这个问题,我们不妨假设已知质数的个数是有限的,最大的 那一个用N来表示。现在我们把所有已知质数都乘起来,再把这个积加 上1 写成数学式就是: (2×3×5×7×11……×N)+1 很明显这个数不能被已知的任何一个质数整除,因为从这个数的产生 方式来看就知道,拿所有的质数去除,最后都会余1 因此,要么这个数本身就是一个质数,要么有比N更大的数能将其除尽。不管怎样,都与N是最大的质数这一假设相矛盾。 我们可以得到结论,质数的个数是无穷的。换言之,没有最大的质数。

2.质数的分布 质数的分布是没有规律的,往往让人莫名其妙。例如2、3、5、7、11、13、17、101、401、601、701都是质数,但与这些数类似的301 (=7×43)和901(=17×53)却是合数。 3.质数的判断 质数的判断有两种方法: 1.只能被1和本身整除。 也就是说根据质数的定义,它的质因数只有1与它本身的数是质数 2.不能被小于它的平方根的所有质数整除就是质数。 以73为例。73的算数平方根√73≈8.5440037 。小于这个数的质数有2,3,5,7 。这四个数均不能除尽73,那么73就是一个质数。 4.质数公式 1.筛选法 例如,我想要找出100以内的质数,不借助他人,应该怎么办呢? 利用筛法,我可以将100以内的整数写在纸上,划掉0,1留下2,划掉所 有2的倍数,再划掉3的倍数,留下3,一直往后,到7(由于11的平方121>100 所以我们划完7的倍数就可以了),就可以找出来了。当然,要的数越多,需要划掉x的倍数就越多。 不过这个方法只适用于小范围的求导质数。即使范围仅仅扩大到1000,手算也是很吃力的。

C语言求素数问题算法

1.自然数是0,1,2…… 2.素数是2,3,5……(不包括1的只能背1和它本身整除的自然数) 【1】求10000以内的所有素数。 素数是除了1和它本身之外再不能被其他数整除的自然数。由于找不到一个通项公式来表示所有的素数,所以对于数学家来说,素数一直是一个未解之谜。像著名的哥德巴赫猜想、孪生素数猜想,几百年来不知吸引了世界上多少优秀的数学家。尽管他们苦心钻研,呕心沥血,但至今仍然未见分晓。 自从有了计算机之后,人们借助于计算机的威力,已经找到了2216091以内的所有素数。 求素数的方法有很多种,最简单的方法是根据素数的定义来求。对于一个自然数N,用大于1小于N的各个自然数都去除一下N,如果都除不尽,则N为素数,否则N为合数。 但是,如果用素数定义的方法来编制计算机程序,它的效率一定是非常低的,其中有许多地方都值得改进。 第一,对于一个自然数N,只要能被一个非1非自身的数整除,它就肯定不是素数,所以不 必再用其他的数去除。 第二,对于N来说,只需用小于N的素数去除就可以了。例如,如果N能被15整除,实际 上就能被3和5整除,如果N不能被3和5整除,那么N也决不会被15整除。 第三,对于N来说,不必用从2到N一1的所有素数去除,只需用小于等于√N(根号N)的所有素数去除就可以了。这一点可以用反证法来证明: 如果N是合数,则一定存在大于1小于N的整数d1和d2,使得N=d1×d2。 如果d1和d2均大于√N,则有:N=d1×d2>√N×√N=N。 而这是不可能的,所以,d1和d2中必有一个小于或等于√N。 基于上述分析,设计算法如下: (1)用2,3,5,7逐个试除N的方法求出100以内的所有素数。 (2)用100以内的所有素数逐个试除的方法求出10000以内的素数。 首先,将2,3,5,7分别存放在a[1]、a[2]、a[3]、a[4]中,以后每求出一个素数,只要不大于100,就依次存放在A 数组中的一个单元中。当我们求100—10000之间的素数时,可依次用a[1]-a[2]的素数去试除N,这个范围内的素数可以不保存,直接打印。 【2】用筛法求素数。 简单介绍一下厄拉多塞筛法。厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2-N的

最全面所有数学公式和概念

公式 长方形的周长=(长+宽)×2 C=(a+b)×2 正方形的周长=边长×4 C=4a 三角形的面积=底×高÷2。公式S= a×h÷2 正方形的面积=边长×边长公式S= a×a 长方形的面积=长×宽公式S= a×b 平行四边形的面积=底×高公式S= a×h 梯形的面积=(上底+下底)×高÷2 公式S=(a+b)h÷2 内角和:三角形的内角和=180度。 长方体的表面积=(长×宽+长×高+宽×高)×2 正方体的表面积=棱长×棱长×6 S =6a 长方体的体积=长×宽×高公式:V=abh 长方体(或正方体)的体积=底面积×高公式:V=abh 正方体的体积=棱长×棱长×棱长公式:V=aaa 圆的周长=直径×π 公式:L=πd=2πr 圆的面积=半径×半径×π 公式:S=πr 圆柱的表(侧)面积:圆柱的表(侧)面积等于底面的周长乘高。公式:S=ch=πdh=2πrh 圆柱的表面积:圆柱的表面积等于底面的周长乘高再加上两头的圆的面积。公式:S=ch+2s=ch+2πr 圆柱的体积:圆柱的体积等于底面积乘高。公式:V=Sh 圆锥的体积=1/3底面×积高。公式:V=1/3Sh 分数的加、减法则:同分母的分数相加减,只把分子相加减,分母不变。异分母的分数相加减,先通分,然后再加减。分数的乘法则:用分子的积做分子,用分母的积做分母。 分数的除法则:除以一个数等于乘以这个数的倒数。 算术方面 1、加法交换律:两数相加交换加数的位置,和不变。 2、加法结合律:三个数相加,先把前两个数相加,或先把后两个数相加,再同第三个数相加,和不变。 3、乘法交换律:两数相乘,交换因数的位置,积不变。 4、乘法结合律:三个数相乘,先把前两个数相乘,或先把后两个数相乘,再和第三个数相乘,它们的积不变。 5、乘法分配律:两个数的和同一个数相乘,可以把两个加数分别同这个数相乘,再把两个积相加,结果不变。 如:(2+4)×5=2×5+4×5 6、除法的性质:在除法里,被除数和除数同时扩大(或缩小)相同的倍数,商不变。O除以任何不是O的数都得O。简便乘法:被乘数、乘数末尾有O的乘法,可以先把O前面的相乘,零不参加运算,有几个零都落下,添在积的末尾。 7、什么叫等式?等号左边的数值与等号右边的数值相等的式子 叫做等式。 等式的基本性质:等式两边同时乘以(或除以)一个相同的数, 等式仍然成立。 8、什么叫方程式?答:含有未知数的等式叫方程式。 9、什么叫一元一次方程式?答:含有一个未知数,并且未知数的次数是一次的等式叫做一元一次方程式。 学会一元一次方程式的例法及计算。即例出代有χ的算式并计算。 10、分数:把单位“1”平均分成若干份,表示这样的一份或几分的数,叫做分数。 11、分数的加减法则:同分母的分数相加减,只把分子相加减,分母不变。异分母的分数相加减,先通分,然后再加减。 12、分数大小的比较:同分母的分数相比较,分子大的大,分子小的小。异分母的分数相比较,先通分然后再比较;

相关文档
最新文档