欧拉函数基础 学习笔记
供复习,无证明过程。
一、基本知识
-
\(\varphi(n)\) 定义为 \([1,n]\) 中与 \(n\) 互质的整数的个数。两个数互质即最大公因数为 \(1\)
例如,\(\varphi(3) = 2,\varphi(9) = 7\)
二、一些性质
-
当 \(n\) 为质数,有 \(\varphi(n) = n - 1\)
-
欧拉函数是积性函数。 当 \(x,y\) 互质,有 \(\varphi(xy) = \varphi(x) \times \varphi(y)\)
-
当 \(x\) 是奇数,有 \(\varphi(2x) = \varphi(x)\)
-
\(\varphi(x)=x\prod_{i=1}^n(1-\frac{1}{p_i})\)
-
当 \(p\) 为质数:
-
若 \(p|i\),有 \(\varphi(ip) = \varphi(i) * p\)
-
否则,有 \(\varphi(ip) = \varphi(i) * (p-1)\)
运用 4、5 两个性质,我们有:
三、欧拉筛
A 求单个数字的欧拉函数值
通过上面 性质4,我们可以在 \(O(\sqrt{n})\) 内求出一个数字的欧拉函数值。
代码:下面实现了求 \(M\) 的欧拉函数值。
void prephi() {
phi = M;
LL m = M;
for(LL i = 2; i * i <= m; ++i) {
if(!(m % i)) {
phi *= (i - 1);
phi /= i;
m /= i;
}
while(!(m % i)) m /= i;
}
if(m > 1) {
phi *= (m - 1);
phi /= m;
}
}
B 欧拉筛
通过上面 性质5,我们可以在 \(O(n)\) 内求出 \(1\) ~ \(n\) 的欧拉函数值。其实实现比较简单,只要在 线性筛素数 的基础上加一点。
代码:下面实现了求 \(1\) ~ \(N\) 的欧拉函数值。
void prephi() {
memset(isp, true, sizeof(isp));
isp[1] = 0, phi[1] = 1;
for(int i = 2; i <= N; i++) {
if(isp[i]) {
prime[++prime_num] = i;
phi[i] = i - 1;
}
for(int j = 1; j <= prime_num && prime[j] * i <= N; j++) {
isp[i * prime[j]] = 0;
if(!(i % prime[j])) {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
四、欧拉定理及其扩展
A 欧拉定理
-
若 \(a,m\) 互质,有 \(a^{\varphi(m)}≡1(mod\ m)\)
-
特别地,当 \(m\) 为质数,即为 费马小定理
-
上式也可以扩展为 \(a^b≡a^{b \mod \varphi(m)}(mod\ m)\) , 此时仍要求 \(a,m\) 互质。
B 扩展欧拉定理
-
当 \(b > \varphi(m)\) , 有 \(a^b≡a^{b \mod \varphi(m) + \varphi(m)}\left(mod\ m\right)\),此式不要求 \(a,m\) 互质。
-
注意当 \(b ≤ \varphi(m)\) 时无效。
题
参考
咕咕日报#200 欧拉系列 作者:Morning-Glory
有关证明和进一步的学习可以点击链接。个人认为讲的不错。

浙公网安备 33010602011771号