2019怎么分解质数?
对于这个问题,应该分开两个方面来看待。一是如何高效地分解质数;二是如何高效地判断一个整数是否为质数。这两个问题其实都跟一个问题有关——判定素数的问题。因此我们先考虑第二个问题,然后再考虑第一个问题。
首先说明一点,我们讨论的问题是算法的效率,所以只在乎于计算量而不想其他方面的复杂度(比如空间复杂度) 如何判断一个整数是否是质数呢?我们知道一个整数如果小于30就是判断其是否等于1或者是否等于2(0除外,因为0=1且0!=2)然后判断是不是大于等于3并且是奇数的和。但如果这个整数大于30怎么办呢?我们观察30以内所有的质数,正好可以形成如下公式: p_k +p_{k+1}=n \tag{1} 其中 \sum_{\text{all } k}{p}_k = n. 所以只要让公式(1)左边之和等于某个指定的整数n,就可以知道该整数是否是质数了。例如让左边的和等于45,那么45=p_7+p_8,于是我们可以得到p_7=21,p_8=24,从而得到[21,24]范围内的所有质数。以此类推。 这样,我们就得到了判断一个整数是否为质数的一个算法。
下面我们来考虑如何高效地实现上述算法。由于我们在寻找每一个质数的时候,都需要把它的因数全部找出来(即需要检验每一个因数是否成立2^m-1|x),因此最好的情况也就是O(log x)的时间复杂度。但实际情况往往要比这糟糕的多。举个简单的例子,当x=600时,我们需要的检验的因子个数就已经超过了200个,而一个整数的因数个数显然不可能超过它的因子个数。因此最好的情况也就是o(sqrt(x))的时间复杂度。事实上,判断一个整数是否为质数,最坏的情况可能所需因子个数甚至能达到这个整数的平方,比如x=900时,我们需要检验900个因子。更糟糕的是,这些因子可能无穷无尽。 所以判断一个整数是否为质数是一件很麻烦的事情。