方法一:
要想知道x是不是质数,那就用它试着去除2~x-1,如果可以被整除,那就不是质数呗。
毫无疑问,这个算法效率是低到人难以忍受的。稍微优化一下,我们可以得到方法二。步骤/方式二
方法二:
第一个质数为2,那x只要是大于2的偶数就必然不是质数,这样我们就能排除掉一半的数了。对于奇数x,用它试着去除3、5...~x-2,如果可以被整除,那就不是质数。
计算效率高了一些,但算法复杂度本质上和第一种没什么区别,只是系数级的改进。步骤/方式三
方法三:
稍微思考一下就会发现,其实质数是分解质因数时只能分解成1和本身的数,既然如此,那么我们在试除的时候就没有必要从3、5一直除到x-2了,只需要除比自身小的质数就可以了。步骤/方式四
方法四:
再进一步思考就会发现,其实也没必要去试除所有比自身小的质数,只要试除比不大于自身的平方根的质数就可以了。
为什么?
假设x不是质数,那么它必然是最少两个质数的乘积,如果这两个质因数不相等,那么必然有一个质因数小于√x,如果两个质因数相等,那么这个质因数必然等于√x。
质数是指大于 1 的自然数中,除了 1 和它本身以外没有其他因数的数。以下是一些常用的找质数的方法:
1. 埃拉托色尼筛法(Sieve of Eratosthenes):这是一种最早且最为经典的找质数的方法,由古希腊数学家埃拉托色尼提出。基本思想是先把从 2 开始的到某一上限的所有整数写下来,然后把 2 的倍数全部划掉,再把 3 的倍数划掉,接着是 5 的倍数,以此类推,直到划掉所有小于该上限的质数。
2. 费马小定理:这是一种基于数论的定理,可以用来快速判断一个数是否为质数。如果 p 是一个质数,a 是任意整数,那么 a 的 p 次方模 p 等于 a。也就是说,如果一个数能被其他数整除,那么它就不是质数。
3. 米勒 - 拉宾素性检验(Miller-Rabin primality test):这是一种概率性的素数检验方法,可以快速判断一个大整数是否为质数。如果一个数通过了米勒 - 拉宾素性检验,那么它有很大可能是一个质数。
4. 原子能级方法:这是一种基于物理学的找质数的方法,通过测量原子能级的分裂情况来判断一个数是否为质数。这种方法的原理是,质数具有特殊的物理性质,它们的原子能级分裂情况与其他数不同。
以上方法中,埃拉托色尼筛法最为常用且实用。在现代计算机科学中,还有很多其他更高效的找质数的方法,如大素数算法(如著名的“Pollard rho 算法”、“大整数因式分解算法”等)。