(本篇并不适合初学者看)
质数:除1和本身之外,没有一个数能够整除它。(否则是合数)
1.质数判定:
①根号试除法。
优点:容易写,对于少量的需要判断的质数,比较可靠。
缺点:询问量一旦增多,必然效率低下。
②Miller_Robin与二次探测
优点:速度比较快,大概,测试个数*logn 。复杂度很可观。而且误判概率极低。
而且,对于long long级别的质数,也能快速准确判断!!
缺点:你可能记不住。。
③筛法,然后暴力判断。
见博客:SIEVE 线性筛
优点:O(N)预处理,O(1)查询。N比较小而询问次数很多时,极为方便。
而且,线性筛素数,根据合数只被最小质因子筛一次的优秀性质,在处理其他函数例如$phi$,$mu$的时候,
也有很高的效率,而且通过判断是否是最小质因子,转移的关系也十分好写。
缺点:显然了。N比较大,直接TLE+MLE。而且,必须从2开始筛,即使你只需要一个。
2.质数筛法:
Eratosthenes筛法,会把每个合数处理质因子个数次。不是稳定的复杂度O(N)
线性筛就是刚才的博客:SIEVE 线性筛
好了,现在我们知道质数是什么、怎么找?
那么,有什么用呢?
3.质因数分解:
算数基本定理:P=q1^c1*p2^c2*...
其中,qi为质数,ci是非负数。这种分解方法是唯一的。
质因数分解往往是一个数学题考虑的突破口。
因为,质因数分解可以把一个数的构成完美地表示出来。
通过质数的次数相乘的表示法,很容易考虑和处理gcd,lcm等问题。
方法:根号试除,最后>1则是质数。
我只会这一种分解方法。
复杂度O(根号)
显然不够优秀,因为试除还会浪费一些时间。可以考虑提前预处理质数,然后用质数试除,本质上是找质因子。
也许会快一些。
比较厉害的是:Pollard_Rho,我反正没看懂。
*一些小应用:
质因数分解n!,直接枚举小于n质数,出现次数就是[n/p]+[n/p^2]...比较显然。
总结:
质数给你敞开数论的大门,走进去,就掉进了坑。