数论之欧拉函数
欧拉函数,用$\phi(n)$ 表示 ,指的是小于等于n的数中与n互质的数的数目,欧拉函数是一个积性函数.
$$
\phi(x) = x \times (1 -\frac{ 1}{p_1}) + x \times(1-\frac{1}{p_2}) +x \times(1 - \frac{1}{p_n})
$$
这里介绍一些相关的知识:
1.一个算术函数f,如果对于两个互素整数m,n有f(nm)=f(n)*f(m)则称 f为积性函数。如果对于任意两个正整数mn有f(nm)=f(n)*f(m)则称f为完全积性函数 。
2.如果f是一个积性函数,则对于正整数$$ n = p_1^{a_1} \times p_2^{a_2} \times p_n^{a_n}$$(pi为素数)(这里是唯一分解定理),则$$ f(n)=f(p_1^{a_1})\times f(p_2^{a_2}) \times f(p_n^{a_n}) $$
欧拉函数
现在回归欧拉函数,看公式中的字母:
其中p指的是x的质因子。(注意的是$\phi(1) = 1$,当两个数字的公因数只有1的时候,就说两个数字互质)
接下来介绍几种欧拉函数的求法:
分解质因数求欧拉函数:
注意的是,如果最终n>1, 说明n也是一个质因子了,那么就要把它也算进去。
1 | int main() |
欧拉函数打表(类似埃氏筛法)
1 | void getphi(int n) |
欧拉函数线性筛法(可以得到欧拉函数和素数表)
需要用到以下三条性质,这里不作证明(第一条p为质数)
$$phi[p] = p - 1$$
$$ i \mod p = 0 \to phi[i \times p] = phi[i] \times p$$
$$ i \mod p \ne 0 \to phi[i \times p] = phi[i] \times (p - 1)$$
1 | int phi[10005]; |
欧拉函数的重要性质:
- 若N是质数X的K次幂,$$phi[N] = (X - 1)\times X ^{k - 1}$$
- 若M,N互质, 那么 $$ phi[M \times N] = phi[M] \times phi[N]$$
- 若N是奇数, 那么$$ phi[2 \times N] = phi[N]$$
- 若X,Y是质数,且$$N = X \times Y , phi[N] = (x - 1) \times (y - 1)$$
- 小于N且与N互质的数的和为: $$N/2 \times phi[N]$$
欧拉定理
对于和m 互质的 x ,有 $$ x ^{\phi(m)}\equiv 1\mod m$$
当m 为素数时, $$phi[m] = m - 1$$ 所以有 $$ x^{m - 1} \equiv 1(\mod m)$$
这就是费马小定理,所以说费马小定理是欧拉定理的特殊形式。
欧拉定理的应用
$$ a^b \mod p = (a \mod p)^{b \mod \phi(p)} \mod p$$ //a和p互质
如果p为质数:
$$ a^b \mod p = (a \mod p)^{b \mod (p - 1)} \mod p $$
还有一个真伪性我还没有验证的公式,先记录下来:
$$ a^b\mod p = (a\mod p )^{\phi(p) + b \mod \phi(p)} \mod p $$ //这里可以摆脱a 和 p互质的束缚