數論基礎


開個坑先把基礎放這兒,過兩天來更新一些奇妙的知識

1 同余

\(a,b\) 為兩個整數,且它們的差 \(a-b\) 能被某個自然數 \(m\) 所整除,則稱 \(a\) 就模 \(m\) 來說同余於 \(b\),或者說 \(a\)\(b\) 關於模 \(m\) 同余,記為:\(a \equiv b\pmod m\)。它意味着:\(a-b=m\times k\)\(k\) 為某一個整數)。

例如\(32\equiv 2\pmod 5\),此時 \(k\)\(6\)

對於整數 \(a,b,c\) 和自然數 \(m,n\),對模 \(m\) 同余具有以下一些性質:

  1. 自反性:\(a\equiv a\pmod m\)

  2. 對稱性:若 \(a\equiv b\pmod m\),則 \(b\equiv a\pmod m)\)

  3. 傳遞性:若 \(a\equiv b\pmod m,b\equiv c\pmod m\),則 \(a\equiv c\pmod m\)

  4. 同加性:若 \(a\equiv b\pmod m\),則 \(a+c \equiv b+c\pmod m\)

  5. 同乘性:若 \(a\equiv b\pmod m\),則 \(a*c\equiv b*c\pmod m\)

    \(a\equiv b\pmod m, c\equiv d\pmod m\),則 \(a*c\equiv b*d\pmod m\)

  6. 不滿足同除性,但是若 \(gcd(c,m)=1\),則當 \(a\times c\equiv b\times c\pmod m\)時,有 \(a\equiv b\pmod m\)

  7. 同冪性:若 \(a\equiv b\pmod m\),則 \(a^n\equiv b^n\pmod m\)

  8. 推論1:\(a*b(mod\ k)=(a\ mod\ k)*(b\ mod\ k)mod\ k\)

  9. 推論2:若 \(p,q\) 互質,\(a\ mod\ p=x,a\ mod\ q=x\),則 \(a\ mod\ (p*q)=x\)


    證明:

    因為 \(p,q\) 互質,\(a\ mod\ p=x,a\ mod\ q=x\)

    所以一定存在整數 \(s,t\),使得 \(a=s*p+x,b=t*q+x\)

    所以 \(s*p=t*q\)

    又因為 \(t\) 為整數,\(p,q\) 互質,將 \(q\) 移到左邊來看

    \(q|s\),即存在整數 \(r\),使得 \(s=r*q\)

    所以 \(a=r*q*p+x\),即 \(a\ mod\ (p*q)=x\)


1.1 例題

這個就沒什么例題了,記住就行了

2 素數

2.1 素數的定義

一個大於 \(1\) 的自然數,除了 \(1\) 和它自身外,不能被其他自然數整除的數叫做素數或質數

注意:

  • 1 既不是素數也不是合數;

  • 2 是最小的素數,也是唯一的偶素數;

  • 素數的個數是無限的(可以用反證法證明):


    • 證明:

      假設素數是有限的,假設素數只有有限的 \(n\) 個,最大的一個素數是 \(p\)。設 \(q\) 為所有素數之積加上 \(1\),即 \(q=(2×3×5×…×p)+1\) 不是素數。那么,\(q\) 可以被 \(2、3、…、p\) 中的若干個數整除(因為合數一定可以分解成若干質因子的乘積)。而 \(q\) 被這 \(2、3、…、p\) 中任意一個整除都會余1,與之矛盾。所以,素數是無限的。


2.2 有關素數的一個定理

2.2.1 算術基本定理(唯一分解定理)

任何一個大於 \(1\) 的正整數都能被唯一分解為有限個素數的乘積,可寫作:

\(N=p_1^{c_1}p_2^{c_2}p_3^{c_3}\cdots p_m^{c_m}\)

其中 \(c_i\) 都是正整數\(p_i\) 都是素數且滿足 \(p_1<p_2<p_3 \cdots <p_m\)

例題:《Hankson 的趣味題》

2.3 單個素數的判定

單個素數判定復雜度是 \(O (\sqrt n)\)

bool isPrime(int x) {
    if (x < 2) return false;
    for (int i = int(sqrt(x+0.5)); i >= 2; --i) {
        if (x % i == 0) return false;
    }
    return true;
}

2.4 篩素數

對於求出某個范圍內的所有素數,我們可以從 \(2\) 開始,將 \(2\) 的所有倍數都去掉,剩下的第一個未被去掉的數 \(3\) 為第二個素數。再講 \(3\) 的所有的倍數去掉,以此來推……我們可以篩選出 \(n\) 以內的所有的素數。

但是這種方法會造成重復篩除合數,影響效率。比如 \(n=30\),在 \(i=2\) 的時候,\(k=2 \times 15\) 篩了一次;在 \(i=3\) 的時候,\(k=3 \times 10\),篩了一次;在 \(i=5\) 的時候,\(k=5 \times 6\) 又篩了一次。因此也就有了“快速線性篩法”。

2.4.1 線性篩

每個合數只被它最小的質因子篩掉。時間復雜度為 \(O(n)\)


int prime[MAXN]; // 保存素數
bool is_not_prime[MAXN] = {1, 1}; // 0和1都不是素數
// 篩選 n 以內的所有素數
void xxs(int n) {
    for (int i = 2; i <= n; ++i) {
        if (!is_not_prime[i]) { // 如果i是素數
            prime[++prime[0]] = i;
        }
        for (int j = 1; j <= prime[0] && i * prime[j] <= n; ++j) {
            is_not_prime[i*prime[j]] = 1;
            // 如果i中包含了該質因子,則停止
            if (i % prime[j] == 0) break;
        }
    }
}

上面代碼中的 if (i % prime[j] == 0) break;用來控制每個合數只被篩掉一次。

直觀的舉個例子:\(i=2 \times 3 \times 5\),此時能篩除 \(2 \times i\),不能篩除 \(3 \times i\)。如果此時篩除 \(3 \times i\) 的話,當 \(i' = 3 \times 3 \times 5\) 時,篩除 \(2 \times i'\) 就和前面重復篩了。也就是說,如果 \(i \mod prime[j] == 0\),說明 \(i\) 自身有一個最小的質因子 \(prime[j]\),根據線性篩的原理,到此終止即可。

2.5 歐拉函數

2.5.1 定義

  • 對於正整數 \(n\),其歐拉函數是指小於等於 \(n\) 的數中與 \(n\) 互質的數的個數,用字母 \(\varphi\) 表示。
  • 通項公式為:$$\varphi(n)=n \times \prod_{i=1}^k (1-\frac{1}{p_i})$$, 其中 \(p_1, p_2, \dots ,p_k\)\(n\) 的所有質因數,\(n\) 為正整數。
  • 例如:\(\varphi(12)=4\),即 \(12\) 以內與 \(12\) 互質的數的個數為 \(4\),有 \(1, 5, 7, 11\)
  • 利用通項公式計算:$$\varphi(12)=12 \times (1-\frac{1}{2}) \times (1-\frac{1}{3})=4$$ (因為 \(12\) 的不同的質因數只有 \(2, 3\))。

2.5.2 性質

  1. \(\varphi (1) = 1\)
  2. \(p\) 是一個素數,則 \(\varphi(p)=p-1\)
  3. \(p\) 是一個素數,則 \(\varphi(p^k)=(p-1) \times p^{k-1}\)
  4. 歐拉函數為積性函數:對於任意兩個正整數 \(a, b\),且 \(gcd(a,b)=1\),則 \(\varphi(a \times b)=\varphi(a) \times \varphi(b)\)。特別的,對於奇數 \(n\)\(\varphi(2n)=\varphi(n)\)

證明:

  1. 顯然成立。
  2. 也很顯然。
  3. 對於 \(n=p^k\),比 \(n\) 小的正整數有 \(p^k-1\)個。其中,所有能被 \(p\) 整除的那些數可以表示成 \(p \times t\) 的形式(\(t=1,2,3, \dots, p^{k-1}-1\)),共有 \(p^{k-1}-1\) 個數能被 \(p\) 整除,也就是說這些數不與 \(p^k\) 互質。所以 \(\varphi(p^k)=p^k-1-(p^{k-1}-1)=p^k-p^{k-1}=(p-1) \times p^{k-1}\)
  4. 證明略,需要用到中國剩余定理……

還有一些變形:

  1. \(p\) 為素數,若 \(n \% p = 0\),則 \(\varphi(n \times p)=p \times \varphi(n)\)。(這條一些資料都要求 \(p\) 為素數,但是 \(p\) 不是素數的時候也成立,大家可以自己推一下)。

  2. \(p\) 為素數,若 \(n\%p \ne 0\),則 \(\varphi(n \times p)=(p-1) \times \varphi(n)\)

  3. \(n\) 為奇數時,\(\varphi(2n)=\varphi(n)\)

  4. \(n\) 互質的數都是成對出現的,且每對的和為 \(n\),所以大於 \(2\) 的數的 \(\varphi(n)\) 都為偶數。


    證明:(反證法)

    假設 \(gcd(n, x)=1,x < n, n > 2\),但是 \(gcd(n, n-x)=k(k>1)\),則可以改寫成 \(n=a \times k, n-x=b \times k\),那么移項可得 \(x=n-b \times k=a \times k-b \times k = (a-b) \times k\),則 \(gcd(n, x)=gcd(ak,(a-b)k)\),它們至少有一個公約數 \(k\),與假設矛盾。


2.5.3 求歐拉函數

  1. 如果只要求一個數的歐拉函數值,那么直接根據定義,在質因數分解的同時求就好了

    int euler_phi(int n) {
      // 如果存在大於根號n的質因子,至多有一個
          int m = int(sqrt(n + 0.5));
          int ans = n;
      // 跟判定素數很像
          for (int i = 2; i <= m; i++) {
        // 如果i能整除n,則i是n的因子,也會質因子(看下面的while)
                if (n % i == 0) {
                ans = ans / i * (i - 1); // 根據定義計算
          // 根據唯一分解定理,去掉i的冪
                while (n % i == 0) n /= i;
                }
          }
      // 如果最后n>1,則為一個大於根號n的一個質因子
           if (n > 1) ans = ans / n * (n - 1);
          return ans;
    }
    
  2. 如果求 \(1\)\(n\) 的所有歐拉函數值,利用線性篩即可求出

    // 整體框架為線性篩素數的代碼,中間根據歐拉函數的性質加了幾條語句而已
    int n, phi[N], prime[N], tot;
    bool not_prime[N]; // true表示不是素數,false表示是素數
    void getPhi() {
        int i, j, k;
        phi[1] = 1;
        for (i = 2; i <= n; ++i) {
            if (!not_prime[i]) {
                prime[++tot] = i;
                phi[i] = i-1; // 根據性質2
            }
            for (j = 1; j <= tot; ++j) {
                k = i * prime[j];
                if (k > n) break;
                not_prime[k] = true;
                if (i % prime[j] == 0) { // 變形1
                    phi[k] = prime[j] * phi[i];
                    break;
                } else { // 變形2
                    phi[k] = (prime[j]-1) * phi[i];
                }
            }
        }
    }
    

    例題:POJ 2478

2.6 費馬小定理

2.6.1 先科普兩個概念:

  1. 剩余類:

    一個整數被正整數 \(n\) 除后,余數有 \(n\) 種情形:\(0,1,2,3,…,n-1\),它們彼此對模 \(n\) 不同余。這表明,每個整數恰與這 \(n\) 個整數中某一個對模 \(n\) 同余。這樣一來,按模 \(n\) 是否同余對整數集進行分類,可以將整數集分成 \(n\) 個兩兩不相交的子集。我們把(所有)對模 \(n\) 同余的整數構成的一個集合叫做模 \(n\) 的一個剩余類

  2. 完全剩余系:

    任取整數 \(n\),那么 \(0,1,…,n-1\)\(n\) 個數稱為模 \(n\) 的一個完全剩余系。每個數稱為相應剩余類的代表元。最常用的完全剩余系是 \(\{0,1,…,n-1\}\)

2.6.2 費馬小定理(要求模數為素數)

\(p\) 為素數,整數 \(a\) 不是 \(p\) 的倍數(即\(\gcd(a,p)=1\),等價嗎?),則 \(a^{p-1}\equiv 1(mod\ p)\)

  • 先來證明一個性質:

    設一個素數為 \(p\),我們取一個不為 \(p\) 的倍數的數 \(a\)

    構造一個序列:\(A={1,2,3,\dots ,p-1}\),這個序列有這樣一個性質:

    \[\prod_{i=1}^n A_i\equiv\prod_{i=1}^n(A_i\times a)\ (mod\ p) \]


    • 證明:

      因為\(gcd(A_i,p)=1,gcd(A_i\times a,p)=1\)(有疑問嗎?)

      又因為每一個 \(A_i\times a\ (mod\ p)\) 都是獨一無二的(反證法證明假設存在同余的,如果我還記得就講一下),且 \(A_i\times a\ (mod\ p)<p\)

      所以每一個 \(A_i\times a\) 都對應一個 \(A_i\)

      \(f=(p-1)!\),則 \(f\equiv a\times A_i\times a\times A_2 \times a\times A_3\times\dots\times A_{p-1}\ (mod\ p)\)

      所以 \(a^{p-1}\times f\equiv f\ (mod\ p)\)

      證畢。


  • 由上面的性質證明中的 \(a^{p-1}\times f\equiv f\ (mod\ p)\),又因為 \(gcd(f,p)=1\),所以 \(a^{p-1}\equiv 1\ (mod\ p)\)。從而證明了費馬小定理。

  • 另一個形式:若 \(p\) 為素數,對於任意整數 \(a\),有 \(a^p\equiv a\pmod p\)


    • 證明:

      因為 \(p\) 為質數,所以對於任意整數 \(a\) 只有兩種情況:

      \(a\)\(p\) 的倍數時,顯然成立;

      \(a\) 不為 \(p\) 的倍數時,則必有 \(\gcd(a,p)=1\),那么費馬小定理直接拿來用,有 \(a^{p-1}\equiv 1\ (mod\ p)\)

      由同余的同乘性,顯然成立。


2.6.3 歐拉定理

費馬小定理是用來闡述在素數模下,指數的同余性質。當模是合數的時,就要應用范圍更廣的歐拉定理了。

\(gcd(a,m)=1\),則 \(a^{\varphi(m)}\equiv 1\ (mod\ m)\)

特別的,當 \(m\) 為質數時,與費馬小定理一致。

證明略吧……

2.6.3 擴展歐拉定理

\[a^b\equiv \begin{cases} a^{b\bmod\varphi(p)}, & \gcd(a,p)=1 \\ a^b, & \gcd(a,p)\neq 1,b<\varphi(p)\pmod p \\ a^{b\bmod\varphi(p)+\varphi(p)}, & \gcd(a,p)\neq 1,b\geq\varphi(p) \end{cases} \]

具體證明可參考 https://oi-wiki.org/math/fermat/

2.6.4 例題

  1. [SPOJ #4141 "Euler Totient Function"Difficulty: CakeWalk]
  2. [UVA #10179 "Irreducible Basic Fractions"Difficulty: Easy]
  3. [UVA #10299 "Relatives"Difficulty: Easy]
  4. [UVA #11327 "Enumerating Rational Numbers"Difficulty: Medium]
  5. [TIMUS #1673 "Admission to Exam"Difficulty: High]

3 最大公約數

一組數的公約數,是指同時是這組數中每一個數的約數的數。而最大公約數,則是指所有公約數里面最大的一個,常縮寫為 gcd(Greatest Common Divisor)。

求 gcd 常用的方法為輾轉相除法(歐幾里得算法),還有一種為更相減損法

3.1 輾轉相除法

3.1.1 輾轉相除法用來求兩個數的最大公約數

其原理為:\(\gcd(x, y)=\gcd(y, x \% y)\)

// 遞歸形式
int gcd(int x, int y) {
    return (y == 0 ? x : gcd(y, x%y));
}

// 非遞歸形式
int gcd(int x, int y){
      int r = x % y; // 取余數
      while (r) { // 余數不為0,交換變量,繼續做除法
            x = y;
            y = r;
            r = x % y;
      }
      return y; // 余數為0時,除數為gcd
}

證明:(證明 \(x,\,y\) 的公約數都是 \(y,\,x\%y\) 的公約數,反過來再證明 \(y,\,x\%y\) 的公約數都是 \(x,\,y\) 的公約數)


3.1.2 多個數的最大公約數

怎么求多個數的最大公約數呢?

顯然答案一定是每個數的約數,那么也一定是每相鄰兩個數的約數。我們每次取出兩個數求出答案后再放回去,直到取完所有的數即可。

3.1.3 最小公倍數

對於兩個整數 \(a\)\(b\),我們根據唯一分解定f理將其表示出來。

可以看出,最小公倍數 \(lcm(a,b)\) 與最大公約數 \(gcd(a,b)\) 的乘積正好為 \(a \times b\),即:\(gcd(a,b) \times lcm(a,b)=a \times b\)

所以我們可以先求兩者的最大公約數,就能方便得出最小公倍數了。

3.1.3 多個數的最小公倍數

可以發現,當我們求出兩個數的 \(gcd\) 時,求最小公倍數是 \(O(1)\) 的復雜度。

那么對於多個數,我們其實沒有必要求一個共同的最大公約數再去處理。類似於求多個數的最大公約數,我們可以先算出兩個數的最小公倍數,放入原序列,繼續與第三個數求最小公倍數,以此類推即可。

3.2 擴展歐幾里得

擴展歐幾里德定理(Extended Euclidean algorithm, EXGCD),常用於求 \(ax+by=\gcd(a,b)\) 的一組整數解(這里 \(x,y\) 為未知數)。

證明略講一下打打醬油……


\(ax_1+by_1=gcd(a,b)\)

\(bx_2+(a\%b)y_2=gcd(b,a\%b)\)

\(\because gcd(a,b)=gcd(b,a \% b)\)

\(\therefore ax_1+by_1=bx_2+(a\%b)y_2\)

\(\because a\%b=a-\lfloor \frac{a}{b} \rfloor \times b\)

\(\therefore ax_1+by_1=bx_2+(a-\lfloor \frac{a}{b} \rfloor \times b)y_2=ay_2+b(x_2-\lfloor\frac{a}{b}\rfloor y_2)\)

因為系數相同,所以我們可以讓 \(x_1=y_2, y_1=x_2-\lfloor\frac{a}{b}\rfloor y_2\)


// 該函數求解 ax+by=1 的整數解
int exgcd(int a, int b, int &x, int &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a; // a為最大公約數
    }
    // 下面的x、y交換是很直觀的根據推到式子來的
    int ret = exgcd(b, a%b, x, y);
    int t = x;
    x = y;
    y = t - a/b*y;
    return ret;
}

3.3 例題

4 乘法逆元

乘法逆元是模意義下的乘法運算的逆元,應用比較廣泛。

4.1 定義

\(a\times x\equiv 1\pmod b\),則稱 \(x\)\(a\) 在模 \(b\) 意義下的乘法逆元,記為 \(a^{-1}\)

注意:並非所有的情況下都存在乘法逆元,但是當 \(\gcd(a,b)=1\),即 \(a,b\) 互質時,存在乘法逆元。

4.2 逆元是干什么的

首先對於除法取模不成立,即 \((a\div b)\% p\neq((a\% p)\div (b\%p))\%p\)

顯然數學家們是不能忍受這種局面的,他們扔出了“逆元”來解決這個問題。


因為取模運算對於乘法來說是成立的,逆元就是把除法取模運算轉化為乘法取模運算。

\[(a/b)\% p=m\tag{1} \]

假設存在一個數 \(x\) 滿足

\[a\times x\%p=m\tag{2} \]

由模運算對乘法成立,對 \((1)\) 式兩邊同時乘以 \(b\) ,得到:

\[a\% p=m\times (b\% p)\% p; \]

如果 \(a\)\(b\) 均小於模數 \(p\) 的話,上式可以改寫為:

\[a=m\times b\% p \]

等式兩邊再同時乘以 \(x\),聯立 \((2)\) 式比較得到:

\[a\times x\% p=m\% p=x\times m\times b\% p \]

因此可以得到:

\[b\times x\% p=1 \]

可以看出 \(x\)\(b\) 在模 \(p\) 意義下的逆元。


由以上過程我們看到,求取 \((a/b)\%p\) 等同於求取 \(a\times b^{-1}\%p\)。 因此,求模運算的除法問題就轉化為求一個數的逆元問題了。

4.3 如何求乘法逆元

求一個數的逆元,有兩種方法。

4.3.1 費馬小定理求逆元

因為我們可能會遇到模數為一個素數 \(p\),所以可以利用費馬小定理來求。

例如:求整數 \(a\) 在模 \(p\) 意義下的逆元,如果 \(a\)\(p\) 的倍數,顯然不存在;如果 \(a\) 不是 \(p\) 的倍數,由 \(a^{p-1}\equiv 1\pmod p\),即 \(a^{p-1}\%p=a\times a^{p-2}\%p=1\)

所以 \(a^{p-2}\% p\) 即為 \(a\) 在模 \(p\) 意義下的逆元,用快速冪求解即可。


typedef long long ll;
ll quickpow(ll a, ll n, ll p) { //快速冪求 a^n % p
    ll ans = 1;
    while(n) {
        if(n & 1) ans = ans * a % p;
        a = a * a % p;
        n >>= 1;
    }
    return ans;
}

ll niyuan(ll a, ll p) { //費馬小定理求逆元 a^(p-2)%p
    return quickpow(a, p - 2, p);
}

注意:該方法的前提條件:模數為素數,且 \(a\) 不是 \(p\) 的倍數。

4.3.2 歐拉定理求逆元

當模數不是素數時,我們可以用歐拉定理來求解,再回顧一下歐拉定理:若 \(\gcd(a, n)=1\),則\(a^{\varphi(n)}\equiv 1\pmod n\)。那么 \(a^{\varphi(n)-1}\) 即為 \(a\) 在模 \(n\) 意義下的逆元,快速冪搞它。代碼就略過吧……

4.3.3 擴展歐幾里得求逆元

根據逆元的定義,若 \(a\times x\equiv 1\pmod b\),則稱 \(x\)\(a\) 在模 \(b\) 意義下的乘法逆元。那么,我們可以把原式轉換成 \(a\times x=b\times y+1\),移項得:\(a\times x-b\times y=1\),因為 \(y\) 為商,可以變個符號,讓原式變為 \(a\times x+b\times y=1\),這就變成了我們熟悉的形式。我們知道,當 \(gcd(a,b)=1\) 時,方程才有整數解,因此,利用擴展歐幾里得求逆元,要求 \(a,b\) 互質。

// ax+by=1
int exgcd(int a, int b, int &x, int &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return b; // b為最大公約數
    }
    // 注意傳參及下面的計算
    int ret = exgcd(b, a%b, y, x);
    y -= a/b*x;
    return ret;
}

// ax+by=1
int exgcd2(int a, int b, int &x, int &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return b; // b為最大公約數
    }
    // 下面的x、y交換是很直觀的根據推到式子來的
    int ret = exgcd2(b, a%b, x, y);
    int t = x;
    x = y;
    y = t - a/b*y;
    return ret;
}

4.3.3 線性求逆元

要求 \(1,2,\dots,p-1\) 中每個數關於 \(p\) 的逆元(\(p\) 為素數),用以上兩種方法,就顯得有點慢了,下面講一下線性求逆元。

過程推到:

首先,\(1^{-1}\equiv 1\pmod p\),顯然成立。

\(p=k\times i+r\),其中 \(1<i<p,\,r<i\)

再放到模 \(p\) 意義下,則有:\(k\times i+r\equiv 0\pmod p\)

兩邊同時乘以 \(i^{-1}\times r^{-1}\),則:

\[\begin{aligned} k\times i\times i^{-1}\times r^{-1}+r\times i^{-1}\times r^{-1} &\equiv 0 &\pmod p\\ k\times r^{-1}+i^{-1} &\equiv 0 &\pmod p\\ i^{-1} &\equiv -k\times r^{-1} &\pmod p\\ i^{-1} &\equiv -\lfloor\frac{p}{i}\rfloor\times r^{-1} &\pmod p\\ i^{-1} &\equiv -\lfloor\frac{p}{i}\rfloor\times (p\bmod i)^{-1} &\pmod p \end{aligned} \]

所以,我們可以用以上遞推式來求解逆元,代碼很簡單。

ny[1] = 1;
for (int i = 2; i < p; ++i) {
    ny[i] = (long long)-(p / i) * ny[p % i] % p; // 注意最后的模 p 不要忘記
}

但是有時候上面的方法會得到負數,而我們往往需要的是不大於 \(p\) 的正整數,所以可以做一下改動:

// 因為 1<i<p,所以 p/i 一定小於 p
ny[1] = 1;
for (int i = 2; i < p; ++i) {
    ny[i] = (long long)(p - p / i) * ny[p % i] % p; // 注意最后的模 p 不要忘記
}

注意:求逆元往往涉及大量的乘法,所以運算的時候一定要注意是否需要用到 long long。

4.3.4 小結

求解方程 \(ax\equiv 1\pmod p\) 的方法。

方法 限定條件 時間復雜度 備注
費馬小定理 模數為素數 \(O(\log n)\)
歐拉定理 \(a\)\(p\) 互質 差不多是 \(O(\sqrt n)\)
擴展歐幾里得 \(a\)\(p\) 互質 據說為 \(O(\ln n)\) 可以在求解過程中判斷是否互質
線性遞推 模數為素數 \(O(n)\)

5 概率

5.1 事件與概率

某些現象,在個別試驗中,其結果呈現出不確定性,而在大量重復試驗中其結果又具有統計規律性,這些現象成為“隨機事件”。

一個試驗稱為”隨機試驗“,是指它具有以下 \(3\) 個特點:

  1. 可以在相同的條件下重復進行。
  2. 每次試驗的可能結果可以不止一個,並且能事先明確試驗的所有可能結果。
  3. 進行一次試驗之前不能確定哪一個結果會出現。

某個隨機試驗所有可能的結果的集合成為樣本空間,一般記為 \(S\)\(S\) 的元素即為試驗的每個結果,稱為樣本點。一般都假設 \(S\) 由有限個元素組成,\(S\) 的子集稱為隨機事件,簡稱事件。在每次試驗中,當且僅當這一子集中的一個樣本點出現時,稱這一事件發生。例如在一次擲骰子的隨機試驗中,如果用獲得的點數來表示單位事件,那么一共可能出現 \(6\) 個單位事件,則事件空間可以表示為 \(S=\{1,2,3,4,5,6\}\)

隨機事件是事件空間 \(S\)子集,它由事件空間 \(S\) 中的單位元素構成,用大寫字母 \(A,B,C,\dots\) 表示。例如在擲兩個骰子的隨機試驗中,設隨機事件 \(A\) 為“獲得的點數和大於 \(10\)”,則 \(A\) 可以由下面 \(3\) 個單位事件組成:\(A=\{(5,6),(6,5),(6,6)\}\)

5.1.1 事件

  1. 基本事件:由一個樣本點組成的單個元素的集合,稱為基本事件
  2. 必然事件:在某種條件下,一定會發生的事件,叫做相對於該條件的必然事件,簡稱必然事件,例如擲一個骰子點數小於 \(7\)
  3. 不可能事件:在某種條件下,一定不會發生的事件,叫做相對於該條件的不可能事件,簡稱不可能事件。例如擲一個骰子點數大於 \(6\)
  4. 隨機事件:在某種條件下,可能發生,也可能不發生的事件,叫做相對於該條件的隨機事件,簡稱隨機事件。例如擲一個骰子點數為 \(2\)。必然事件與不可能事件統稱為相對於條件 \(S\) 的確定事件,簡稱確定事件。確定事件和隨機事件統稱為事件,一般用大寫字母 \(A,B,C,\dots\) 表示。

5.1.2 頻數、頻率及概率

  1. 頻數和頻率:在相同的條件下重復 \(n\) 次試驗,觀察某一事件 \(A\) 是否發生,稱 \(n\) 次試驗中事件 \(A\) 出現的次數 \(n_A\) 為事件 \(A\) 的頻數,稱事件 \(A\) 出現的比例 \(f_n(A)=\frac{n_A}{n}\) 為事件 \(A\) 出現的頻率。
  2. 概率:對於給定的隨機事件 \(A\),由於事件 \(A\) 發生的頻率 \(f_n(A)\) 隨着試驗次數的增加穩定於某個常數上,把這個常數記作 \(P(A)\),稱為事件 \(A\) 的概率。
  3. 概率的意義:
    • 隨機事件在一次的試驗中發生與否是隨機的,但隨機性中含有規律性。
    • 概率是頻率的穩定值,是一個確定的常數。概率大,並不表示事件一定發生,只是說事件發生的可能性大,但在一次試驗中卻不一定發生;概率小,並不表示事件一定不會發生,只是說事件發生的可能性小,但在一次試驗中卻不一定不發生。

5.1.3 事件的關系及運算

名稱 定義 符號表示 圖形表示
包含關系 如果事件 \(A\) 發生,則事件 \(B\) 一定發生,這時稱事件 \(B\) 包含事件 \(A\)(或稱事件\(A\) 包含於事件 \(B\) \(B\supseteq A\)(或 \(A\subseteq B\)
相等關系 \(B\supseteq A\)\(B\subseteq A\),那么稱事件 \(A\) 與事件 \(B\) 相等 \(A=B\)
並事件(和事件) 若某事件發生當且僅當事件 \(A\) 或事件 \(B\) 發生,則稱此事件為事件 \(A\) 與事件 \(B\) 的並事件(或和事件) \(A\bigcup B\)(或 \(A+B\)
交事件(積事件) 若某事件發生當且僅當事件 \(A\) 發生且事件 \(B\) 發生,則稱此事件為事件 \(A\) 與事件 \(B\) 的交事件(或積事件) \(A\bigcap B\)(或 \(A\times B\)
互斥事件 \(A\bigcap B\) 為不可能事件,那么稱事件 \(A\) 與事件 \(B\) 互斥 \(A\bigcap B=\emptyset\)
對立事件 \(A\bigcap B\) 為不可能事件,且 \(A\bigcup B\) 為必然事件,那么稱事件 \(A\) 與事件 \(B\) 互為對立事件 \(A\bigcap B=\emptyset\)
\(P(A\bigcup B)=P(A)+P(B)=1\)

5.1.4 概率的基本性質

  1. 任何事件的概率在 \(0\sim 1\) 之間,即 \(0\le P(A)\le 1\)
  2. 必然事件的概率為 \(1\),不可能事件的概率為 \(0\)
  3. 如果事件 \(A\) 與事件 \(B\) 互斥,則 \(P(A\bigcup B)=P(A)+P(B)\)
  4. 如果事件 \(A\) 與事件 \(B\) 互為對立事件,則 \(A\bigcup B\) 為必然事件,\(P(A\bigcup B)=1,\,P(A)=1-P(B)\)
  5. 互斥事件的可加性:設 \(A_1,A_2,\dots,A_n\) 是互斥的 \(n\) 個事件,則 \(P(A_1\bigcup A_2\bigcup\dots A_n)=P(A-1)+P(A_2)+\dots+P(A_n)\)
  6. 獨立事件的可乘性:如果事件 \(A\) 是否發生對事件 \(B\) 發生的概率沒有影響,同時事件 \(B\) 是否發生對事件 \(A\) 發生的概率也沒有影響,則稱 \(A\)\(B\) 是相互獨立事件,有 \(P(A\bigcap B)=P(A)\times P(B)\)。推廣到 \(n\) 個相互獨立事件,\(P(A_1\bigcap A_2\bigcap\dots A_n)=P(A_1)\times P(A_2)\times\dots P(A_n)\)

5.1.5 定理與公式

  • 全概率公式:若事件 \(A_1, A_2,\dots,A_n\) 構成一個完備的事件且都有正概率,即 \(\forall i,j,A_i\bigcap A_j=\empty\),且 \(\sum_{i=1}^{n} A_i=1\),有 \(P(B)=\sum_{i=1}^n P(A_i)P(B|A_i)\)
  • 貝葉斯定理:\(P(B_i|A)=\frac{P(B_i)P(A|B_i)}{\sum_{j=1}^n P(B_j)P(A|B_j)}\)

以上公式中,事件 \(B_i\) 的概率為 \(P(B_i)\),在事件 \(B_i\) 已發生的條件下事件 \(A_i\) 的概率為 \(P(A|B_i)\),在事件 \(A\) 發生的條件下事件 \(B_i\) 的概率為 \(P(B_i|A)\)

5.2 古典概率

概率依其計算方法不同,可分為古典概率、試驗概率和主觀概率。古典概率通常又叫事前概率,是指當隨機事件中各種可能發生的結果及其出現的次數都可以由演繹或外推法得知,而無需經過任何統計試驗即可計算各種可能發生結果的概率。

人們最早研究概率是從擲硬幣、擲骰子和摸球等游戲和賭博中開始的。這類游戲有幾個共同特點:

  • 試驗的樣本空間有限。
    如擲硬幣有正反兩種結果,擲骰子有 \(6\) 種結果等;

  • 試驗中每個結果出現的可能性相同。
    如硬幣和骰子是均勻的前提下,擲硬幣出現正反的可能性各為 \(\frac{1}{2}\),擲骰子擲出各種點數的可能性各為 \(\frac{1}{6}\)

  • 這些隨機現象所能發生的事件是互不相容的。

    比如擲硬幣的結果要么是正,要么是反,不可能同時發生。

具有這幾個特點的隨機試驗稱為古典概型或等可能概型。計算古典概型概率的方法稱為概率的古典定義或古典概率。

在計算古典概率時,如果在全部可能出現的基本事件范圍內,構成事件 \(A\) 的基本事件有 \(a\) 個,不構成事件 \(A\) 的事件有 \(b\) 個,則出現事件 \(A\) 的概率為 \(P(A)=\frac{a}{a+b}\)

5.2.1 例題

  1. \(40\) 支圓珠筆中有 \(30\) 支黑色的,另外 \(10\) 支是紅色的。從中任意取出 \(4\) 支,計算其中至少有 \(1\) 支紅色的概率。

    分析:

    • 直接計算,分成紅色的有 \(1\) 支、\(2\) 支、\(3\)支、\(4\)支四個事件,彼此互斥,直接相加
    • 利用對立事件計算
  2. https://vjudge.net/problem/LightOJ-1104(生日悖論)

  3. POJ 3071

5.2 期望

我們先來玩一個游戲:如果有 \(14\) 張牌,其中有 \(1\) 張是 \(A\)。現在我來坐庄,一塊錢賭一把,如果你抽中了 \(A\),我賠你 \(10\) 塊錢;如果沒有抽中,那么你那一塊錢就輸給我了。你覺得對誰有利?

如果你只玩一把,只有兩種可能。但是如果玩上幾百幾千甚至更多,有的抽中有的不中,你手中的錢是個什么結果呢?

這就是概率上的一個概念——數學期望,它可以理解成某件事情大量發生之后的平均結果

5.2.1 定義

在一定區間內變量取值為有限個,或數值可以一一列舉出來的變量稱為離散型隨機變量。一個離散型隨機變量的數學期望是試驗中每次可能的結果乘以其結果概率的總和。

上面游戲中,你作為玩家,得到的“數學期望值”是 \(-\frac{3}{14}\)

信息學奧賽中的期望值問題,大多數都是求離散型隨機變量的數學期望。如果 \(X\) 是一個離散的隨機變量,輸出值為 \(x_1,x_2,\dots\),和輸出值相應的概率分別為 \(p_1,p_2,\dots\)(概率之和為 \(1\)),那么期望值是 \(E(X)=\sum_i p_i\times x_i\)

5.2.2 性質

  • 期望的“線性”性質

    對於任意隨機變量 \(X\)\(Y\) 以及常量 \(a\)\(b\),有:\(E(aX+bY)=aE(X)+bE(Y)\)

    當兩個隨機變量 \(X\)\(Y\) 相互獨立且各自都有一個已定義的期望時,有:\(E(XY)=E(X)E(Y)\)

  • 全期望公式:\(E(Y)=E(E(Y|X))\)

    推導:

    \[\begin{aligned} E(E(Y|X))&=\sum_i P(X=x_i)\times E(Y|X=x_i)\\ &=\sum_i p_{x_i}\times E(Y|X=x_i)\\ &=\sum_i p_{x_i}\times \sum_j y_j\times\frac{p_{x_iy_j}}{p_{x_i}}\\ &=\sum_{i}\sum_{j}p_{x_i}\times y_j\times\frac{p_{x_iy_j}}{p_{x_i}}\\ &=\sum_{i}\sum_{j}y_j\times p_{x_iy_j}\\ &=\sum_{j}y_j\sum_i {p_{x_iy_j}}\\ &=E(Y) \end{aligned} \]

5.2.3 例題

UVA 10529

5.3 方差

離散型方差的一般形式:

\[D(X)=\sum_i (x_i-E(X))^2p_i \]

換種寫法:

\[D(X)=E(X-E(X))^2 \]

特別的,當 \(x_i\) 等概率發生時,

\[\begin{aligned} D(X)&=\frac{1}{n}\sum_i (x_i-E(X))^2\\ &=\frac{1}{n}\sum_i (x_i-\overline x)^2 \end{aligned} \]

上面公式中,\(\overline x\) 表示 \(x_i\) 的平均數。

再換種寫法:

\[D(X)=E(X^2)-E^2(X) \]

\[\begin{aligned} D(X)&=E(X-E(X))^2\\ &=E(X^2-2X\cdot E(X)+E^2(X))\\ &=E(X^2)-E(2\cdot E(X)\cdot X)+E^2(X)\\ &=E(X^2)-2E(X)\cdot E(X)+E^2(X)\\ &=E(X^2)-E^2(X) \end{aligned} \]

上面第三行中,\(2E(X)\)\(E^2(X)\) 均為常量,因此可以直接拿到期望外面,即 \(E(a)=a\)\(a\) 為常量

5.3.1 性質

  • \(D(aX+b)=a^2(X)\),其中 \(a,\,b\) 為常數

    \[\begin{aligned} D(aX+b)&=E((aX+b)^2)-E^2(aX+b)\\ &=E(a^2X^2+2abX+b^2)-E(aX+b)\cdot E(aX+b)\\ &=a^2E(X^2)+2abE(X)+E(b^2)-(aE(X)+E(b))^2\\ &=a^2E(X^2)+2abE(X)+b^2-(aE(X)+b)^2\\ &=a^2E(X^2)+2abE(X)+b^2-a^2E^2(X)-2abE(X)-b^2\\ &=a^2E(X^2)-a^2E^2(X)\\ &+a^2D(X) \end{aligned} \]

  • \(X,\,Y\) 相互獨立,則 \(D(X+Y)=D(X)+D(Y)\)

    \[\begin{aligned} D(X+Y)&=E((X+Y)^2)-E^2(X+Y)\\ &=E(X^2+2X\cdot Y+Y^2)-E(X+Y)\cdot E(X+Y)\\ &=E(X^2)-2E(XY)+E(Y^2)-(E(X)+E(Y))^2\\ &=E(X^2)-2E(X)E(Y)+E(Y^2)-E^2(X)-2E(X)E(Y)+E^2(Y)\\ &=E(X^2)-E^2(X)+E(Y^2)-E^2(Y)\\ &=D(X)+D(Y) \end{aligned} \]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM