关于最大素数

这些天很无聊的了解了一下几个数学题

由对王垠的40行代码引发,先是研究了尾递归,后又由于王垠的文章《谈P=NP?》了解了一下当今数学的七大难题,于是又去查其中一个庞加莱猜想的事情(庞加莱猜想已经解决,后有丘成桐事件),另外哥德巴赫猜想的相关事情(陈景润的1+2,非七大难题),最后又回到P/NP问题(七大难题之一),结果不小心又无聊的去查了一下最大素数问题,更无聊的是还跟着去证明了一下。。。跟我的编程工作毫无关系嘛。。。我发现我的思维也太散了。。。

关于最大素数问题

是否有最大素数,下面是百度百科给出的证明过程:

不存在最大质数!

上小学的时候,我们就知道所有的自然数可以分为质数(素数)和合数两类,当然还特别规定了“1既不是质数,也不是合 数”。100以内的质数,从小到大依次是:2、3、5、7、11、13、17、19、……、83、89、97。不用说了,你一定会背下来。那么质数的个数 是不是有限多的呢?

在解决这个问题之前,我们先来看看另一个问题:怎样判断一个已知自然数是不是质数。比如,143是不是质数?

你一定会按照下面这个步骤去判断: 先用最小的质数2去除143,不能整除;再用3去试试,还是不行;再依次用5、7试试,还是不行;11呢?行!143=11×13,所以143不是质数,而是合数。所以,判断一个数是不是质数,只需用比这个数小的所有质数,依次去除它即可,如果都不能整除的话,这个数就一定是质数;相反,只要这个数能够被某一个质数整除,这个数就一定是合数。这种方法所依据的原理是:每一个合数都可以表示成若干个质数的乘积。不用说,这叫做“分解质因数”,也是小学数学的知识。

我们先假设质数的个数是有限多的,那么必然存在一个“最大的质数”,设这个“最大的质数”为N。下面我们找出从1到N之间的所有质数,把它们连乘起来,就是:

2×3×5×7×11×13×……×N

把这个连乘积再加上1,得到一个相当大的数M:

M=2×3×5×7×11×13×……×N+1

那么这个M是质数还是合数呢? 乍一想,不难判断,既然N是最大的质数,而且M>N,那么M就应该是合数。既然M是合数,就可以对M分解质因数。可是试一下就会发现,我们用从1到N之间的任何一个质数去除M,总是余1!这个现实,又表明M一定是质数。

这个自相矛盾的结果,无非说明: 最大的质数是不存在的!如果有一个足够大的质数N,一定可以像上面那样,找到一个比N更大的质数M。既然不存在最大的质数,就可以推知自然数中的质数应该有无限多个。

可同时百度百科有人给出了另一个反例:

M=2×3×5×7×11×13×……×N+1,用从1到N之间的任何一个质数去除M,总是余1!这个现实,又表明M一定是质数。此结论大错特错,例如,2×3×5×7×11×13+1=30031=59×509,30031是个合数。

看到这个反例,我开始怀疑以上证明的正确性,于是想了好久,终于想明白,该证明是正确的!

反例的错误点在于他没有除比30031小的所有素数,仅除到13,而要证明一个素是否素数必须要除比他小的所有素数均不能整除才可以证明该数是素数。

关于快速证明一个数是否素数采用该数除以比他小的所有素数即可快速判断而无需除比他小的所有数,这个很好证明!每一个合数必然可以表示成若干素数的乘积,一样很容易证明。这里不赘述。

我们之所以对以上证明过程存在质疑,主要来自于该证明的结论是N如果是最大素数,那么M还是素数。于是通过反例N=13,则M=30031,可30031是合数即M是合数,与上面的推论M是素数矛盾了!!这是怎么回事呢?是否说明这个推论是错误的呢?经过思考我们发现,证明中认定M是素数的前提是首先我们得认定N是最大的素数!!才推出M还是素数,然后自相矛盾,即可反证N不是最大素数。而反例中的前提条件即出错,N=13,显然13不是最大素数他就不可能成为N。

我们先不考虑M和N谁比较大,按证明即先认定N为最大的素数,那么可推出M必定为素数这个结论。最后发现M>N,故N就不是最大素数。

然后再来看反例:”M=2×3×5×7×11×13×……×N+1,用从1到N之间的任何一个质数去除M,总是余1!这个现实,又表明M一定是质数。此结论大错特错,例如,2×3×5×7×11×13+1=30031=59×509,30031是个合数。“,其实M除以1到N总余1表示M一定是素数这个结论并没有错,因为这个结论的前提条件是N是我们假定的最大素数成立的前提,而不是指任意素数,作者混淆概念,如例子将13=N,推出出30031为M,而M不是素数所以推翻结论,这前提条件就不正确了。

时间: 2024-11-06 03:33:23

关于最大素数的相关文章

177. 有限制的素数

177. [USACO Jan07] 有限制的素数 ★   输入文件:qprime.in   输出文件:qprime.out   简单对比 时间限制:1 s   内存限制:128 MB Farmer John 开始给奶牛们标记上素数的牌子,贝茜注意到了这一切,她对各种数的牌子很好奇. 请帮助贝茜算出从A到B (1 ≤ A ≤ B ≤ 4,000,000; B ≤ A + 1,000,000; B ≤ A + 2,000,000 ),其中包含数字D的素数的个数. 素数是只有两个两个约数(1 和 它

素数应用

输入一个数 分解尾三个数想乘 如果三个数其中有两个为素数->yes 否则no 1 //素数升级 2 //功能:??已知N是正整数,?它可拆写成三个正整数N1.N2和N3之和的形式N=N1+N2+N3.? 3 //请编程序打印出满足上式的全部组合,并当N1.N2和N3中至少有两个是素数时打印"YES"否则打印"NO".? 4 //如N = 5时输出:? 5 //5 = 1 + 1 + 3?????NO? 6 //5 = 1 + 2 + 2?????YES? 7

尝试用filter()函数删除1~100的素数

题目来自"廖雪峰的官方网站--Python教程",尝试用filter()函数删除1~100的素数: def is_prime(n):     if n <= 1:         return False     for s in range(2,n):         if n % s == 0:             return False     return True      print filter(is_prime,range(1,101) 素数的定义: 质数(

今天练习了一下用python写函数,就把它记录到博客上吧 冒泡排序和素数判断

第一个是判断素数,先上代码吧: 1 from math import sqrt 2 def is_prime(i): 3 if i == 2: 4 return True 5 elif i<2: 6 return False 7 elif i%2 == 0: 8 return False 9 else: 10 for n in range(3,int(sqrt(i)+1),2): 11 if i%n == 0: 12 return False 13 return True 这里用到了math包的

hdu 2136 筛法求素数以及一些细节上hxy做的优化

题目大意:每个数字都可以表示为一些素数的和,原因很显然:由算数基本定理可知,每一个数都可以表示为素数的乘积,自然也就可以表示为一些素数的和咯. 于是题目让我们求在这样的表示中出现的最大的素数是第几个素数. 思路:一开始想都没想,上了一个这样的代码. 1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 1000000

POJ 2689 Prime Distance(素数区间筛法--经典题)

大致题意:给定[L,R]区间,找出区间内的每个素数 数据范围 : 1<=L< R<=2,147,483,647) R-L <=1,000,000. R的数值太大,所以不能直接筛[0,R]的,要空间和时间优化,用到区间筛法,另外注意不能用int,因为R和L都是满int的,中间有很多细节处理会爆int的,还要注意1不是素数,所以在区间筛中要特判一下,是个易错的地方 //1160K 16MS C++ 1539B #include<cstdio> #include<ios

NEFU120 梅森素数【Lucas-Lehmer判定】

题目链接: http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=120 题目大意: 给一个数p,若Mp = 2^p - 1是梅森素数,则输出"yes",否则输出"no". 思路: 这道题p小于62.Mp就小于2^62-1.如果直接进行素数判别会比较慢,用筛法的话数据量 又会很大.所以这里用了Lucas-Lehmer判定法则. Lucas-Lehmer判定法则具体步骤: 如果要判定的整数位Mp =

轻松搞定素数

素数判定 素数,我们在数学上早就学过了吧,还记得定义是什么吗,其定义是:一个大于1的自然数,除了1和它本身外,不能整除以其他自然数(质数)整除,素数又叫质数.我们在进行素数判定的时候就要从它的定义入手. 我们先来看一道例题. 素数判定 Description 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数.   Input 输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结

POJ 2635 The Embarrassed Cryptographer (同余线性方程+素数筛)

题目地址:POJ 2635 先用素数筛把10^6万以内素数筛出来.然后把输入的那个大数转化成数组,并且每三位存成一个数,这样可以节约内存和时间,然后利用同余线性的原理,对那个小整数以内的所有素数枚举,然后判断是否整除,找到最小的能被整除的. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #i

素数筛 模板

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 int prim[3000000]={2,3,5}; 8 //素数是分为基本素数{2,3}.阳素数{6N+1,N>=1}形式的.阴素数{6N-1,N>=1}形式的 9 //为了代码的好写,在这里这样写的 : 10 //数除了{2,3,5}为素数,其他的数可以写成6N,6N+1