「數論函數」學習筆記

定義域爲正整數,值域爲整數的函數稱爲數論函數。OI中經常使用的數論函數有$\mu$,$\varphi$等。函數

積性函數

徹底積性函數:$f(ab)=f(a)f(b)$優化

通常積性函數:$f(ab)=f(a)f(b),a \perp b$spa

常見的積性函數以下:code

莫比烏斯函數 $\mu(n)$
歐拉函數 $\varphi(n)$
單位函數 $\text{id}(n)=n$
元函數 $\epsilon(n)=[n=1]$
恆等函數 $I(n)=1$
約數個數 $d(n)=\sum\limits_{i=1}^n[i
約數和 $\sigma(n)=\sum\limits_{i

狄利克雷卷積

兩個函數$f,g$的狄利克雷卷積$t$:遞歸

$$t(n)=\sum\limits_{d|n}f(d)g(\dfrac{n}{d})$$it

記爲$t = f \ast g$table

一個重要的性質:兩個積性函數的狄利克雷卷積仍爲積性函數ast

整除分塊

假如說咱們要求解$$\sum\limits_{i=1}^{n}\left \lfloor n \over i \right \rfloor$$class

直接模擬是$O(n)$的。而咱們發現$\left \lfloor \dfrac{n}{i} \right \rfloor$在$i$相近時會有不少重複的值。整除分塊的思想就是將全部重複的數值一塊兒計算效率

有結論$\left \lfloor \dfrac{n}{i} \right \rfloor .. \left \lfloor \dfrac{n}{n/(n/i)} \right \rfloor$的值都是相等的,而$\left \lfloor \dfrac{n}{i} \right \rfloor$總共有不超過$2\sqrt{n}$個取值。所以複雜度是$O(\sqrt{n})$。

莫比烏斯函數

定義

考慮一個函數$F(n)=\sum\limits_{d|n}f(d)$,可否經過對$f$進行容斥得出$F$?其容斥係數知足什麼特定規律嗎?

咱們發現$F$的定義實際上是個狄利克雷卷積的形式。即$F=f \ast I$

所以$f$即爲$F$捲上「$I$的狄利克雷逆」。由此咱們便定義這個容斥係數,也就是莫比烏斯函數$\mu$,爲$I$的逆。即

$$\mu \ast I = \epsilon(n)$$

$$\sum\limits_{d|n}\mu(d)=[n=1]=\epsilon(n) \tag{1.1}$$

莫比烏斯函數的性質

性質一

$\mu$函數爲積性函數。即

$$\mu(m \ast n) = \mu(m) \ast \mu(n), \ \ \ m \perp n \tag{1.2}$$

性質二

由此任意的莫比烏斯函數均可以表示爲$\mu(n)=\prod\limits_{i} \mu(p_i^{y_i})$ (分解質因數)

$p^y$很特殊,根據以前的結論有$\sum\limits_{d|p^y}\mu(d)=0$,所以$\mu(1)+\mu(p)+\mu(p^2)+ \cdots \mu(p^y)=0$

由此猜想莫比烏斯函數值的性質:$\mu(1)=1,\mu(p)=-1$,而且對於全部指數$y$大於$1$的,知足$\mu(p^y)=0$

也就是:

$$\mu(d) = \begin{cases} 1 & d=1 \ (-1)^y & d=p_1 \ast p_2 \ast \cdots \ast p_y \ 0 & otherwise\end{cases} \tag{1.3}$$

這個結論是正確的。咱們能夠用二項式定理證實這樣的性質知足莫比烏斯函數的定義:

$n>1$時,將$n$分解質因數得$n=p_1^{y_1} \ast p_2^{y_2} \ast ... \ast p_k^{y_k}$。任何一個質數的個數超過$1$時莫比烏斯函數值必定爲$0$,能夠無論。咱們只須要考慮有多少個質因數的指數都爲$1$。所以有

$$ \begin{aligned} & \sum\limits_{d|n} \mu(d) \ =& \sum\limits_{i=0}^{k} C^{i}{k} \ast (-1)^i \ =& \sum\limits{i=0}^{k} \dbinom{k}{i} (-1)^i 1^{k-i} \ =& 0 \end{aligned} $$

線性篩

積性函數均可以由線性篩求得。代碼以下:

inline void SieveMu(int n){
    mu[1] = 1;
    for(int i = 2; i <= n; ++i){
        if(!b[i]){
            prm[++tot] = i;
            mu[i] = -1;
        }
        for(int j = 1; j <= tot && i*prm[j] <= n; ++j){
            b[i*prm[j]] = 1;
            if(i % prm[j] == 0){
                mu[i*prm[j]] = 0;
                break;
            }else{
                mu[i*prm[j]] = -mu[i];
            }
        }
    }
}

莫比烏斯反演

根據莫比烏斯函數的定義,咱們發現莫比烏斯函數具備以下的反演原理。

公式 1

$$F(n)=\sum\limits_{d|n}f(d) \xrightarrow[]{反演} f(n)=\sum\limits_{d|n}\mu(d)F(\dfrac{n}{d}) \tag{1.4}$$

公式 2

$$F(n)=\sum\limits_{n|d}f(d) \xrightarrow[]{反演} f(n)=\sum\limits_{n|d}\mu(\dfrac{d}{n})F(d) \tag{1.5}$$

問題一

求$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m }[gcd(i,j) = k], (n < m ) $

直接經過定義來變形: $$ \begin{aligned} &=\sum\limits_{i=1}^{n/k}\sum\limits_{j=1}^{m/k}[gcd(i,j)=1] \ &=\sum\limits_{i=1}^{n/k}\sum\limits_{j=1}^{m/k}\sum\limits_{d|gcd(i,j)}\mu(d) \ &=\sum\limits_{d=1}^{n}\mu(d)\sum\limits_{d|i}^{n/k}\sum\limits_{d|j}^{m/k}1\ &=\sum\limits_{d=1}^{n}\mu(d)\sum\limits_{i=1}^{\left \lfloor \frac{n}{kd} \right \rfloor}\sum\limits_{j=1}^{\left \lfloor \frac{m}{kd} \right \rfloor} 1\ &= \sum\limits_{d=1}^{n}\mu(d)\left \lfloor \frac{n}{kd} \right \rfloor\left \lfloor \frac{m}{kd} \right \rfloor\ \end{aligned} $$

可使用整除分塊$O(\sqrt{n})$求解。

將$gcd$換到外面枚舉是一個經常使用的$trick$。

問題二

求$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}gcd(i,j),(n<m)$

$$ \begin{aligned} &= \sum\limits_{d=1}^{n}d\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m}[gcd(i,j)=d] \ &=\sum\limits_{d=1}^{n}d\sum\limits_{i=1}^{n/d}\mu(i)\left \lfloor \dfrac{n}{i d} \right \rfloor \left \lfloor \dfrac{m}{id} \right \rfloor \ \end{aligned} $$

第一個$\sum$能夠用整除分塊,第二個也是。因而複雜度爲$O(n)$。

咱們還能夠進一步優化——設$T=i \cdot d$,則有

$$ \begin{aligned} &=\sum\limits_{d=1}^{n}d\sum\limits_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\mu(\dfrac{T}{d})\left \lfloor \dfrac{n}{T} \right \rfloor \cdot \left \lfloor \dfrac{m}{T} \right \rfloor \ &=\sum\limits_{T=1}^{n}\left \lfloor \dfrac{n}{T} \right \rfloor \left \lfloor \dfrac{m}{T} \right \rfloor\sum\limits_{d|T}d\mu(\dfrac{T}{d}) \end{aligned} $$

後面部分$\sum\limits_{d|T}d\mu(\dfrac{T}{d})$是一個狄利克雷卷積,是一個積性函數,咱們能夠在線性篩時篩出。而後直接整除分塊就能夠$O(\sqrt{n})$完成求解了。

將兩個數的乘積設作一個變量進行恆等變形也是一個經常使用$trick$。

歐拉函數

定義

對於一個正整數$n$,小於$n$且與$n$互質的正整數個數記做$\varphi(n)$ 。

$$\varphi(n) = \sum\limits_{i=1}^{n-1}[gcd(n,i)=1] \tag{2.1}$$

其中特殊定義$\varphi(1)=1$

經常使用的歐拉函數值:$\varphi(p)=p-1, \ \varphi(p^k)=p^k-p^{k-1}$

其中,歐拉函數也是積性函數。知足$\varphi(nm)=\varphi(n)\varphi(m), \ n \perp m$,所以也能夠經過線性篩求出。

既然這樣,那麼將$n$分解質因數獲得$n=\prod\limits_{i}p_{i}^{k_i}$,則有$\varphi(n)=\prod\limits_{i}\varphi(p_i^{k_i})$。

因而就得出了$\varphi$的通項公式:

$$\varphi(n)=\prod\limits_{i}(p_i^{k_i}-p_i^{k_i-1})=n \prod\limits_{i}(1-{1 \over p_i}) \tag{2.2}$$

歐拉函數的性質

$$\sum\limits_{d|n}\varphi(d)=n \tag{2.4}$$

這個性質很是巧妙。這實際上是一個真分數約分的過程。

$$\frac{0}{12},\frac{1}{12},\frac{2}{12},\frac{3}{12},\frac{4}{12},\frac{5}{12},\frac{6}{12},\frac{7}{12},\frac{8}{12},\frac{9}{12},\frac{10}{12},\frac{11}{12}$$

約分後交換順序獲得

$$\frac{0}{1},\frac{1}{2},\frac{1}{3},\frac{2}{3},\frac{1}{4},\frac{3}{4},\frac{1}{6},\frac{5}{6},\frac{1}{12},\frac{5}{12},\frac{7}{12},\frac{11}{12}$$

固然這個性質能夠表示成狄利克雷卷積的形式:

$$\sum\limits_{d|n}\varphi(d)I(\dfrac{n}{d})=n$$

也就是

$$\varphi \ast I = \text{id}$$

那麼也就獲得了

$$\varphi = \mu \ast \text{id} \tag{2.5}$$

$$\varphi(n) = \sum\limits_{d|n}\mu(d) \dfrac{n}{d} \ \ \ \Leftrightarrow \ \ \ \dfrac{\varphi(n)}{n} = \sum\limits_{d|n}\dfrac{\mu(d)}{d} \tag{2.6}$$


杜教篩

杜教篩要解決的問題時在低於線性的複雜度下求出積性函數的前綴和。

即求

$$S(n)=\sum\limits_{i=1}^{n}f(i)$$

咱們找另外一個積性函數$g$去卷$f$,令$h = f \ast g$。

那麼

$$ \begin{aligned} \sum\limits_{i=1}^{n}h(i) &=\sum\limits_{i=1}^{n}(f*g)(i) \ &=\sum\limits_{i=1}^{n}\sum\limits_{d|i}^{i}g(d)f(\dfrac{i}{d}) \ &=\sum\limits_{d=1}^{n}g(d)\sum\limits_{d|i}^{n}f(\dfrac{i}{d}) \ &=\sum\limits_{d=1}^{n}g(d)\sum\limits_{i=1}^{\left \lfloor \frac{n}{d}\right \rfloor}f(i) \ &= \sum\limits_{d=1}^{n}g(d)S(\left \lfloor \frac{n}{d}\right \rfloor) \ \end{aligned} $$

咱們要求的是$S(n)$,所以考慮將它表示出來:

$$ \sum\limits_{i=1}^{n}h(i) = g(1)S(n)+\sum\limits_{d=2}^{n}g(d)S(\left \lfloor \frac{n}{d}\right \rfloor) $$

移項獲得

$$ g(1)S(n) = \sum\limits_{i=1}^{n}(f*g)(i) -\sum\limits_{d=2}^{n}g(d)S(\left \lfloor \frac{n}{d}\right \rfloor) \tag{3.1} $$

這就是杜教篩的核心式子。這是一個遞歸式,若是咱們可以快速求得$f \ast g$以及$g$這兩個函數的前綴和,那麼就能夠$O(n^{\frac{2}{3}})$求出$S(n)$。而難點就在於找出合適的$g$。

問題一

求出$S(n)=\sum\limits_{i=1}^{n}\mu(i)$

關於$\mu$的卷積,有$\mu \ast I = \epsilon$。$\epsilon$和$I$的前綴和都很是好求,所以咱們選擇$I$來做爲$g$。

根據$(3.1)$可得

$$1 \cdot S(n)=\sum\limits_{i=1}^{n}\epsilon(i) -\sum\limits_{d=2}^{n}1 \cdot S(\left \lfloor \frac{n}{d}\right \rfloor)$$

化簡得

$$S(n)=1-\sum\limits_{d=2}^{n}S(\left \lfloor \frac{n}{d}\right \rfloor) \tag{3.2}$$

問題二

求出$S(n)=\sum\limits_{i=1}^{n}\varphi(i)$

歐拉函數有性質$(2.4):$$\varphi \ast I = \text{id}$。於是仍是選擇$I$來做爲$g$。

同理,根據$(3.1)$有

$$1 \cdot S(n)=\sum\limits_{i=1}^{n}\text{id}(i) -\sum\limits_{d=2}^{n}1 \cdot S(\left \lfloor \frac{n}{d}\right \rfloor)$$

化簡得

$$S(n)=\dfrac{n(n+1)}{2}-\sum\limits_{d=2}^{n}S(\left \lfloor \frac{n}{d}\right \rfloor) \tag{3.3}$$

代碼實現

這個遞歸式咱們經過記憶化搜索來實現。經過map來儲存篩過的值。

爲了提升效率,能夠先用歐拉篩篩出$\sqrt{n}$之內的前綴和,防止杜教篩在小數據範圍內遞歸次數太多。後面部分經過整除分塊來實現。

int DuJiaoMu(int n){
    if(n <= B) return smu[n];
    if(mp_mu[n]) return mp_mu[n];
    int res = 1;
    for(int i = 2,j; i <= n; i = j+1){
        j = n/(n/i);
        res -= (j-i+1)*DuJiaoMu(n/i);
    }
    return mp_mu[n] = res;
}
相關文章
相關標籤/搜索