简单快速判断是否为质数

duanchangdi
6
2025-05-20

前言

正常判断一个数,要循环除以每个小于自身且大于1的整数,若余数为0,则为非素数。
但是这样太慢,时间复杂度为o ( n ) ,判断大量的绝对不行

解决办法

返回1是素数

int prime(int p)
{
	if (p == 2 || p == 3)
	{ 
		return 1; 
	}
	if (p % 6 != 1 && p % 6 != 5)
	{ 
		return 0; 
	}
	for (int i = 5; i <= floor(sqrt(p)); i += 6)
	{
		if (p%i == 0 || p % (i + 2) == 0)
		{ 
			return 0;
		}
	}
	return 1;
}

第一部分

if (p == 2 || p == 3)
	{ 
		return 1; 
	}

先将2和3两个质数给排除出去

第二部分

if (p % 6 != 1 && p % 6 != 5)
	{ 
		return 0; 
	}

	for (int i = 5; i <= floor(sqrt(p)); i += 6)
	{
		if (p%i == 0 || p % (i + 2) == 0)
		{ 
			return 0;
		}
	}
	return 1;

所有大于3的数都可以写成 6x+1,6x+2,6x+3,6x+4,6x+5

😕 6x+2=2(3x+1)--可以被整除,非质数
😕 6x+3=3(2x+1)--可以被整除,非质数
😕 6x+4=2(3x+2)--可以被整除,非质数
🎉️ 只有(6x+1),(6x+5)不可被整除

👀️ 所以先筛选出去模除6不为1或者5的所有数,且一定为非质数

因为在这之前已经判断了6x+2,6x+3,6x+4
最后一个循环判断这个数会不会被6x+1,6x+5
所以5开始步进为2

6x+1=i + 2
6x+5=i

🚀️ 若存在整出返回0,非质数,否则是返回1是质数