zoukankan      html  css  js  c++  java
  • 【数论】-素数问题整理

    1.素数定理: π(x)~x/ln(x)

    其中π(x)是不超过x的范围中素数的个数,当x非常大时,π(x)与x/ln(x)比较接近。

    2.埃拉托色尼筛法

    应用:可以快速找到[2, n]内所有的素数。操作步骤如下:

    (1)输出最小的素数2,然后筛掉2的倍数

    (2)输出最小的素数3,然后筛掉3的倍数

    (3)输出最小的素数5,然后筛掉5的倍数

    继续以上步骤,直到操作到n

    例题:hdu 2710

    #include <iostream>
    #include <string.h>
    using namespace std;
    const int N=2e4+5;
    int nprime[N],cnt=0;
    void table(){
        nprime[1]=1;
        for(int i=2;i<N;i++){
            if(!nprime[i]){//直接记录i的最大素因子 
                nprime[i]=i;
                for(int j=i+i;j<N;j+=i)
                nprime[j]=i;
            }
        }
    }
    int main(){
        table();
        int t;
        while(cin>>t){
            int maxx=0,ans;
            while(t--){
                int n;
                cin>>n;
                if(nprime[n]>maxx)maxx=nprime[n],ans=n;
            }
            cout<<ans<<endl;
        }
        
    }
    View Code

    3.算术基本定理

    (1)若n的标准素因子分解表达式为n=p1a1*p2a2*...*pkak,设d(n)为n的正因子个数,f(n)为n的所有因子之和,则有

    d(n)=(a1+1)*(a2+1)*...*(ak+1)

    f(n)=(p1a1+1-1/p1-1)*(p2a2+1-1/p2-1)*..*(pkak+1-1/pk-1)

    (2)n!的素因子分解中的素数p的幂为[n/p]+[n/p2]+[n/p3]+...

    4.梅森素数

    定义:Mp=2p-1,当p为素数,且Mp为素数,则称Mp为梅森素数

    当p为第几个素数,则称Mp为第几个梅森数

    判定:

    Lucas-Lehmer判定法:判定一个梅森数是否是梅森素数

    设p是素数,第p个梅森数为Mp为2p-1,r1 = 4,对于k >= 2

    r(k) = r(k-1)^2-2(modM(p)), 0 <= r(k) <= M(p)

    可以得到r(k)序列,则有M(p)是素数,当且仅当r(p-1) = 0(mod M(p))

    涉及知识:

    卢卡斯-莱默检验法原理

    假设我们想验证M3 = 7是素数。我们从s=4开始,并更新3−2=1次,把所有的得数模7:
    • s ← ((4 × 4) − 2) mod 7 = 0
    由于我们最终得到了一个能被7整除的s,因此M3是素数。
    另一方面,M11 = 2047 = 23 × 89就不是素数。我们仍然从s=4开始,并更新11−2=9次,把所有的得数模2047:
    • s ← ((4 × 4) − 2) mod 2047 = 14
    • s ← ((14 × 14) − 2) mod 2047 = 194
    • s ← ((194 × 194) − 2) mod 2047 = 788
    • s ← ((788 × 788) − 2) mod 2047 = 701
    • s ← ((701 × 701) − 2) mod 2047 = 119
    • s ← ((119 × 119) − 2) mod 2047 = 1877
    • s ← ((1877 × 1877) − 2) mod 2047 = 240
    • s ← ((240 × 240) − 2) mod 2047 = 282
    • s ← ((282 × 282) − 2) mod 2047 = 1736
    由于s最终仍未能被2047整除,因此M11=2047不是素数。但是,我们从这个检验法仍然无法知道2047的因子,只知道它的卢卡斯-莱默余数1736。
    思路:输入p,先求出2p-1,循环求r(k) = (r(k-1)2-2)%Mp
  • 相关阅读:
    由于客观原因,暂时学习php两天,然后继续学习.net
    【任务】html编辑器在vs2003下实现
    one bug og webMatrix when create a new file
    数据统一接口?
    安全3S
    一个订单管理页面
    【总结】浪费3个月向.net继续前进
    关于在asp.net中类的继承问题
    【心得】create a data table in webMatrix is very easy!
    Java与.NET谁是未来
  • 原文地址:https://www.cnblogs.com/xyfs99/p/11552354.html
Copyright © 2011-2022 走看看