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]...比较显然。

    总结:

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

  • 相关阅读:
    Lintcode: Wood Cut
    Lintcode: Update Bits
    Lintcode: Route Between Two Nodes in Graph
    Lintcode: Flip Bits
    Leetcode: Maximum Size Subarray Sum Equals k
    Lintcode: Subarray Sum Closest
    Lintcode: Remove Node in Binary Search Tree
    Lintcode: Majority Number III
    Leetcode: Range Sum Query
    Leetcode: Create Maximum Number
  • 原文地址:https://www.cnblogs.com/Miracevin/p/9698627.html
Copyright © 2011-2022 走看看