为什么Miller-Rabin算法比朴素的判断素数方法还慢
  • 板块学术版
  • 楼主王熙文
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/1/28 14:27
  • 上次更新2023/11/5 04:14:56
查看原帖
为什么Miller-Rabin算法比朴素的判断素数方法还慢
353688
王熙文楼主2021/1/28 14:27

RT,我的Miller-Rabin算法:

int qcheng(int a,int b,int c)//快速积
{
	int ans=0,res=a;
	while(b)
	{
		if(b&1/*=b%2==1*/) ans=(ans+res)%c;
		res=(res+res)%c;
		b>>=1/*=b/=2*/;
	}
	return ans;
}
int qmi(int a,int b,int c)//快速幂
{
	int ans=1,res=a;
	while(b)
	{
		if(b&1) ans=qcheng(ans,res,c);
		res=qcheng(res,res,c);
		b>>=1;
	}
	return ans;
}
int prime[]={2,3,5,7,11,13,17,19,23,29};
bool sushu(int x)//快速判断素数
{
	int s=0,t=x-1;
	if(x==2) return true;//2是素数
	if(x<2 || !(x&1)) return false;//如果x是偶数或者是0,1,那它不是素数
	while(!(t&1)/*=t%2==0*/)//将x分解成(2^s)*t的样子
	{
		s++;
		t>>=1;
	}
	for(int i=0;(i<10 && prime[i]<x);i++)//随便选一个素数进行测试
	{
		int a=prime[i],k,b=qmi(a,t,x);//先算出a^t
		for(int j=1;j<=s;j++)//然后进行s次平方
		{
			k=qcheng(b,b,x);//求b的平方
			if(k==1 && b!=1 && b!=x-1) return false;//用二次探测判断
			b=k;
		}
		if(b!=1) return false;//用费马小定律判断
	}
	return true;//如果进行多次测试都是对的,那么x就很有可能是素数
}

朴素的:

bool sushu(int a)
{
	if(a<2) return 0;
	for(int i=2;i<=sqrt(a);i++)
	{
		if(a%i==0) return 0;
	}
	return 1;
}

对于SP2这题,用Miller-Rabin比朴素的还慢:

Miller-Rabin:https://www.luogu.com.cn/record/45661759

朴素的:https://www.luogu.com.cn/record/45661587

可以看到Miller-Rabin几乎慢了一倍,难道是我的算法写假了?一个复杂度是O(sqrt(sqrt(n))),一个是O(sqrt(n))

求助大佬们

2021/1/28 14:27
加载中...