无极之地
WUJI
无极之地。记录所思所见,慢慢写下去。
首页 / 数论 / 算法
莫比乌斯函数与莫比乌斯反演 从 μ(n) 的定义出发,讲清约数和恒等式、反演公式与证明思路,并用欧拉函数与线性筛落到代码。
上一篇阶与原根 本原勾股数组的参数化
世界时钟 北京 --:--:-- 东京 --:--:-- UTC --:--:-- 伦敦 --:--:-- 纽约 --:--:-- 积性函数之间常常藏着一层「先对约数求和,再还原成点值」的关系。欧拉函数、互素计数、无平方因子的指示,最后都会碰到同一个开关:莫比乌斯函数 μ ( n ) \mu(n) μ ( n ) 。下面把定义、那条几乎处处为零的求和恒等式、反演公式,以及筛法实现放在一条线上。
莫比乌斯函数怎么取值
对正整数 n n n ,先写素因子分解 n = p 1 a 1 p 2 a 2 ⋯ p k a k n = p_1^{a_1} p_2^{a_2} \cdots p_k^{a_k} n = p 1 a 1 。莫比乌斯函数 只看两件事:有没有平方因子,以及不同素因子的个数。
p 2 a 2
⋯
p k a k
μ ( n ) = { 1 , n = 1 ( − 1 ) k , n = p 1 p 2 ⋯ p k (两两不同的素数) 0 , 存在某个 a i ≥ 2 \mu(n) =
\begin{cases}
1, & n = 1 \\
(-1)^k, & n = p_1 p_2 \cdots p_k\text{(两两不同的素数)} \\
0, & \text{存在某个 }a_i \ge 2
\end{cases} μ ( n ) = ⎩ ⎨
1 1 1 的值是 1 1 1
无平方因子且有偶数个不同素因子,值为 1 1 1
无平方因子且有奇数个不同素因子,值为 − 1 -1 − 1
被某个素数的平方整除,值为 0 0 0
几个具体值:μ ( 1 ) = 1 \mu(1)=1 μ ( 1 ) = 1 ,μ ( 2 ) = − 1 \mu(2)=-1 μ ( 2 ) = − 1 ,μ ( 3 ) = − 1 \mu(3)=-1 μ ( 3 ) = − 1 ,μ ( 6 ) = μ ( 2 ⋅ 3 ) = 1 \mu(6)=\mu(2\cdot 3)=1 , , 。再看 ,四个不同素数,所以 ;而 含平方,所以 。
判断时不要先数「全部素因子的个数再取符号」,而要先问有没有平方。18 = 2 ⋅ 3 2 18=2\cdot 3^2 18 = 2 ⋅ 3 2 有三个素因子因子,但 μ ( 18 ) = 0 \mu(18)=0 μ ( 18 ) = 0 ,不是 − 1 -1 − 1 。手算可以先试除平方数 4 , 9 , 25 , 49 , … 4,9,25,49,\ldots ,能整除就直接停。
μ \mu μ 是积性函数:若 gcd ( a , b ) = 1 \gcd(a,b)=1 g cd( a , b ) = 1 ,则 μ ( a b ) = μ ( a ) μ ( b ) \mu(ab)=\mu(a)\mu(b) μ ( ab ) = μ ( a ) μ ( b ) 。它不是完全积性的。μ ( 4 ) = 0 \mu(4)=0 ,但 。只要出现平方,对任意分解直接相乘就会错。写筛法时记住:合数的值可以由互素因子乘出来,但不能对带平方的分解随便乘。
那条核心恒等式 莫比乌斯函数真正有用,是因为它和常数函数 1 1 1 互为狄利克雷逆。写成求和就是
∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d \mid n} \mu(d) = [n=1] d ∣ n ∑ μ ( d ) = [ n = 1 ] 右边是艾弗森括号:n = 1 n=1 n = 1 时为 1 1 1 ,否则为 0 0 0 。
n = 1 n=1 n = 1 :只有 d = 1 d=1 d = 1 ,和为 μ ( 1 ) = 1 \mu(1)=1 μ ( 1 ) = 1 。
n = p n=p n = p :约数是 1 , p 1,p ,和为 。
一般证明走素因子。设 n n n 有 k k k 个不同素因子。因为 μ \mu μ 在有平方因子的约数上为零,求和只剩下从这 k k k 个素数里任选一个子集。选 t t t 个素数的项贡献 ( − 1 ) t (-1)^t ( − 1 ) t ,这样的子集有 个。于是
∑ d ∣ n μ ( d ) = ∑ t = 0 k ( k t ) ( − 1 ) t = ( 1 − 1 ) k = 0 k \sum_{d \mid n} \mu(d) = \sum_{t=0}^{k} \binom{k}{t}(-1)^t = (1-1)^k = 0^k d ∣ n ∑ μ ( d ) = t = 0 ∑ 约定 0 0 = 1 0^0=1 0 0 = 1 ,所以 k = 0 k=0 k = 0 (即 n = 1 n=1 n = 1 )时得 1 1 1 ,否则得 0 0 0 。这就是 。
数论里「恰好等于 1 1 1 」「恰好互素」经常被写成这种指示。容斥原理的符号 ( − 1 ) k (-1)^k ( − 1 ) k 和 μ \mu μ 是同一套东西:对每个素数选或不选,平方因子直接杀掉。
也可以从生成函数看一眼。若只看无平方核,每个素数贡献因子 ( 1 − 1 ) = 0 (1-1)=0 ( 1 − 1 ) = 0 ,所以合数的约数和抵消干净;只有完全没有素数可贡献时,空积等于 1 1 1 。这和「容斥到最后空集合留下 1 1 1 」是同一句话。
用 n = 30 n=30 n = 30 把约数和写全:约数 1 , 2 , 3 , 5 , 6 , 10 , 15 , 30 1,2,3,5,6,10,15,30 1 , 2 , 3 , 5 , 6 , 10 , 15 , 30 ,对应 μ \mu μ 为 1 , − 1 , − 1 , − 1 , 1 , 1 , 1 , − ,加起来 。任意 都会这样成对消掉。这条恒等式后面会被反复当作「内层求和的开关」:它要么给出 ,要么整段消失。
莫比乌斯反演 设 f f f 、g g g 是定义在正整数上的两个函数。若对每个 n n n 都有
g ( n ) = ∑ d ∣ n f ( d ) g(n) = \sum_{d \mid n} f(d) g ( n ) = d ∣ n ∑ f ( d ) f ( n ) = ∑ d ∣ n μ ( d ) g ( n d ) f(n) = \sum_{d \mid n} \mu(d)\, g\!\left(\frac{n}{d}\right) f ( n ) = d ∣ n ∑ μ ( d ) g ( d n 也可以写成 f ( n ) = ∑ d ∣ n μ ( n / d ) g ( d ) f(n)=\sum_{d \mid n}\mu(n/d)\,g(d) f ( n ) = ∑ d ∣ n μ ( n / d ) g ( d ) ,只是把约数配对换了一下。反过来也对:从第二式能推回第一式。这一对互推就叫莫比乌斯反演。
还有一种「整除方向反过来」的形式,竞赛里同样常见。若
g ( n ) = ∑ n ∣ d f ( d ) g(n) = \sum_{n \mid d} f(d) g ( n ) = n ∣ d ∑ f ( d ) f ( n ) = ∑ n ∣ d μ ( d n ) g ( d ) f(n) = \sum_{n \mid d} \mu\!\left(\frac{d}{n}\right) g(d) f ( n ) = n ∣ d ∑ μ ( n d ) 第一种按约数从下往上累加,第二种按倍数从下往上累加。下面证明用第一种。两种写法只是偏序反过来,不要在同一道题里各用一半,否则求和下标就很容易对不上。
证明思路 把第二式的右边展开。代入 g ( n / d ) = ∑ e ∣ ( n / d ) f ( e ) g(n/d)=\sum_{e \mid (n/d)} f(e) g ( n / d ) = ∑ e ∣ ( n / d ) f ( e ) ,得到
∑ d ∣ n μ ( d ) ∑ e ∣ ( n / d ) f ( e ) \sum_{d \mid n} \mu(d) \sum_{e \mid (n/d)} f(e) d ∣ n ∑ μ ( d ) e ∣ ( n / d ) ∑ f ( e ) 对满足 d ∣ n d \mid n d ∣ n 且 e ∣ ( n / d ) e \mid (n/d) e ∣ ( n / d ) 的对 ( d , e ) (d,e) ( d , e ) 求和。改成先固定 e e e ,再对 d ∣ ( n / e ) d \mid (n/e) 求和:
∑ e ∣ n f ( e ) ∑ d ∣ ( n / e ) μ ( d ) \sum_{e \mid n} f(e) \sum_{d \mid (n/e)} \mu(d) e ∣ n ∑ f ( e ) d ∣ ( n / e ) ∑ μ ( d ) 内层恰好是上节的恒等式,等于 [ n / e = 1 ] [n/e=1] [ n / e = 1 ] ,也就是只有 e = n e=n e = n 时为 1 1 1 。于是整段塌成 f ( n ) f(n) f ( n ) 。
反过来,从 f f f 推 g g g 时,把 μ \mu μ 的求和再叠一层,内层又变成 ∑ d ∣ m μ ( d ) = [ m = 1 ] \sum_{d \mid m}\mu(d)=[m=1] ∑ d ∣ m μ ( d ) = [ m ,同样只留下一项。
不必把它想成矩阵求逆的黑箱。狄利克雷卷积下,1 ∗ μ = ε 1*\mu=\varepsilon 1 ∗ μ = ε ,其中 1 1 1 是恒为 1 1 1 的函数,ε \varepsilon ε 是单位元(ε ( 1 ) = 1 \varepsilon(1)=1 ε ( 1 ) = 1 ,其余为 )。于是 当且仅当 。反演就是两边同时卷积 。
用一个具体的 n n n 把换序看清楚。取 n = 6 n=6 n = 6 ,g ( n ) = ∑ d ∣ n f ( d ) g(n)=\sum_{d\mid n}f(d) g ( n ) = ∑ d ∣ n f ( d ) ,要还原 。公式给出
f ( 6 ) = μ ( 1 ) g ( 6 ) + μ ( 2 ) g ( 3 ) + μ ( 3 ) g ( 2 ) + μ ( 6 ) g ( 1 ) f(6)=\mu(1)g(6)+\mu(2)g(3)+\mu(3)g(2)+\mu(6)g(1) f ( 6 ) = μ ( 1 ) g ( 6 ) + μ ( 2 ) g ( 3 ) + μ ( 3 ) g ( 2 ) + g ( 6 ) = f ( 1 ) + f ( 2 ) + f ( 3 ) + f ( 6 ) g ( 3 ) = f ( 1 ) + f ( 3 ) g ( 2 ) = f ( 1 ) + f ( 2 ) g ( 1 ) = f ( 1 ) \begin{aligned}
g(6)&=f(1)+f(2)+f(3)+f(6)\\
g(3)&=f(1)+f(3)\\
g(2)&=f(1)+f(2)\\
g(1)&=f(1)
\end{aligned} g ( 6 ) g 代入后 f ( 1 ) f(1) f ( 1 ) 的系数是 1 − 1 − 1 + 1 = 0 1-1-1+1=0 1 − 1 − 1 + 1 = 0 ,f ( 2 ) f(2) f ( 2 ) 的系数是 1 − 1 = 0 1-1=0 1 , 的系数是 ,只剩下 。系数恰好是 。一般 也是这样:每个 前面挂着 。
经典例子:欧拉函数 欧拉函数 φ ( n ) \varphi(n) φ ( n ) 表示 1 1 1 到 n n n 中与 n n n 互素的个数。它有一条更老的恒等式:
∑ d ∣ n φ ( d ) = n \sum_{d \mid n} \varphi(d) = n d ∣ n ∑ φ ( d ) = n 原因是:把 { 1 , 2 , … , n } \{1,2,\dots,n\} { 1 , 2 , … , n } 按 gcd ( k , n ) \gcd(k,n) g cd( k , n ) 分组。若 gcd ( k , n ) = d \gcd(k,n)=d g cd( k , n ) = d ,则 与 互素,这样的 恰有 个。对所有 求和得到 。换元后就是 。
现在 g ( n ) = n g(n)=n g ( n ) = n ,f = φ f=\varphi f = φ ,反演立刻给出
φ ( n ) = ∑ d ∣ n μ ( d ) n d = n ∑ d ∣ n μ ( d ) d \varphi(n) = \sum_{d \mid n} \mu(d)\,\frac{n}{d} = n \sum_{d \mid n} \frac{\mu(d)}{d} φ ( n ) = d ∣ n ∑ μ ( d ) d n 这就是用 μ \mu μ 写 φ \varphi φ 的公式。手算 n = 12 n=12 n = 12 :约数 1 , 2 , 3 , 4 , 6 , 12 1,2,3,4,6,12 1 , 2 , 3 , 4 , 6 , 12 ,对应 μ \mu μ 为 ,于是
φ ( 12 ) = 12 ( 1 − 1 2 − 1 3 + 1 6 ) = 12 ⋅ 1 3 = 4 \varphi(12) = 12\left(1-\frac{1}{2}-\frac{1}{3}+\frac{1}{6}\right) = 12\cdot\frac{1}{3} = 4 φ ( 12 ) = 12 ( 1 − 2 1 − 3 1 , 5 , 7 , 11 1,5,7,11 1 , 5 , 7 , 11 确实与 12 12 12 互素。
若已经会素因子公式 φ ( n ) = n ∏ p ∣ n ( 1 − 1 / p ) \varphi(n)=n\prod_{p\mid n}(1-1/p) φ ( n ) = n ∏ p ∣ n ( 1 − 1/ p ) ,会发现它和上式是同一件事:展开乘积,每一项正好对应无平方约数上的 μ ( d ) / d \mu(d)/d μ ( d ) / d 。
互素指示也可以从同一条恒等式读出来。gcd ( k , n ) = 1 \gcd(k,n)=1 g cd( k , n ) = 1 当且仅当 ∑ d ∣ gcd ( k , n ) μ ( d ) = 1 \sum_{d \mid \gcd(k,n)}\mu(d)=1 ∑ d ∣ g c d ( k , n ) μ ( d ) = 。于是
∑ k = 1 n [ gcd ( k , n ) = 1 ] = ∑ k = 1 n ∑ d ∣ gcd ( k , n ) μ ( d ) = ∑ d ∣ n μ ( d ) n d \sum_{k=1}^{n}[\gcd(k,n)=1] = \sum_{k=1}^{n}\sum_{d \mid \gcd(k,n)}\mu(d) = \sum_{d \mid n}\mu(d)\,\frac{n}{d} k = 1 ∑ n [ g cd( k , n ) = 1 又回到 φ ( n ) \varphi(n) φ ( n ) 。很多「与 n n n 互素」的计数,第一步都是把 [ gcd = 1 ] [\gcd=1] [ g cd= 1 ] 换成 μ \mu μ 的和,再交换求和顺序。例如 1 1 1 到 n n n 、 到 的互素对数
∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = 1 ] = ∑ d μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋ \sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=1] = \sum_{d}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor i = 1 ∑ n j = 1 ∑ 就是把指示函数展开再换序。整除分块可以把相同的 ⌊ n / d ⌋ \lfloor n/d\rfloor ⌊ n / d ⌋ 段压成 O ( n ) O(\sqrt{n}) O ( n ) 。
再手算一次 n = 9 n=9 n = 9 。约数 1 , 3 , 9 1,3,9 1 , 3 , 9 ,对应 μ \mu μ 为 1 , − 1 , 0 1,-1,0 1 , − 1 , 0 ,于是
φ ( 9 ) = 9 ( 1 − 1 3 ) = 6 \varphi(9)=9\left(1-\frac{1}{3}\right)=6 φ ( 9 ) = 9 ( 1 − 3 1 ) = 6 1 , 2 , 4 , 5 , 7 , 8 1,2,4,5,7,8 1 , 2 , 4 , 5 , 7 , 8 与 9 9 9 互素,对得上。注意 9 = 3 2 9=3^2 9 = 3 2 使 μ ( 9 ) = 0 \mu(9)=0 μ ( ,反演时这一项直接不出现;漏把平方约数的 置零,就会多减或多加。
另一个常见变形是对 gcd \gcd g cd 求和。由 ∑ d ∣ n φ ( d ) = n \sum_{d\mid n}\varphi(d)=n ∑ d ∣ n φ ( d ) = n 可以推出
∑ k = 1 n gcd ( k , n ) = ∑ d ∣ n d φ ( n d ) \sum_{k=1}^{n}\gcd(k,n)=\sum_{d\mid n}d\,\varphi\!\left(\frac{n}{d}\right) k = 1 ∑ n g cd( k , n ) = d ∣ n 若题目要的是「先知道约数和,再求原函数」,就走反演;若已经有 φ \varphi φ 的显式,直接代入往往更短。两者并不冲突,只是从哪一头写起不同。
埃氏筛对每个合数会标多次。线性筛保证每个合数只被最小质因子划掉一次,同时可以把积性函数的值递推出来。对 μ \mu μ 的规则是:
μ ( 1 ) = 1 \mu(1)=1 μ ( 1 ) = 1
若 i i i 乘上一个新素数 p p p ,且 p ∤ i p \nmid i p ∤ i ,则 μ ( i p ) = − μ ( i ) \mu(ip)=-\mu(i) μ ( i p )
def linear_sieve_mu ( n : int ) -> list [ int ]:
""" 返回数组 mu,其中 mu[i] = μ(i),下标从 1 到 n。 """
mu = [ 0 ] * ( n + 1 )
primes : list [ int ] = []
vis = [ False ] * ( n + 1 )
mu [ 1 ] = 1
for i in range ( 2 , n + 1 ):
if not vis [ i ]:
primes . append (
时间 O ( n ) O(n) O ( n ) 。vis[i] 为假表示 i i i 是素数,此时直接赋 μ ( i ) = − 1 \mu(i)=-1 μ ( i ) = − 1 。内层一旦发现 p p p 整除 i i i ,说明最小质因子已经用过,break 保证每个合数只进入一次。跑一下就能对上前面的手算:μ ( 1 ) \mu(1) 到 是 。
线性筛和积性是绑在一起的。当 p ∤ i p\nmid i p ∤ i 时 gcd ( i , p ) = 1 \gcd(i,p)=1 g cd( i , p ) = 1 ,所以 μ ( i p ) = μ ( i ) μ ( p ) = − μ ( i ) \mu(ip)=\mu(i)\mu(p)=-\mu(i) μ ( i p ) = μ ( i ) μ 。当 时, 至少含 ,定义直接给出 ,不必再访问更大的素数。若漏掉 ,同一个合数会被多个质因子更新,后面的赋值会把已经正确的 改乱。
预处理出 mu 之后,单个 n n n 的反演就是枚举约数。约数个数通常很小,比再筛一次便宜。需要 φ \varphi φ 的整段前缀时,也可以在同一套线性筛里顺带递推 φ \varphi φ ,不必每次再对约数求和。
若只要单个 n n n 的 μ ( n ) \mu(n) μ ( n ) ,不必筛到 n n n 。试除到 n \sqrt{n} n ,统计不同素因子个数,中途碰到平方因子就返回 。
def mu_single ( n : int ) -> int :
if n <= 0 :
raise ValueError ( " n 必须为正整数 " )
ans = 1
i = 2
while i * i <= n :
if n % i == 0 :
n //= i
if n % i == 0 :
return 0
ans = - ans
i += 1 if i == 2 else 2
if
写的时候容易踩的坑 μ ( 1 ) \mu(1) μ ( 1 ) 是 1 1 1 ,不是 0 0 0 。很多循环从 2 2 2 开始筛,却忘了初始化 mu[1]。后面反演时 d = 1 d=1 d = 1 那一项正好是 g ( n ) g(n) g ( n ) 自己,漏了整式就错。
有平方因子必须是 0 0 0 ,不是 ( − 1 ) (-1) ( − 1 ) 的某种次数。μ ( 12 ) = μ ( 2 2 ⋅ 3 ) = 0 \mu(12)=\mu(2^2\cdot 3)=0 μ ( 12 ) = μ ( 2 2 ⋅ 3 ) = 0 ,不是 μ ( 2 。线性筛里「 整除 就置 并 」就是在落实这件事。
反演的求和下标是 d ∣ n d \mid n d ∣ n ,不是 d ≤ n d \le n d ≤ n 。写成 ∑ d = 1 n μ ( d ) g ( n / d ) \sum_{d=1}^{n}\mu(d)g(n/d) ∑ d = 1 n μ ( 而不加整除条件,只有在 被定义成「非整数处为 」时才碰巧对;一般函数会多算许多项。
两种反演不要混。g ( n ) = ∑ d ∣ n f ( d ) g(n)=\sum_{d\mid n}f(d) g ( n ) = ∑ d ∣ n f ( d ) 还原的是约数方向;g ( n ) = ∑ n ∣ d f ( d ) g(n)=\sum_{n\mid d}f(d) g ( n ) = ∑ 还原的是倍数方向。题目若在 到 上对倍数求和,套错公式会出现 和 对调。
φ ( n ) = n ∑ d ∣ n μ ( d ) / d \varphi(n)=n\sum_{d\mid n}\mu(d)/d φ ( n ) = n ∑ d ∣ n μ ( d ) / d 里的除法最终是整数。代码请用 sum(mu[d] * (n // d) for d in ...),不要先把 μ ( d ) / d \mu(d)/d μ ( d ) / d 做成浮点再乘回去。小 n n 也许碰巧对,大 会圆整出错。
狄利克雷卷积不交换下标就不成立。( μ ∗ g ) ( n ) = ∑ d ∣ n μ ( d ) g ( n / d ) (\mu*g)(n)=\sum_{d\mid n}\mu(d)g(n/d) ( μ ∗ g ) ( n ) = ∑ d ∣ n μ ( d ) g ( n / d ) ,把 g ( n / d ) g(n/d) 写成 必须同时把 换成 。只改一边,数值会对不上。
μ \mu μ 会取负值。前缀和 M ( n ) = ∑ i ≤ n μ ( i ) M(n)=\sum_{i\le n}\mu(i) M ( n ) = ∑ i ≤ n μ ( i ) 在正负之间摆动,不能当正项级数估计。需要界时,用 ∣ μ ( n ) ∣ ≤ 1 |\mu(n)|\le 1 ∣ μ ( n ) ∣ ,以及无平方核的密度大约 。
下标从 0 0 0 还是从 1 1 1 要统一。数组开 n+1 并让 mu[i] 表示 μ ( i ) \mu(i) μ ( i ) ,循环从 2 2 2 扫到 n n n ,这是最不容易错的。若把答案存在 mu[i-1],后面写 n / d n/d n / d 时非常容易偏一位。
单个数的试除也有对称坑:除掉一个素数 p p p 后必须立刻检查 p p p 是否还整除剩下的 n n n 。只统计「出现过的素数个数」而不查重指数,会把 12 12 12 判成 μ ( 12 ) = − 1 \mu(12)=-1 μ ( 12 ) = − 1 。上面的 mu_single 在第一次除掉 i i i 后立刻看 n % i,就是为了抓住平方。
无平方因子的计数也是同一套符号。n n n 无平方因子当且仅当 μ ( n ) ≠ 0 \mu(n)\ne 0 μ ( n ) = 0 ,于是 1 1 1 到 N N N 里无平方数的个数可以写成 ∑ k = 1 N ∣ μ ( k ) ∣ \sum_{k=1}^{N}|\mu(k)| ∑ ,也可以用容斥写成 。后一个式子里 出现在分母上,正是「每个平方因子被容斥掉一次」。它和 并不矛盾:一个管「约数和是否塌成单位」,一个管「把平方从区间里挖走」。
它在算法里站在哪 容斥数个数、统计互素对、推 φ \varphi φ 的前缀、把互素条件收成 μ \mu μ 与整除分块,全是同一套:先把条件写成对约数的和,再用 μ \mu μ 把和还原成点值。杜教筛能在亚线性时间内求 μ \mu μ 和 φ \varphi φ 的前缀,底座仍是 1 ∗ μ = ε 1*\mu=\varepsilon 1 ∗ μ = ε 。
做题时可以按三步走。第一,看题目给的是 g ( n ) = ∑ d ∣ n f ( d ) g(n)=\sum_{d\mid n}f(d) g ( n ) = ∑ d ∣ n f ( d ) 还是对倍数求和,先选定反演方向。第二,把指示函数 [ gcd = 1 ] [\gcd=1] [ g cd= 1 ] 或 [ n = 1 ] [n=1] 换成 的和,再交换求和顺序,让 走到最外层。第三,内层若出现 ,就整除分块;若只要单个 ,就枚举约数。公式背熟之后,真正耗时的是下标有没有写反。验算时先拿 和素数 代入:这两处项数少,公式写反或者 的符号错了,会立刻露馅。
一次同余管的是单个线性条件有没有解。莫比乌斯管的是对所有约数加起来之后怎么拆回去。两者都是初等数论里会被反复调用的底座。把 ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d\mid n}\mu(d)=[n=1] ∑ d ∣ n μ ( d ) = [ n = 1 ] 记牢,反演就只是换序加这一条恒等式。
⎧
1 , ( − 1 ) k , 0 , n = 1 n = p 1 p 2
μ ( 6 ) =
μ ( 2 ⋅
3 ) =
1
μ ( 30 ) = μ ( 2 ⋅ 3 ⋅ 5 ) = − 1 \mu(30)=\mu(2\cdot 3\cdot 5)=-1 μ ( 30 ) = μ ( 2 ⋅ 3 ⋅ 5 ) = − 1 μ ( 4 ) = μ ( 12 ) = μ ( 18 ) = 0 \mu(4)=\mu(12)=\mu(18)=0 μ ( 4 ) = μ ( 12 ) = μ ( 18 ) = 0 n = 210 = 2 ⋅ 3 ⋅ 5 ⋅ 7 n=210=2\cdot 3\cdot 5\cdot 7 n = 210 = 2 ⋅ 3 ⋅ 5 ⋅ 7 μ ( 210 ) = 1 \mu(210)=1 μ ( 210 ) = 1 n = 60 = 2 2 ⋅ 3 ⋅ 5 n=60=2^2\cdot 3\cdot 5 n = 60 = 2 2 ⋅ 3 ⋅ 5 4
,
9
,
25
,
49
,
…
μ ( 4 ) = 0
μ ( 2 ) μ ( 2 ) = 1 \mu(2)\mu(2)=1 μ ( 2 ) μ ( 2 ) = 1 1 , p
n = p a n=p^a n = p a (a ≥ 2 a\ge 2 a ≥ 2 ):约数里 μ ( 1 ) = 1 \mu(1)=1 μ ( 1 ) = 1 ,μ ( p ) = − 1 \mu(p)=-1 μ ( ,更高次幂全是 ,和仍是 。n = p q n=pq n = pq :约数 1 , p , q , p q 1,p,q,pq 1 , p , q , pq ,和为 1 − 1 − 1 + 1 = 0 1-1-1+1=0 1 − 1 − 1 + 1 = 。( k t ) \binom{k}{t} ( t k )
k
( t k )
(
−
1
) t
=
( 1 −
1 ) k =
0 k
[ n = 1 ]
1 1,-1,-1,-1,1,1,1,-1 1 , − 1 , − 1 , − 1 , 1 , 1 , 1 , − 1
1 − 1 − 1 − 1 + 1 + 1 + 1 − 1 = 0 1-1-1-1+1+1+1-1=0 1 − 1 − 1 − 1 + 1 + 1 + 1 − 1 = 0
)
g
(
d
)
d ∣
( n / e )
=
1 ]
0 0 0
f ( 6 ) f(6) f ( 6 )
μ
(
6
)
g
(
1
)
(
3
)
g ( 2 )
g ( 1 )
= f ( 1 ) + f ( 2 ) + f ( 3 ) + f ( 6 ) = f ( 1 ) + f ( 3 ) = f ( 1 ) + f ( 2 ) = f (
−
1 =
0
∑ d ∣ ( 6 / e ) μ ( d ) \sum_{d\mid (6/e)}\mu(d) ∑ d ∣ ( 6/ e ) μ ( d ) k / d k/d k / d
∑ d ∣ n φ ( d ) = n \sum_{d \mid n}\varphi(d)=n ∑ d ∣ n φ ( d ) = n
=
n d ∣ n ∑ d μ ( d )
1 , − 1 , − 1 , 0 , 1 , 0 1,-1,-1,0,1,0 1 , − 1 , − 1 , 0 , 1 , 0
1
+
6 1
)
=
12 ⋅
3 1 =
4
1
]
=
k = 1 ∑ n d ∣ g c d ( k , n ) ∑ μ ( d ) =
d ∣ n ∑ μ ( d ) d n
1 1 1
m
[
g cd
(
i
,
j
)
=
1 ] =
d ∑ μ ( d ) ⌊ d n ⌋ ⌊ d m ⌋
9
)
=
0
∑
d
φ
( d n )
=
− μ ( i )
若 p ∣ i p \mid i p ∣ i ,则 i p ip i p 含平方因子,μ ( i p ) = 0 \mu(ip)=0 μ ( i p ) = 0 ,并且后面的素数不必再乘 i
)
mu [ i ] = - 1
for p in primes :
ip = i * p
if ip > n :
break
vis [ ip ] = True
if i % p == 0 :
mu [ ip ] = 0
break
mu [ ip ] = - mu [ i ]
return mu
if __name__ == " __main__ " :
mu = linear_sieve_mu ( 30 )
print ( mu [ 1 : 31 ])
# 验证 sum_{d|n} μ(d) = [n=1]
for n in range ( 1 , 31 ):
s = sum ( mu [ d ] for d in range ( 1 , n + 1 ) if n % d == 0 )
assert s == ( 1 if n == 1 else 0 )
def phi_from_mu ( n : int , mu : list [ int ]) -> int :
return sum ( mu [ d ] * ( n // d ) for d in range ( 1 , n + 1 ) if n % d == 0 )
print ( phi_from_mu ( 12 , mu ), phi_from_mu ( 7 , mu ), phi_from_mu ( 1 , mu ))
# 4 6 1
μ ( 1 )
1 , − 1 , − 1 , 0 , − 1 , 1 , − 1 , 0 , 0 , 1 1,-1,-1,0,-1,1,-1,0,0,1 1 , − 1 , − 1 , 0 , − 1 , 1 , − 1 , 0 , 0 , 1 (
p
)
=
− μ ( i )
break
0 0 0
n
>
1
:
ans = - ans
return ans
) μ ( 6 ) \mu(2)\mu(6) μ ( 2 ) μ ( 6 )
break
d
)
g
(
n
/
d
)
n ∣ d
f
(
d
)
n
g ( n / d )
≤
1
k = 1 N
∣
μ
(
k
)
∣
∑ d μ ( d ) ⌊ N / d 2 ⌋ \sum_{d}\mu(d)\lfloor N/d^2\rfloor ∑ d μ ( d ) ⌊ N / d 2 ⌋ ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d\mid n}\mu(d)=[n=1] ∑ d ∣ n μ ( d ) = [ n = 1 ] [ n = 1 ]
⌊ n / d ⌋ \lfloor n/d\rfloor ⌊ n / d ⌋
⋯
p k
(两两不同的素数)
存在某个 a i ≥ 2
p
)
=
− 1
0
1
)
莫比乌斯函数与莫比乌斯反演 · 无极之地