【学习笔记】欧拉函数 欧拉定理 扩展欧拉定理
欧拉函数 欧拉定理 学习笔记
之前没怎么搞过数论,现在来学学 从最简单的搞起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\)的最小质因子)
- \(n\)为质数,\(\varphi(n)=n-1\)
- 当\(p\)为\(d\)的一个质因子,\(\varphi(n)=\varphi(d)\times p\)
- 当\(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;
}
欧拉函数性质
-
欧拉函数是积性函数(特别的\(\varphi(2n)=\varphi(n)\))
-
\(n=\sum_{d|n}\varphi(d)\) \(n\)的所有因子的欧拉函数值之和为\(n\)
-
还有一部分就是上面证明中提到的了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;
}
总结
其实就三句有用的
- 欧拉公式 \(\varphi(x)=x\times \prod_{i=1}^{k}(1-\frac{1}{p_i})\)
- 欧拉定理 \(gcd(a,m)=1\),\(a^{\varphi(m)}\equiv 1(mod\) \(m)\)
- 扩展欧拉定理 \(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)\)