欧拉函数
欧拉函数
欧拉函数就是求小于 n n n且与 n n n互质的整数个数
设 n n n的唯一分解式为 n = p 1 a 1 p 2 a 2 . . . p n a n n=p_1^{a_1}p_2^{a_2}...p_n^{a_n} n=p1a1p2a2...pnan
φ ( n ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p n ) φ(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_n}) φ(n)=n(1−p11)(1−p21)...(1−pn1)
求欧拉函数
求单个数的欧拉函数
ll euler_phi(ll n) {
int m = sqrt(n + 0.5);
ll ans = n;
for (int i = 2; i <= m; i++) {
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0) n /= i;
}
}
if (n > 1) ans = ans / n * (n - 1);
return ans;
}
埃氏筛法求欧拉函数
根据上述公式,类似埃氏筛,每求得一个素数就更新其倍数所有的 p h i phi phi值
int phi[maxn];
void phi_table(int n) {
memset(phi, 0, sizeof phi);
phi[1] = 1;
for (int i = 2; i <= n; i++)
if (!phi[i]) {
for (int j = i; j <= n; j += i) {
if (!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i - 1);
}
}
}
欧拉筛法求欧拉函数
使用此方法需要知道欧拉函数的以下性质:
- 对于素数 p p p,若 n % i = = 0 n\%i==0 n%i==0,那么 φ ( p n ) = p ∗ φ ( n ) \varphi(pn)= p*\varphi(n) φ(pn)=p∗φ(n);若 n % i ! = 0 n\%i!=0 n%i!=0,那么 φ ( p n ) = φ ( p ) φ ( n ) = ( p − 1 ) ∗ φ ( n ) \varphi(pn)= \varphi(p)\varphi(n) = (p-1)*\varphi(n) φ(pn)=φ(p)φ(n)=(p−1)∗φ(n)
- 若 n n n为某一素数的幂次,那么 φ ( p a ) = ( p − 1 ) ∗ p a − 1 \varphi(p^a)=(p-1)*p^{a-1} φ(pa)=(p−1)∗pa−1
证明:
vector<int> prime;
bitset<maxn> vis;
int phi[maxn];
void euler() {
phi[1] = 1;
for (int i = 2; i < maxn; i++) {
if (!vis[i]) {
phi[i] = i - 1;
prime.push_back(i);
}
for (int j = 0; j < prime.size() && i * prime[j] < maxn; j++) {
vis[i * prime[j]] = 1;
if (i % prime[j]) {
prime[i * prime[j]] = phi[i] * (prime[j] - 1);
} else {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
}
}
}
性质
-
当 m , n m,n m,n互质时,有 φ ( m ∗ n ) = φ ( m ) ∗ φ ( n ) \varphi(m*n)= \varphi(m)*\varphi(n) φ(m∗n)=φ(m)∗φ(n)
-
对于素数 p p p,若 n % i = = 0 n\%i==0 n%i==0,那么 φ ( p n ) = p ∗ φ ( n ) \varphi(pn)= p*\varphi(n) φ(pn)=p∗φ(n);若 n % i ! = 0 n\%i!=0 n%i!=0,那么 φ ( p n ) = φ ( p ) φ ( n ) = ( p − 1 ) ∗ φ ( n ) \varphi(pn)= \varphi(p)\varphi(n) = (p-1)*\varphi(n) φ(pn)=φ(p)φ(n)=(p−1)∗φ(n)
-
对于互质的 x x x与 p p p,有 x φ ( p ) ≡ 1 ( m o d p ) x^{\varphi(p)}≡1(mod~p) xφ(p)≡1(mod p),因此 x x x的逆元为 x φ ( p ) − 1 x^{\varphi(p)}-1 xφ(p)−1,即欧拉定理。特别地,当 p p p为质数时, φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p−1,此时逆元为 x p − 2 x^{p-2} xp−2,即费马小定理 x p − 1 ≡ 1 ( m o d p ) x^{p-1} \equiv 1(mod~~p) xp−1≡1(mod p)
-
当 n n n为奇数时, φ ( 2 ∗ n ) = φ ( n ) \varphi(2*n)=\varphi(n) φ(2∗n)=φ(n)
证明:因为 n n n为奇数,那么 2 n 2n 2n为偶数,偶数和偶数一定不互素,所以只需考虑 2 n 2n 2n和小于它的奇数互素的情况
-
n > 1 n>1 n>1,不大于 n n n且和 n n n互质的所有正整数的和是 φ ( n ) ∗ n 2 \frac{\varphi(n)*n}{2} 2φ(n)∗n