米勒罗宾算法:判断一个大数是不是素数
发布日期:2021-05-10 16:09:30 浏览次数:19 分类:精选文章

本文共 3327 字,大约阅读时间需要 11 分钟。

������������������������

���������������������

������������������������������������������������������������������������������������������������������������2������������������������������������������������������������������������������������������������������C++���������

������������

������������������������������������������

  • ���������������������������������������������������������������������������������������ctime���������������������
  • ������������������������Miller-Rabin���������������������������������������������������������������������������������������������������������������������
  • ���������������������������������������������������������10,000���������������������������������������������������������������������������
  • ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

���������������

  • ���������������������������������������������������������10,000���������������������������������������������������������������������������������
  • ������������������������������������������������������������������������������������
  • ���������������������������������������n������������������������������������p���������n-p������������������������������������������������������������
  • ������������

    #include 
    #include
    #include
    #include
    #include
    using namespace std;
    typedef unsigned long long LL;
    LL qmul(LL x, LL y, LL mod) {
    return (x * y - (long long)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
    }
    LL qpow(LL a, LL n, LL mod) {
    LL ret = 1;
    while (n) {
    if (n & 1) ret = qmul(ret, a, mod);
    a = qmul(a, a, mod);
    n >>= 1;
    }
    return ret;
    }
    bool Miller_Rabin(LL p) {
    if (p < 2) return false;
    if (p != 2 && p % 2 == 0) return false;
    LL s = p - 1;
    while (! (s & 1)) s >>= 1;
    for (int i = 0; i < 5; ++i) {
    if (prime[i] == p) return true;
    LL t = s, m = qpow(prime[i], s, p);
    while (t != p - 1 && m != 1 && m != p - 1) {
    m = qmul(m, m, p);
    t >>= 1;
    }
    if (m != p - 1 && ! (t & 1)) return false;
    }
    return true;
    }
    void init() {
    for (int i = 2; i < N; ++i) {
    if (!book[i]) {
    prime1[k++] = i;
    }
    for (int j = 2; i * j <= N; ++j) {
    if (!book[i * j]) {
    book[i * j] = true;
    }
    }
    }
    }
    int main() {
    init();
    int t = 0;
    LL n;
    cin >> t;
    while (t--) {
    scanf("%llu", &n);
    bool flag = false;
    for (int i = 0; i < k; ++i) {
    if (n - prime1[i] >= 0 && Miller_Rabin(n - prime1[i])) {
    printf("%d %llu\n", prime1[i], n - prime1[i]);
    flag = true;
    break;
    }
    }
    if (!flag) {
    printf("������������������������������\n");
    }
    }
    return 0;
    }

    ������

    ���������������������������������������������������������������������������������Miller-Rabin���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

    上一篇:文件读写(java)
    下一篇:HDU——5528 Count a * b(积性函数推公式+唯一分解定理)

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年04月10日 01时48分41秒