昨天发出之后,收到很多朋友的评论,讨论更高效的求素数的方法,我将大家的评论一一看过,觉得受益良多,同时也没有闲着,动手又敲了一遍这些精妙的求素数的方法,发出来与大家共享。
这是一位大佬
就像上面这位朋友所说,求素数的方法确实有很多:100以下随便做,枚举估验特判开心就好,100000以下用6倍筛,1000000以下用埃氏筛,100万以上直接欧拉筛,不优化40000000以内秒过,一个亿以内的欧拉优化过……
我真被这简洁明了的概括惊呆了。
那今天就按照这样的顺序讲一下这些求素数的方法吧。
100以内:随便做什么意思,就是最简单的定义来就好了。根据定义,判断一个整数n是否是素数,只需要去判断在整数区间[2, n-1]之内,是否具有某个数m,使得n % m == 0。
我们把这种方法叫做朴素判断素数算法或者试除法,代码是这样的:
事实上,这个算法是O(n)的,感觉是很快了,但是依旧无法满足需求。
所以有一个算法是O(sqrt(n))的算法: