1. 程式人生 > 其它 >字元編碼的發展

字元編碼的發展

數論學習筆記... (待繼續填坑)

數論學習筆記


定義

一些概念

  • 數論函式(算術函式)

定義域為正整數,陪域為複數的函式。每個算術函式都可視為複數的序列。

最重要的算術函式是積性加性函式。算術函式的最重要操作為狄利克雷卷積

  • 積性函式

滿足

\[gcd(a, b)=1\quad f(ab)=f(a)f(b) \]

\(f\) 是積性函式。

同理有加性函式

  • 完全積性函式
\[\forall a,b\quad f(ab)=f(a)f(b) \]

同理有完全加性函式

  • 艾弗森約定(艾佛森括號)
\[[P]= \begin{cases} 1 &\text{If P is true;}\\ 0 &\text{Otherwise.} \end{cases} \]
  • **符號函式 **
\[\operatorname{sgn} x= \begin{cases} -1 &x<0\\ 0 &x=0\\ 1 &x>0 \end{cases} \]

一些數論函式

  • 尤拉函式

\(\varphi(n)\) 是小於等於 \(n\) 的正整數中與 \(n\) 互質的數的數目

\[\varphi(n)=\sum\limits_{d\le n}[\gcd(d,n)=1]\\ \varphi(n)=n\times\prod\limits_{P_i\mid n}\frac{P_i-1}{P_i}\qquad P_i\in\mathbb{P} \]
  • 恆等函式
\[I(n)=1 \]
  • 單位函式
\[id(n)=n \]
  • 冪函式
\[I_k(n)=n^k \]
  • 單位元函式
\[\varepsilon(n)=[n=1] \]
  • 莫比烏斯函式
\[\mu(n)= \begin{cases} 1 &n=1\\ 0 &n=k^2\times t\quad (k>1)\\ (-1)^c &n=\prod\limits_{i=1}^cP_i\quad (P_i\in\mathbb{P}) \end{cases} \]
  • 約數個數函式
\[d(n)=\sum\limits_{i=1}^n[i\mid n] \]
  • 約數和函式
\[\sigma(n)=\sum\limits_{i\mid n}i \]

狄利克雷卷積

定義

卷積(又稱疊積(convolution)、褶積旋積),是透過兩個函式 \(f\)\(g\) 生成第三個函式的一種數學運算元。狄利克雷卷積是其中的一種。

狄利克雷卷積是定義在數論函式集上的一種二元運算,相當於是在這個定義上的一種乘法,而普通函式加法就是該定義上的加法。

\[(f\ast g)(n)=\sum_{d\mid n}f(d)\cdot g(\frac nd) \]

運算

就和一般實數上的乘法與加法十分類似

  • 交換律\(f\ast g=g\ast f\)

  • 結合律\((f\ast g)\ast h=f\ast(g\ast h)\)

  • 分配率\(f\ast (g+h)=f\ast g + f\ast h\)

正如實數中有 \(\forall n,\ 1\times n=n\)\(\forall n\ne0,\ n\times n^{-1}=1\) 一樣,這裡也存在**單位元函式 \(\varepsilon\) **,使得

  • \(\forall f,\ f\ast\varepsilon=\varepsilon\ast f=f\)
  • \(\forall f(1)\ne0,\ f\ast f^{-1}=\varepsilon\)

定理

一些定理

  1. 兩個積性函式的狄利克雷卷積一定也是一個積性函式。

一些等式

\[\begin{align*} &I\ast I=d \qquad&(1)\\ &I\ast id=\sigma &(2)\\ &\varphi\ast I=id &(3)\\ &I\ast\mu=\varepsilon &(4) \end{align*} \]

證明 \((4)\)​ :

\[\because \varphi\ast I=id\\ id\ast\mu=\varphi\\ \therefore \varphi\ast I\ast\mu=\varphi=\varphi\ast\varepsilon\\ \therefore I\ast\mu=\varepsilon \]

\(I\)\(\mu\) 互為反函式, \(I=\mu^{-1},\ \mu=I^{-1}\)


\[\begin{align*} &d(ij)=\sum_{x\mid i}\sum_{y\mid j}[\gcd(x,y)=1]\qquad&(5)\\ &\sum_{d\mid n}\varphi(d)=n &(6)\\ &\mu\ast id=\varphi &(7)\\ \end{align*} \]

證明 \((7)\)​ :

\[\begin{align*} \because\mu\ast I&=\varepsilon\\ \therefore id\ast\mu\ast I&=id\ast\varepsilon=id\\ \because\varphi\ast I&=id\\ \therefore id\ast\mu&=\varphi \end{align*} \]

莫比烏斯反演

性質

莫比烏斯函式不僅是積性函式,還有如下性質:

\[\sum_{d\mid n}\mu(d)= \begin{cases} 1\quad n=1\\ 0\quad n\ne1 \end{cases} \]

結論

結論 1
\[F(n)=\sum_{d\mid n}f(d) \implies f=\mu\ast F \]

稱數論函式 \(F(n)\) 為數論函式 \(f(n)\) 的莫比烏斯變換,數論函式 \(f(n)\) 為數論函式 \(F(n)\) 的莫比烏斯逆變換(反演)。

證明:

\[\because F(n)=\sum_{d\mid n}f(d)\times1=\sum_{d\mid n}f(d)I(\frac nd)\\ \therefore F=f\ast I\\ \because I\ast\mu=\varepsilon\\ \therefore F\ast\mu=f\ast\varepsilon\\ \therefore f=\mu\ast\varepsilon \]
結論 2
\[[P=1]=\sum_{d\mid P}\mu(d) \]

證明:

\[\begin{align*} [P=1]&=\varepsilon(P)\\\\ &=(I\ast\mu)(P)\\\\ &=\sum_{d\mid P}\mu(d) \end{align*} \]

應用:

例 1

\[[\gcd(i,j)=1]=\sum_{d\mid \gcd(i,j)}\mu(d)=\sum_{d\mid i\and d\mid j}\mu(d) \]

模板程式碼

線性篩

許多積性函式對質數有特殊性質,使得我們可以簡單地計算函式值,

同時,又因為任意兩個質數互質,於是我們可以利用質數和數論函式的積性篩出更一般的數的函式值。

使用線性篩可以 \(O(n)\) 地篩出大部分積性函式的值。

尤拉函式

#include <vector>
#include <bitset>
int n, phi[N];
std::vector<int> prime;//篩出的質數
std::bitset<N> cmpst;//composite 合數
inline void Euler() {
    cmpst.reset();
    phi[1] = 1;//特殊值
    for (register int i=2, tmp; i<=n; ++i) {
        if (!cmpst[i]) {
            prime.push_back(i);
            phi[i] = i-1;//質數的phi值
        }
        for (register int p : prime) {
            tmp = i*p;
            if (tmp > n) break;
            cmpst[tmp] = 1;//標記合數
            if (i%p == 0) {//線性篩的核心操作:此時p是i的最小質因數
                phi[tmp] = phi[i] * p;
                break;
            } phi[tmp] = phi[i] * phi[p];//合數的phi值,利用phi的積性
        }
    }
}

莫比烏斯函式

#include <vector>
#include <bitset>
#define N 50030
int mu[N];
bitset<N> nap;//not a prime
vector<int> prime;
inline void seive(int n = N - 20) {
	mu[1] = 1; nap[1] = 1;
	for (rg int i=2; i<=n; ++i) {
		if (!nap[i]) {
			mu[i] = -1;
			prime.push_back(i);
		}
		for (rg int p : prime) {
			if (i * p > n) break;
			nap[i * p] = 1;
			if (i % p == 0) { mu[i * p] = 0; break; }
			mu[i * p] = -mu[i];
		}
	}
}

整除分塊(數論分塊)

對於多組詢問求形如下式的值

\[\sum_{i=1}^n S(\lfloor\frac ki\rfloor)f(i) \]

其中 \(S\)\(f\) 都是可以 \(O(1)\) 求值的函式

我們可以使用整除分塊將其從 \(O(n)\) 優化至 \(O(\sqrt n)\)

原理:當 \(i\) 在一些區間 \([l,r],\ l,r\in[1,n]\) 中時, \(\lfloor\frac ki\rfloor\) 為定值。

我們可以在預處理中將 \(f\) 字首和為 \(sum\_f\)

已知 \(l,k\) ,我們可以 \(O(1)\) 求出 \(r=\lfloor\frac k{\lfloor \frac ki\rfloor}\rfloor\)證明

特別注意:有時候 \(i>k\) 了就會出現除以 0 的情況。(易知當 \(k\ge n\) 時不會出現)

int ans = 0;
for (int l=1, r; l<=n; l=r+1) {
    r = (l > k) ? n : min( k / (k / l), n );
    ans += S(l) * ( num_f(r) - sum_f(l-1) );
}
return ans;

典型例題

GCD - Extreme (II)

UVA11426

\(1\le n\le4\times10^6+1\) ,資料組數: \(T\le100\) ,求:

\[\sum_{i=1}^n\sum_{j=i+1}^n\gcd(i,j) \]

解:

\[\begin{align*} \sum_{i=1}^n\sum_{j=i+1}^n\gcd(i,j)&= \sum_{j=1}^n\sum_{i=1}^{j-1}\gcd(i,j)\\ &=\sum_{d=1}^nd\sum_{j=1}^n\sum_{i=1}^{j-1}[\gcd(i,j)=d]\\ &=\sum_{d=1}^nd\sum_{j=1}^{\lfloor\frac nd\rfloor}\sum_{i=1}^{j-1}[\gcd(i,j)=1]\\ \end{align*} \]

注意到:

\[\because \varphi(j)=\sum_{i=1}^j[\gcd(i,j)=1]\\ \therefore \sum_{i=1}^{j-1}[\gcd(i,j)=1]= \begin{cases} 0&j=1\\ \varphi(j)\quad&j>1 \end{cases}\\ \]

於是我們定義 \(\varphi\) 的從 2 開始的字首和 \(\operatorname{\varphi_s}(x)=\sum\limits_{i=2}^x\varphi(i)\) ,它可以用線性篩篩出來後 \(O(1)\) 求出。

那麼繼續:

\[\begin{align*} \sum_{i=1}^n\sum_{j=i+1}^n\gcd(i,j) &=\sum_{d=1}^nd\sum_{j=1}^{\lfloor\frac nd\rfloor}\sum_{i=1}^{j-1}[\gcd(i,j)=1]\\ &=\sum_{d=1}^nd\times\operatorname{\varphi_s}(\lfloor\frac nd\rfloor) \end{align*} \]

利用整除分塊,可以做到 \(O(n+T\sqrt n)\)


[NOI2010] 能量採集

P1447

本文來自部落格園,作者:Gyan083,轉載請註明原文連結:https://www.cnblogs.com/gyan083/p/15585300.html