这个题做了一会,发现怎么都显示段错误,就粘了一个Miller-Rabin

错误代码

C++代码(正解)

复制代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
typedef long long ll;
using namespace std;
const int S=20;
ll mod_mul(ll a,ll b,ll p){
    ll res=0;
    a%=p,b%=p;
    while(b){
        if(b&1)res=(res+a)%p;
        a=(a<<1)%p;
        b>>=1;
    }
    return res;
}
ll mod_pow(ll x,ll n,ll p){
    ll res=1;
    while(n){
        if(n&1)res=mod_mul(res,x,p);
        x=mod_mul(x,x,p);
        n>>=1;
    }
    return res;
}

bool check(ll a,ll n,ll x,ll t){//判断是否为合数
    ll ret=mod_pow(a,x,n);
    ll last=ret;
    for(int i=1;i<=t;i++){
        ret=mod_mul(ret,ret,n);
        if(ret==1&&last!=1&&last!=n-1)return 1;
        last=ret;
    }
    if(ret!=1) return 1;//fermat测试
    return 0;
}

bool Miller_Rabin(ll n){
    if(n<2)return 0;
    if(n==2)return 1;
    if((n&1)==0)return 0;
    ll x=n-1,t=0;
    while((x&1)==0)x>>=1,t++;
    for(int i=0;i<S;i++){
        ll a=rand()%(n-1)+1;
        if(check(a,n,x,t))return 0;//合数
    }
    return 1;
}

int prime(int n){
    return 1;
}


int gotbaha(int n){
    for(int i=1;i<=n;i++){
        if((Miller_Rabin(i))&&(Miller_Rabin(n-i))){
            printf("%d=%d+%d\n",n,i,n-i);
            return 0;
        }
    }
    
}
复制代码