米勒罗宾算法:判断一个大数是不是素数

本文介绍了一种使用米勒-拉宾素性测试验证哥德巴赫猜想的C++程序实现。通过预处理素数表和多次素性测试,程序能够有效地找出满足哥德巴赫猜想的两个素数。该算法适用于不超过10万的大整数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

验证:哥德巴赫猜想

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <ctime>
#include <cmath>
using namespace std;
typedef unsigned long long  LL;
const int N = 100000,M = 10000,count1 = 10;
int prime1[M], k = 0;
bool book[N];
LL prime[6] = {2, 3, 5, 233, 331};
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 0;
    if(p != 2 && p % 2 == 0) return 0;
    LL s = p - 1;
    while(! (s & 1)) s >>= 1;
    for(int i = 0; i < 5; ++i) {
        if(p == prime[i]) return 1;
        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 0;
    }
    return 1;
}
//以上均为米勒罗宾模板
void init()
{
    for(int i = 2; i < N; ++i){
        if(book[i]==false){
            prime1[k++] = i;
        }
        for(int j = 2; i*j <= N; ++j){
            if(book[i*j]==false)
            book[i*j] = true;
        }
    }
}
int main(){
    init();
    int t;
    LL n;
    cin>>t;
    while(t--){
        scanf("%llu",&n);
        int flag = 0;
        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 = 1;
                break;
            }
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心脏dance

如果解决了您的疑惑,谢谢打赏呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值