拉宾米勒测试

来源:互联网 发布:广州java 外包公司 编辑:程序博客网 时间:2024/05/17 08:20

参见:
http://www.cnblogs.com/Mathics/p/4028819.html

#include<bits/stdc++.h>using namespace std;long long pow_mod(long long base,long long power,long long mod){   // cout<<base<<endl;    if(power==0) return 1;    if(power==1) return base;    if(power%2) return pow_mod(base*base%mod,power>>1,mod)*base%mod;    else return pow_mod(base*base%mod,power>>1,mod);}bool l_m_test(long long base,long long num){    long long d=num-1;    while(!(d&1)) d/=2;    if(pow_mod(base,d,num)==1||pow_mod(base,d,num)==num-1) return true;    long long t=(num-1)/2;    while(d!=t)    {        d*=2;        if(pow_mod(base,d,num)==num-1) return true;    }    return false;}int main(){    for(int i=2;i<102;i++)    {       if(((i&1)!=0)&&(i%3!=0)&&(i>2)&&l_m_test(2,i)&&((i<=7)||l_m_test(7,i))&&((i<=61)||l_m_test(61,i))||(i==2)||(i==3))        cout<<i<<endl;    }}