數論相關

Qerrj發表於2024-08-16

數論相關

積性函式

推論1:積性函式 \(f\) 一定滿足 \(f(1) = 1\)

推論2:透過質數點值可以唯一確定完全積性函式,因為質數可以組成所有的數;透過所有 \(p^k\) 處的點值可以唯一確定積性函式,因為積性函式有前置條件 \(n \bot m\) 所以要組合出有多個質因子 \(p\) 的數就需要 \(p^k\) 處的點值。

Dirchlet 卷積

\[(f \otimes g)(n) = \sum_{xy = n} f(x)f(y) \]

Dirchlet 卷積有類似於乘法的性質:

  1. 交換律

  2. 結合律

  3. 單位元,即 $ \epsilon(n) = [n = 1]$。

  4. 兩個積性函式的 Dirchlet 卷積依舊是積性函式。

  5. 積性函式的 Dirchlet 逆依舊是積性函式。

計算

Dirchlet卷積可以直接計算,複雜度就是調和級數 \(O(nlogn)\)

Dirchlet逆依舊可以直接計算:

有函式 \(f\),需要求出 \(g\) 滿足 \(f \otimes g = \epsilon\)

那麼顯然就有 \(f(1)g(1) = 1\),則 \(g(1) = \frac{1}{f(1)}\)。當 \(n \geq 2\) 時,則有

\[(f \otimes g)(n) = \sum_{d | n} f(d)g(n / d) = 0 \\ g(n)f(1) = -\sum_{d | n, d \neq 1}f(d)g(n / d) \\ \Rightarrow g(n) = -\frac{1}{f(1)}\sum_{d | n, d \neq 1}f(d)g(n / d) \]

常用數論函式

\(\epsilon(n) = [n = 1]\)

\(id_k(d) = d^k\)

\(\sigma_k(n) = \sum_{d|n} d^k\)

\(\mu(n)\)

\(\varphi(n)\)

性質;

\(\mu \otimes 1 = \epsilon\)

\(\varphi \otimes 1 = id\)

\(\mu \otimes id = \varphi\) (這個可以拿前兩個推)

\(1 \otimes 1 = d\)

\(1 \otimes id_k = \sigma_k\)

莫比烏斯反演

\[f(n) = \sum_{d|n} g(d) \Longleftrightarrow g(n) = \sum_{d|n} f(d)\mu(n / d) \]

證明很簡單:

\[f = g \otimes 1 \\ g \otimes 1 \otimes \mu = g = f \otimes \mu \]

聯絡子集反演:

\[f_S = \sum_{T \subseteq S}g(T) \Longleftrightarrow g_S = \sum_{T \subseteq S} (-1)^{|S| - |T|}f_T \]

我們知道 \(s\) 是一個集合,而 \(d\) 可以看作是所有質因子的多重集,所以二者很相似,我們可以這樣理解,如果 \(n = \prod p\),也就是所有質因子質數為1,那麼就和子集反演完全等價,就可以理解 \((-1)^{|S| - |T|} = \mu(n / d)\)

整除分塊

這個很牛,考慮一個問題,我們固定一個不變 \(n\),那麼所有的 \(\lfloor \frac{n}{x} \rfloor\) 有多少種取值?

答案是 \(O(\sqrt n)\) 種,證明:

\(x \leq \sqrt n\) 時,顯然有 \(O(\sqrt n)\) 種,因為 \(x\) 只有 \(\sqrt n\) 個。

\(x > \sqrt n\) 時,因為 \(\lfloor \frac{n}{x} \rfloor \leq \sqrt n\) ,所以也只有 \(O(\sqrt n)\) 種。

那麼 \(\lfloor \frac{n}{x} \rfloor\) 的取值就是若干個顏色段,只要我們可以 \(O(1)\) 的求出邊界是多少,那麼就可以 \(O(\sqrt n)\) 的算出 \(\sum \lfloor \frac{n}{x} \rfloor\)

現在我們知道一個顏色段的左端點 \(l\),考慮設右端點為 \(r\),那麼就有:

\[\lfloor \frac{n}{l} \rfloor \leq \frac{n}{r} \Longrightarrow r \leq \frac{n}{\lfloor \frac{n}{l} \rfloor} \]

所以 \(\large r = \frac{n}{\lfloor \frac{n}{l} \rfloor}\)

多維形式

也就是有多維,以兩維為例,我需要求 \(\sum \lfloor \frac{n}{i}\rfloor \lfloor \frac{m}{i}\rfloor\),分析一下發現顏色段還是 \(O(\sqrt n)\) 級別,如果維數過大,那麼就是 \(O(k \sqrt n)\) 。我們每次 \(r\)\(\large min(\frac{n}{\lfloor \frac{n}{l} \rfloor}, \frac{m}{\lfloor \frac{m}{l} \rfloor})\)即可。

篩法

線性篩

\(\mu\)\(\varphi\)

\[\varphi(n) = n \prod \frac{p - 1}{p} \]

\[\mu(n) = \begin{cases} 0 \quad, 含有平方質因子 \\ (-1)^{k} \quad, 不同質因子個數 \end{cases} \]

我們就考慮線性篩時的兩種情況:

  1. \(i \% p \neq 0\) 時,那麼對於 \(\varphi\) 就是用積性函式性質 \(\varphi(i * p) = \varphi(i) * \varphi(p) = \varphi(i) * (p - 1)\), 對於 \(\mu\) 就是多了一個不同質因子 \(\mu(i * p) = -\mu(i)\)

  2. \(i \% p = 0\)時,我們用上面 \(\varphi\) 的公式就發現 \(\varphi(i * p) = \varphi(i) * p\),對於 \(\mu(i * p)\) 就直接變成 \(0\)

篩一般的積性函式

由前面推論2我們知道,題面肯定會給在 \(p\) 或者 \(p_k\) 的點值,這個點值的計算我們姑且聲稱他的時間複雜度為 \(O(logn)\)。那我們怎麼用線性篩篩出所有的呢?

我們知道線性篩是用最小質因子來篩的,那麼設 \(n = p_0^{k_0} \prod p_i^{k_i}\),我們欽定 \(p_0\) 為最小質因子,\(m = \prod p_i^{k_i}\),那麼我們用 \(p_0\)\(n\) 的時候就可以 \(f(n) = f(m) * f(p_0^{k_0})\),我們就只需要知道最小質因子的次數,這線上性篩的過程中就可以做到,很簡單。

杜教篩

杜教篩是比較基礎的亞線性篩法。 可以在低於線性的複雜度篩出積性函式的字首和。

我們現在除了化式子拆掉 \(\sum\),能加速求和的就只有整除分塊了,所以我們需要構造出來跟除法有關,嘗試用 Dirchlet 卷積,若我們現在要求 \(f\),所以我們需要構造一個 \(g\),透過 \(g\) 來求出 \(f\),一個方法就是卷積起來在拆開,我們嘗試化一下式子。

\[\sum_{i = 1}^n (f \otimes g)(i) = \sum_{i = 1}^n \sum_{d | i} g(d)f(i / d) = \sum_{d = 1}^n g(d) \sum_{d | i} f(i / d) = \sum_{d = 1}^n g(d) \sum_{i = 1}^{n / d} f(i) \\ \Rightarrow \sum_{i = 1}^n f(i) = (\sum_{i = 1}^n (f \otimes g)(i)) - \sum_{d = 2}^n g(d) \sum_{i = 1}^{n / d} f(i) \]

觀察到 \(\sum_{i = 1}^{n / d}f(i)\) 只有 \(O(\sqrt n)\) 個取值,\(g\) 是我們所構造的,如果我們能構造出容易計算的 \(g\)\(f \otimes g\),那麼就可以快速算出答案。

方便描述,我們成全體 \({S_f(\lfloor n / x \rfloor)}\)\(f\) 的基本和組。

可以分析得出時間複雜度 \(O(n^{\frac{3}{4}})\),並且如果可以,可以 \(O(n)\) 篩出前 \(n^{\frac{2}{3}}\) 項,大於 \(n^{\frac{2}{3}}\) 的就遞迴計算。

上面的是已知 \(f \otimes g\) 的基本和組和 \(g\) 的基本和組,求 \(f\) 的基本和組。

如果我們已知 \(f\)\(g\) 的基本和組,我們一樣可以類似杜教篩的求 \(f \otimes g\) 的基本和組。

\[\sum_{i = 1}^n (f \otimes g)(i) = \sum_{i = 1}^n \sum_{d | i} g(d)f(i / d) = \sum_{d = 1}^n g(d) \sum_{d | i} f(i / d) = \sum_{d = 1}^n g(d) \sum_{i = 1}^{n / d} f(i) \]

直接拿這個算和上面本質相同。

我們還有另外一個方法。

狄利克雷雙曲線法

我們用一下簡單的容斥。

\[\sum_{i = 1}^n (f \otimes g)(i) = \sum_{xy \leq n} f(x)g(y) \]

注意到 \(xy \leq n\) 是一個雙曲線,我們可以這樣容斥,如圖。

這是一個雙曲線,我們把所有的 \(f(x)g(y)\) 看作點 \((x, y)\),那麼藍色部分就是 \(y \leq \sqrt n\) 的點集,紅色部分就是 \(x \leq \sqrt n\) 的點集,相交部分就是同時滿足兩個條件的。

所以我們可以算出藍色部分和紅色部分再減去相交的部分,用式子表述就是:

\[S_{f \otimes}(n) = \sum_{x \leq \sqrt n} f(x)S_g(n / x) + \sum_{y \leq \sqrt n} g(x)S_f(n / x) - S_f(\sqrt n) S_g(\sqrt n) \]

這個東西複雜度沒有變化,但是聽說常數比較小。感覺上也更妙一些。。。

Powerful Number 篩

這個東西要暴力一些,比杜教篩更現代。 而且更快。

相關文章