真的需要二次探测吗 /yiw
查看原帖
真的需要二次探测吗 /yiw
87064
ducati楼主2022/4/5 21:10

我只用 Fermat 素性测试就过了,测了素数 2,3,5,7,11,13,17,372,3,5,7,11,13,17,37,把所有 long long 范围内的 卡米克尔数 全部测了一遍,发现都是 NO。

所以有没有人能够叉掉我的这份代码,或者说明它的正确性啊 /kel

一年前我还是邪教徒,那时的码风令人呕吐

#include <bits/stdc++.h>
#define int unsigned long long
using namespace std;

int t,n;
int pr[8]={2,3,5,7,11,13,17,37};

int mul(int x,int y,int p)
{
	int res=0;
	for (;y;y=y>>1,x=(x*2)%p)
	  if (y&1ll)  res=(res+x)%p;
	
	return res;
}

int quick_power(int x,int y,int p)
{
	int res=1;
	for (;y;y=y>>1,x=mul(x,x,p))
	  if (y&1ll)  res=mul(res,x,p);
	
	return res;
}

bool is_prime(int x)
{
	for (int i=0;i<7;i++)
	{
		if (x==pr[i])  return true;
		if (x%pr[i]==0ll)  return false;
		if (quick_power(pr[i],x,x)!=pr[i]) {return false;}
	}
	return true;
}

signed main()
{
	cin>>t;
	while (t--)
	{
		cin>>n;
		if (is_prime(n))  cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}
2022/4/5 21:10
加载中...