素數檢測
素数是指恰好有两个约数的整数(1和其本身)。
简单素性测试
因为n的约数都不超过n,所以只需检查2n-1的所偶整数是否整除n就能判定n是否为素数。进而,如果d是n的约数,那么n/d也是n的约数。由n=d×n/d可知min(d,n/d)≤sqrt(n),所以只要检查 **2sqrt(n)** 得到所有整数就可以了。由此可知,整数分解和约数枚举都可以在 O(sqrt(n)) 时间内完成。
埃氏筛法
要枚举n以内的素数,可以用埃氏筛法。
首先,将2到n范围内的所有整数写下来。
其中最小的数字2是素数。将表中所有2的倍数都划去,
表中剩余的最小数字是3,他不能被更小的数长出,所以是素数。在将表中所有3的倍数都划去。
以此类推,如果表中剩余的最小数字是m时,m就是素数。然后将表中所有m的倍数划去。像这样反复操作,就能一次枚举n以内的素数。
1 | int prime[MAX_N];//第i个素数 |
时间复杂度:O(nlognlogn)
区间筛法
对于求[a,b)区间内素数的问题可以采用区间筛法,即将埃氏筛法运用于[a,b)上。
先分别做好[2,sqrt(b))和[a,b)的素数表,在从[2,sqrt(b))中筛得素数时,也将其倍数从[a,b)的表中划去,最后剩下的就是区间[a,b)内的素数了。
1 | typedef long long ll; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sugar Code!