zoukankan      html  css  js  c++  java
  • miller rabin 素性测试

    知识前置:

    a^(p-1)≡1(mod p)(费马小定理)(p为素数,且a<p)

    用途:

    检验一个数是否为素数

    实现方法:

    快速幂+随机化

    原理:

    一个素数一定是满足费马小定理的,而一个合数有一定的可能性满足费马小定理,所以可以利用随机化随机a,来测试一个数是否为素数

    优点:

    时间短,有一个判断一个,无需范围

    缺点:

    有一定的可能性会误判

    补充:

    miller rabin不一定只用费马小定理,其他只有素数满足的数学定理也能放进去测试,还能提高准确率

    代码:

    long long pw(long long va,long long k)
    {
        if(k==1)
        {
            return va%p;
        }
        if(k%2==0)
        {
            return pw((va*va)%p,k/2)%p;
        }
        else
        {
            return ((pw((va*va)%p,k/2)%p)*va)%p;
        }
    }
    bool check(int val)
    {
        if(val==1)
        {
            return false;
        }
        if(val==2)
        {
            return true;
        }
        if(val==3)
        {
            return true;
        }
        long long pd=0;
        for(rii=1;i<=10;i++)
        {
            int kkk=rand();
            int ltt=rand();
            p=val;
            kkk=kkk*ltt%97;//取膜和判断次数由题目给的时间而定,测试次数越多,取膜越大,时间耗费越多
            kkk*=2;
            pd=max(pd,pw(kkk,val-1));
        }
        if(pd==1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
  • 相关阅读:
    平板涂色
    速算游戏_NOI导刊2011提高(04)
    信息学奥赛一本通——配套刷题网站
    求10000以内n的阶乘
    大整数的因子
    计算2的N次方
    大整数加法
    带余除法
    A/B 高精度
    A*B 高静度
  • 原文地址:https://www.cnblogs.com/ztz11/p/9254170.html
Copyright © 2011-2022 走看看