关于Miller_Rabbin的效率
  • 板块学术版
  • 楼主DengDuck鄧德
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/5/5 12:18
  • 上次更新2023/10/28 02:07:51
查看原帖
关于Miller_Rabbin的效率
501947
DengDuck鄧德楼主2022/5/5 12:18

本代码在 LibreOJ 被活活卡成了9207ms,不知道为什么

算法:miller_rabbin

用时:9207ms

```cpp
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
long long t, n;
long long ksc(long long x, long long y, long long mod) {
    long long sum = 0;
    x %= mod;

    while (y) {
        if (y & 1) {
            sum += x;
            sum %= mod;
        }

        x += x;
        y >>= 1;
        x %= mod;
    }

    return sum;
}
long long ksm(long long x, long long y, long long mod) {
    long long sum = 1;

    while (y) {
        if (y & 1) {
            sum = ksc(sum, x, mod);
        }

        x = ksc(x, x, mod);
        y >>= 1;
    }

    return sum;
}

bool pd(long long x) {
    srand(time(0));

    if (x == 1 || x == 0)
        return false;

    if (x == 2 || x == 3)
        return true;

    if (!(x & 1))
        return false;

    long long k = x - 1;
    long long r = 0;

    while (!(k & 1)) {
        ++r;
        k >>= 1;
    }

    long long t = 1, lt = 0;

    for (int h = 0; h <= 10; h++) {
        t = rand() % (n - 1) + 1;
        t = ksm(t, k, n);

        if (t == 1)
            continue;

        lt = t;

        for (int i = 1; i <= r; ++i) {
            t = ksc(t, t, n);

            if (t == 1) {
                if (lt ^ (n - 1))
                    return false;

                break;
            }

            lt = t;
        }

        if (t ^ (1ll))
            return false;
    }

    return true;
}
int main() {
    while (scanf("%lld", &n) != EOF) {

        if (pd(n)) {
            putchar('Y');
        } else {
            putchar('N');
        }

        putchar('\n');
    }
}
2022/5/5 12:18
加载中...