nyist 468 Fibonacci数列(六)(Miller-Rabin算法 大数素性测试)
发布时间:2020-12-14 02:20:32 所属栏目:大数据 来源:网络整理
导读:Fibonacci数列(六) 时间限制: 1000 ms ?|? 内存限制: 65535 KB 难度: 3 描述 大家都知道都知道素数的定义:大于1且只有1和其本身外没有其它因子的正整数。对应的我们可以这样定义"Fibonacci素数":在Fibonacci数列中大于1且与小于它的Fibonacci数都互质
Fibonacci数列(六)
时间限制:
1000 ms ?|? 内存限制:
65535 KB
难度:
3
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=468
#include <cstdio> #include <cstring> #include <algorithm> #define ll long long using namespace std; int const S = 20; //随机算法判定次数,S越大,判错概率越小 long long mult_mod(long long a,long long b,long long c) { a%=c; b%=c; long long ret=0; while(b) { if(b&1){ret+=a;ret%=c;} a<<=1; if(a>=c)a%=c; b>>=1; } return ret; } long long pow_mod(long long x,long long n,long long mod) { if(n==1)return x%mod; x%=mod; long long tmp=x; long long ret=1; while(n) { if(n&1) ret=mult_mod(ret,tmp,mod); tmp=mult_mod(tmp,mod); n>>=1; } return ret; } bool check(long long a,long long x,long long t) { long long ret=pow_mod(a,x,n); long long last=ret; for(int i=1;i<=t;i++) { ret=mult_mod(ret,ret,n); if(ret==1&&last!=1&&last!=n-1) return true; last=ret; } if(ret!=1) return true; return false; } bool Miller_Rabin(long long n) { if(n<2)return false; if(n==2)return true; if((n&1)==0) return false; long long x=n-1; long long t=0; while((x&1)==0){x>>=1;t++;} for(int i=0;i<S;i++) { long long a=rand()%(n-1)+1; if(check(a,n,t)) return false; } return true; } int main() { ll n; while(scanf("%lld",&n)!=EOF) { if(n == 1 || n == 2) { printf("Non"); continue; } if(Miller_Rabin(n) || n == 4) printf("Yesn"); else printf("Non"); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |