欧拉函数、定理学习笔记
欧拉函数、定理学习笔记
欧拉函数
定义
所有小于等于 \(x\) 的数中与 \(x\) 互质的数的个数。
符号: \(\varphi(x)\)
通项公式
\(p_i\) 表示 \(x\) 的质因数,\(n\) 表示 \(x\) 的质因数个数。
欧拉函数的性质
对于质数 \(x\),\(\varphi(x)=x-1\)
若 \(x\),\(y\) 互质,则 \(\varphi(x) \times \varphi(y) = \varphi(x \times y)\)
这条性质属于积性函数,即任意满足有 互质 的数 \(a,b\) 时,恒有 \(f(a \times b) = f(a) \times f(b)\)
(怎么证明我是真的不会,如果真想知道可以看下这个)
如果 \(n\) 为奇数,则 \(\varphi(n \times 2) = \varphi(n)\)
因为 \(n\) 为奇数,所以 \(n\) 与 2 互质,且 \(\varphi(2) = 1\),所以上式成立。
如果 \(x\) 为质数,则\(\varphi(x^k) = x^k - x^{k-1}\)
因为与 \(x^k\) 不互质的数只有 \(x\) 的倍数,而 \(x^k\) 中 \(x\) 的倍数有 \(x^{k-1}\) 个。
如果 \(3 \le x\),则 \(\varphi(x)\) 的值为偶数。
因为 \(\gcd(x,n) = \gcd(n-x,n)\) ,更相减损术证明,与 \(x\) 互质的数是成对存在的,且每一对中的两个数之和为 \(x\)。
\[\sum\limits_{i=1,(i,x)=1}^{x-1}i =\dfrac {\varphi(x) \times x} {2} (2 \le x) \]
通过上面的证明可知,每一对与 \(x\) 互质的数的和为 \(x\),总共有 \(\dfrac {\varphi(x)}{2}\) 对。
\(x = \sum\limits_{i|x} \varphi(i)\),即 \(x\) 的因数(包括1和它自己)的欧拉函数之和等于 \(x\)。
这条性质又叫欧拉反演。
证明:
定义函数 \(f(n)=\sum\limits_{i|n} \varphi(i)\)
\(f(n)\) 是积性函数,证明: $$f(n) \times f(m) = \sum_{i|n}\varphi(i) \times \sum_{j|m}\varphi(j) = \sum_{i|n} \sum_{j|m} \varphi(i) \varphi(j) = \sum_{i|n} \sum_{j|m} \varphi(i \times j) = \sum_{d|nm} \varphi(d) = f(nm)$$
\(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\)
\(n=p_1^{k_1} \times p_2^{k_2} \times \dots \times p_m^{k_m}\)
\(f(n)=f(p_1^{k_1}) \times f(p_2^{k_2}) \times \dots \times p_m^{k_m} = p_1^{k_1} \times p_2^{k_2} \times \dots \times p_m^{k_m} = n\)
求欧拉函数
求单个数的欧拉函数
直接根据之前的通式 \(\varphi(x) = x \prod_{i=1}^n \left( 1-\dfrac{1}{p_i} \right)\) 计算即可。
其中有以下几点细节:
- 如果以 \(\sqrt n\) 为上界分解质因数之后得到的值不是 \(1\),说明 \(n\) 有一个大于 $\sqrt n $ 的质因数,要再进行一次计算。
- 对于通项公式中 \(\left( 1-\dfrac{1}{p_i} \right)\) 这一项,在代码实现中将其转化为 \(\dfrac{p_i-1}{p_i}\)。
int phi(int x){
int ans=x;
for(int i=2;i*i<=x;i++)
if(x%i==0){
ans=ans/i*(i-1);
while(x%i==0)x/=i;
}
if(x>1)ans=ans/x*(x-1);
return ans;
}
预处理欧拉函数
以下用 \(p_i\) 表示数字 \(i\) 的欧拉函数值,即 \(\varphi(i)\)。
- \(O \left( n \log_2 \left( \log_2 n \right) \right)\) 的筛法:
基本上不会被卡,而且比较好写的筛法。
先把所有 \(p_i\) 初始化为 \(i\)。
对于当前枚举到的数 \(i\),如果 \(p_i=i\),那么 \(i\) 为质数,并对之后包括 \(i\) 在内的的倍数进行更新。
更新就是根据上面的通项公式,对于 \(p_j\),就变为 \(p_j \cdot \dfrac{i-1}{i}\)
#define L(i,j,k) for(int i=(j);i<=(k);i++)
#define ll(i,j,k,l) for(int i=(j);i<=(k);i+=(l))
L(i,1,n) p[i]=i;
L(i,2,n) if(p[i]==i)
ll(j,i,n,i) p[j]=p[j]/i*(i-1);
- \(O(n)\) 的筛法:
预先规定:
- \(s_i\) 表示筛出的第 \(i\) 个质数。
- \(f_i\) 表示数字 \(i\) 的最小质因数。
参考筛素数的线性筛,当筛到数字 \(i\) 时,小于 \(i\) 的数的欧拉函数和小于 \(i\) 的质数已经筛出,利用 \(i\) 和 \(s\) 向后更新。
对于数字 \(i\),如果此时 \(f_i=0\),说明这个数的最小质因数不会在 \(\left[2,i-1\right]\) 的范围内出现,也易得数字 \(i\) 是个质数,根据前一篇博客中写到的欧拉函数性质可知,此时 \(\varphi(i)=i-1\)
所以,如果数字 \(i\) 为质数:
- 将 \(i\) 加入筛出的素数表。
- \(f_i=i\),质数的最小质因数是自身。
- 更新 \(p_i\) 的值为 \(i-1\)。
接下来,无论 \(i\) 是否为质数,直接在素数表中枚举 \(s_j\)。
- 如果 \(i \bmod s_j!=0\),可知 \((i,s_j)=1\),此时有 $$p_{i \times s_j} = p_i \times p_{s_j} = p_i \times (s_j - 1)$$
- 如果 \(i \bmod s_j=0\),此时 $$p_{i \times s_j} = p_i \times s_j$$
- 同时更新 $$f_{s_j \times i} = s_j$$
证明:
\(i \bmod s_j=0\) 时无法直接计算的原因是两个数不互质。
假设 $$i \times p_j = A \times p_j^{m-1} \times p_j = p_j^m$$
若 \(x\) 是质数,\(\varphi(x^k) = x^k-x^{k-1}\)
因为 $$\varphi(i \times p_j) = \varphi(A) \times \varphi(p_j^m) = \varphi(A) \times \varphi(p_j^{m-1}) \times p$$
其中 $$A \times p_j^{m-1} = i$$
所以 $$\varphi(A) \times \varphi(p_j^{m-1}) = \varphi(i)$$
联立得 $$\varphi(i \times p_j) = \varphi(A) \times \varphi(p_j^{m-1}) \times p = \varphi(i) \times p_j$$
得证。
代码实现:
if(x==1)return 0;p[1]=1;
for(int i=2;i<n;i++){
if(!f[i])s[++tp]=i,p[i]=i-1,f[i]=i;
for(int j=1;j<=tp;j++){
if(s[j]*i>n||s[j]>f[i])break;f[s[j]*i]=s[j];
if(s[j]<f[i]) p[s[j]*i]=(s[j]-1)*p[i];
else p[s[j]*i]=s[j]*p[i];
}
}
欧拉定理
若 \(\gcd(a,n)=1\),则 $$a^{\varphi(n)} \equiv 1 \pmod{n}$$
证明:
从 1 到 \(n\) 中,与 \(n\) 互质的数为 \(\varphi(n)\) 个,将这些数放入集合 \(x\) 中,表示为 \(x_1,x_2, \dots , x_{\varphi(n)}\)。
再另外设一个集合 \(m\),其中的元素 $$m_1 = a \times x_1$$ $$m_2 = a \times x_2$$ $$\dots \dots \dots$$ $$m_{\varphi(n)} = a \times x_{\varphi(n)}$$
接下来要证明两个推理。
- 集合 \(m\) 中的任意两个数模 \(n\) 的余数不同,即不存在 \(m_a,m_b\) 满足 \(m_a \equiv m_b \pmod{n}\)
用反证法证明。
假设存在 \(m_a,m_b\) 满足 \(m_a \equiv m_b \pmod{n}\),即 \((m_a - m_b) \div n = k\)
所以 $$m_a - m_b = n \times k$$
将集合 \(m\) 中的数用集合 \(x\) 中的数表示 $$a \times x_a - a \times x_b = n \times k$$
也就是 $$a \times (x_a - x_b) = n \times k$$
因为已知 \(a\) 与 \(n\) 互质,所以式子转化为 $$(x_a - x_b) \bmod n = 0$$
但是因为已知 \(x_a,x_b < n\),即 \(x_a - x_b < n\)
所以上述式子均不成立,得证。
- 集合 \(m\) 的数除以 \(n\) 的余数都与 \(n\)互质。
首先已知 \(m_i = a \times x_i\)。
其次已知 \(a\) 与 \(n\) 互质,\(x_i\) 与 \(n\) 互质,所以 \(m_i\) 也就是 \(a \times x_i\) 与 \(n\) 互质。
所以带入欧几里得算法(辗转相除法)中推一步就行。
得证。
接下来开始推式子。
集合 \(m\) 中的每个元素分别对应集合 \(x\) 中的每个数同余。
因为第二个推理得到,\(m\) 集合中的每个元素模 \(n\) 的结果都与 \(n\) 互质,这与 \(x\) 中的数对应。
表示出来就是$$m_i \equiv x_i\pmod{n}$$
由此可得$$m_1 \times m_2 \times \dots \times m_{\varphi(n)} \equiv x_1 \times x_2 \times \dots \times x_{\varphi(n)} \pmod{n}$$
把集合 \(m\) 中所有数都转换成集合 \(x\) 中的数乘以 \(a\) 的形式 $$a^{\varphi(n)} \times x_1 \times x_2 \times \dots \times x_{\varphi(n)} = x_1 \times x_2 \times \dots \times x_{\varphi(n)} \pmod{n}$$
移项可得 $$(a^{\varphi(n)}-1) \times x_1 \times x_2 \times \dots \times x_{\varphi(n)} \equiv 0 \pmod{n}$$
因为上面式子中的\(x_1,x_2 \dots x_{\varphi(n)}\) 均与 \(n\) 互质,所以相乘的结果也与 \(n\) 互质。
所以 $$a^{\varphi(n)}-1 \equiv 0 \pmod{n}$$
即$$a^{\varphi(n)} \equiv 1 \pmod{n}$$
Q.E.D

浙公网安备 33010602011771号