欧拉函数 学习笔记

定义

\(\varphi(n)\) 表示小于 \(n\) 的数中与 \(n\) 互质的个数,是一个重要的数论函数。

性质

  1. \(n\) 为质数,则 \(\varphi(n)=n-1\)

显然小于 \(n\) 的都与 \(n\) 互质。

  1. \(n\) 为质数,则 \(\varphi(n^k)=n^k-n^{k-1}\)

在小于等于 \(n^k\) 的数中不与 \(n^k\) 互质的只有 \(n\) 的倍数,共 \(n^{k-1}\) 个。

  1. 欧拉函数是积性函数,即当 \(\gcd(a,b)=1\)\(\varphi(mn)=\varphi(m)\varphi(n)\)

先给出几个定义。

剩余类:模 \(n\) 同余的集合。

剩余系:对于某一个特定的正整数 \(n\),一个整数集中的数模 \(n\) 所得的余数域。

完全剩余系:剩余系中包含了这个正整数所有可能的余数。

简化剩余系:完全剩余系中与 \(n\) 互质的数构成的子集。

\(x_1,x_2,\cdots,x_{\varphi(m)}\) 为一个模 \(m\) 意义下的简化剩余系,\(y_1,y_2,\cdots,y_{\varphi(n)}\) 为一个模 \(n\) 意义下的简化剩余系。

引理 1:\(\forall i,j,\gcd(x_in+y_jm,mn)=1\)

\[\because \gcd(x_i,m)=1 \]

\[\therefore \gcd(x_in,m)=1 \]

\[\therefore \gcd(x_in+y_jm,m)=1 \]

同理 \(\gcd(x_in+y_jm,n)=1\)。由两式得证。

引理 2:\(x_in+y_im\)\(mn\) 的所有不同剩余类中。

反证法,假设 \(\exists(i,j)\ne(k,l),x_in+y_jm\equiv x_kn+y_lm\pmod{mn}\)

\[\therefore x_in+y_jm\equiv x_kn+y_lm\pmod{m} \]

\[\therefore x_in\equiv x_kn\pmod{m},x_i\equiv x_k\pmod{m} \]

由于 \(x_i,x_k\) 在同一简化剩余系中,\(i=k\),同理 \(j=l\),矛盾。

引理 3:若 \(z\)\(mn\) 的简化剩余系中,\(\exists i,j,x_in+y_jm\equiv z\pmod{nm}\)

\(\because \gcd(n,m)=1\),由裴蜀定理得,\(\exists p,q,mp+nq=z\)

\[\because \gcd(z,mn)=1 \]

\[\therefore \gcd(mp+nq,mn)=1 \]

\[\therefore(q,m)=1,(p,n)=1 \]

所以 \(p,q\) 分别在 \(n,m\) 的简化剩余系中,得证。

因此 \(x_in+y_jm\) 遍历 \(mn\) 的简化剩余系中。\(mn\) 的简化剩余系大小为 \(\varphi(mn)\)\(x_in+y_jm\)\(\varphi(m)\varphi(n)\) 种。因此 \(\varphi(mn)=\varphi(m)\varphi(n)\)

  1. \(\varphi(n)=n\prod(1-\frac{1}{p_i})\)

\[\begin{aligned}\varphi(n)&=\prod\varphi(p_i^{k_i})\\&=\prod p_i^{(k_i-1)}(p_i-1)\\&=\prod p_i^{k_i}\prod\frac{p_i-1}{p_i}\\&=n\prod(1-\frac{1}{p_i})\end{aligned} \]

欧拉定理

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

证明:

构造数列 \(r_1,r_2,\cdots,r_{\varphi(m)}\) 为一个模 \(m\) 意义下的简化剩余系。显然 \(ar_1,ar_2,\cdots ar_{\varphi(m)}\) 也是一个模 \(m\) 意义下的简化剩余系。那么 \(\prod r_i\equiv\prod ar_i\equiv a^{\varphi(m)}\prod r_i\)。约掉 \(\prod r_i\) 得证。

费马小定理就是 \(m\) 为质数的特殊情况。

扩展欧拉定理

\[a^b\equiv\begin{cases}a^{b\bmod\varphi(m)},\,&\gcd(a,m)=1\\a^b,&\gcd(a,m)\ne1,\,b<\varphi(m)\\a^{b\bmod\varphi(m)+\varphi(m)},&\gcd(a,m)\ne1,\,b\ge\varphi(m)\end{cases}\pmod m\]

这个式子常常用来给次数高的式子降幂。

证明:

第一行就是把 \(a^{\varphi(m)}\) 去掉。下面证明第三行。

\(m\) 质因数分解为 \(\prod p_i^{\alpha_i}\),即证 \(a^b\equiv a^{b\bmod\varphi(m)+\varphi(m)}\pmod{p_i^{\alpha_i}}\)

\(\gcd(a,p_i^{\alpha_i})=1\)

欧拉函数是积性函数,有 \(\varphi(p_i^{\alpha_i})\mid\varphi(m)\)。那么仿照第一行证明即可。

\(\gcd(a,p_i^{\alpha_i})\ne1\)

\(\varphi(p_i^{\alpha_i})=p_i^{\alpha_i}\times\frac{p_i-1}{p_i}=p_i^{\alpha_i-1}(p_i-1)\geq p_i^{\alpha_i-1}\geq \alpha_i\)。有 \(b\geq\varphi(m)\geq\varphi(p_i^{\alpha_i})\geq\alpha_i\)。又因为 \(\gcd(a,p_i^{\alpha_i})\ne1\),即 \(p_i\mid a\),因此 \(p_i^{\alpha_i}\mid a^b\)\(p_i^{\alpha_i}\mid a^{b\bmod\varphi(m)+\varphi(m)}\),即 \(a^b\equiv a^{b\bmod\varphi(m)+\varphi(m)}\equiv0\pmod{p_i^{\alpha_i}}\)。证毕。

P4139

题意:求 \(2^{2^{2^\cdots}}\bmod p\)

用扩展欧拉定理,得到 \(2^{2^{2^\cdots}}\equiv 2^{2^{2^\cdots}\bmod\varphi(p)+\varphi(p)}\pmod{p}\)。上面的 \(2^{2^\cdots}\bmod\varphi(p)\) 中,也是一个无穷项的幂塔,但是模数为 \(\varphi(p)\)。可以不断递归,最终模数会变成 \(1\),此时返回 \(0\)

int solve(int p){
  return p==1?0:qpow(2ll,solve(phi[p])+phi[p],p);
}

欧拉反演

一个性质:\(n=\sum_{d\mid n}\varphi(d)\)

定义 \(f(n)=\sum_{d\mid n}\varphi(d)\)

\(\gcd(n,m)\)\(f(n)f(m)=\sum_{i\mid n}\varphi(i)\sum_{j\mid m}\varphi(j)=\sum_{i\mid n}\sum_{j\mid m}\varphi(i)\varphi(j)=\sum_{i\mid nm}\varphi(i)=f(nm)\)。因此 \(f(n)\) 是积性函数。

\[\begin{aligned}f(p^k)&=\varphi(1)+\varphi(p)+\varphi(p^2)+\dots+\varphi(p^k)\\&=1+p-1+p^2-p+\dots+p^k-p^{k-1}\\&=p^k\end{aligned} \]

\[f(n)=\prod f(p_i^{k_i})=\prod p_i^{k_i}=n \]

运用这个性质叫欧拉反演。其实就是莫反的一个推论 \(\varphi\ast\mathbf{1}=\operatorname{Id}\)

P2398

考虑欧拉反演,原式等于 \(\sum_{i=1}^n\sum_{j=1}^n\sum_{d\mid\gcd(i,j)}\varphi(d)\)

枚举 \(d\),原式等于 \(\sum_{d=1}^n\sum_{d\mid i}\sum_{d\mid j}\varphi(d)\),即 \(\sum_{d=1}^n\lfloor\frac n d \rfloor^2\varphi(d)\)。可以整除分块。

#include<bits/stdc++.h>
using namespace std;
int phi_init(int n,int prime[],int phi[],bool a[],int cnt=0){
  phi[1]=1;
  for(int i=2;i<=n;i++)a[i]=1;
  for(int i=2;i<=n;i++){
    if(a[i])prime[++cnt]=i,phi[i]=i-1;
    for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
      a[i*prime[j]]=0;
      if(i%prime[j]==0){
        phi[i*prime[j]]=phi[i]*prime[j];
        break;
      }
      else phi[i*prime[j]]=phi[i]*(prime[j]-1);
    }
  }
  return cnt;
}
int n,prime[100005],phi[100005];
long long ans;
bool a[100005];
int main(){
  cin>>n,phi_init(n,prime,phi,a);
  for(int i=1;i<=n;i++)phi[i]+=phi[i-1];
  for(int l=1,r;l<=n;l=r+1)r=n/(n/l),ans+=1ll*(phi[r]-phi[l-1])*(n/l)*(n/l);
  return cout<<ans<<'\n',0;
}

[[数学]]

posted @ 2024-03-01 09:35  lgh_2009  阅读(24)  评论(0)    收藏  举报