【学习笔记】欧拉函数 欧拉定理 扩展欧拉定理

欧拉函数 欧拉定理 学习笔记

之前没怎么搞过数论,现在来学学 从最简单的搞起QwQ

欧拉函数

先说几个简单的概念

互质大家应该都懂,就不说了(除了1以外没有其他公因子)

剩余类、完全剩余系、缩系就不说了,不是什么高级的东西,感兴趣可以问我

在数论,对正整数n,欧拉函数\(\varphi(n)\)是小于n的正整数中与n互质的数的数目

欧拉函数的推导

公式最后再说,先推一下,需要大力分讨

(1)\(n=1\),则\(\varphi(1)=1\),1与任何数都互质

(2)\(n\)是质数,\(\varphi(n)=n-1\)

(3)\(n\)是质数的某次方,\(n=p^k\)(p为质数,\(k\geq 1\)\(\varphi(n)=p^k-p^{k-1}\)

因为从\(1\)\(n\)一共有\(p^k\)个数,其中不与\(n\)互质的一定为\(p\)的倍数共有\(p^{k-1}\)

柿子亦可化简为\(\varphi(p^k)=p^k(1-\frac{1}{p})\)\(k=1\)时得到上述第二种情况

(4)\(n\)可分解为两互质整数之积,\(n=p_1p_2\)\(\varphi(n)=\varphi(p_1p_2)=\varphi(p_1)\varphi(p_2)\)

证明需用CRT,有点麻烦,记住就行了(其实就是积性函数)

(5)任意正整数都可以写成质数之积,\(n=p_1^{k_1}p_2^{k_2}\)\(p_m^{k_m}\)

根据(4)可得\(\varphi(n)=\varphi(p_1^{k_1})\varphi(p_2^{k_2})\)\(\varphi(p_m^{k_m})\)

再根据(3)可得\(\varphi(n)=p_1^{k1}(1-\frac{1}{p_1})p_2^{k2}(1-\frac{1}{p_2})\)\(p_m^{k_m}(1-\frac{1}{p_m})\)

\(\varphi(n)=p_1^{k_1}p_2^{k_2}\)\(p_m^{k_m}\)\((1-\frac{1}{p_1})(1-\frac{1}{p_2})\)\((1-\frac{1}{p_m})\)

最终得\(\varphi(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})\)\((1-\frac{1}{p_m})\)

综上所述:\(\varphi(n)=n\prod_{i=1}^{m}(1-p_i)\)

这样我们就得到了欧拉函数的通项公式,考虑如何求解

欧拉函数就用欧拉筛(bushi

线性筛素数

保证每个数被最小质因子筛去,通过break做到\(O(n)\)

void oula()
{
	memset(vis,false,sizeof(vis));
	for(int i=2;i<=n;i++)
	{
		if(!vis[i]) prime[++cnt]=i;
		for(int j=1;j<=cnt && i<=n/prime[j];j++)
		{
			vis[i*prime[j]]=true;
			if(i%prime[j]==0) break;
		}
	}
}

线性筛欧拉函数

用到的三个性质 设\(d=\frac{n}{p}\)\(p\)\(n\)的最小质因子)

  1. \(n\)为质数,\(\varphi(n)=n-1\)
  2. \(p\)\(d\)的一个质因子,\(\varphi(n)=\varphi(d)\times p\)
  3. \(p\)\(d\)互质,\(\varphi(n)=\varphi(d)\times \varphi(p)\)
void oula()
{
	memset(vis,false,sizeof(vis));
	phi[1]=1,cnt=0;
	for(int i=2;i<=n;i++)
	{
		if(!vis[i]) prime[++cnt]=i,phi[i]=i-1; //性质1 
		for(int j=1;j<=cnt && i<=n/prime[j];j++)
		{
			vis[i*prime[j]]=true; 
			if(i%prime[j]==0)
			{
				phi[i*prime[j]]=phi[i]*prime[j]; //性质2 
				break;
			}
			phi[i*prime[j]]=phi[i]*(prime[j]-1); //性质3 
		}
	}
}

求某个数的欧拉函数值

int oula(int x)
{
	int res=x;
	for(int i=2;i*i<=x;i++)
	{
		if(x%i==0) res=res/i*(i-1);
		while(x%i==0) x/=i;
	}
	if(x>1)return res=res/x*(x-1);
	else return res;
}

欧拉函数性质

  1. 欧拉函数是积性函数(特别的\(\varphi(2n)=\varphi(n)\)

  2. \(n=\sum_{d|n}\varphi(d)\) \(n\)的所有因子的欧拉函数值之和为\(n\)

  3. 还有一部分就是上面证明中提到的了qwq

欧拉定理

\(gcd(a,m)=1\),则\(a^{\varphi(m)}\equiv1 (mod\) \(m)\)

欧拉定理的证明

首先举出几个引理

引理一

  • \(a,b,c\)三个任意整数与正整数\(m\),满足\(m\)\(c\)互质,则如果\(a\times c\equiv b\times c(mod\) \(m)\),那么\(a\equiv b(mod\) \(m)\)
  • 证明:由同余的同加性可知,\(a\times c-b\times c\equiv 0(mod\) \(m)\),即\((a-b)\times c\equiv 0(mod\) \(m)\)\(gcd(c,m)=1\),因此\(c\)不为\(m\)的倍数,即\((a-b)\)\(m\)的倍数,\((a-b)\equiv 0(mod\) \(m)\)\(a\equiv b(mod\) \(m)\)

引理二

  • \(a,b\)属于\(m\)的缩系,则\(a\times b\) \(mod\) \(m\)也属于\(m\)的缩系
  • 证明:若\(a,b\)\(m\)互质,则\(a\times b\)也与\(m\)互质(因为\(a,b\)中都没有与\(m\)相同的因子,所以\(a\times b\)也没有与\(m\)相同的因子),因此(可由反证法得知)\(a\times b\) \(mod\) \(m\)也与\(m\)互质

引理三

  • \(n,m\)互质,且\(S_1\)={\(a_1\),\(a_2\),…,\(a_m\)}为\(m\)的完全剩余系,则\(S_2\)={\(na_1\) \(mod\) \(m\),\(na_2\) \(mod\) \(m\),…,\(na_m\) \(mod\) \(m\)}也构成\(m\)的完全剩余系
  • 证明:假设\(na_i\equiv na_j(mod\) \(m)\),由引理一可知\(a_i\equiv a_j(mod\) \(m)\),因为是其都属于\(m\)的完全剩余系,所以\(a_i\not \equiv a_j(mod\) \(m)\),产生了矛盾,因此\(na_i\not\equiv na_j(mod\) \(m)\),在\(S_2\)中两两之间都满足这一性质,即满足其为\(m\)的完全剩余系

引理四

  • \(n,m\)互质,且\(S_1\)={\(a_1\),\(a_2\),…,\(a_{\varphi(m)}\)}为\(m\)的简化剩余系(缩系),则\(S_2\)={\(na_1\) \(mod\) \(m\),\(na_2\) \(mod\) \(m\),…,\(na_{\varphi(m)}\) \(mod\) \(m\)}也为其简化剩余系
  • 证明:首先由引理三推出一个完全剩余系,然后根据引理二可证明此引理

证明欧拉定理

\(m\)的简化剩余系为{\(a_1\),\(a_2\),…,\(a_{\varphi(n)}\)}

\(a^{\varphi(m)}a_1a_2\)\(a_{\varphi(m)}\)=\((aa_1)(aa_2)…(aa_{\varphi(m)})\equiv a_1a_2\)\(a_{\varphi(m)}(mod\) \(m)\)

\(a^{\varphi(m)}a_1a_2\)\(a_{\varphi(m)}\equiv a_1a_2\)\(a_{\varphi(m)}(mod\) \(m)\)

后者(\(a_1a_2\)\(a_{\varphi(m)}\))均与\(m\)互质,直接由引理一得到\(a^{\varphi(m)}\equiv1(mod\) \(m)\)

欧拉定理的一点小扩展

\(a^b\equiv a^{b\mod {\varphi(n)}}(mod\) \(n)\)

证明

\(b=k\times \varphi(n)+r\)\(r=b\mod \varphi(n)\),则\(a^b\equiv a^{k\times \varphi(n)+r}\equiv a^r\times a^{\varphi(n)\times k}\equiv a^r\times (a^{\varphi(n)})^k(mod\) \(n)\)

因为\(a^{\varphi(n)}\equiv 1(mod\) \(n)\),所以\(a^b\equiv a^r(mod\) \(n)\),即\(a^b\equiv a^{b\mod \varphi(n)}(mod\) \(n)\)

扩展欧拉定理

由上得\(a^b\equiv a^{b\mod {\varphi(n)}}(mod\) \(n)\)

\(a,m∈ Z\)(不要求互质)时有

\(a^b\equiv \left\{\begin{matrix} a^{b\mod \varphi(m)} & b<\varphi(m)\\ a^{(b\mod \varphi(m))+\varphi(m)}& b\geq \varphi(m) \end{matrix}\right.\) \((mod\) \(m)\)

证明扩展欧拉定理

\(m\)的质因数\(p\),满足\(m=p^r\times s,gcd(p,s)=1\)

欧拉定理得\(p^{\varphi(s)}\equiv 1(mod\) \(m)\)\(\varphi(m)=\varphi(s)\varphi(p^r)\)

\(p^{\varphi(m)}\equiv(p^{\varphi(s)})^{\varphi(p^r)}\equiv1^{(\varphi(p^r))}\equiv1(mod\) \(s)\)

\(p^{\varphi(m)}=ks+1\),则\(p^{\varphi(m)+r}=p^{\varphi(m)}\times p^r\)=\((ks+1)\times p^r\)\(s=\frac{m}{p^r}\),得到\(p^{\varphi(m)+r}=(km+p^r)\)

\(p^{\varphi(m)+r}\equiv p^r(mod\) \(m)\)

\(b\geq r\)时,\(p^b\equiv p^{b-r}\times p^r\equiv p^{b-r}\times p^{\varphi(m)+r}\equiv p^{b+\varphi(m)}(mod\) \(m)\)

\(r\leq \varphi(p^r)\leq \varphi(m)\)\(b\geq \varphi(m)\geq\varphi(p^r)\geq r\)

因此可得\(a^b\geq a^{p^r}\),即\(a^{p^r}\)\(a^b\)的一个因子,也是\(a^{(b\mod \varphi(m))+\varphi(m)}\)的因子

\(a^b\equiv a^{(b\mod \varphi(m))+\varphi(m)}\equiv 0(mod\) \(p^{r})\)

然后质因子分解\(m\)\(\prod p_i^{r_i}\),按照上述方法,可得到每个\(p_i^{r_i}\)都满足\(a^b\equiv a^{(b\mod \varphi(m))+\varphi(m)}\equiv 0(mod\) \(p_i^{r_i})\)

综上所述:扩展欧拉定理成立

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#define int long long

using namespace std;

int phi,a,m,b,flag;

int ksm(int a,int b)
{
	int ans=1;
	for(;b;b>>=1,a=(a*a)%m)
	{
		if(b&1) ans=(ans*a)%m;
	}
	return ans;
}

int oula(int x)
{
	int res=x;
	for(int i=2;i*i<=x;i++)
	{
		if(x%i==0) res=res/i*(i-1);
		while(x%i==0) x/=i;
	}
	if(x>1)return res=res/x*(x-1);
	else return res;
}

signed main()
{
	scanf("%d%d",&a,&m);
	
	int mid=m;	phi=oula(m); char ch;
	while ((ch=getchar())<'0' || ch>'9');
	while (b=b*10ll+(ch^48),(ch=getchar())>='0' && ch<='9')
	{
		if (b>=phi) flag=1,b%=phi;	
	}
	if(b>=phi) b%=phi,flag=true;
	if(flag) b+=phi;
	
	printf("%lld",ksm(a,b));
	
	return 0;
}

例题

上帝与集合的正确用法

差不多是个裸题,柿子都给出来了,直接递归就好,然后用扩展欧拉定理求解即可

AC code

点击查看代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#define int long long

using namespace std;

const int maxn=1e7+5;

inline int read()
{
	int w=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
	{
		w=(w<<3)+(w<<1)+(ch^48);
		ch=getchar();
	}
	return w*f;
}

int t,p,cnt;
int phi[maxn];
bool vis[maxn];
int prime[maxn];

int ksm(int a,int b,int mod)
{
	int ans=1;
	for(;b;b>>=1,a=(a*a)%mod)
	{
		if(b&1) ans=(ans*a)%mod;
	}
	return ans%mod;
}

void oula()
{
	phi[1]=1,cnt=0;int n=maxn-5;
	for(int i=2;i<=n;i++)
	{
		if(!vis[i]) phi[i]=i-1,prime[++cnt]=i;
		for(int j=1;i<=n/prime[j] && j<=cnt;j++)
		{
			vis[i*prime[j]]=true;
			if(i%prime[j]==0)
			{
				phi[i*prime[j]]=phi[i]*prime[j];break;
			}
			phi[i*prime[j]]=phi[i]*(prime[j]-1);
		}
	}
}

int solve(int x)
{
	if(x==1) return 0;
	return ksm(2,solve(phi[x])+phi[x],x);
}

void work()
{
	printf("%lld\n",solve(read()));
}

signed main()
{
	oula();t=read();while(t--) work();
	
	return 0;
}

总结

其实就三句有用的

  1. 欧拉公式 \(\varphi(x)=x\times \prod_{i=1}^{k}(1-\frac{1}{p_i})\)
  2. 欧拉定理 \(gcd(a,m)=1\)\(a^{\varphi(m)}\equiv 1(mod\) \(m)\)
  3. 扩展欧拉定理 \(a^b\equiv \left\{\begin{matrix} a^{b\mod \varphi(m)} & b<\varphi(m)\\ a^{(b\mod \varphi(m))+\varphi(m)}& b\geq \varphi(m) \end{matrix}\right.\) \((mod\) \(m)\)
posted @ 2022-11-03 08:34  NinT_W  阅读(101)  评论(0编辑  收藏  举报