欧拉函数和欧拉定理¶
欧拉函数是一种定义在正整数域的数论函数,在剩余系的运算中有重要作用。
定义¶
欧拉函数的符号是 \varphi,读作 phi。\varphi(n) 表示在不大于 n 的所有正整数中,与 n 互质的数的个数。需要注意的是,按照这个定义,\varphi(1)=1。
欧拉函数是积性函数,对于任意满足 (a,b)=1 的 a,b,都有 \varphi(a\cdot b)=\varphi(a)\cdot\varphi(b)。
一些基本公式、结论¶
显然,对于任意质数 p,它的欧拉函数值 \varphi(p) 都等于 p-1,因为任意小于 p 的数都与 p 互质。不显然地,对于任意正整数 i,设其所有质因数分别为 p_1,p_2,...,p_s,那 i 的欧拉函数值 \varphi(i)=i\cdot\prod\limits_{j=1}^s\dfrac{p_j-1}{p_j}。
引理 1. 若 p 为质数,k 为正整数,则 \varphi(p^k)=p^k-p^{k-1}
一个数 i 不与 p^k 互质当且仅当 p\mid i,而在 \left[1,p^k\right] 中这样的 i 一共有 \dfrac{p^k}{p}=p^{k-1} 个,所以 \varphi(p^k)=p^k-p^{k-1}。
引理 2. 根据唯一分解定理将 n 分解为 \prod\limits_{i=1}^s{p_i}^{k_i},则 \varphi(n)=n\cdot\prod\limits_{i=1}^s\dfrac{p_i-1}{p_i}
由于欧拉函数是积性函数
引理 2 是计算欧拉函数最一般的公式,根据它可以 O\left(\sqrt{n}\right) 地求出 \varphi(n)。
线性筛求欧拉函数¶
根据欧拉函数的积性和 引理 2,可得对于任意质数 p 有
在筛素数的同时可以求出欧拉函数。
phi[1] = 1;
for(int i = 2; i <= n; ++i){
if(!vist[i]) prime[++cnt] = i;
for(int j = 1; j <= cnt; ++j){
if(i % prime[j])
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
else{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
}
}
欧拉定理¶
对于任意 a,p 满足 (a,p)=1, a^{\varphi(p)}\equiv 1\pmod p。
这一点可以构造证明。设 \varphi(p) 个正整数 m_1,m_2,\ldots,m_{\varphi(p)} 构成 p 的一个既约剩余系,根据既约剩余系的定义可以得到 (m_i,p)=1。
对于其中任意两个不同的数 m_i,m_j,由于 (a,p)=1,a\cdot (m_i-m_j)\nmid p。换言之 a\cdot m_i 与 a\cdot m_j 在模 p 意义下不同余。
由于其中的数两两不同余,a\cdot m_1,a\cdot m_2,\ldots,a\cdot m_{\varphi(p)} 也构成 p 的一个既约剩余系。于是 \prod(a\cdot m_i)\equiv\prod m_i\pmod p,即 a^{\varphi(p)}\equiv 1\pmod p。
费马小定理¶
对于任意 a 和任意质数 p 满足 p \nmid a,a^{p}\equiv a\pmod p。
费马小定理是欧拉定理的特殊情况。我们可以用更简洁的数学归纳法来证明它:
显然 1^{p}\equiv 1\pmod p。假设我们已经证明 a^{p}\equiv a\pmod{p},根据二项式定理
其中的二项式系数 \binom{p}{i},由于 p 与任意可能的 i 互质(除了 i=0 和 i=p),因此 \forall i\neq 0 \text{ 且 } i\neq p,\binom{p}{i}\equiv 0\pmod{p},而对于 i=0 和 i=p,显然 \binom{p}{i}=1。于是可以将原式写作
即
得证。
扩展欧拉定理¶
对于任意 a,b,p,a^{b}\equiv\begin{cases}a^b&\text{if }b<\varphi(p)\\a^{b\bmod \varphi(p)+\varphi(p)}&\text{if }b\ge\varphi(p)\end{cases}\pmod{p}
证明略。
嵌套幂¶
求 n^{n^{n^{\ldots}}}\bmod p。
根据扩展欧拉定理
而
每迭代一次,模数就变为其欧拉函数。可以证明,在 O(\log p) 级别次迭代内,模数可以降至 1,此时式子值恒为 0。
int solve(int n, int p){
if(p == 1) return 0;
return qpow(n, solve(n, phi[p]) + phi[p]) % p;
}
由于使用了快速幂,时间复杂度为 O(n\log^2 p)。类似的式子都可以套用这种方法计算。