莫比乌斯反演(二):莫比乌斯函数

莫比乌斯函数

前言

莫比乌斯函数,数论函数,由德国数学家和天文学家莫比乌斯(August Ferdinand Möbius ,1790–1868)提出。梅滕斯(Mertens)首先使用 μ ( d ) \mu(d) 作为莫比乌斯函数的记号。而据说,高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数。莫比乌斯函数在数论中有着广泛应用。

莫比乌斯函数  μ ( d ) \mu(d)

莫比乌斯函数表达式:
μ ( d ) = { 1 , d = 1 1 k , d = p 1 p 2 p 3 p k ( p i p j ) 0 , o t h e r w i s e \mu(d)=\begin{cases} 1,\qquad d=1\\ -1^k, \qquad d = p_1\cdot p_2\cdot p_3\cdots p_k\quad({p_i } \neq p_j)\\ 0, \qquad otherwise\\ \end{cases}

由上式可知 μ ( 6 ) = 1 \mu(6) = 1 因为 6 = 2 3 6=2*3 ,而 μ ( 12 ) = 0 \mu(12) = 0 因为 12 = 2 2 3 = 2 2 3 12 = 2*2*3 = 2^2*3
特别需要注意的是 μ ( 1 ) = 1 \mu(1) = 1

莫比乌斯函数的性质

  1. 约束求和:
    d n μ ( d ) = [ 1 n ] = { 1 ,   n = 1 0 ,   n > 1 \sum_{d|n}\mu{(d)}=\left[\frac{1}{n}\right]= \begin{cases} 1, &\text{ $n=1$}\\ 0, &\text{ $n>1$}\\ \end{cases}
    或者
    d n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu{(d)}=\left[n=1\right]
    PS: [ n = 1 ] [n=1] 表示当 n = 1 n=1 时为 1 1 ,否则为 0 0
    证明:当 n = 1 n=1 时,显然成立。当 n > 1 n>1 时,将 n n 改写为 p 1 p 2 p k p_1\cdot p_2 \cdots p_k
    设集合 P = { p 1 , p 2 ,   , p k } P = \{p_1,p_2,\cdots,p_k\}
    若使 d n d|n ,当且仅当 d d 为集合 P P 中的某些元素的乘积。因此可得:
    d n μ ( d ) = μ ( 1 ) + μ ( p 1 ) + μ ( p 2 ) + + μ ( p 1 p 2 ) + + μ ( p 1 p 2 p 3 ) + + μ ( p 1 p 2 p k ) = C k 0 × ( 1 ) 0 + C k 1 × ( 1 ) 1 + C k 2 × ( 1 ) 2 + C k 3 × ( 1 ) 3 + + C k k × ( 1 ) k = 0 \begin{aligned}\sum_{d|n}\mu(d) =& \mu(1)+\mu(p_1)+\mu(p_2)+\cdots+\mu(p_1 p_2)+\cdots+\mu(p_1p_2p_3)+\cdots+\mu(p_1p_2\cdots p_k)\\ =&C_k^0\times(-1)^0+C_k^1\times(-1)^1+C_k^2\times(-1)^2+C_k^3\times(-1)^3+\cdots+C_k^k\times(-1)^k\\ =&0\end{aligned}
  2. 这个性质只列出,暂时不作证明
    d n μ ( d ) d = φ ( n ) n \sum_{d|n}\frac{\mu(d)}{d}=\frac{\varphi(n)}{n}

以上两条是莫比乌斯函数最常用的性质。

莫比乌斯函数筛法

1.最简单的筛法:

void get_mu() {
    mu[1] = 1;
    for (int i = 1; i < maxn; i++) {
        for (int j = i + i; j < maxn; j += i) {
            mu[j] -= mu[i];
        }
    }
}

2.线性筛法

void get_mu() {
  mu[1] = 1;
  for (int i = 2; i < maxn; i++) {
    if (vis[i] == false) {
      prime[cnt++] = i;
      mu[i] = -1;
    }
    for (int j = 0; j < cnt && i * prime[j] < maxn; j++) {
      vis[i * prime[j]] = true;
      if (i % prime[j] == 0) {
        mu[i * prime[j]] = 0;
        break;
      } else {
        mu[i * prime[j]] = -mu[i];
      }
    }
  }
发布了79 篇原创文章 · 获赞 56 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/qq_40861916/article/details/90612363
今日推荐