📄 素数测试问题.cpp
字号:
#include<iostream>
#include<cstdlib>
using namespace std;
unsigned __int64 fMultiModular(unsigned __int64 a,unsigned __int64 b,const unsigned __int64 n)
{
unsigned __int64 back = 0,temp = a%n;
while(b>0)
{
if(b&0x1){
if((back = back + temp)>n)
back -= n;
}
if((temp <<=1)>n)
temp -=n;
b >>=1;
}
return back;
}
unsigned __int64 modular_exp(const unsigned __int64 a,unsigned __int64 b,const unsigned __int64 n)
{
unsigned __int64 d = 1,dTemp = a%n;
while(b>0)
{
if(b&0x1)
d = fMultiModular(d,dTemp,n);
dTemp = fMultiModular(dTemp,dTemp,n);
b >>=1;
}
return d;
}
bool fWitNess(const unsigned __int64 a,const unsigned __int64 n,char t,const unsigned __int64 u)
{
unsigned __int64 x,y;
x = modular_exp(a,u,n);
while(t--)
{
y = fMultiModular(x,x,n);
if(y==1&&x!=1&&x!=n-1)
return true;
x = y;
}
return y!=1;
}
bool miller_rabin(const unsigned __int64 n,int count)
{
if(n==1)
return false;
if(n==2)
return true;
unsigned __int64 a,u;
char t = 0;
for(u = n-1;!(u&0x1);u>>=1)
++t;
for(int i=1;i<=count;++i)
{
a = rand()%(n-1)+1;
if(fWitNess(a,n,t,u))
return false;
}
return true;
}
int main()
{
unsigned __int64 test_num;
while(scanf("%I64u",&test_num)==1)
{
//if(test_num==0){printf("NO\n");return 0;}
if(miller_rabin(test_num,20))
printf("YES\n");
else printf("NO\n");
}
//return 0;
system("pause");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -