Millerrabin代码求调
  • 板块学术版
  • 楼主FormulaOne
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/7/15 14:40
  • 上次更新2023/10/27 20:13:19
查看原帖
Millerrabin代码求调
180406
FormulaOne楼主2022/7/15 14:40
#include <iostream>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#define ll long long
using namespace std;
ll ksm(ll a,ll b,ll p)
{
	ll x=a,y=b,k=1;
	while(y>1)
	{
		if(y%2!=0) k=k*x%p;
		y/=2;
		x=x*x%p; 
	}
	return x*k%p;
}
void millerrabin(ll n)
{
	ll m=n-1,t=0;
	if(n==2)
	{
		cout<<"YES";
		return;
	}
	if(n<2||n%2==0)
	{
		cout<<"NO";
		return;
	}
	while(m%2==0)
	{
		m/=2;
		t++;
	}
	for(int l=1;l<=30;l++)
	{
		ll a=rand()%(n-1)+1;
		ll x=ksm(a,m,n),y;
		for(int q=1;q<=t;q++)
		{
			y=ksm(x,x,n);
			if(y==1)
			{
				if(x==1||x==n-1)
				{
					cout<<"NO";
					return;
				}
			}
		}
	}
	cout<<"YES";
	return;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		ll n;
		cin>>n;
		millerrabin(n);
		cout<<endl;
	}
	return 0;
}
2022/7/15 14:40
加载中...