zoukankan      html  css  js  c++  java
  • [学习笔记]质数

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

    质数:除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]...比较显然。

    总结:

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

  • 相关阅读:
    MySql 5.6以下版本自定义函数返回VARCHAR的中文问题
    解决Tomcat的java.lang.IllegalStateException: Cannot create a session after the response has been committed问题
    Lucene自定义规则范围查询
    JS吊炸天的代码
    又是正则
    JS显示指定字符数,避免一个中文两个字符的情况
    PostgreSql查看当前表的主外键关系
    java基础(个人学习笔记) A
    Elasticsearch5.5.1插件开发指南
    ElasticSearch5.5.1插件分类
  • 原文地址:https://www.cnblogs.com/Miracevin/p/9698627.html
Copyright © 2011-2022 走看看