數論

卓育安

講師介紹

  • 227

  • 數讀負責人

  • handle: prairie2022

我讀書少,又是鄉下來的,沒寫過多少程式,

所以我只能默默的看著別人上分,時不時標個電,

有時間也當個資讀講師,這樣好像可以假裝自己是資訊組。

大綱

仙貝知識

記號

a\mid b\iff a整除b\\ a\perp b\iff a與b互質\\ a\equiv b\pmod{m}\iff m\mid a-b\\ \gcd (a, b) := a, b的最大公因數\\ \operatorname{lcm} (a, b) := a, b的最小公倍數\\

以下\(p\)代表質數,\(m\)代表正整數

其他字母默認為整數

歐幾里得

輾轉相除法

\texttt{gcd (a, b)==gcd(a\%b, b)}
int GCD(int a, int b){
    if(!b){
        return a;
    }
    return GCD(b, a%b);
}

因為每輾轉兩次\(a\)和\(b\)都至少減半,故複雜度為\(\mathcal{O}\left(\log \min(a, b)\right)\)

內建函式

//for c++14
#include <algorithm>
using namespace std;

int a=32725, b=48763;
int g = __gcd(a, b);
//g = 11

快速冪

a^n=\begin{cases} \left(a^\frac{n}{2}\right)^2 & \text{if }2\mid n\\ a\times a^{n-1} & \text{if }2\nmid n \end{cases}
#define int long long
using namespace std;

const int m = 1e9+7;
int fastpow(int a, int n){
    if(!n){
        return 1;
    }
    if(n&1){
        return (a*fastpow(a, n^1))%m;
    }
    int tmp = fastpow(a, n>>1);
    return (tmp*tmp)%m;
}

\(\mathcal{O}(\log n)\)

快速冪也適用於計算\\ \overbrace{a*a*\cdots *a}^{n個a}

其實矩陣乘法也是一種函數合成

其中*為具有結合律的二元運算\\ 如函數合成、矩陣乘法等

中國剩餘定理

x\equiv r_1\pmod{m_1}\\ x\equiv r_2\pmod{m_2}\\ \cdots\\ x\equiv r_n\pmod{m_n}\\

若\(m_1, m_2, \cdots, m_n\)兩兩互質

設\(\displaystyle\prod_{i=1}^n m_i=M\)

則以上同餘方程在\(\displaystyle\operatorname{mod} M\)下有唯一解

Proof

\displaystyle 考慮函數f:\mathbb{Z}/M\mathbb{Z}\to\prod_i\mathbb{Z}/m_i\mathbb{Z}\\ 使得f(x)=\langle x\%m_i\rangle_i
\displaystyle 若f(x_1)=f(x_2)\\ 則f(x_1-x_2)=\langle 0\rangle_i\\ 即M=\operatorname{lcm} (m_1, m_2, \cdots, m_n)\mid x_1-x_2

笛卡爾積

數列

\displaystyle 若f(x_1)=f(x_2)\\ 則f(x_1-x_2)=\langle 0\rangle_i\\ 即M=\operatorname{lcm} (m_1, m_2, \cdots, m_n)\mid x_1-x_2
\displaystyle 故我們有f單射\\ 然而\left|\prod_i\mathbb{Z}/m_i\mathbb{Z}\right|=M=\left|\mathbb{Z}/M\mathbb{Z}\right|\\ 所以f雙射\quad QED.

數論函數

\displaystyle n=\prod_i p_i^{\alpha_i}\\ \tau (n)=\prod_i \alpha_i+1\\ \sigma (n)=\prod_i\sum_{j=0}^{\alpha_i} p_i^j=\prod_i\frac{p_i^{\alpha_i+1}-1}{p_i-1}

質因數分解

因數個數

因數總和

\varphi (n):=\left|\{a\leq n\mid a\perp n\}\right|
\overbrace{\hspace{6em}}^{既約剩餘系}

歐拉函數

\displaystyle =\prod_i p_i^{\alpha_i-1}(p-1)

性質

\varphi(p)=p-1\\ a\perp b\implies \varphi(ab)=\varphi(a)\varphi(b)\\ a\mid b\implies \varphi(ab)=a\varphi(b)

質數

質數計數函數

\(\pi (n)\)為不超過\(n\)的質數個數

質數定理

\pi (n)\approx \dfrac{n}{\ln n}

而對於\(n>1\)都有

\pi (n)<\dfrac{1.25506n}{\ln n}

質數判定

因為一個合數必有不超過\(\lfloor\sqrt{n}\rfloor\)的質因數,故試除\(\left[\ 2,\sqrt{n}\ \right]\)中的所有整數即可判斷

\(\mathcal{O}(\sqrt{n})\)

為隨機化算法,但在特定範圍內可以只驗很少個base而確定一個數是否為質數

\(\mathcal{O}(k\log^3 n)\),其中\(k\)為base的個數

質數篩

如何得到所有不超過\(n\)的質數?

篩法

開一個陣列\texttt{visited}\\ 其中\texttt{visited[i]}存i是(\texttt{1})否(\texttt{0})已被判定為合數\\ (一開始\texttt{visited[i]=0},\,\forall\ 2\leq i\leq n)
然後開一個空陣列\texttt{prime},從i=2開始跑\\ 若\texttt{visited[i]==0}則將i存入\texttt{prime}\\ 接著篩掉i的一些倍數\\ (即選特定的一些k並將\texttt{visited[i*k]}設為\texttt{1})

那每次要篩掉哪些倍數呢?

Solution 1

篩掉全部的倍數

#include <vector>
#include <bitset>
using namespace std;

bitset<10000000> visited;
vector<int> prime;

void sieve1(int n){
    //初始化
    visited.reset();
    prime.clear();
    //篩法
    for(int i=2; i<=n; i++){
        if(!visited[i]){
            prime.push_back(i);
        }
        for(int j=i<<1; j<=n; j+=i){
            visited[j] = 1;
        }
    }
}
\displaystyle 因為n以下i的倍數共有\left\lfloor\frac{n}{i}\right\rfloor 個\\ 故複雜度為\\ \sum_{i=2}^n\frac{n}{i}=\mathcal{O}(n\log n)
\frac{1}{1}+\frac{1}{2}+\frac{1}{3}+\cdots +\frac{1}{n} = \mathcal{O}(\log n)

Solution 2

埃氏篩

只篩掉質數的倍數

#include <vector>
#include <bitset>
using namespace std;

bitset<10000000> visited;
vector<int> prime;

void sieve2(int n){
    //初始化
    visited.reset();
    prime.clear();
    //篩法
    for(int i=2; i<=n; i++){
        if(!visited[i]){
            prime.push_back(i);
            for(int j=i<<1; j<=n; j+=i){
                visited[j] = 1;
            }
        }        
    }
}
\displaystyle 複雜度為\sum_{p\leq n}\frac{n}{p} = \mathcal{O}(n\log\log n)
\frac{1}{2}+\frac{1}{3}+\frac{1}{5}+\cdots +\frac{1}{p} = \mathcal{O}(\log\log p)

Solution 3

線性篩

保證每個數都只被篩到一次

#include <vector>
#include <bitset>
using namespace std;

bitset<10000000> visited;
vector<int> prime;

void sieve3(int n){
    //初始化
    visited.reset();
    prime.clear();
    //篩法
    for(int i=2; i<=n; i++){
        if(!visited[i]){
            prime.push_back(i);
        }
        for(const auto &k: prime){
            if(i*k>n) break;
            visited[i*k] = 1;
            if(i%k==0) break;
        }
    }
}

保證\(k\)是\(ik\)的最小質因數

只篩掉每個數的質數倍

    //篩法
    for(int i=2; i<=n; i++){
        if(!visited[i]){
            prime.push_back(i);
        }
        for(const auto &k: prime){
            if(i*k>n) break;
            visited[i*k] = 1;
            if(i%k==0) break;
        }
    }

保證\(k\)是\(ik\)的最小質因數

只篩掉每個數的質數倍

因此,所有合數都只會被自己最小的質因數篩掉

故複雜度為\(\mathcal{O}(n)\)

線性篩的應用

求\(2\sim n\)的\(\varphi\)值

\varphi(ip)=\begin{cases} p\varphi(i) & \text{if }p\mid i\\ (p-1)\varphi(i) & \text{if }p\nmid i \end{cases}

因此可以遞迴出\(\varphi(\text{合數})\)的值

求\(1\sim n\)的質因數分解

做線性篩時記錄每個整數i的最小質因數\texttt{p[i]}\\ 以及\texttt{q[i]=i/p[i]}\\ 則i的質因數分解(由小到大)即為\\ \texttt{p[i]*p[q[i]]*p[q[q[i]]]*...}

模運算

\begin{array}{rlc} a+b\equiv & \texttt{a\%m+b\%m} & \pmod{m}\\ a-b\equiv & \texttt{a\%m-b\%m} & \pmod{m}\\ a\times b\equiv & \texttt{(a\%m)*(b\%m)} & \pmod{m}\\ a\div b\equiv & \texttt{(a\%m)*}? & \pmod{m}\\ a^b\equiv & (\texttt{a\%m})^? & \pmod{m}\\ \end{array}

Euler's theorem

a\perp m\implies a^{\varphi(m)}\equiv 1\pmod{m}

Fermat's little theorem

a^p\equiv a\pmod{p}

Proof

定義集合A=\{i\leq m\mid i\perp m\}\\ 考慮A'=\{\texttt{i*a\%m}\mid i\in A\}\\
若有i,j\in A滿足\texttt{i*a\%m}=\texttt{j*a\%m}\\ 則m\mid a(i-j),即i=j

Proof

故|A'|=|A|且A'\subseteq A\\ 所以A'=A

\(\displaystyle\prod_{i\in A}i=\prod_{x\in A'}x\equiv\)

\(\displaystyle\prod_{i\in A}ia=a^{\varphi(n)}\)

\(\displaystyle\prod_{i\in A}i\pmod{m}\)

Proof

\(\displaystyle 1\equiv\)

\(\displaystyle a^{\varphi(m)}\)

\(\displaystyle\pmod{m}\)

故|A'|=|A|且A'\subseteq A\\ 所以A'=A

可以幹嘛

簡化冪次的計算

a\perp m\implies a^b\equiv a^{b\operatorname{mod}\varphi(m)}\pmod{m}

模逆元

若ab\equiv 1\pmod{m}\\ 則b稱為a的模逆元,記為a^{-1}
a在\operatorname{mod} m下至多只有一個模逆元\\ 且x\div a\equiv a^{-1}x\pmod{m}
由歐拉定理可知\\ 若a\perp m則a在\operatorname{mod}m下有模逆元\\ a^{-1}\equiv a^{\varphi(m)-1}\pmod{m}
而若a\not\perp m,顯然\\ \nexists b\quad ab\equiv 1\pmod{m}\\ 故a沒有模逆元

\(\varphi(m)\)已知時,計算模逆元為\(\mathcal{O}(\log\varphi(m))\)

計算模逆元

\(a\div b\) 但 \(b\not\perp m\)

\displaystyle 設m的質因數集為A\\ 若要計算(a\div b)\%m,可以先將a, b分解為\\ a=a'\prod_{p\in A}p^{\alpha_p}\\ b=b'\prod_{p\in A}p^{\beta_p}\\ 其中a', b'\perp m\\

\(a\div b\) 但 \(b\not\perp m\)

記錄a'(b')^{-1}\operatorname{mod} m與各\alpha_p-\beta_p的值\\ 則可計算一串數字的乘除模m的值
\displaystyle a\div b\equiv a'(b')^{-1}\prod_{p\in A}p^{\alpha_p-\beta_p}\pmod{m}

另解

輾轉相除法

Bézout's identity

關於x, y的不定方程\\ ax+my=\gcd(a, m)\\ 有整數解

我們可以用輾轉相除法構造出一組解\(x, y\)

以下限制x\in\mathbb{Z}^+, y\in\mathbb{Z}\\ 設a>b, g=\gcd(a, b)\\ ax+by=g的最小解為(x,y)
設\texttt{c\%a==b},則\\ \texttt{a}x+(\texttt{c}-\texttt{c/a}\times \texttt{a})y=g\\ \texttt{c}y+\texttt{a}(x-\texttt{c/a}\times y)=g\\
設\texttt{c==q*a+b},則\\ \texttt{a}x+(\texttt{c}-\texttt{c/a}\times \texttt{a})y=g\\ \texttt{c}y+\texttt{a}(x-\texttt{c/a}\times y)=g\\
\texttt{+a/g}
\texttt{-c/g}

可遞迴出\(ax+by=g\)的最小解

int x, y, g;
void euclid(int a, int b){
    if(!b){
        x = 1;
        y = 0;
        g = a;
        return;
    }
    euclid(b, a%b);
    swap(x, y);
    y -= a/b*x+a/g;
    x += b/g;
}
若a\perp m\\ 則可由以上方法求出ax+my=1的最小解\\ 其中x即為a在\operatorname{mod} m下的模逆元

\(\mathcal{O}(\log a)\)

組合計數

二項式係數

\displaystyle (x+1)^n=\sum_{m=0}^\infty\binom{n}{m}x^m
\displaystyle \binom{n}{m}=\begin{cases} \dfrac{n!}{m!(n-m)!} & \text{if }m\leq n\\ 0 & \text{if }m>n \end{cases}
\begin{array}{c} 1\\ 1\quad 1\\ 1\quad 2\quad 1\\ 1\quad 3\quad 3\quad 1\\ 1\quad 4\quad 6\quad 4\quad 1\\ 1\quad 5\quad 10\quad 10\quad 5\quad 1\\ \end{array}

帕斯卡三角形

\(\binom{n}{m}=\binom{n-1}{m-1}+\binom{n-1}{m}\)

\begin{array}{c} \binom{0}{0}\\ \binom{1}{0}\quad \binom{1}{1}\\ \binom{2}{0}\quad \binom{2}{1}\quad \binom{2}{2}\\ \binom{3}{0}\quad \binom{3}{1}\quad \binom{3}{2}\quad \binom{3}{3}\\ \binom{4}{0}\quad \binom{4}{1}\quad \binom{4}{2}\quad \binom{4}{3}\quad \binom{4}{4}\\ \binom{5}{0}\quad \binom{5}{1}\quad \binom{5}{2}\quad \binom{5}{3}\quad \binom{5}{4}\quad \binom{5}{5}\\ \end{array}
  1. \(\mathcal{O}(m)\)計算\(\displaystyle\binom{n}{m}\)
  2. \(\mathcal{O}(N^2)\)計算所有\(n\leq N\)的二項式係數

如果\(n\)太大時,要計算\(\displaystyle\binom{n}{m}\operatorname{mod} M\)

因為需要取模逆元,故為\(\mathcal{O}(m+\log M)\)

到此,我們可以

數學

\displaystyle 設在p進位下\\ n=\overline{n_kn_{k-1}\dots n_1n_0}\\ m=\overline{m_km_{k-1}\dots n_1n_0}\\ 則\binom {n}{m}\equiv \prod_{i=0}^k \binom {n_i}{m_i}\pmod {p}

其他組合計數

排容原理

\displaystyle 設F=\{A_1, A_2, \cdots, A_n\}\\ 其中A_i皆為有限集\\ 則\left|\bigcup F\right|=\sum_{\varnothing\neq S\subseteq F}(-1)^{|S|-1}\left|\bigcap S\right|
\displaystyle |A\cup B\cup C|=|A|+|B|+|C|\\ -|A\cap B|-|A\cap C|-|B\cap C|+|A\cap B\cap C|

題單

48% of Mathematics

TIOJ經典題(?

CF隨便找

Special Round

參考資料

Math

By prairie2022