更多文章可以在本人的个人小站: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