數論選講(更新中)

數論選講

文章目錄

(初等數論基礎概念就不普及了)php

一些前置姿式:html

  1. 素數分佈:素數有無限個,用 π ( x ) \pi(x) 表示小於 x x 的素數個數,則隨着 x x 的增加,有 π ( x ) = Θ ( x ln x ) \pi(x)=\Theta(\frac{x}{\ln x}) ,同時蘊含常數 1 1
    這個結論能夠用於估計某些與枚舉素數有關的算法的複雜度。node

  2. 算術基本定理,又稱惟一分解定理。
    對於任意正整數 n n ,惟一存在如下分解: n = i p i k i n=\prod_i p_i^{k_i}
    其中全部 p i p_i 均爲質數,且從小到大排列。c++

  3. O ( log a ) O(\log a) g c d gcd 算法和 e x g c d exgcd 算法默認你們都會,而且知道exgcd怎麼求模意義下本質不一樣解的個數以及輸出全部解。git

  4. 同餘的一些術語你們僞裝都聽得懂吧(否則無法講了。。。)web


一,素數斷定與因數分解

1.素數斷定

首先你們都會線性篩 O ( n ) O(n) 篩出一部分質數算法

顯然咱們有試除法能夠在 O ( n ) O(\sqrt n) 時間內判斷一個數是不是質數。數組

固然能夠經過只枚舉質數優化至 O ( n ln n ) O(\frac{\sqrt n}{\ln n}) app

可是有的時候試除法複雜度也不夠優秀,因此就須要Miller-Rabin算法。ide

1.1 Miller-Rabin

首先Miller-Rabin算法是一個隨機算法,同時是一個機率算法(換句話說,有可能出錯)

不過當測試次數足夠多的時候,出錯機率至關小就是了(反正臉黑的就多測幾回就好了)。

前置姿式:

  1. 費馬小定理:對於 p P , p a p\in \mathbb P,p\nmid a a p 1 1 ( m o d p ) a^{p-1}\equiv 1\pmod p ,不過反過來不必定了。。。
  2. 二次探測:對於素數 p p ,可以知足 x 2 1 ( m o d p ) x^2\equiv 1\pmod p 的同餘類 x x 只有 x 1 ( m o d p ) x\equiv 1\pmod p x p 1 ( m o d p ) x\equiv p-1\pmod p
二次探測證實:

x 2 1 ( m o d p ) x^2\equiv 1\pmod p ,則 x 2 = 1 + p k x^2=1+pk ,有 ( x + 1 ) ( x 1 ) = p k (x+1)(x-1)=pk

必須有 p x + 1 p\mid x+1 p x 1 p\mid x-1 ,分別對應 x p 1 ( m o d p ) x\equiv p-1\pmod p x 1 ( m o d p ) x\equiv 1\pmod p

1.1.1 算法流程(判斷數n是否爲質數):
  1. 對於偶數,直接跳出循環,固然同時能夠把幾個小質數的倍數一塊兒特判。
  2. 不然找出 s , t s,t ,使得 n 1 = 2 s t n-1=2^st ,其中 2 t 2\nmid t
  3. 隨機選取質數 a a
  4. 驗證是否有 a n 1 1 ( m o d n ) a^{n-1}\equiv 1\pmod n ,若是不是則 n n 爲合數
  5. 不然計算出 a t a^t ,而後進行 s s % n \%n 意義下的二次探測。
  6. 多重複幾回就能大機率判斷 n n 是不是一個質數。

通常我選擇的是重複3~5次。

2.因數分解

一樣的咱們能夠用試除法,複雜度一樣不夠優秀。。。

下面介紹一種根本沒人用的方法:Fermat整數分解法。

2.1 Fermat整數分解法

首先,這個方法複雜度玄學,可是好於試除法。

怎麼理解玄學這個事情。。。目前沒有任何關於這個算法複雜度上界,下界,指望,漸進緊確界的任何斷言或推論。

2.1.1 考慮分解數n:
  1. 若是是質數或1直接返回。
  2. 不然咱們先把全部的質因子 2 2 剔除,從 a = n + 1 a=\lfloor\sqrt n\rfloor+1 開始往上枚舉,計算 c = a 2 n c=a^2-n
  3. 若是存在正整數 b b 使得 b 2 = c b^2=c ,則有 n = ( a + b ) ( a b ) n=(a+b)(a-b) ,遞歸分解便可。
  4. c + a > n \lfloor\sqrt c\rfloor+a > n 時返回,說明本來的 n n 確定是一個質數。

而後來看Pollard-Rho算法

2.2 Pollard-Rho算法

一樣的,這個也是一個隨機算法,一部分效率是要看臉的。

考慮對於 a , n N , g c d ( a , n ) n \forall a,n\in \mathbb N_*,gcd(a,n)\mid n

而自己 g c d gcd 的複雜度只有 O ( log n ) O(\log n) 級別,這給了咱們啓示,如何構造出一個靠譜的數 a a ,使得他包含 n n 的因子,就成了很是重要的問題。

一下直接假設 a a n n 的因子且 a n a\leq \sqrt n ,由於不是的那部分顯然不重要。

咱們在這個尋找過程當中加入隨機因素。

構造函數 f ( x , n ) = ( x 2 + c ) % n f(x,n)=(x^2+c)\%n ,其中 c c 是在每次Pollard-Rho以前決定好的在 [ 1 , n ) [1,n) 中的正整數,保證在 x = 1 x=1 的時候不會陷入死循環中。

構造序列 { x } \{x\} ,其中 x 1 = r a n d ( ) , x i = f ( x i 1 , n ) x_1=rand(),x_i=f(x_{i-1},n) 。咱們能夠認爲它是近似隨機的。(聽說某版本C++的rand()也是這樣實現的,不過略有區別)。

顯然這個序列的軌跡要麼是一個環,要麼就是一個 ρ \rho 形(根據抽屜原理),且環長在 O ( n ) O(\sqrt n) 的級別內,這個環暫且稱爲一環。

還有,澄清一點,不少博客聲稱這個 f f 函數是單射函數。。。可是顯然不是,不然怎麼來的 ρ \rho 形軌跡。至少顯然 f ( x , n ) = f ( n x , n ) f(x,n)=f(n-x,n) f f 就已經不是單射函數了。

而後考慮序列 { y } \{y\} ,其中 y i = x i % a y_i=x_i\%a (注意這裏 a a 仍然是一個未知數),同理這個軌跡依然要麼是環形要麼是 ρ \rho 形,根據生日悖論,其環長在 O ( a ) O ( n 4 ) O(\sqrt a)\leq O(\sqrt[4]n) 規模。

考慮一環上兩個不一樣的位置 x i ̸ = x j x_i\not=x_j ,若是它們對應二環上同一個位置 y i = y j y_i=y_j ,則有 j i = O ( a ) , a x j x i j-i=O(\sqrt a),a\mid |x_j-x_i|

這又給咱們帶來了一些啓發。

若是咱們可以找到一個 y i = x i % a y_i=x_i\%a ,而後 O ( a ) O(\sqrt a) 枚舉 x j x_j ,當發現 1 < g c d ( n , x i x j < n ) 1< gcd(n,|x_i-x_j| < n) 的時候,咱們就找到了一個因數。

可是注意,目前 a a 仍然是一個未知數。

能夠採用兩種辦法,Floyd判圈算法或者Brent‘s找環算法’。

因爲Floyd判圈跑的賊慢,因此這裏只介紹Brent’s。

2.2.1 算法流程(已經驗證n不是質數或1):
  1. 首先令 x 1 = r a n d ( ) x_1=rand() ,隨機選擇一個參數 c c ,當前環長 k = 1 k=1
  2. 而後向後擴展長度爲環長的 x x 序列,記錄 q = x 1 x i q=\prod|x_1-x_i|
  3. 計算 t = g c d ( q , n ) t=gcd(q,n) ,若是 t = 1 t=1 ,令 x 1 = x k + 1 x_1=x_{k+1} k = k 2 k=k*2 ,回到 2 2 步。
  4. 不然,若是 t = n t=n ,回到 1 1
  5. 否則,咱們就找到了一個 n n 的因數 t t ,遞歸分解 t t n / t n/t 便可。
2.2.2 複雜度分析:

考慮處理一個因子時候的複雜度,若環長爲 k k ,則枚舉次數近似於:
T ( n ) = O ( k ) + O ( k 2 ) + O ( k 2 2 ) + + O ( k 2 z ) T(n)=O(k)+O(\frac{k}2)+O(\frac{k}{2^2})+…+O(\frac{k}{2^z})

這個數列是收斂的,化求和爲積分後咱們獲得 T ( n ) = O ( k ) = O ( n 4 ) T(n)=O(k)=O(\sqrt[4]n) ,蘊含常數爲 2 2 。套上一個 g c d gcd 就是 O ( n 4 log n ) O(\sqrt [4]n\log n)

考慮計算全部因子的複雜度:
T ( n ) O ( n 4 log n ) + T ( n 2 ) + T ( n 4 ) + + T ( n 2 z ) = O ( n 4 log n ) T(n)\leq O(\sqrt[4] n\log n)+T(\frac{n}2)+T(\frac{n}4)+…+T(\frac{n}{2^z})=O(\sqrt[4]n\log n)

然而實際上因爲初期小因子較多,分解速度快,這個複雜度只有很是很是不走運的時候纔會被卡到。

2.3 Quadratic Sieve Algorithm 二次篩法

以Fermat分解和二次剩餘爲基礎的篩法,等熟練掌握Fermat和二次剩餘以後再來看吧,這裏放一個whzzt的博客:https://blog.csdn.net/whzzt/article/details/81069289

並且這個比Pollard-Rho快(小聲BB),準確來講,複雜度遠遠優於Pollard-Rho。

不過比Pollard-Rho難寫就是了。


二,中國剩餘定理及其擴展

憑藉強大的中國剩餘定理,咱們可以對不少同餘問題進行快速的分解與合併,使得咱們只須要考慮模數爲質數的若干次冪的狀況。

1. 一元線性同餘方程

形如 f ( x ) a ( m o d n ) f(x)\equiv a\pmod n 的方程成爲一元線性同餘方程,其中 f ( x ) f(x) 中只包含關於 x x 的線性變換。

相信你們都會用ex歐幾里得來解,這裏就不贅述了。

2. 一元線性同餘方程組

由若干個一元線性同餘方程共同構成的方程組就是一元線性同餘方程組 (廢話)

通常把一元線性同餘方程組寫成這樣:
{ x a 1 ( m o d m 1 ) x a 2 ( m o d m 2 ) x a t ( m o d m t ) \left\{ \begin{aligned} &x\equiv a_1\pmod {m_1}\\ &x\equiv a_2\pmod{m_2}\\ &…… \\ &x\equiv a_t\pmod{m_t}\\ \end{aligned} \right.

當對於 1 i , j t . i ̸ = j \forall 1\leq i,j \leq t.i\not=j ,都有 g c d ( m i , m j ) = 1 gcd(m_i,m_j)=1 的時候,以上方程恆有解,咱們能夠直接採用中國剩餘定理求解。

3. 中國剩餘定理CRT

考慮若是咱們可以獲得一個數列 { e } \{e\} ,對於 1 i , j t i ̸ = j \forall 1\leq i,j\leq t,i\not=j ,都有

{ e i 1 ( m o d m i ) e i 0 ( m o d m j ) \left\{ \begin{aligned} e_i\equiv 1\pmod{m_i}\\ e_i\equiv 0\pmod{m_j} \end{aligned} \right.

那麼咱們就可以很簡單的獲得答案了,就是

x i = 1 t e i a i ( m o d i = 1 t m i ) x\equiv \sum_{i=1}^te_ia_i\pmod{\prod_{i=1}^tm_i}

這個正確性是十分顯然的,那麼咱們如今要作的就是構造出一個合法的 { e } \{e\} 序列。

M = i = 1 t m i M=\prod_{i=1}^tm_i M i = M m i M_i=\frac{M}{m_i} M i 1 M i 1 ( m o d m i ) M_i^{-1}M_i\equiv 1\pmod {m_i}

則能夠直接獲得知足條件的 e i M i 1 M i ( m o d M ) e_i\equiv M_i^{-1}M_i\pmod M

按照上面寫的算一算就好了。

4. 擴展中國剩餘定理exCRT

1 i , j t , i ̸ = j \exist 1\leq i,j \leq t,i\not=j ,有 g c d ( m i , m j ) ̸ = 1 gcd(m_i,m_j)\not=1 的時候,上面的方法再也不適用了,咱們須要一種更加通用的方法來計算方程組的解。

如今,考慮合併兩個方程。

x a 1 ( m o d m 1 ) x\equiv a_1\pmod {m_1}

x a 2 ( m o d m 2 ) x\equiv a_2\pmod {m_2}

如今顯然能夠設: x = a 1 + y 1 m 1 = a 2 + y 2 m 2 x=a_1+y_1m_1=a_2+y_2m_2

而新的方程顯然就是 x a 1 + y 1 m 1 a 2 + y 2 m 2 ( m o d l c m ( m 1 , m 2 ) ) x\equiv a_1+y_1m_1\equiv a_2+y_2m_2\pmod{lcm(m_1,m_2)}

顯然如今須要解決的方程就是這個:

a 1 a 2 = y 2 m 2 y 1 m 1 a_1-a_2=y_2m_2-y_1m_1

相信你們都會直接用擴展歐幾里得求解,隨便解出一個合法的 y 1 , y 2 y_1,y_2 代回去就能獲得一個新的方程,當上述方程無解時,方程組無解。

兩兩合併獲得的最後一個方程就是答案。


三,原根,n次剩餘與離散對數

1.原根

原根:對於正整數 n n ,它的原根是一個知足以下條件的正整數 a a g c d ( a , n ) = 1 gcd(a,n)=1 ,且 a , a 2 , a 3 . . . a ϕ ( n ) a,a^2,a^3...a^{\phi(n)} % n \%n 意義下兩兩不一樣餘。

關於原根的幾個結論(如下的 p p 都是指奇質數)

  1. 具備原根的數字只有如下幾種形式: 2 , 4 , 2 p n , p n 2,4,2p^n,p^n ,且原根必定存在。
  2. n n 的最小原根大小是 O ( n 4 ) O(\sqrt[4]n)
  3. n n 有原根,則原根個數爲 ϕ ( ϕ ( n ) ) \phi(\phi(n))
  4. g g p p 的原根,則 g g g + p g+p p 2 p^2 的原根。
  5. 對於 n N \forall n\in N_* ,若 g g p n p^n 的原根,則 g g g + p n g+p^n 中的奇數是 2 p n 2p^n 的原根。

證實:由於懶得寫,咕了。

1.1 找原根

通常來講題目要求的數的原根都不會太大,因此暴力枚舉 [ 2 , n 4 ] [2,\lfloor\sqrt[4]n\rfloor] 就好了。

問題在於怎麼check,首先咱們有歐拉定理可知: g c d ( a , n ) = 1 a ϕ ( n ) 1 ( m o d n ) gcd(a,n)=1\Rightarrow a^{\phi(n)}\equiv 1\pmod n

因此循環節長度 s s 必然有 s ϕ ( n ) s\mid \phi(n)

因此咱們求出 ϕ ( n ) \phi(n) 的惟一分解,枚舉全部的 p ϕ ( n ) p\mid \phi(n) ,而後判斷 a ϕ ( n ) p ̸ 1 ( m o d n ) a^{\frac{\phi(n)}{p}}\not\equiv 1\pmod n ,全部 p p 上式都成立則找到一個原根 a a

1.2 指標

若是 n n 有原根 g g ,且

g r a ( m o d n ) g^r\equiv a\pmod n

成立,則稱 r r 是以 g g 爲底的 a a n n 的一個指標。

記做 r = i n d g a r=ind_ga

求指標能夠用BSGS。

指標有如下性質:

  1. a b ( m o d p ) i n d g a i n d g b ( m o d ϕ ( n ) ) a\equiv b\pmod p\Leftrightarrow ind_ga\equiv ind_gb\pmod {\phi(n)}
  2. i n d g ( a b ) i n d g ( a ) + i n d g ( b ) ( m o d ϕ ( n ) ) ind_g(ab)\equiv ind_g(a)+ind_g(b)\pmod{\phi(n)}
  3. i n d g ( a k ) k i n d g ( a ) ( m o d ϕ ( n ) ) ind_g(a^k)\equiv k\cdot ind_g(a)\pmod{\phi(n)}

2.離散對數

離散對數問題:求解形如

A x B ( m o d C ) A^x\equiv B\pmod {C}

的同餘方程。

咱們先考慮 g c d ( A , C ) = 1 gcd(A,C)=1 的狀況,顯然此時只有當 g c d ( B , C ) = 1 gcd(B,C)=1 的時候有解。

2.1 BSGS

2.1.1 前置知識:指數模的週期性

A x A^x C C 取模的結果隨着 x x 的變化具備週期性,最長週期爲 C 1 C-1

證實:由抽屜原理易證。

因此咱們只須要獲得 x [ 0 , C 1 ] x\in [0,C-1] 的答案就好了。

那麼如今怎麼解決這個東西。。。(注意解出來不是一個同餘等價類啊,就是說 C R T CRT 在這裏毫無用武之地了)

樸素的枚舉顯然是 O ( C ) O(C) ,考慮優化。

這時候就要用到一種思想Baby-Step,Giant-Step,意味小步大步,簡稱爲BSGS。民間稱呼數不勝數:拔山蓋世,北上廣深,百度搜索谷歌搜索

咱們將這 C C 個數分爲 n n 組,每組 m = C n m=\lceil\frac{C}n\rceil 個數。對每一組進行詢問,在這組 m m 個數內是否有答案。

這時候答案能夠當作是: A i m y B ( m o d C ) A^{im-y}\equiv B\pmod C

因爲 g c d ( A , C ) = 1 gcd(A,C)=1 ,因此 A A % C \%C 意義下是存在逆元的,這時候就能夠將上面這個方程等價轉化爲 A i m A y B ( m o d C ) A^{im}\equiv A^{y}B\pmod C

咱們將 y = 1 , 2 , . . . m y=1,2,...m 的全部 A y B A^yB 存到一個哈希表內,而後 O ( n ) O(n) 枚舉 i i 計算 A i m A^{im} 的值,再到哈希表中查詢就能夠獲得咱們的答案了。

總的複雜度 O ( C n ) + O ( n ) O(\frac{C}n)+O(n) ,當 n = C n=\sqrt C 的時候取得最小值,此時複雜度爲 O ( C ) O(\sqrt C)

2.2 exBSGS

如今嘗試解決當 g c d ( A , C ) ̸ = 1 gcd(A,C)\not=1 時候的離散對數問題。

在已經有了解決 g c d ( A , C ) = 1 gcd(A,C)=1 的問題的方案的時候,咱們考慮將這個問題轉化成 g c d ( A , C ) = 1 gcd(A,C)=1 的狀況。

如今將原方程 A x B ( m o d C ) A^x\equiv B\pmod C 進行一點轉化:
A x = B + C y A^x=B+Cy

d 1 = g c d ( A , C ) , C 1 = C d 1 , B 1 = B d 1 d_1=gcd(A,C),C_1=\frac{C}{d_1},B_1=\frac{B}{d_1} ,獲得等價方程:

A d 1 A x 1 = B 1 + y C 1 \frac{A}{d_1}A^{x-1}=B_1+yC_1

d 2 = g c d ( A , C 1 ) , C 2 = C 1 d 2 , B 2 = B 1 d 2 d_2=gcd(A,C_1),C_2=\frac{C_1}{d_2},B_2=\frac{B_1}{d_2} ,獲得等價方程:

A 2 d 1 d 2 A x 2 = B 2 + y C 2 \frac{A^2}{d_1d_2}A^{x-2}=B_2+yC_2

一直處理到 n n ,直到 d n + 1 = 1 d_{n+1}=1
則咱們獲得等價方程:

A n i = 1 n d i A x n = B n + y C n \frac{A^n}{\prod_{i=1}^nd_i}A^{x-n}=B_n+yC_n

其中 B n = B i = 1 n d i , C n = C i = 1 n d i B_n=\frac{B}{\prod_{i=1}^nd_i},C_n=\frac{C}{\prod_{i=1}^nd_i}

若是 B n B_n 不是整數確定就沒有解了。

D = A n i = 1 n d i D=\frac{A^n}{\prod_{i=1}^nd_i} ,顯然 g c d ( D , C n ) = 1 , g c d ( A , C n ) = 1 gcd(D,C_n)=1,gcd(A,C_n)=1 ,即 D , A D,A % C n \%C_n 意義下存在逆元。

獲得等價方程: D A x n B n ( m o d C n ) D\cdot A^{x-n}\equiv B_n\pmod{C_n} ,即

A x n B n D 1 ( m o d C n ) A^{x-n}\equiv B_n\cdot D^{-1}\pmod {C_n}

如今已經轉化成了 g c d ( A , C n ) = 1 gcd(A,C_n)=1 的形式了,直接上普通的BSGS就好了。

注意咱們還須要先作一次 O ( log C ) O(\log C) 的枚舉(顯然 n n 不會超過 O ( log C ) O(\log C) ),由於最後的答案可能沒有 n n 大,就是說可能 g c d gcd 的影響尚未徹底消除,就已經獲得 B B 了。

3.n次剩餘

n n 次剩餘問題:求解形如

x n a ( m o d m ) x^n\equiv a\pmod m

的同餘方程。

利用CRT咱們能夠把問題分解,設 m m 的惟一分解式爲 m = i = 1 t p i k i m=\prod_{i=1}^tp_i^{k_i}

{ x n a ( m o d p 1 k 1 ) x n a ( m o d p 2 k 2 ) x n a ( m o d p t k t ) \left\{ \begin{aligned} &x^n\equiv a\pmod {p_1^{k_1}}\\ &x^n\equiv a\pmod {p_2^{k_2}}\\ &…… \\ &x^n\equiv a\pmod {p_t^{k_t}} \end{aligned} \right.

解完這 t t 個方程後用CRT合併回去就好了。

因此接下來只討論求解 x n a ( m o d p k ) x^n\equiv a\pmod {p^k} 這樣的方程。

3.1 p爲奇質數的狀況

此時 p k p^k 的原根必定存在,設這個原根爲 g g

首先咱們令 g c d ( a , p k ) = 1 gcd(a,p^k)=1 ,否則咱們就看一看 a a 當中有幾個 p p ,兩邊同時除去,若是總數不是 n n 的倍數,那麼原方程無解,不然咱們老是能夠經過在最後的 x x 中乘上若干個 p p 來獲得咱們要的解。

首先咱們用BSGS解一下這個方程:

g t a ( m o d p k ) g^t\equiv a\pmod {p^k}

解出來 t t 以後,咱們設 x g z ( m o d p k ) x\equiv g^z\pmod{p^k} ,則咱們獲得這個方程:

g z n g t ( m o d p k ) g^{zn}\equiv g^{t} \pmod {p^k}

因此有 z n t ( m o d ϕ ( p k ) ) zn\equiv t\pmod{\phi(p^k)}

擴歐解一解就好了。

注意,擴歐沒有解確定就只能咕咕咕了。

3.2 p=2的狀況

有一個很顯然的結論: x n a ( m o d 2 k ) x^n\equiv a\pmod {2^k} 的不充分前提是 x n a ( m o d 2 k 1 ) x^n\equiv a \pmod{2^{k-1}}

而若是 x n a ( m o d 2 k 1 ) x^n\equiv a\pmod{2^{k-1}} ,則要麼 x n a ( m o d 2 k ) x^n\equiv a\pmod{2^k} 要麼 ( x + 2 k 1 ) n a ( m o d 2 k ) (x+2^{k-1})^n\equiv a\pmod{2^{k}}

解的總個數不會不少(實測證實這個剪枝跑得飛快),暴力 d f s dfs 便可。

4.二次剩餘

二次剩餘問題:求解形如

x 2 a ( m o d m ) x^2\equiv a\pmod m

的同餘方程。

首先,仍是先分解成 x 2 a ( m o d p k ) x^2\equiv a\pmod {p^k} 來處理。

固然能夠按照 n n 次剩餘的套路來解。

不過咱們如今有優秀的 O ( log p k ) O(\log p^k) 的解法。

4.1 p爲奇質數且k=1的狀況

如今的方程就是這樣的: x 2 a ( m o d p ) x^2\equiv a\pmod p

4.1.1 解的存在性

首先考慮一個問題,無解。

爲何會無解?顯然 x 2 ( p x ) 2 ( m o d p ) x^2\equiv (p-x)^2\pmod p 根據抽屜原理,這樣下來總有一些抽屜是空的,這就是無解的狀況。

x 2 a ( m o d p ) x^2\equiv a\pmod p 有解,則稱 a a % p \%p 意義下的二次剩餘類。
不然稱 a a % p \%p 意義下的二次非剩餘類。

咱們定義勒讓德符號( L e g e n d r e   s y m b o l Legendre\text{ }symbol ):
( a p ) = { 1 a % p 1 a % p 0 a 0 ( m o d p ) \Big(\frac{a}{p}\Big)=\left\{ \begin{aligned} 1 &&&a是\%p下的二次剩餘 \\ -1 &&&a是\%p下的二次非剩餘 \\ 0 &&& a\equiv0\pmod p \end{aligned} \right.

咱們有歐拉準則: ( a p ) a p 1 2 ( m o d p ) (\frac{a}p)\equiv a^{\frac{p-1}2}\pmod p

證實: 首先 p a p\mid a 的時候歐拉準則顯然成立。

不然由費馬小定理咱們有 a p 1 1 ( m o d p ) a^{p-1}\equiv 1\pmod p

因此必然有 a p 1 2 ± 1 ( m o d p ) a^{\frac{p-1}{2}}\equiv \pm1\pmod p

先證實 ( a p ) = 1 (\frac{a}{p})=1 的狀況

必要性: a a % p \%p 意義下的二次剩餘,即 x , x 2 a ( m o d p ) \exist x,x^2\equiv a\pmod p

那麼咱們有

a p 1 2 ( x 2 ) p 1 2 x p 1 1 ( m o d p ) a^{\frac{p-1}2}\equiv (x^2)^{\frac{p-1}2}\equiv x^{p-1}\equiv 1\pmod p

必要性證實完畢。

充分性: p p 有一個原根 g g ,那麼必然有 g i a ( m o d p ) g^i\equiv a\pmod p

則:

g i ( p 1 ) 2 1 ( m o d   p ) g^{\frac{i(p-1)}2}\equiv 1(mod\text{ }p)

因爲 g g 爲原根,因此必然會有 ( p 1 ) i ( p 1 ) 2 (p-1)\mid\frac{i(p-1)}{2}

i i 是偶數。

必然存在解 x 0 g i 2 ( m o d p ) x_0\equiv g^{\frac{i}2}\pmod p

充分性證畢。

那麼 ( a p ) 1 ( m o d p ) (\frac{a}p)\equiv-1\pmod p 的狀況也就十分顯然了。

首先由費馬小定理 a p 1 2 ± 1 ( m o d p ) a^{\frac{p-1}{2}}\equiv \pm 1\pmod p

因爲前面的歐拉準則在 ( a p ) = 1 (\frac{a}{p})=1 的必要性,二次非剩餘的狀況下 x 2 a p 1 1 ( m o d p ) x^2\equiv a^{p-1}\equiv -1\pmod p ,顯然不可能,違反了費馬小定理。

4.1.2 Cipolla算法

如下全部運算均在 % p \%p 意義下進行

b 2 a w ( m o d p ) b^2-a\equiv w\pmod p ,其中 w w % p \%p 意義下的二次非剩餘

因爲 w w % p \%p 意義下不存在平方根,相似於虛數設 i = w i=\sqrt w 。相似於複數從新定義 % p \%p 意義下一個數爲 ( a , b ) (a,b) ,即 a + b w a+b\sqrt w

接下來定義一個代數系統 < G , + , × > <G,+,\times> 知足:

( a , b ) + ( c , d ) = ( a + c , b + d ) (a,b)+(c,d)=(a+c,b+d)

( a , b ) × ( c , d ) = ( a c + b d w , a d + b c ) (a,b)\times (c,d)=(a c+b d w,a d+b c)

顯然 G G 是一個環,不知道什麼是環的自行百度,百度百科

既然有結合律了。就能夠快速冪。

那麼有結論:上述方程的解爲 x = ( b + i ) p + 1 2 x=(b+i)^{\frac{p+1}2}

證實以下:

x 2 = ( b + i ) p + 1 = ( b + i ) p ( b + i ) \begin{aligned} x^2 &=(b+i)^{p+1} \\ &=(b+i)^p(b+i) \end{aligned}

其中,由二項式定理

( b + i ) p = k = 0 p C p k b k i p k (b+i)^p=\sum_{k=0}^pC_p^kb^ki^{p-k}

顯然當 k ̸ = 0  or  p k\not= 0\text{ or }p C p k 0 ( m o d p ) C_p^k\equiv 0\pmod p

因此有

( b + i ) p b p + i p b p 1 b + w p 1 2 i b i ( m o d p ) (b+i)^p\equiv b^p+i^p \equiv b^{p-1}b+w^{\frac{p-1}2}i\equiv b-i\pmod p

這個式子的推出同時用到了費馬小定理和二次非剩餘的特殊性質。

因此能夠推出:

x 2 ( b i ) ( b + i ) b 2 w a ( m o d p ) x^2\equiv (b-i)(b+i)\equiv b^2-w\equiv a\pmod p

4.1.3 尋找二次非剩餘

因爲前文已經敘述了,因爲有 t 2 ( p t ) 2 ( m o d p ) t^2\equiv (p-t)^2\pmod p ,因此二次剩餘的數量不會超過 O ( p 2 ) O(\frac{p}2) ,咱們隨機出來一個數就有將近 1 / 2 1/2 的機率是二次非剩餘,直接隨機尋找便可,指望次數爲 2 2

4.2 p爲奇質數且k>1的狀況

4.2.1 解的存在性

進行解的存在性判斷稍微麻煩了一些

設: a = p c m a=p^cm p m p\nmid m

c k c\ge k ,直接返回0。

c < k c < k ,有解多了一個前提條件: c % 2 = 0 c\%2=0

必要性證實:

設:

x 0 2 a ( m o d p k ) x_0^2\equiv a\pmod{p^k}
x 0 = p t n , n % p ̸ = 0 x_0=p^tn,n\%p\not=0

因此

x 0 2 = p 2 t n 2 x_0^2=p^{2t}n^2

2 t < k 2t < k ,有以下推論:

( p 2 t s )   %   p k = p 2 t ( s   %   p k 2 t ) (p^{2t}s)\text{ }\%\text{ }p^k=p^{2t}(s\text{ }\%\text{ }p^{k-2t})

因此 p 2 t a p^{2t}|a ,同時咱們也能夠這樣將原方程化爲

x 0 2 a / p c ( m o d p k c ) x_0^2\equiv a/p^c\pmod {p^{k-c}}

當新方程有解時,原方程也有解,將上面歐拉定則裏面推理用的 p 1 p-1 換成 ϕ ( p k c ) \phi(p^{k-c}) 就好了。

最後解爲 x = x 0 × p c 2 x=x_0\times p^{\frac{c}2}

因此接下來只討論 p a p\nmid a 的狀況。

4.2.2 從Cipolla推動

如今求解方程

x 2 a ( m o d p k ) x^2\equiv a\pmod {p^k}

其中 p a p\nmid a

先解出

r 2 a ( m o d p ) r^2\equiv a\pmod p

那麼有

( r 2 a ) = k p ( r 2 a ) k 0 ( m o d p k ) (r^2-a)=kp\Rightarrow (r^2-a)^k\equiv 0\pmod {p^k}

( r 2 a ) k t 2 u 2 a ( m o d p ) k (r^2-a)^k\equiv t^2-u^2a\pmod p^k

咱們有

( r a ) k = t u a ( r + a ) k = t + u a (r-\sqrt a)^k=t-u\sqrt a \\ (r+\sqrt a)^k=t+u\sqrt a

這個運算仍然在擴域後進行。(能夠證實上式顯然是成立的,由二項式定理)

最終咱們有

t 2 u 2 a ( m o d p k ) t^2\equiv u^2a\pmod {p^k}

解出來的方程就是

t 2 u 2 a ( m o d p k ) t^2u^{-2}\equiv a\pmod {p^k}

顯然

g c d ( t , p ) = g c d ( u , p ) = 1 gcd(t,p)=gcd(u,p)=1

因此逆元用擴展歐幾里得求一下就好了。

4.3 p=2的狀況

4.3.1 解的存在性

處理冪的方法與上面這種狀況差很少,咱們效仿上面先化成

x 2 a ( m o d 2 k ) , 2 a x^2\equiv a \pmod{2^k},2\nmid a

那麼如今呢,沒有歐拉準則了啊。

從特殊狀況談起,先打一個表,把那些有解的 a a 找出來

k 有解的a
1 1
2 1
3 1
4 1,9
5 1,9,17,25
6 1,9,17,25,33,41,49,57

彷佛當且僅當 a 1 ( m o d 8 ) a\equiv1\pmod{8} 的時候有解啊。。。

實際上,咱們有以下的蘊含關係:

a 1 ( m o d 8 ) x , x 2 a ( m o d 2 k ) a\equiv1\pmod{8}\Leftrightarrow \exist x,x^2\equiv a\pmod{2^k}

必要性: 因爲存在解 x 0 , x 0 2 a ( m o d 2 k ) x_0,x_0^2\equiv a\pmod{2^k}

因爲 g c d ( a , 2 ) = 1 gcd(a,2)=1 ,因此 g c d ( x 0 , 2 ) = 1 gcd(x_0,2)=1 ,不妨設 x 0 = 2 t + 1 x_0=2t+1

因此

a x 0 2 ( 2 t + 1 ) 2 4 t ( t + 1 ) + 1 ( m o d 2 k ) a\equiv x_0^2\equiv (2t+1)^2\equiv 4t(t+1)+1\pmod{2^k}

顯然 8 4 t ( t + 1 ) 8\mid 4t(t+1) ,因此 a 1 ( m o d 8 ) a\equiv 1\pmod8

充分性: 由下面敘述的求解方法易證。也就是說,在可以求出解的狀況下,解老是存在 (廢話)

4.3.2 找規律+遞推

1. k 2 k\le2
特判。

2. k = 3 k=3
二次剩餘方程 x 2 a ( m o d 2 3 ) x^2\equiv a\pmod {2^3} 有解,當且僅當 a 1 ( m o d 2 3 ) a\equiv 1\pmod{2^3} ,且本質不一樣的解有四個: ± 1 , ± 5 \pm1,\pm5

換句話說,咱們能夠將這個解記爲 x = ± ( x 3 + t 3 × 2 2 ) , t 3 Z , x 3 = 1  or  5 x=\pm(x_3+t_3\times 2^2),t_3\in\mathbb Z,x_3=1\text{ or }5

3. k > 3 k > 3

假設咱們已經知道方程 x 2 a ( m o d 2 q 1 ) x^2\equiv a\pmod{2^{q-1}}
的解,顯然解能夠表示成 x q = ± ( x q 1 + t q 1 × 2 q 2 ) , t q 1 Z x_q=\pm(x_{q-1}+t_{q-1}\times 2^{q-2}),t_{q-1}\in \mathbb Z

考慮如何推導出 x q x_q t q t_q

爲了方便,後面記 a i = a % 2 i a_i=a\% 2^i

對於一個 x 2 a ( m o d 2 q 1 ) x^2\equiv a\pmod{2^{q-1}} x q 1 x_{q-1} 來講,在 % 2 q \%2^q 意義下,只可能有:

x q 1 2 a q 1 ( m o d 2 q ) x q 1 2 a q 1 + 2 q 1 ( m o d 2 q ) \begin{aligned} &x_{q-1}^2\equiv a_{q-1} &\pmod{2^q} \\ 或是&x_{q-1}^2\equiv a_{q-1}+2^{q-1}&\pmod{2^q} \end{aligned}

因此咱們就要求出合適的 t q 1 t_{q-1} 的值,先代入方程 x 2 a ( m o d 2 q ) x^2\equiv a\pmod {2^q}

( x q 1 + 2 q 2 × t q 1 ) 2 a q ( m o d 2 q ) x q 1 2 + 2 q 1 t q 1 a q ( m o d 2 q ) t q 1 a q x q 1 2 2 q 1 ( m o d 2 ) \begin{aligned} (x_{q-1}+2^{q-2}\times t_{q-1})^2 & \equiv a_q &\pmod{2^q} \\ x_{q-1}^2+2^{q-1}t_{q-1}&\equiv a_q &\pmod{2^q} \\ t_{q-1}& \equiv \frac{a_q-x_{q-1}^2}{2^{q-1}} &\pmod{2} \end{aligned}

因此知足要求的 t q 1 = a q x q 1 2 2 q 1 + 2 × t q , t q Z t_{q-1}=\frac{a_q-x_{q-1}^2}{2^{q-1}}+2\times t_q,t_q\in \mathbb{Z}

回到方程 x 2 a ( m o d 2 q ) x^2\equiv a \pmod{2^q} 它的解就是

x = ± ( x q 1 + a q x q 1 2 2 + 2 k 1 × t k ) , t k Z x=\pm(x_{q-1}+\frac{a_q-x_{q-1}^2}{2}+2^{k-1}\times t_k),t_k\in\mathbb{Z}

q = 3 q=3 的狀況開始一路遞推便可。

P.S.:原本還想講三次剩餘娛樂一下,結果發現沒有題。。。

其實三次剩餘比二次剩餘要簡單,有興趣的能夠自行了解一下。


四,常見積性函數以及性質

幾個定義:

  1. 數論函數:定義域爲 N + \mathbb{N^+} ,陪域爲複數域的函數。
  2. 積性函數:對於數論函數 f ( n ) f(n) ,若是對於 a , b , N + , g c d ( a , b ) = 1 \forall a,b,\in \mathbb{N^+},gcd(a,b)=1 ,都有 f ( a b ) = f ( a ) f ( b ) f(ab)=f(a)f(b) ,則 f ( n ) f(n) 是一個積性函數。
  3. 徹底積性函數:對於數論函數 f ( n ) f(n) ,若是對於 a , b , N + \forall a,b,\in \mathbb{N^+} ,都有 f ( a b ) = f ( a ) f ( b ) f(ab)=f(a)f(b) ,則 f ( n ) f(n) 是一個徹底積性函數。

證實一個函數是積性函數有顯然的好處,可以加速處理出函數值。
當咱們須要處理 f ( n ) f(n) 的時候,若是直接求會出現效率問題,求出 n = i = 1 t p i k i n=\prod_{i=1}^tp_i^{k_i} ,則 f ( n ) = i = 1 t f ( p i k i ) f(n)=\prod_{i=1}^tf(p_i^{k_i})

在接下來的討論中,全部函數不考慮恆等於 0 0 的常數函數。

一些記號:

  1. 定義函數的逐點加法和逐點乘法:
    ( f × g ) ( n ) = f ( n ) × g ( n ) (f\times g)(n)=f(n)\times g(n)

( f + g ) ( n ) = f ( n ) + g ( n ) (f+g)(n)=f(n)+g(n)
接下來有一部分可能會由於筆者的sb錯誤將 × \times \cdot 混用,不過不會引發歧義。
2. [ a ] [a] ,條件求值表達式,當表達式 a a 爲真的時候, [ a ] [a] 值爲 1 1 ,不然值爲 0 0

1.Dirichlet卷積

定義兩個數論函數的Dirichlet卷積爲:

( f g ) ( n ) = d n f ( d ) g ( n d ) (f*g)(n)=\sum_{d\mid n}f(d)g(\frac{n}d)

Dirichlet卷積的性質:

  1. 交換律: f g = g f f*g=g*f
  2. 結合律: ( f g ) h = f ( g h ) (f*g)*h=f*(g*h)
  3. 分配率: f ( g + h ) = f g + f h f*(g+h)=f*g+f*h
  4. 單位元: f ϵ = ϵ f = f f*\epsilon=\epsilon*f=f ,其中 ϵ ( n ) = [ n = 1 ] \epsilon(n)=[n=1] ,是徹底及性函數
  5. 對於兩個積性函數 f , g f,g ,它們的 D i r i c h l e t Dirichlet 卷積也是積性函數

2.常見積性函數

  1. 除數函數: n n 的約數的 k k 次冪之和, σ k ( n ) = d n d k \sigma_k(n)=\sum_{d\mid n}d^k
  2. 約數個數函數: n n 的約數個數, d ( n ) = σ 0 ( n ) = d n 1 d(n)=\sigma_0(n)=\sum_{d\mid n}1
  3. 約數和函數: n n 的全部約數之和, σ ( n ) = σ 1 ( n ) = d n d \sigma(n)=\sigma_1(n)=\sum_{d\mid n}d
  4. 歐拉函數: [ 1 , n ] [1,n] 中與 n n 互質的數的個數, ϕ ( n ) = φ ( n ) = i = 1 n [ g c d ( i , n ) = 1 ] \phi(n)=\varphi(n)=\sum_{i=1}^n[gcd(i,n)=1]
  5. 莫比烏斯函數:若 n n 有平方因子,則 μ ( n ) = 0 \mu(n)=0 ,不然,假設 n n k k 個不一樣的質數相乘獲得, μ ( n ) = ( 1 ) k \mu(n)=(-1)^k ,實際上,莫比烏斯函數的定義式爲 d n μ ( d ) = [ n = 1 ] \sum_{d\mid n}\mu(d)=[n=1]
  6. 元函數: ϵ ( n ) = [ n = 1 ] \epsilon(n)=[n=1] ,徹底積性。
  7. 冪函數: I d k ( n ) = n k Id_k(n)=n^k ,徹底積性。
  8. 恆等函數: I ( n ) = I d 0 ( n ) = 1 I(n)=Id_0(n)=1 ,徹底積性。
  9. 單位函數: I d ( n ) = I d 1 ( n ) = n Id(n)=Id_1(n)=n ,徹底積性。

2.1 一些Dirichlet卷積恆等式

d ( n ) = d n 1 , d = I I σ ( n ) = d n d , σ = I I d ϵ ( n ) = d n μ ( d ) , ϵ = μ I ϕ ( n ) = d n μ ( d ) n d , ϕ = μ I d I d ( n ) = d n ϕ ( d ) , I d = ϕ I \begin{aligned} &d(n)=\sum_{d\mid n}1,&&即d=I*I\\ &\sigma(n)=\sum_{d\mid n}d,&&即\sigma=I*Id\\ &\epsilon(n)=\sum_{d\mid n}\mu(d),&&即\epsilon=\mu*I\\ &\phi(n)=\sum_{d\mid n}\mu(d)\frac{n}d,&&即\phi=\mu*Id\\ &Id(n)=\sum_{d\mid n}\phi(d),&&即Id=\phi*I \end{aligned}

在接下來的部分中,將會證實後兩個式子(前三個直接由定義獲得)。

不過如今先看一個東西: g ( n ) = d n f ( d ) g(n)=\sum_{d\mid n}f(d) ,即 g = f I g=f*I ,咱們有結論:若是 g g 是積性函數,則 f f 必然是積性函數(由Dirichlet卷積的性質不難發現 f f 是積性函數的時候 g g 必定是積性函數)。

證實: n = m 1 m 2 g c d ( m 1 , m 2 ) = 1 n=m_1m_2,gcd(m_1,m_2)=1

因爲 g g 是積性函數,則 g ( m 1 m 2 ) = g ( m 1 ) g ( m 2 ) g(m_1m_2)=g(m_1)g(m_2)

展開左邊獲得:

g ( m 1 m 2 ) = d m 1 m 2 f ( d ) = d 1 m 1 d 2 m 2 f ( d 1 d 2 ) g(m_1m_2)=\sum_{d\mid m_1m_2}f(d)=\sum_{d_1\mid m_1}\sum_{d_2\mid m_2}f(d_1d_2)

展開右邊獲得:

g ( m 1 ) g ( m 2 ) = d 1 m 1 d 2 m 2 f ( d 1 ) f ( d 2 ) g(m_1)g(m_2)=\sum_{d_1\mid m_1}\sum_{d_2\mid m_2}f(d_1)f(d_2)

因此獲得:

d 1 m 1 d 2 m 2 f ( d 1 d 2 ) = d 1 m 1 d 2 m 2 f ( d 1 ) f ( d 2 ) \sum_{d_1\mid m_1}\sum_{d_2\mid m_2}f(d_1d_2)=\sum_{d_1\mid m_1}\sum_{d_2\mid m_2}f(d_1)f(d_2)

由恆等式的性質能夠獲得 f ( d 1 d 2 ) = f ( d 1 ) f ( d 2 ) f(d_1d_2)=f(d_1)f(d_2) 。因此 f f 是積性函數。

固然,咱們也能夠構造另外一個 g ( n 2 ) g(n_2) ,展開後相減也能獲得上述結論。

3. 一些積性函數的特性

該部分默認 n n 的惟一分解式爲: n = i = 1 t p i k i n=\prod_{i=1}^tp_i^{k_i} ,且空的 \prod 默認值爲 1 1

3.1 歐拉函數

1. ϕ ( n ) = i = 1 t ( p i 1 ) p i k i 1 = n i = 1 t ( 1 1 p i ) \phi(n)=\prod_{i=1}^{t}(p_i-1)p_i^{k_i-1}=n\prod_{i=1}^{t}(1-\frac{1}{p_i})

2.降冪大法:歐拉定理和廣義歐拉定理

3. I d ( n ) = d n ϕ ( d ) Id(n)=\sum_{d\mid n}\phi(d) ,即 I d = ϕ I Id=\phi*I

證實: 顯然歐拉函數 ϕ ( n ) \phi(n) 能夠表明一個東西——分母爲 n n 的最簡真分數個數,特別的, ϕ ( 1 ) = 1 \phi(1)=1 表示 1 1 \frac{1}{1} 這個分數。

1 n , 2 n , 3 n , n n \frac{1}n,\frac{2}{n},\frac{3}n,…\frac{n}n ,排成一列,化簡後以分母分類統計便可獲得上式。

4. ϕ ( n ) = d n μ ( d ) n d \phi(n)=\sum_{d\mid n}\mu(d)\frac{n}d ,即 ϕ = μ I d \phi=\mu*Id

首先由剛纔證實的結論 I d = ϕ I Id=\phi*I ,兩邊捲上一個 μ \mu 獲得 I d μ = ϕ I μ Id*\mu=\phi*I*\mu

由結合律獲得 ϕ I μ

相關文章
相關標籤/搜索