数论基础

费马小定理

P为质数 a为任意整数

$ a^{p-1} equiv 1 (mod p)$

线性筛

欧拉筛

for(int i=2;i<=n;i++)
{
	if(!is_prime[i])
	{
		prime[++top]=i;
	}
	for(int j=1;j<=top && i*prime[j]<=n;j++)
	{
		is_prime[i*prime[j]]=true;
		cnt[i*prime[j]]++;
		if(i%prime[j]==0) break;	
	}		
}

欧拉函数

(phi(n))是n以内与n互质的输的个数 (phi(1)=1)
是积性函数 但不是完全积性函数

(phi(n)=n(1-frac{1}{p_1})(1-frac{1}{p_2})cdots(1-frac{1}{p_k}))

(p_i)是n的质因子

由积性函数得另一式子:

(phi(n)=p_1^{k_1-1}(p_1-1)*p_2^{k_2-1}(p_2-1)cdots p_i^{k_i-1}(p_i-1)) p为n的质因子

由上可以进行线性筛了

void get_phi()
{
	phi[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!is_prime[i]) prime[++top]=i,phi[i]=i-1;
		
		for(int j=1;j<=top&&prime[j]*i<=n;j++)
		{
			is_prime[i*prime[j]]=true;
			
			if(i%prime[j]==0) 
			{
				phi[i*prime[j]]=phi[i]*prime[j];
				break;
			}
			else
			{
				phi[i*prime[j]]=phi[i]*(prime[j]-1);
			}
	    }
    }
}

欧拉定理

n与a互质

(a^{phi(n)} equiv 1 (mod n))

若n为质数 则变为 费马小定理

扩展欧几里得算法

(ax+by=gcd(a,b))

一定有解
(y_1=x_2-a/b*y_2)
(x_1=y_2)

因为 (gcd(a,0)=a)
所以 b=0时 显然 x=1,y=0

void exgcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1;
		y=0;
		return ;
	}
	exgcd(b,a%b,x,y);
	int tmp=y;
	y=x-a/b*y;
	x=tmp;
} 

求逆元

(不会逆元怎么打UR!)
求 m 在(mod p) 意义下的逆元 p 为质数

扩展欧几里得算法求逆元

ax+by=1

a=m
b=p

mx+bp=1
取模 p 后 为 mx=1

所以x为m在模p下的逆元

费马小定理求逆元

因为 (m^{p-1} equiv 1(mod p))
所以 (m*m^{p-2} equiv 1 (mod p))

所以 (m^{p-2}) 就是m在模质数p下的逆元
快速幂即可


我数论太弱了 补了这一点点基础...

我乱打的一些 一些概念可能不对 哪里有错误 希望可以评论指出 谢谢

原文地址:https://www.cnblogs.com/ofsxb/p/5228037.html