Pollard-Rho && Miller Rabin

  • 注意中途要开 __int128

  • 求一个数是否为质数或者最大的质因数

#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace IO{
    #define ll long long
    #define db double
    #define FLS fflush(stdout)
    #define FOR(i,a,b) for(int i=a;i<=b;++i)
    #define ROF(i,a,b) for(int i=a;i>=b;--i)
    inline int max(int a,int b) {return (a>b)?a:b;}
    inline int min(int a,int b) {return (a<b)?a:b;}
    inline ll ksm(ll a,int b,int mod) {ll res=1;while(b) {if(b&1) res=(__int128)res*a%mod;a=(__int128)a*a%mod;b>>=1;}return res;}
    char buf[1<<21],*p1=buf,*p2=buf;
    #define Fin(a) freopen(a".in","r",stdin)
    #define Fout(a) freopen(a".out","w",stdout)
    inline int getchar(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
    inline int read(){
        int ret=0;bool f=0;char ch=getchar();
        while(ch<'0' || ch>'9') {if(ch=='-') f=1;ch=getchar();}
        while(ch>='0' && ch<='9') {ret=(ret<<1)+(ret<<3)+ch-48;ch=getchar();}
        return f?-ret:ret;
    }
}using namespace IO;

int n,maxpri,t,k;

inline int mr(int p,int x) {
    int a=ksm(x,t,p);
    FOR(j,1,k) {
        int nxt=(__int128)a*a%p;
        if(nxt==1 && (a!=1 && a!=p-1)) return 0; 
        a=nxt;
    }
    if(a!=1) return 0;
    return 1;
}

inline int check(int x) {
    if(x<2) return 0;
    t=x-1,k=0;
    while(!(t&1)) t>>=1,++k;
    if(x==2 || x==3 || x==5 || x==7 || x==61) return 1;
    return mr(x,2) && mr(x,97) && mr(x,61) && mr(x,577) && mr(x,137);
}

inline int f(int x,int c,int mod) {
    return ((__int128)x*x+c)%mod;
}

int gcd(int x,int y) {return (!y)?x:gcd(y,x%y);}

inline int pr(int x) {
    int c=rand()%(x-1)+1,s=0,t=0;
    int val=1;
    for(int i=1;;i<<=1,s=t,val=1) {
        FOR(j,1,i) {
            t=f(t,c,x);
            val=(__int128)val*abs(t-s)%x;
            if(j%127==0) {
                int d=gcd(val,x);
                if(d>1) return d;
            }
        }
        int d=gcd(val,x);
        if(d>1) return d;
    }
}

void fac(int x) {
    if(x<=maxpri || x<2) return ;
    if(check(x)) {
        if(x>maxpri) return maxpri=x,void();
        else return ;
    }
    int y=x;
    while(y>=x) {
        y=pr(x);
    }
    while(x%y==0) x/=y;
    fac(x);fac(y);
}

inline void solve() {
    cin>>n;
    maxpri=0;
    fac(n);
    if(maxpri==n) cout<<"Prime"<<endl;
    else cout<<maxpri<<endl;
}

signed main(){
#ifdef LOCAL
    Fin("P4718_14");
    Fout("1");
#endif
    srand((unsigned)time(0));
    int T;cin>>T;
    while(T--) solve();
#ifdef LOCAL        
    fprintf(stderr,"%f\n",1.0*clock()/CLOCKS_PER_SEC);
#endif
    return 0;
}

posted @   Kzos_017  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示