素数,又称质数、Prime Number,就是只能被1和它自己整除的正整数。
素数本身的特殊性质决定了其应用的广泛性,比如作为哈希函数的基数或是加密函数共钥的参数。因此,素数的问题也是平时讨论中比较多的。
一个比较常见的问题就是,如何判断一个数(假设为N)是否为素数?本文对常用的几种进行比较:
引用
第一种比较朴素的方法是采用0到N-1的所有整数去尝试整除N,如果其间有任意的数能被N整除,说明N是合数,否则输出素数。
事实上,并不需要遍历小于N的所有整数,其实只要遍历小于sqrt(N)的所有整数即可。为什么这样说呢?这里我们可以用反证法加以证明,假设我们采用前述方法进行遍历,直到遇到某个k>sqrt(N),才能被N整除,这样,必然存在一个整数l=N/k,l<sqrt(N),l同时也能被N整除,而在这种情况下,l肯定在k之前就被测试过了,这样就与前面的假设相矛盾了;因此就诞生了第二种优化的方法,如下:
引用
第二种方法,遍历2以上到N的平方根以下的每一个整数,是不是能被N整除
与欧几里得同时代的数学家埃拉托色尼首先给出了求素数的方法,现在人们称之为“埃拉托尼筛子”。他求素数的方法如下。首先从2开始,写出自然数:2,3,4,5,6,7,8,9 … 100,然后,把其中的一切合数划去,划掉合数的原则是,在这一列数中,第一个数2满足素数的定义,把它保留下来。随后把能被2的倍数都划去,因为它们都是合数。接着在数2后的没有被划去的第一个数是3,因为它只被1和它本身整除,所以它是一个合数,把它也划去。剩下没有被划去的第一个有选举权是5,它只能被这和它本身整除,所以它也是一个素数。如此连续不断地划下去,最后剩下的数都是素数。为什么把这种方法叫做“厄拉多塞筛子”呢?因为厄拉多塞在求素数时,把自然数写在一块白蜡的木板上,并逐个在写着合数的位置上刺一个孔,这样白蜡板上被刺了很多的小孔,好像一个筛子。把所有的合数“筛掉”剩下的就都是素数。用“埃拉托尼筛子”可得到100以内的25个素数:2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97。这里得到的启示是,我们不需要像前面那样,“遍历2以上到N的平方根以下的每一个整数,是不是能被N整除”,从而引出了方法三
引用
第三种方法,遍历2以上到N的平方根以下的每一个整数,是不是能被N整除;如果不能被N整除,同时也就排除了该整数的倍数,将其从待除数队列中删除;如此可将耗费性能的除法运算消耗进一步压缩
使用“埃拉托尼筛子”方法在黑板上筛选数字的时候,我们发现,方法三中去除的都是合数,留下的都是素数;如果我们事先知道某段区间的素数(事实上,<2000将会使个不错的范围),则可以将方法三进一步优化:
引用
第四种方法,遍历2以上N的平方根以下的每一个素数,是不是能整除N;(这个方法是上面方法的改进,但要求N平方根以下的素数已全部知道)
上述方法虽然实现巧妙,但对于实际中的大素数判断还是无能为力,例如:N=2^127-1是一个38位数,要验证它是否为素数,用上面几个不同的方法,假设计算机能每秒钟计算1亿次除法,那么方法三要用4136年,方法四要用93年……接下来将会介绍一种只需要1秒钟的方法——Rabin-Miller算法。首先来看一下费马小定理:
引用
假如a是一个整数,p是一个素数,那么a^p与a相对于p同余;如果a不是p的倍数(互质),可以得到a^(p-1)除以p的余数恒为1
我们可以来验证一下费马小定理,已知67是一个素数,而2^66mod 67=1。上述定理的逆命题又被称为中国猜测(中国数学家早于费马2000年提出),其描述为:2^(p-1)除以p的余数为1,可得出p是素数。很遗憾,该论断是错误的,比如p=341符合上述条件,却不是一个素数。因此我们修改中国猜测为如下推论:
引用
对于给定的整数n,可以设计一个素数判定算法。通过计算d=2^(n-1)mod n来判定整数n的素性。当d不等于1时,n肯定不是素数;当d等于1时, n则很可能是素数,但也存在合数n使得2^(n-1)≡1(mod n)。
可见,中国猜测只是素数判定的一个必要条件。有些合数也满
足费马小定理的条件。这些和数被称做卡米切尔数数,除341外,其余的卡米切尔数是561,1105,1729。Carmichael数是非常少的。在1~100000000范围内的整数中,大约只有255个卡米切尔数。
至于如何从费马小定理推导出Rabin-Miller算法,wiki上有很好的证明过程:
http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test
该算法的过程如下:
- 首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
- 选择一个小于p的随机数a。
- 设j=0且z=a^m mod p
- 如果z=1或z=p-1,那麽p通过测试,可能使素数
- 如果j>0且z=1, 那麽p不是素数
- 设j=j+1。如果j<b且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
- 如果j=b 且z<>p-1,不是素数
这个测试较前一个速度快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
我们举一个例子来说明:
假设我们想知道n = 221是否为一个素数,首先我们将n − 1 = 220写成2^2*55,即s = 2以及 d = 55。我们随机选择一个a < n,比如说a = 174。接着进行如下计算:
a^2^0*d mod n = 174^55 mod 221 = 47 ≠ 1, n − 1
a^2^1*d mod n = 174^110 mod 221 = 220 = n − 1
由于此时220 ≡ −1 mod n,所以我们说221很有可能是一个素数,或者它(174)是一个很强的“伪素数”。我们打算再试一次,这一次取a = 137:
a^2^0·d mod n = 137^55 mod 221 = 188 ≠ 1, n − 1
a^2^1·d mod n = 137^110 mod 221 = 205 ≠ n − 1
这次137成了证明221是合数的见证人,尽管看起来很像一个素数,221其实是一个合数,因此为221 = 13 * 17:)
分享到:
相关推荐
【标题】:“浅谈利用C语言的循环结构解决素数问题” 【描述】:本文讨论了如何使用C语言中的循环结构来解决素数问题,强调了C语言在程序设计教学中的重要性和循环结构在计算机解题中的核心角色。 【部分内容】: ...
浅谈C++如何求等差素数列 在本文中,我们将探讨如何使用 C++ 语言来求解等差素数列的问题。等差素数列是指一个由素数组成的等差数列,例如 7, 37, 67, 97, 127, 157,其中公差为 30,长度为 6。2004 年,格林与华人...
自己下下来看看吧,原创的,就给1分,吧!呵呵!
标题中的“例谈”表明文章将通过具体的教学实例来探讨教学策略。 【描述理解】: 描述部分指出在实际教学中,教师常常发现学生的学习方法过于机械,面对新问题时缺乏独立解决问题的能力,同时不同班级间的学生能力...
《数学中的小问题大定理丛书·卡塔兰猜想:从一道普特南竞赛试题谈起》从一道普特南数学竞赛试题谈起,洋细地介绍了卡塔兰猜想的产生、证明方法及其在数学竞赛试题中的广泛应用。并且针对学生和专业学者,以不同的...
例如,在教授“质数和合数”时,教师首先让学生找出数的因数,然后引导学生观察因数的个数,分类讨论,最终引出质数和合数的概念。通过关键问题的引导,教师可以加深学生对新旧知识内在联系的理解,形成较为完整的...
"浅谈C语言中循环结构的教学方法" 本文讨论了C语言中循环结构的教学方法,旨在帮助初学者更好地理解和掌握循环结构的概念和应用。循环结构是结构化程序设计的三种基本结构之一,也是程序设计的基础。但是,对于初学...
3. **素数判定与分解**:对于某些涉及质数的问题,掌握高效的素数判定和分解方法是非常重要的。 #### 五、总结 数位类统计问题是ACM等算法竞赛中的一类经典问题,涉及到对数字特征的深入理解和灵活运用。通过本文...
通常选择素数m,因为素数的因数较少,可以减少冲突的概率。 3. 数字分析法:适用于已知所有键且能分析其位数分布的情况。通过对关键码的位进行分析,丢弃分布不均匀的位,保留分布均匀的位作为地址。 4. 平方取...
### 浅谈计算机文件加密技术 #### 一、概述 在网络时代,计算机安全问题日益凸显,其中计算机病毒、系统漏洞、黑客攻击等成为了普遍关注的问题。为了提高网络安全性和计算机使用安全,计算机加密技术逐渐发展起来...
1. 分治算法:这是一种将大问题分解为小问题来解决的策略。通常包括三个步骤:分解、解决和合并。典型的分治算法有快速排序、归并排序和大整数乘法等。 2. 动态规划算法:它通过将问题分解为相互重叠的子问题来求解...
本篇文章将围绕《浅谈程序设计竞赛的算法知识》这一主题展开讨论,重点解析竞赛中常见的算法知识及其应用场景。 #### 二、程序设计竞赛中考核的算法知识 1. **AdHoc(杂题)** - 特点:通常没有固定解法,需要...
在《从高斯数列谈代码效率》中,文章通过比较不同方法求解1到100的和,阐述了代码效率优化的重要性。 1. **循环与递归的效率比较** - 解1(for循环):使用迭代法,虽然直观易懂,但在循环过程中可能会占用较多的...
例如,除法哈希法中,我们使用`hash(key) = key mod M`,其中`M`是素数,确保了输入与哈希值之间的唯一映射。 2. **哈希函数的均匀性**:理想的哈希函数应该使得所有可能的哈希值被均匀地分配,减少哈希冲突的可能...
数学归纳法的思想可以追溯到古希腊时期,欧几里德在证明素数的无限性时运用了类似的思想。然而,正式提出“递归推理”原则的是16世纪的意大利数学家莫洛克斯。真正对数学归纳法进行明确阐述的是法国的帕斯卡,他在...
下文中无特别说明,均假设运算在模某个大质数p卜进行。 1.4.1求向量列和矩阵列的最短递推式 考虑如何求出n维行向量列{o,1,12…}的线性递推式。假设考虑在模p意义下随机 个n维列向量ν,转而计算{toν,t1v,l2v…}这...
比如,通过比较质数和合数,正数和负数,帮助学生理解它们的共性和特性,从而深化对概念的理解。同时,利用对立概念的对比,如“微分”与“积分”,可以加深学生对概念本质的理解。 【总结与提升】 有效的数学概念...
该定理指出,选取多个互不相同的质数,通过模运算可以确保数据的唯一性,即使存在哈希冲突,也能通过多层次的哈希计算来减少错误的可能性。在哈希树中,每一层的哈希值是下一层节点哈希值的组合,这样的结构允许快速...
例如,你可以创建一个名为`CalculatePrimes`的类,继承自`Thread`,并在`run()`方法内实现计算素数的具体逻辑。`Thread`对象创建后,并不会立即运行,而是需要调用`start()`方法来启动线程。启动线程和创建线程是两...