数论选讲(更新中)

2020年01月25日 阅读数:1450
这篇文章主要向大家介绍数论选讲(更新中),主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

数论选讲

文章目录

(初等数论基础概念就不普及了)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

由结合律获得 ϕ