[学习笔记]质数

(本篇并不适合初学者看)

质数:除1和本身之外,没有一个数能够整除它。(否则是合数)

1.质数判定:

①根号试除法。

优点:容易写,对于少量的需要判断的质数,比较可靠。

缺点:询问量一旦增多,必然效率低下。

②Miller_Robin与二次探测

见博客: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]...比较显然。

总结:

质数给你敞开数论的大门,走进去,就掉进了坑。

原文地址:https://www.cnblogs.com/Miracevin/p/9698627.html