更多文章可以在本人的个人小站:https://kaiserwilheim.github.io 查看。
转载请注明出处。
初稿写于2021-10-10,
再修改于2022-02-07
Achtung: 本文章使用p来代指“任意质数”,请勿混淆。
首先让我们膜拜一下莱昂哈德·欧拉(Leonhard Euler):
欧拉函数
欧拉函数 φ ( n ) φ(n) φ(n) 的概念是在 [ 0 , n − 1 ] [0,n-1] [0,n−1] 范围内有多少个整数与 n n n 互质。
其中,我们规定 φ ( 1 ) = 1 φ(1)=1 φ(1)=1,
且不难发现, φ ( p ) = p − 1 φ(p)=p-1 φ(p)=p−1。
欧拉函数的一些性质
欧拉函数是积性函数
即 φ ( m n ) = φ ( m ) φ ( n ) φ(mn) = φ(m) φ(n) φ(mn)=φ(m)φ(n)
并且当 n m o d 2 ≡ 1 n \bmod{2} \equiv 1 nmod2≡1 时, φ ( 2 n ) = φ ( n ) φ(2n) = φ(n) φ(2n)=φ(n),
而当 n m o d 2 ≡ 0 n \bmod{2} \equiv 0 nmod2≡0(即 2 ∣ n 2|n 2∣n)时, φ ( 2 n ) = 2 φ ( n ) φ(2n) = 2 φ(n) φ(2n)=2φ(n)
∑ m ∣ n n m = n φ ( n ) 2 \displaystyle \sum_{m|n}^{n} m = n \frac{φ(n)}{2} m∣n∑nm=n2φ(n)
∑ m ∣ n n m = n φ ( n ) 2 \sum_{m|n}^{n} m = n \frac{φ(n)}{2} m∣n∑nm=n2φ(n)
易证。
∑ d ∣ n φ ( d ) = n \displaystyle \sum_{d|n} φ(d) = n d∣n∑φ(d)=n
∑ d ∣ n φ ( d ) = n \sum_{d|n} φ(d) = n d∣n∑φ(d)=n
我们利用莫比乌斯反演的相关知识可以得出。
或者我们这样考虑:
如果 gcd ( k , n ) = d \gcd(k,n) = d gcd(k,n)=d ,那么 gcd ( k d , n d ) = 1 ( k < n ) \gcd(\frac{k}{d} , \frac{n}{d}) = 1 (k < n) gcd(dk,dn)=1(k<n) 。
我们如果设 f ( x ) f(x) f(x) 为满足 gcd ( k , n ) = x \gcd(k,n) = x gcd(k,n)=x 的数的个数,那么 n = ∑ i − 1 n f ( i ) n = \sum_{i-1}^n f(i) n=∑i−1nf(i) 。
根据上面的证明,我们可以发现, f ( x ) = φ ( n x ) f(x) = φ(\frac{n}{x}) f(x)=φ(xn) ,从而得到 n = ∑ d ∣ n φ ( n d ) n = \sum_{d|n} φ(\frac{n}{d}) n=∑d∣nφ(dn) 。注意此时我们的约数 d d d 和 n d \frac{n}{d} dn 具有对称性,所以上面的式子可以化为 n = ∑ d ∣ n φ ( d ) n = \sum_{d|n} φ(d) n=∑d∣nφ(d) 。
φ ( p k ) = p k − p k − 1 \displaystyle φ(p^k) = p^k - p^{k-1} φ(pk)=pk−pk−1
若 n = p k n = p^k n=pk ,那么 φ ( n ) = p k − p k − 1 φ(n) = p^k - p^{k-1} φ(n)=pk−pk−1 。
由定义可知。
因为有 n ⊥ p k ⟺ p ∤ n n \perp p^k \iff p \not \mid n n⊥pk⟺p∣n 。在 { 0 , 1 , p , ⋯ , p k − 1 } \{ 0,1,p,\cdots ,p^k-1 \} {0,1,p,⋯,pk−1} 中, p p p 的倍数是 { 0 , p , 2 p , ⋯ , p k − p } \{ 0,p,2p,\cdots ,p^k-p \} {0,p,2p,⋯,pk−p} ,共有 p k − 1 p^{k-1} pk−1 个。
φ ( ∏ i = 1 s p i k i ) = ∏ i = 1 s p i k i − 1 ⋅ ( p i − 1 ) \displaystyle φ(\prod_{i=1}^s p_i^{k_i}) = \prod_{i=1}^s p_i^{k_i - 1} · (p_i - 1) φ(i=1∏spiki)=i=1∏spiki−1⋅(pi−1)
由唯一分解定理,设 n = ∏ i = 1 s p i k i n = \prod_{i=1}^s p_i^{k_i} n=∏i=1spiki ,则有 φ ( n ) = ∏ i = 1 s p i − 1 p i φ(n) = \prod_{i=1}^s \frac{p_i - 1}{p_i} φ(n)=∏i=1spipi−1。
证明:
φ ( n ) = ∏ i = 1 s φ ( p i k i ) = ∏ i = 1 s p i k i − p i k i − 1 = ∏ i = 1 s ( p i − 1 ) × p i k i − 1 = ∏ i = 1 s ( 1 − 1 p i ) p i k i = n ∏ i = 1 s ( 1 − 1 p i ) \begin{aligned} φ(n) &= \prod_{i=1}^s φ(p_i^{k_i}) \\ &= \prod_{i=1}^s p_i^{k_i} - p_i^{k_i - 1} \\ &= \prod_{i=1}^s (p_i - 1) \times p_i^{k_i - 1} \\ &= \prod_{i=1}^s (1 - \frac{1}{p_i}) p_i^{k_i} \\ &= n \prod_{i=1}^s (1 - \frac{1}{p_i}) \end{aligned} φ(n)=i=1∏sφ(piki)=i=1∏spiki−piki−1=i=1∏s(pi−1)×piki−1=i=1∏s(1−pi1)piki=ni=1∏s(1−pi1)
计算欧拉函数的值
单点求值
我们不难发现,当 m m m 是一个质数的整数幂 p k p^k pk 时,我们有
φ ( p k ) = p k − p k − 1 φ(p^k)=p^k-p^{k-1} φ(pk)=pk−pk−1
;
如果 m > 1 m>1 m>1 不是一个质数的整数幂,那我们可以把 m m m 拆分成 m = m 1 m 2 m=m_1 m_2 m=m1m2 ,其中 m 1 ⊥ m 2 m_1 \perp m_2 m1⊥m2。这样这个数就可以在剩余系里表示为 ( n m o d m 1 , n m o d m 2 ) (n \bmod m_1 , n \bmod m_2) (nmodm1,nmodm2) 。如果你不知道什么是剩余系,可以看我的博客:(咕了)。
根据
k ⊥ m 且 k ⊥ n ⟺ k ⊥ m n k \perp m 且 k \perp n \iff k \perp mn k⊥m且k⊥n⟺k⊥mn
和
gcd ( m , n ) = gcd ( n m o d m , m ) \gcd(m,n) = \gcd(n \bmod m,m) gcd(m,n)=gcd(nmodm,m)
可得
n ⊥ m ⟺ n m o d m 1 ⊥ m 1 且 n m o d m 2 ⊥ m 2 n \perp m \iff n \bmod m_1 \perp m_1 且 n \bmod m_2 \perp m_2 n⊥m⟺nmodm1⊥m1且nmodm2⊥m2
,由此,我们可以推得
φ ( m ) = φ ( m 1 ) φ ( m 2 ) , m 1 ⊥ m 2 φ(m)=φ(m_1)φ(m_2),m_1 \perp m_2 φ(m)=φ(m1)φ(m2),m1⊥m2
所以,欧拉函数是一个积性函数。
欧拉函数的通项公式是
φ ( m ) = ∏ p ∣ m ( p m p − p m p − 1 ) = m ∏ p ∣ m ( 1 − 1 p ) φ(m)=\prod_{p|m} (p^{m_p}-p^{m_p-1})=m \prod_{p|m}(1-\frac{1}{p}) φ(m)=p∣m∏(pmp−pmp−1)=mp∣m∏(1−p1)
上代码:
int euler_phi(int n)
{int m = int(sqrt(n + 0.5));int 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;
}
如果将代码改为下面的形式可以优化一些:
int euler_phi(int n)
{int ans = n;for(int i = 2; i * i <= n; 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;
}
区间筛
而我们可以使用筛法来求连续区间的欧拉函数值:
const int N = 1e7 + 5;
int phi[N], prime[N / 100];
bool visit[N];
void getphi(int n)
{phi[1] = 1;for(int i = 2; i <= n; i++){if(!visit[i]){prime[prime[0] + 1] = i;prime[0]++;phi[i] = i - 1;}for(int j = 1; j <= prime[0] && i * prime[j] <= n; j++){visit[i * prime[j]] = true;if(!(i % prime[j])){phi[i * prime[j]] = phi[i] * prime[j];break;}else{phi[i * prime[j]] = phi[i] * (prime[j] - 1);}}}
}
还有OI Wiki上提供的代码:
void pre()
{memset(is_prime, 1, sizeof(is_prime));int cnt = 0;is_prime[1] = 0;phi[1] = 1;for(int i = 2; i <= 5000000; i++){if(is_prime[i]){prime[++cnt] = i;phi[i] = i - 1;}for(int j = 1; j <= cnt && i * prime[j] <= 5000000; j++){is_prime[i * prime[j]] = 0;if(i % prime[j])phi[i * prime[j]] = phi[i] * phi[prime[j]];else{phi[i * prime[j]] = phi[i] * prime[j];break;}}}
}
复杂度均为线性。
欧拉定理
我们先看一下费马小定理。
费马小定理
众所周知,费马小定理是:
a p − 1 ≡ 1 ( m o d p ) , a ⊥ p a^{p-1} \equiv 1 \pmod{p},a \perp p ap−1≡1(modp),a⊥p
还有另一种形式,是这样的:
∀ a ∈ N , a p ≡ a ( m o d p ) \forall a \in \mathbb{N} ,a^p \equiv a \pmod{p} ∀a∈N,ap≡a(modp)
。
证明
我们首先取一个不为 p p p 倍数的数 a a a 。
构造一个序列: A = { 1 , 2 , 3 , ⋯ , p − 1 } A = \lbrace 1,2,3, \cdots , p - 1 \rbrace A={1,2,3,⋯,p−1} ,这个序列拥有这样的一个性质:
∏ i = 1 n A i ≡ ∏ i = 1 n ( A i × a ) ( m o d p ) \prod_{i=1}^n A_i \equiv \prod_{i=1}^n (A_i \times a) \pmod{p} i=1∏nAi≡i=1∏n(Ai×a)(modp)
证明:
∵ ( A i , p ) = 1 , ( A i × a , p ) = 1 \because (A_i,p) = 1 , (A_i \times a,p) = 1 ∵(Ai,p)=1,(Ai×a,p)=1
又因为每一个 A i × a ( m o d p ) A_i \times a \pmod{p} Ai×a(modp) 都是独一无二的,且 A i × a ( m o d p ) < p A_i \times a \pmod{p} < p Ai×a(modp)<p ,得证(每一个 A i × a A_i \times a Ai×a 都对应了一个 A i A_i Ai)。
设 f = ( p − 1 ) ! f = (p-1)! f=(p−1)!,则
f ≡ ( a × A 1 ) ( a × A 2 ) ( a × A 3 ) ⋯ ( a × A p − 1 ) ( m o d p ) a p − 1 ⋅ f ≡ f ( m o d p ) a p − 1 ≡ 1 ( m o d p ) \begin{aligned} f &\equiv (a \times A_1)(a \times A_2)(a \times A_3) \cdots (a \times A_{p-1}) \pmod{p} \\ a^{p-1} · f &\equiv f \pmod{p} \\ a^{p-1} &\equiv 1 \pmod{p} \end{aligned} fap−1⋅fap−1≡(a×A1)(a×A2)(a×A3)⋯(a×Ap−1)(modp)≡f(modp)≡1(modp)
证毕。
或者也可以使用归纳法证明:
显然 1 p ≡ 1 ( m o d p ) 1^p \equiv 1 \pmod{p} 1p≡1(modp)。那么假设 a p ≡ a ( m o d p ) a^p \equiv a \pmod{p} ap≡a(modp) 成立,那么通过二项式定理有
( a + 1 ) p = a p + C p 1 a p − 1 + C p 2 a p − 2 + ⋯ + C p p − 1 a + 1 (a+1)^p = a^p + C_p^1 a^{p-1} + C_p^2 a^{p-2} + \cdots + C_p^{p-1} a + 1 (a+1)p=ap+Cp1ap−1+Cp2ap−2+⋯+Cpp−1a+1
因为 C p k = p ! ( n − k ) ! k ! C_p^k = \dfrac{p!}{(n-k)!k!} Cpk=(n−k)!k!p! 对于 k ∈ [ 1 , p − 1 ] k \in [ 1,p-1 ] k∈[1,p−1] 成立,在模 p p p 意义下 C p 1 ≡ C p 2 ≡ ⋯ ≡ C p p − 1 ≡ 0 ( m o d p ) C_p^1 \equiv C_p^2 \equiv \cdots \equiv C_p^{p-1} \equiv 0 \pmod{p} Cp1≡Cp2≡⋯≡Cpp−1≡0(modp),那么 ( a + 1 ) p ≡ a p + 1 ( m o d p ) (a+1)^p \equiv a^p + 1 \pmod{p} (a+1)p≡ap+1(modp),将 a p ≡ a ( m o d p ) a^p \equiv a \pmod{p} ap≡a(modp) 代入得 ( a + 1 ) p ≡ a + 1 ( m o d p ) (a+1)^p \equiv a+1 \pmod{p} (a+1)p≡a+1(modp)。
证毕。
欧拉定理
欧拉定理的内容如下:
若 gcd ( a , m ) = 1 \gcd(a,m) = 1 gcd(a,m)=1,则 a φ ( m ) ≡ 1 ( m o d m ) a^{φ(m)} \equiv 1 \pmod{m} aφ(m)≡1(modm)。
证明
欧拉定理的证明过程与费马小定理的证明过程十分相似。
我们同样首先构造一个与 m m m 互质的序列,再进行操作。
设 r 1 , r 2 , ⋯ , r φ ( m ) r_1,r_2, \cdots ,r_{φ(m)} r1,r2,⋯,rφ(m) 为模 m m m 意义下的一个简化剩余系,则 a r 1 , a r 2 , ⋯ , a r φ ( m ) ar_1,ar_2, \cdots ,ar_{φ(m)} ar1,ar2,⋯,arφ(m) 同样也为模 m m m 意义下的一个简化剩余系。所以, ∏ i = 1 φ ( m ) r i ≡ ∏ i = 1 φ ( m ) a r i ≡ a φ ( m ) ∏ i = 1 φ ( m ) r i ( m o d m ) \prod_{i=1}^{φ(m)} r_i \equiv \prod_{i=1}^{φ(m)} ar_i \equiv a^{φ(m)} \prod_{i=1}^{φ(m)} r_i \pmod{m} ∏i=1φ(m)ri≡∏i=1φ(m)ari≡aφ(m)∏i=1φ(m)ri(modm),约去 ∏ i = 1 φ ( m ) r i \prod_{i=1}^{φ(m)} r_i ∏i=1φ(m)ri 后可得 a φ ( m ) ≡ 1 ( m o d m ) a^{φ(m)} \equiv 1 \pmod{m} aφ(m)≡1(modm)。
证毕。
当 m = p m=p m=p 时,由于 φ ( m ) = m − 1 φ(m) = m-1 φ(m)=m−1,将之代入可得费马小定理。
扩展欧拉定理
扩展欧拉定理是这个样子的:
a b ≡ { a b m o d φ ( m ) , gcd ( a , m ) = 1 , a b , gcd ( a , m ) ≠ 1 , b < φ ( m ) , a ( b m o d φ ( m ) ) + φ ( m ) , gcd ( a , m ) ≠ 1 , b ≥ φ ( m ) . ( m o d m ) a^b \equiv \begin{cases} a^{b \ \bmod \ φ(m)}, & \gcd(a,m) = 1,\\ a^b, & \gcd(a,m) \neq 1, b < φ(m),\\ a^{(b \ \bmod \ φ(m))+φ(m)}, & \gcd(a,m) \neq 1,b \geq φ(m). \end{cases} \pmod{m} ab≡⎩⎪⎨⎪⎧ab mod φ(m),ab,a(b mod φ(m))+φ(m),gcd(a,m)=1,gcd(a,m)=1,b<φ(m),gcd(a,m)=1,b≥φ(m).(modm)
证明见OI Wiki
莫比乌斯函数
定义
我们把一个数字分解质因数为 n = p 1 c 1 p 2 c 2 ⋯ p k c k n=p_1^{c_1}p_2^{c_2} \cdots p_k^{c_k} n=p1c1p2c2⋯pkck,则
μ ( n ) = { 1 n = 1 0 ∀ i ∈ [ 1 , k ] , c i > 1 ( − 1 ) k ∀ i ∈ [ 1 , k ] , c i = 1 μ(n)= \begin{cases} 1 & n=1 \\ 0 & \forall i \in [1,k] , c_i > 1 \\ (-1)^k & \forall i \in [1,k] , c_i = 1 \end{cases} μ(n)=⎩⎪⎨⎪⎧10(−1)kn=1∀i∈[1,k],ci>1∀i∈[1,k],ci=1
解释一下:
- 当 n = 1 n=1 n=1 时, μ ( n ) = 1 μ(n)=1 μ(n)=1;
- 当 n ≠ 1 n \neq 1 n=1 时:
- 当存在 i ∈ [ 1 , k ] i\in [1,k] i∈[1,k],使得 c i > 1 c_i > 1 ci>1 时, μ ( n ) = 0 μ(n)=0 μ(n)=0,也就是说只要某个质因子出现的次数超过一次, μ ( n ) μ(n) μ(n) 就等于 0 0 0;
- 当任意 i ∈ [ 1 , k ] i\in[1,k] i∈[1,k],都有 c i = 1 c_i=1 ci=1 时, μ ( n ) = ( − 1 ) k μ(n)=(-1)^k μ(n)=(−1)k,也就是说每个质因子都仅仅只出现过一次时, μ ( n ) μ(n) μ(n) 等于 − 1 -1 −1 的 k k k 次幂,此处 k k k 指的便是仅仅只出现过一次的质因子的总个数。
性质
莫比乌斯函数不仅是积性函数,还有如下性质:
∑ d ∣ m μ ( d ) = [ m = = 1 ] \sum_{d|m} μ(d) = [m==1] d∣m∑μ(d)=[m==1]
其中 [ m = = 1 ] [m==1] [m==1] 代表 m==1?1:0
。
证明
设
n = ∏ i = 1 k p i c i , n ′ = ∏ i = 1 k p i n=\prod_{i=1}^k{p_i}^{c_i},n'=\prod_{i=1}^k p_i n=i=1∏kpici,n′=i=1∏kpi
那么
∑ d ∣ n μ ( d ) = ∑ d ∣ n ′ μ ( d ) = ∑ i = 0 k C k i ⋅ ( − 1 ) i = ( 1 + ( − 1 ) ) k \sum_{d\mid n}μ(d)=\sum_{d\mid n'}μ(d)=\sum_{i=0}^k C_k^i·(-1)^i=(1+(-1))^k d∣n∑μ(d)=d∣n′∑μ(d)=i=0∑kCki⋅(−1)i=(1+(−1))k
莫比乌斯反演
如果两个的函数 f ( n ) f(n) f(n) 与 g ( n ) g(n) g(n) 满足
f ( n ) = ∑ d ∣ n g ( d ) f(n) = \sum_{d|n} g(d) f(n)=d∣n∑g(d)
则
g ( n ) = ∑ d ∣ n μ ( d ) f ( n d ) g(n) = \sum_{d|n} μ(d) f(\frac{n}{d}) g(n)=d∣n∑μ(d)f(dn)
证明
摘自《混凝土数学》
充分性
f ( n ) = ∑ d ∣ n g ( d ) = ∑ d ∣ n g ( n d ) \begin{aligned} f(n) &= \sum_{d|n} g (d)\\ &= \sum_{d|n} g (\frac{n}{d}) \end{aligned} f(n)=d∣n∑g(d)=d∣n∑g(dn)
∑ d ∣ n μ ( d ) f ( n d ) = ∑ d ∣ n μ ( d ) ∑ d 1 ∣ n d g ( d 1 ) \sum_{d|n} μ(d) f(\frac{n}{d}) = \sum_{d|n} μ(d) \sum_{d_1|\frac{n}{d}} g(d_1) d∣n∑μ(d)f(dn)=d∣n∑μ(d)d1∣dn∑g(d1)
∑ d ∣ n ∑ d 1 ∣ n d μ ( d ) g ( d 1 ) = ∑ d 1 ∣ n g ( d 1 ) ∑ d ∣ n d 1 μ ( d ) = g ( n ) \begin{aligned} \sum_{d|n} \sum_{d_1|\frac{n}{d}} μ(d) g (d_1) &= \sum_{d_1|n} g(d_1) \sum_{d|\frac{n}{d_1}} μ(d) \\ &= g(n) \end{aligned} d∣n∑d1∣dn∑μ(d)g(d1)=d1∣n∑g(d1)d∣d1n∑μ(d)=g(n)
考虑到
∑ d ∣ n d 1 μ ( d ) = { 1 d 1 = n 0 d 1 < n \sum_{d|\frac{n}{d_1}} μ(d) = \begin{cases} 1 & d_1 = n \\ 0 & d_1 < n \end{cases} d∣d1n∑μ(d)={10d1=nd1<n
因此
g ( n ) = ∑ d ∣ n μ ( d ) f ( n d ) = ∑ d ∣ n μ ( n d ) f ( d ) \begin{aligned} g(n) &= \sum_{d|n} μ(d) f(\frac{n}{d}) \\ &= \sum_{d|n} μ(\frac{n}{d}) f(d) \end{aligned} g(n)=d∣n∑μ(d)f(dn)=d∣n∑μ(dn)f(d)
必要性
g ( n ) = ∑ d ∣ n μ ( d ) f ( n d ) = ∑ d ∣ n μ ( n d ) f ( d ) \begin{aligned} g(n) &= \sum_{d|n} μ(d) f(\frac{n}{d}) \\ &= \sum_{d|n} μ(\frac{n}{d}) f(d) \end{aligned} g(n)=d∣n∑μ(d)f(dn)=d∣n∑μ(dn)f(d)
∑ d ∣ n g ( d ) = ∑ d ∣ n g ( n d ) = ∑ d ∣ n ∑ d 1 ∣ n d μ ( n d d 1 ) f ( d 1 ) = ∑ d d 1 ∣ n μ ( n d d 1 ) f ( d 1 ) = ∑ d 1 ∣ n f ( d 1 ) ∑ d ∣ n d μ ( n d d 1 ) = f ( n ) \begin{aligned} \sum_{d|n} g(d) &= \sum_{d|n}g(\frac{n}{d}) \\ &= \sum_{d|n} \sum_{d_1|\frac{n}{d}} μ(\frac{n}{d d_1})f(d_1) \\ &= \sum_{d d_1|n} μ(\frac{n}{d d_1}) f(d_1) \\ &= \sum_{d_1|n} f(d_1) \sum_{d|\frac{n}{d}} μ(\frac{n}{d d_1}) \\ &= f(n) \end{aligned} d∣n∑g(d)=d∣n∑g(dn)=d∣n∑d1∣dn∑μ(dd1n)f(d1)=dd1∣n∑μ(dd1n)f(d1)=d1∣n∑f(d1)d∣dn∑μ(dd1n)=f(n)
考虑到
∑ d ∣ n d 1 μ ( n d d 1 ) = ∑ d ∣ n d 1 μ ( d ) = { 1 d 1 = n 0 d 1 < n \begin{aligned} \sum_{d|\frac{n}{d_1}} μ(\frac{n}{d d_1}) &= \sum_{d|\frac{n}{d_1}} μ(d) \\ &= \begin{cases} 1 & d_1 = n \\ 0 & d_1 < n \end{cases} \end{aligned} d∣d1n∑μ(dd1n)=d∣d1n∑μ(d)={10d1=nd1<n
因此
f ( n ) = ∑ d ∣ n g ( d ) = ∑ d ∣ n g ( n d ) \begin{aligned} f(n) &= \sum_{d|n} g(d) \\ &= \sum_{d|n} g(\frac{n}{d}) \end{aligned} f(n)=d∣n∑g(d)=d∣n∑g(dn)
求莫比乌斯函数的值
单点求值
自己算。
区间筛法
void getMu()
{mu[1] = 1;for(int i = 2; i <= n; ++i){if(!flg[i]) p[++tot] = i, mu[i] = -1;for(int j = 1; j <= tot && i * p[j] <= n; ++j){flg[i * p[j]] = 1;if(i % p[j] == 0){mu[i * p[j]] = 0;break;}mu[i * p[j]] = -mu[i];}}
}
莫比乌斯变换
设 f ( n ) f(n) f(n), g ( n ) g(n) g(n) 为两个数论函数。
如果有 f ( n ) = ∑ d ∣ n g ( d ) f(n) = \sum_{d|n} g(d) f(n)=∑d∣ng(d) 那么有:
形式1: g ( n ) = ∑ d ∣ n μ ( d ) f ( n d ) g(n) = \sum_{d|n} μ(d) f(\frac{n}{d}) g(n)=∑d∣nμ(d)f(dn)。
这种形式下,函数 f ( n ) f(n) f(n) 被称为函数 g ( n ) g(n) g(n) 的莫比乌斯变换,反之则称之为其的莫比乌斯逆变换(反演)。
形式2: g ( n ) = ∑ d ∣ n μ ( d n ) f ( d ) g(n) = \sum_{d|n} μ(\frac{d}{n}) f(d) g(n)=∑d∣nμ(nd)f(d)。
据说这种形式更常考一点。
证明
- 方法一:对原式做数论变换。
∑ d ∣ n μ ( d ) f ( n d ) = ∑ d ∣ n μ ( d ) ∑ k ∣ n d g ( k ) = ∑ k ∣ n g ( k ) ∑ d ∣ n k μ ( d ) = g ( n ) \begin{aligned} & \sum_{d\mid n}μ(d)f(\frac{n}{d}) \\ =& \sum_{d\mid n}μ(d)\sum_{k\mid \frac{n}{d}}g(k) \\ =& \sum_{k\mid n}g(k)\sum_{d\mid \frac{n}{k}}μ(d) \\ =& g(n) \end{aligned} ===d∣n∑μ(d)f(dn)d∣n∑μ(d)k∣dn∑g(k)k∣n∑g(k)d∣kn∑μ(d)g(n)
用 ∑ d ∣ n g ( d ) \displaystyle\sum_{d\mid n}g(d) d∣n∑g(d) 来替换 f ( n d ) f(\dfrac{n}{d}) f(dn),再变换求和顺序。最后一步变换的依据: ∑ d ∣ n μ ( d ) = [ n = 1 ] \displaystyle\sum_{d\mid n}μ(d)=[n=1] d∣n∑μ(d)=[n=1],因此在 n k = 1 \dfrac{n}{k}=1 kn=1 时第二个和式的值才为 1 1 1。此时 n = k n=k n=k,故原式等价于 ∑ k ∣ n [ n = k ] ⋅ g ( k ) = g ( n ) \displaystyle\sum_{k\mid n}[n=k]\cdot g(k)=g(n) k∣n∑[n=k]⋅g(k)=g(n)
- 方法二:运用卷积。
原问题为:已知 f = g ∗ 1 f=g * 1 f=g∗1,证明 g = f ∗ μ g=f * μ g=f∗μ
易知如下转化: f ∗ μ = g ∗ 1 ∗ μ ⟹ f ∗ μ = g f * μ=g * 1 * μ\implies f * μ=g f∗μ=g∗1∗μ⟹f∗μ=g(其中 1 ∗ μ = ε 1 * μ=ε 1∗μ=ε)。
对于第二种形式:
类似上面的方法一,我们考虑逆推这个式子。
∑ n ∣ d μ ( d n ) f ( d ) = ∑ k = 1 + ∞ μ ( k ) f ( k n ) = ∑ k = 1 + ∞ μ ( k ) ∑ k n ∣ d g ( d ) = ∑ n ∣ d g ( d ) ∑ k ∣ d n μ ( k ) = ∑ n ∣ d g ( d ) ε ( d n ) = g ( n ) \begin{aligned} & \sum_{n|d}{μ(\frac{d}{n})f(d)} \\ =& \sum_{k=1}^{+\infty}{μ(k)f(kn)} \\ =& \sum_{k=1}^{+\infty}{μ(k)\sum_{kn|d}{g(d)}} \\ =& \sum_{n|d}{g(d)\sum_{k|\frac{d}{n}}{μ(k)}} \\ =& \sum_{n|d}{g(d)ε(\frac{d}{n})} \\ =& g(n) \end{aligned} =====n∣d∑μ(nd)f(d)k=1∑+∞μ(k)f(kn)k=1∑+∞μ(k)kn∣d∑g(d)n∣d∑g(d)k∣nd∑μ(k)n∣d∑g(d)ε(nd)g(n)
我们把 d d d 表示为 k n kn kn 的形式,然后把 f f f 的原定义代入式子。
发现枚举 k k k 再枚举 k n kn kn 的倍数可以转换为直接枚举 n n n 的倍数再求出 k k k,发现后面那一块其实就是 ε ε ε, 整个式子只有在 d = n d=n d=n 的时候才能取到值。
参考文献
《混凝土数学》
OI Wiki