• Miller_Rabbin算法判断大素数


    由费马小定理 a p − 1 ≡ 1 ( m o d    p ) a^{p-1}\equiv1(\mod p) ap11(modp),当 p p p为质数时成
    立。但当 p p p不为质数时该定理不一定成立。
    这里用二次探测去优化这个公式。
    大概内容若有 y 2 ≡ 1 ( m o d    p ) y^2\equiv 1(\mod p) y21(modp)其中 p p p为质数, y < p y

    y<p
    则有 y = 1 y=1 y=1 y = p − 1 y=p-1 y=p1
    k = p − 1 = 2 m ∗ n k=p-1=2^m*n k=p1=2mn
    ( a n ) 2 m ≡ 1 ( m o d    p ) (a^{n})^{2^m}\equiv 1(\mod p) (an)2m1(modp)
    随机一个数 x x x去模拟公式中的 a a a。若 ( a n ) ( . . . ) % p (a^n)^{(...)}\%p (an)(...)%p不为1或者
    ( a n ) u % p = 1 , ( a n ) ( u + 1 ) % p = p − 1 (a^n)^u\%p=1,(a^n)^{(u+1)}\%p=p-1 (an)u%p=1,(an)(u+1)%p=p1则它一定不是质数。
    进行十次以上的探测可以很高的概率判断素数

    using ll = long long ;
    ll mul(ll a,ll b,ll p){
        ll r = 0;
        while(b) {
            if(1&b) r = (r + a) % p;
            a = (a + a) % p;
            b >>= 1;
        }
        return r;
    }
    ll mi(ll a, ll b, ll p){
        ll r = 1;
        while(b) {
            if(1&b) r = mul(r, a, p);
            a = mul(a, a, p);
            b >>= 1;
        }
        return r;
    }
    mt19937 rnd(time(NULL));
    bool check(ll n){
        if(n == 1)return false;
        if(n == 2 || n == 3)return true;
        if(n + 1 & 1)return false;
        ll k = n - 1;
        int r = 0;
        while(k + 1 & 1) {
            k >>= 1;
            r ++;
        }
        ll res, la = 0;
        int cnt = 1;
        while(cnt--) {
            res = rnd() % (n - 1) + 1;
            res = mi(res, k, n);
            if(res == 1) continue;
            la = res;
            for(int i = 0; i < r; i++) {
                assert(res >= 0 && res < n);
                res = mul(res, res, n);
                if(res == 1){
                    if(la != n - 1) return false;
                    break;
                }
                la = res ;
            }
            if(res != 1)return false;
        }
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
  • 相关阅读:
    iOS安全加固方法及实现
    [附源码]计算机毕业设计JAVA高校资源共享平台
    传统运维与云运维到底有什么不同呢?
    Python的Django部署uwsgi后自签名实现的HTTPS
    软件调试技术概览
    架构师日记-从技术角度揭露电商大促备战的奥秘
    Spark 之 deploy
    『 MySQL数据库 』数据库之表的约束
    Docker环境搭建及学习
    Contention Based Energy Efficient Wireless Sensor Network – A survey
  • 原文地址:https://blog.csdn.net/ftrghujhgf/article/details/126850420