zoukankan      html  css  js  c++  java
  • Miller Rabin 素性测试

    Miller_Rabin素性测试:

    二次探测定理:

    (p)是质数,且(x^2equiv 1 pmod p)
    则:

    (xequiv1pmod p)(xequiv p-1pmod p),且他的逆定理成立。

    证明:

    [ecause x^2equiv 1pmod p ]

    [ herefore (x+1)(x-1)equiv 0pmod p ]

    [ herefore p|(x+1)$$或 $$ p|(x-1) ]

    ( herefore)得证。

    至于逆定理为啥成立我也不知道

    欧拉函数:

    (phi (x))表示(<x)的数中与(x)互质的数的个数。

    显然,一个合数的(phi)值很小。

    Miller_Rabin算法:

    假设我现在要测(n)是否是素数,钦定(n>2)

    随机几个素数(a),对于每一个(a),计算:

    [a^{n-1}mod n ]

    因为(n)是奇数,
    所以(n-1)是偶数.

    将$$a^{n-1}mod n$$

    分解成$$a{2k*t}mod n$$

    计算时,先算(a^t),然后不停平方,每次用二次探测定理判断他是否是素数。最后算到(a^{n-1}),用费马小定理判断是否是素数。如果

    [a^{n-1}mod n!equiv 1 ]

    那么n一定是合数。

    如果(a^{2^i*t}equiv 1pmod n)符合二次探测定理

    而且(a^{2^{i-1}*t}!equiv 1pmod n)

    并且(a^{2^{i-1}*t}!equiv n-1pmod n)

    那么n就是合数。

    以上都没判断出来的,就有(frac{3}{4})的几率是质数了。

    证明:

    据说可以用欧拉函数证,但我不会证qwq

    Code

    bool check(int p,ll n)
    {
        if(p==n)
    	    return 1;
        if(quick_pow(p,n-1,n)!=1)
    	    return 0;
        ll s=0,k=n-1;
        while(!(k&1))
        {
    		k>>=1;
    		s++;
        }
        ll last=quick_pow(p,k,n);
        for(int i=1;i<=s;i++)
        {
            ll now=last*last%n;
            if(now==1)
    	        return last==n-1||last==1;
            last=now;
        }
        return 0;
    }
    
    等等,还有一件事!

    (N<4,759,123,141),选取 (a=2,7,61) 即可确保算法得出正确结果。

    (N<3,825,123,056,546,413,051≈3*10^{18}),选取(a=2,3,5,7,11,13,17,19,23)即可确保算法得出正确结果。

    (N<18,446,744,073,709,551,616=2^{64}),选取 (a=2,3,5,7,11,13,17,19,23,29,31,37)即可确保算法得出正确结果。

  • 相关阅读:
    Spark集群下的K-Means算法
    牛客:数据库SQL实战(一)查询入职最晚的员工的所有信息
    吴军《硅谷之谜》
    IntelliJ IDEA 中 右键新建(new)时,选项没有scala(java) class的解决方法和具体解释
    Gitlab跨版本升级
    Kubernetes 0-1 Pod中的livenessProbe和readinessProbe解读
    Kubernetes 0-1 了解Pod
    Kubernetes 0-1 K8S自建LoadBalancer
    Kubernetes 0-1 K8S部署coredns
    Kubernetes 0-1 二进制搭建K8S(四)部署Node
  • 原文地址:https://www.cnblogs.com/oierwyh/p/11375111.html
Copyright © 2011-2022 走看看