数论 素数

本文探讨了威尔逊定理、费马定理和费马小定理,介绍了朴素素数检验算法及Miller-Rabin素数测试的原理,包括二向探测定理的应用,并展示了如何通过随机数计算进行素数判断。同时涵盖了质数筛选和编程实现实例。
摘要由CSDN通过智能技术生成

性质

  1. x ⩾ 2 x\geqslant 2 x2 ,则 x = p 1 × p 2 × p 3 × p 4 × p 5 × p 6 × . . . × p n x= p_1 \times p_2 \times p_3 \times p_4 \times p_5 \times p_6 \times ... \times p_n x=p1×p2×p3×p4×p5×p6×...×pn

  2. 威尔逊定理: 若 p p p 为素数,则 ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)! \equiv -1 \pmod{p} (p1)!1(modp) 。 若 ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)! \equiv -1 \pmod{p} (p1)!1(modp) 为素数,则 p p p 为素数。

  3. 费马定理: 若 a , p a,p a,p 互质且 p p p 为素数, a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod{p} ap11(modp)

  4. 费马小定理: 若 p p p 为素数, a p ≡ a ( m o d p ) a^{p} \equiv a \pmod{p} apa(modp)

素数的判定

朴素算法

void check(int x)
{
	for(int i=2; i*i<=x; i++)
	{
		if(x%i==0)
		{
			cout<<"NO"<<endl;
			return ;
		}
	}
	if(x==1)cout<<"NO"<<endl;
	else cout<<"YES"<<endl;
}

M i l l e r − R a b i n Miller-Rabin MillerRabin 素数测试

原理1:费马小定理: 若 p p p 为素数, a p ≡ a ( m o d p ) a^{p} \equiv a \pmod{p} apa(modp)

原理2:二向探测定理: 若 p p p 为素数并 x 2 ≡ 1 ( m o d p ) x^2 \equiv 1 \pmod{p} x21(modp) x = 1 x=1 x=1 x = p − 1 x=p-1 x=p1

x 2 − 1 ≡ 0 ( m o d p ) x^2 -1 \equiv 0 \pmod{p} x210(modp)
( x − 1 ) × ( x + 1 ) ≡ 0 ( m o d p ) (x-1)\times (x+1) \equiv 0 \pmod{p} (x1)×(x+1)0(modp)
x = 1 x=1 x=1 x = p − 1 x=p-1 x=p1

  1. 计算 数字 m , r m,r m,r n = 2 r + m + 1 n=2^r + m +1 n=2r+m+1

  2. 选择随机数 A < n A<n A<n s r a n d ( t i m e ( N U L L ) ) srand(time(NULL)) srand(time(NULL)) ) ,

  3. 计算 A 2 i + m ( 1 ≤ i ≤ r ) A^{2^i + m} (1\le i \le r) A2i+m(1ir) ,若 A 2 i + m   m o d   n = 1 a n d ( A 2 i − 1 + m = = 1 或 A 2 i − 1 + m = = n − 1 ) {\color{#2CA9E1}{A^{2^i + m} \bmod n=1 \quad and \quad (A^{2^{i-1} + m}==1 \quad \mathsf{\text{或}} \quad A^{2^{i-1} + m}==n-1)}} A2i+mmodn=1and(A2i1+m==1A2i1+m==n1) 则同过测试,否则 n n n 不为素数

4.计算 A n − 1   m o d   n 等于 A 2 r + m   m o d   n {\color{#2CA9E1}{A^{n-1} \bmod n \quad \mathsf{\text{等于}} \quad A^{2^r + m} \bmod n}} An1modn等于A2r+mmodn 若值为 1 1 1 则同过测试否则 n n n 不为素数.

  1. 重复1至4(大概 6 , 7 6,7 6,7 遍即可).
#define ll unsigned long long
namespace Solve
{
	ll ksc(ll x,ll y,ll mod)
	{
		ll res=0;
		while(y)
		{
			if(y&1)
			{
				res=res+x;
				res%=mod;
			}
			y>>=1;
			x=(x+x)%mod;
		}
		return res;
	}
	ll ksm(ll xx,ll y,ll mod)
	{
		__int128 res=1,x=xx;
		while(y)
		{
			if(y%2==1)res=res*x%mod;
			x=x*x%mod;
			y>>=1;
		}
		return res;
	}
	bool Miller_Rabin(ll n)
	{
		if(n==1)return 0;
		if(n==2)return 1;
		ll m=n-1,r=0;
		while(m%2==0)m>>=1,r++;
		for(ll i=1; i<=10; i++)
		{
			ll a=rand()%(n-1)+1;
			ll x=ksm(a,m,n),nxt;
			for(ll j=1; j<=r; j++)
			{
				nxt=ksc(x,x,n);
				if(nxt==1&&x!=1&&x!=n-1)return 0;
				x=nxt;
			}
			if(x!=1)return 0;
		}
		return 1;
	}
}

提交记录

质数筛

线性算法,可以求出

void find_prime(int n)
{
	int cnt=0;
	for(int i=2; i<=n; i++)
	{
		if(!v[i])
		{
			p[++cnt]=i;
			v[i]=i;
			cout<<i<<" ";
		}
		for(int j=1; p[j]*i<=n&&j<=cnt; j++)
		{
			v[p[j]*i]=p[j];
			if(!(i%p[j]))break;
		}
	}
	cout<<endl;
	for(int i=2; i<=n; i++)cout<<i<<" "<<v[i]<<endl;
	cout<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值