(初等数论基础概念就不普及了)
一些前置姿势:
素数分布:素数有无限个,用 π ( x ) \pi(x) π(x)表示小于 x x x的素数个数,则随着 x x x的增长,有 π ( x ) = Θ ( x ln x ) \pi(x)=\Theta(\frac{x}{\ln x}) π(x)=Θ(lnxx),同时蕴含常数 1 1 1。
这个结论可以用于估计某些与枚举素数有关的算法的复杂度。
算术基本定理,又称唯一分解定理。
对于任意正整数 n n n,唯一存在以下分解: n = ∏ i p i k i n=\prod_i p_i^{k_i} n=∏ipiki
其中所有 p i p_i pi均为质数,且从小到大排列。
O ( log a ) O(\log a) O(loga)的 g c d gcd gcd算法和 e x g c d exgcd exgcd算法默认大家都会,并且知道exgcd怎么求模意义下本质不同解的个数以及输出所有解。
同余的一些术语大家假装都听得懂吧(不然没法讲了。。。)
首先大家都会线性筛 O ( n ) O(n) O(n)筛出一部分质数
显然我们有试除法可以在 O ( n ) O(\sqrt n) O(n)时间内判断一个数是否是质数。
当然可以通过只枚举质数优化至 O ( n ln n ) O(\frac{\sqrt n}{\ln n}) O(lnnn)
但是有的时候试除法复杂度也不够优秀,所以就需要Miller-Rabin算法。
首先Miller-Rabin算法是一个随机算法,同时是一个概率算法(换句话说,有可能出错)
不过当测试次数足够多的时候,出错概率相当小就是了(反正脸黑的就多测几次就行了)。
前置姿势:
设 x 2 ≡ 1 ( m o d p ) x^2\equiv 1\pmod p x2≡1(modp),则 x 2 = 1 + p k x^2=1+pk x2=1+pk,有 ( x + 1 ) ( x − 1 ) = p k (x+1)(x-1)=pk (x+1)(x−1)=pk。
必须有 p ∣ x + 1 p\mid x+1 p∣x+1或 p ∣ x − 1 p\mid x-1 p∣x−1,分别对应 x ≡ p − 1 ( m o d p ) x\equiv p-1\pmod p x≡p−1(modp)和 x ≡ 1 ( m o d p ) x\equiv 1\pmod p x≡1(modp)。
一般我选择的是重复3~5次。
同样的我们可以用试除法,复杂度同样不够优秀。。。
下面介绍一种根本没人用的方法:Fermat整数分解法。
首先,这个方法复杂度玄学,但是好于试除法。
怎么理解玄学这个事情。。。目前没有任何关于这个算法复杂度上界,下界,期望,渐进紧确界的任何断言或推论。
然后来看Pollard-Rho算法
同样的,这个也是一个随机算法,一部分效率是要看脸的。
考虑对于 ∀ a , n ∈ N ∗ , g c d ( a , n ) ∣ n \forall a,n\in \mathbb N_*,gcd(a,n)\mid n ∀a,n∈N∗,gcd(a,n)∣n。
而本身 g c d gcd gcd的复杂度只有 O ( log n ) O(\log n) O(logn)级别,这给了我们启示,如何构造出一个靠谱的数 a a a,使得他包含 n n n的因子,就成了非常重要的问题。
一下直接假设 a a a是 n n n的因子且 a ≤ n a\leq \sqrt n a≤n,因为不是的那部分显然不重要。
我们在这个寻找过程中加入随机因素。
构造函数 f ( x , n ) = ( x 2 + c ) % n f(x,n)=(x^2+c)\%n f(x,n)=(x2+c)%n,其中 c c c是在每次Pollard-Rho之前决定好的在 [ 1 , n ) [1,n) [1,n)中的正整数,保证在 x = 1 x=1 x=1的时候不会陷入死循环中。
构造序列 { x } \{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) x1=rand(),xi=f(xi−1,n)。我们可以认为它是近似随机的。(据说某版本C++的rand()也是这样实现的,不过略有区别)。
显然这个序列的轨迹要么是一个环,要么就是一个 ρ \rho ρ形(根据抽屉原理),且环长在 O ( n ) O(\sqrt n) O(n)的级别内,这个环暂且称为一环。
还有,澄清一点,很多博客声称这个 f f f函数是单射函数。。。但是显然不是,否则怎么来的 ρ \rho ρ形轨迹。至少显然 f ( x , n ) = f ( n − x , n ) f(x,n)=f(n-x,n) f(x,n)=f(n−x,n), f f f就已经不是单射函数了。
然后考虑序列 { y } \{y\} {y},其中 y i = x i % a y_i=x_i\%a yi=xi%a(注意这里 a a a仍然是一个未知数),同理这个轨迹依然要么是环形要么是 ρ \rho ρ形,根据生日悖论,其环长在 O ( a ) ≤ O ( n 4 ) O(\sqrt a)\leq O(\sqrt[4]n) O(a)≤O(4n)规模。
考虑一环上两个不同的位置 x i ̸ = x j x_i\not=x_j xi̸=xj,如果它们对应二环上同一个位置 y i = y j y_i=y_j yi=yj,则有 j − i = O ( a ) , a ∣ ∣ x j − x i ∣ j-i=O(\sqrt a),a\mid |x_j-x_i| j−i=O(a),a∣∣xj−xi∣
这又给我们带来了一些启发。
如果我们能够找到一个 y i = x i % a y_i=x_i\%a yi=xi%a,然后 O ( a ) O(\sqrt a) O(a)枚举 x j x_j xj,当发现 1 < g c d ( n , ∣ x i − x j ∣ < n ) 1< gcd(n,|x_i-x_j| < n) 1<gcd(n,∣xi−xj∣<n)的时候,我们就找到了一个因数。
但是注意,目前 a a a仍然是一个未知数。
可以采用两种办法,Floyd判圈算法或者Brent‘s找环算法’。
由于Floyd判圈跑的贼慢,所以这里只介绍Brent’s。
考虑处理一个因子时候的复杂度,若环长为 k 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(2k)+O(22k)+…+O(2zk)。
这个数列是收敛的,化求和为积分后我们得到 T ( n ) = O ( k ) = O ( n 4 ) T(n)=O(k)=O(\sqrt[4]n) T(n)=O(k)=O(4n),蕴含常数为 2 2 2。套上一个 g c d gcd gcd就是 O ( n 4 log n ) O(\sqrt [4]n\log n) O(4nlogn)。
考虑计算所有因子的复杂度:
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) T(n)≤O(4nlogn)+T(2n)+T(4n)+…+T(2zn)=O(4nlogn)。
然而实际上由于初期小因子较多,分解速度快,这个复杂度只有非常非常不走运的时候才会被卡到。
以Fermat分解和二次剩余为基础的筛法,等熟练掌握Fermat和二次剩余之后再来看吧,这里放一个whzzt的博客:https://blog.csdn.net/whzzt/article/details/81069289
而且这个比Pollard-Rho快(小声BB),准确来说,复杂度远远优于Pollard-Rho。
不过比Pollard-Rho难写就是了。
凭借强大的中国剩余定理,我们能够对很多同余问题进行快速的分解与合并,使得我们只需要考虑模数为质数的若干次幂的情况。
形如 f ( x ) ≡ a ( m o d n ) f(x)\equiv a\pmod n f(x)≡a(modn)的方程成为一元线性同余方程,其中 f ( x ) f(x) f(x)中只包含关于 x x x的线性变换。
相信大家都会用ex欧几里得来解,这里就不赘述了。
由若干个一元线性同余方程共同构成的方程组就是一元线性同余方程组 (废话)
一般把一元线性同余方程组写成这样:
{ 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. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡a1(modm1)x≡a2(modm2)……x≡at(modmt)
当对于 ∀ 1 ≤ i , j ≤ t . i ̸ = j \forall 1\leq i,j \leq t.i\not=j ∀1≤i,j≤t.i̸=j,都有 g c d ( m i , m j ) = 1 gcd(m_i,m_j)=1 gcd(mi,mj)=1的时候,以上方程恒有解,我们可以直接采用中国剩余定理求解。
考虑如果我们能够得到一个数列 { e } \{e\} {e},对于 ∀ 1 ≤ i , j ≤ t , i ̸ = j \forall 1\leq i,j\leq t,i\not=j ∀1≤i,j≤t,i̸=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. {ei≡1(modmi)ei≡0(modmj)
那么我们就能够很简单的得到答案了,就是
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} x≡i=1∑teiai(modi=1∏tmi)
这个正确性是十分显然的,那么我们现在要做的就是构造出一个合法的 { e } \{e\} {e}序列。
设 M = ∏ i = 1 t m i M=\prod_{i=1}^tm_i M=∏i=1tmi, M i = M m i M_i=\frac{M}{m_i} Mi=miM, M i − 1 M i ≡ 1 ( m o d m i ) M_i^{-1}M_i\equiv 1\pmod {m_i} Mi−1Mi≡1(modmi)
则可以直接得到满足条件的 e i ≡ M i − 1 M i ( m o d M ) e_i\equiv M_i^{-1}M_i\pmod M ei≡Mi−1Mi(modM)
按照上面写的算一算就行了。
当 ∃ 1 ≤ i , j ≤ t , i ̸ = j \exist 1\leq i,j \leq t,i\not=j ∃1≤i,j≤t,i̸=j,有 g c d ( m i , m j ) ̸ = 1 gcd(m_i,m_j)\not=1 gcd(mi,mj)̸=1的时候,上面的方法不再适用了,我们需要一种更加通用的方法来计算方程组的解。
现在,考虑合并两个方程。
x ≡ a 1 ( m o d m 1 ) x\equiv a_1\pmod {m_1} x≡a1(modm1)
x ≡ a 2 ( m o d m 2 ) x\equiv a_2\pmod {m_2} x≡a2(modm2)
现在显然可以设: 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=a1+y1m1=a2+y2m2。
而新的方程显然就是 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)} x≡a1+y1m1≡a2+y2m2(modlcm(m1,m2))
显然现在需要解决的方程就是这个:
a 1 − a 2 = y 2 m 2 − y 1 m 1 a_1-a_2=y_2m_2-y_1m_1 a1−a2=y2m2−y1m1
相信大家都会直接用扩展欧几里得求解,随便解出一个合法的 y 1 , y 2 y_1,y_2 y1,y2代回去就能得到一个新的方程,当上述方程无解时,方程组无解。
两两合并得到的最后一个方程就是答案。
原根:对于正整数 n n n,它的原根是一个满足如下条件的正整数 a a a: g c d ( a , n ) = 1 gcd(a,n)=1 gcd(a,n)=1,且 a , a 2 , a 3 . . . a ϕ ( n ) a,a^2,a^3...a^{\phi(n)} a,a2,a3...aϕ(n)在 % n \%n %n意义下两两不同余。
关于原根的几个结论(以下的 p p p都是指奇质数)
证明:因为懒得写,咕了。
一般来说题目要求的数的原根都不会太大,所以暴力枚举 [ 2 , ⌊ n 4 ⌋ ] [2,\lfloor\sqrt[4]n\rfloor] [2,⌊4n⌋]就行了。
问题在于怎么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 gcd(a,n)=1⇒aϕ(n)≡1(modn)
所以循环节长度 s s s必然有 s ∣ ϕ ( n ) s\mid \phi(n) s∣ϕ(n)
所以我们求出 ϕ ( n ) \phi(n) ϕ(n)的唯一分解,枚举所有的 p ∣ ϕ ( n ) p\mid \phi(n) p∣ϕ(n),然后判断 a ϕ ( n ) p ̸ ≡ 1 ( m o d n ) a^{\frac{\phi(n)}{p}}\not\equiv 1\pmod n apϕ(n)̸≡1(modn),所有 p p p上式都成立则找到一个原根 a a a。
如果 n n n有原根 g g g,且
g r ≡ a ( m o d n ) g^r\equiv a\pmod n gr≡a(modn)
成立,则称 r r r是以 g g g为底的 a a a对 n n n的一个指标。
记作 r = i n d g a r=ind_ga r=indga
求指标可以用BSGS。
指标有以下性质:
离散对数问题:求解形如
A x ≡ B ( m o d C ) A^x\equiv B\pmod {C} Ax≡B(modC)
的同余方程。
我们先考虑 g c d ( A , C ) = 1 gcd(A,C)=1 gcd(A,C)=1的情况,显然此时只有当 g c d ( B , C ) = 1 gcd(B,C)=1 gcd(B,C)=1的时候有解。
A x A^x Ax对 C C C取模的结果随着 x x x的变化具有周期性,最长周期为 C − 1 C-1 C−1。
证明:由抽屉原理易证。
所以我们只需要得到 x ∈ [ 0 , C − 1 ] x\in [0,C-1] x∈[0,C−1]的答案就行了。
那么现在怎么解决这个东西。。。(注意解出来不是一个同余等价类啊,就是说 C R T CRT CRT在这里毫无用武之地了)
朴素的枚举显然是 O ( C ) O(C) O(C),考虑优化。
这时候就要用到一种思想Baby-Step,Giant-Step,意味小步大步,简称为BSGS。民间称呼数不胜数:拔山盖世,北上广深,百度搜索谷歌搜索
我们将这 C C C个数分为 n n n组,每组 m = ⌈ C n ⌉ m=\lceil\frac{C}n\rceil m=⌈nC⌉个数。对每一组进行询问,在这组 m m m个数内是否有答案。
这时候答案可以看成是: A i m − y ≡ B ( m o d C ) A^{im-y}\equiv B\pmod C Aim−y≡B(modC)
由于 g c d ( A , C ) = 1 gcd(A,C)=1 gcd(A,C)=1,所以 A A A在 % C \%C %C意义下是存在逆元的,这时候就可以将上面这个方程等价转化为 A i m ≡ A y B ( m o d C ) A^{im}\equiv A^{y}B\pmod C Aim≡AyB(modC)
我们将 y = 1 , 2 , . . . m y=1,2,...m y=1,2,...m的所有 A y B A^yB AyB存到一个哈希表内,然后 O ( n ) O(n) O(n)枚举 i i i计算 A i m A^{im} Aim的值,再到哈希表中查询就可以得到我们的答案了。
总的复杂度 O ( C n ) + O ( n ) O(\frac{C}n)+O(n) O(nC)+O(n),当 n = C n=\sqrt C n=C的时候取得最小值,此时复杂度为 O ( C ) O(\sqrt C) O(C)
现在尝试解决当 g c d ( A , C ) ̸ = 1 gcd(A,C)\not=1 gcd(A,C)̸=1时候的离散对数问题。
在已经有了解决 g c d ( A , C ) = 1 gcd(A,C)=1 gcd(A,C)=1的问题的方案的时候,我们考虑将这个问题转化成 g c d ( A , C ) = 1 gcd(A,C)=1 gcd(A,C)=1的情况。
现在将原方程 A x ≡ B ( m o d C ) A^x\equiv B\pmod C Ax≡B(modC)进行一点转化:
A x = B + C y A^x=B+Cy Ax=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} d1=gcd(A,C),C1=d1C,B1=d1B,得到等价方程:
A d 1 A x − 1 = B 1 + y C 1 \frac{A}{d_1}A^{x-1}=B_1+yC_1 d1AAx−1=B1+yC1
令 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} d2=gcd(A,C1),C2=d2C1,B2=d2B1,得到等价方程:
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 d1d2A2Ax−2=B2+yC2
一直处理到 n n n,直到 d n + 1 = 1 d_{n+1}=1 dn+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 ∏i=1ndiAnAx−n=Bn+yCn
其中 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} Bn=∏i=1ndiB,Cn=∏i=1ndiC。
如果 B n B_n Bn不是整数肯定就没有解了。
设 D = A n ∏ i = 1 n d i D=\frac{A^n}{\prod_{i=1}^nd_i} D=∏i=1ndiAn,显然 g c d ( D , C n ) = 1 , g c d ( A , C n ) = 1 gcd(D,C_n)=1,gcd(A,C_n)=1 gcd(D,Cn)=1,gcd(A,Cn)=1,即 D , A D,A D,A在 % C n \%C_n %Cn意义下存在逆元。
得到等价方程: D ⋅ A x − n ≡ B n ( m o d C n ) D\cdot A^{x-n}\equiv B_n\pmod{C_n} D⋅Ax−n≡Bn(modCn),即
A x − n ≡ B n ⋅ D − 1 ( m o d C n ) A^{x-n}\equiv B_n\cdot D^{-1}\pmod {C_n} Ax−n≡Bn⋅D−1(modCn)
现在已经转化成了 g c d ( A , C n ) = 1 gcd(A,C_n)=1 gcd(A,Cn)=1的形式了,直接上普通的BSGS就行了。
注意我们还需要先做一次 O ( log C ) O(\log C) O(logC)的枚举(显然 n n n不会超过 O ( log C ) O(\log C) O(logC)),因为最后的答案可能没有 n n n大,就是说可能 g c d gcd gcd的影响还没有完全消除,就已经得到 B B B了。
n n n次剩余问题:求解形如
x n ≡ a ( m o d m ) x^n\equiv a\pmod m xn≡a(modm)
的同余方程。
利用CRT我们可以把问题分解,设 m m m的唯一分解式为 m = ∏ i = 1 t p i k i m=\prod_{i=1}^tp_i^{k_i} m=∏i=1tpiki:
{ 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. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧xn≡a(modp1k1)xn≡a(modp2k2)……xn≡a(modptkt)
解完这 t t t个方程后用CRT合并回去就行了。
所以接下来只讨论求解 x n ≡ a ( m o d p k ) x^n\equiv a\pmod {p^k} xn≡a(modpk)这样的方程。
此时 p k p^k pk的原根一定存在,设这个原根为 g g g。
首先我们令 g c d ( a , p k ) = 1 gcd(a,p^k)=1 gcd(a,pk)=1,不然我们就看一看 a a a当中有几个 p p p,两边同时除去,如果总数不是 n n n的倍数,那么原方程无解,否则我们总是可以通过在最后的 x x x中乘上若干个 p p p来得到我们要的解。
首先我们用BSGS解一下这个方程:
g t ≡ a ( m o d p k ) g^t\equiv a\pmod {p^k} gt≡a(modpk)
解出来 t t t之后,我们设 x ≡ g z ( m o d p k ) x\equiv g^z\pmod{p^k} x≡gz(modpk),则我们得到这个方程:
g z n ≡ g t ( m o d p k ) g^{zn}\equiv g^{t} \pmod {p^k} gzn≡gt(modpk)
所以有 z n ≡ t ( m o d ϕ ( p k ) ) zn\equiv t\pmod{\phi(p^k)} zn≡t(modϕ(pk))
扩欧解一解就行了。
注意,扩欧没有解肯定就只能咕咕咕了。
有一个很显然的结论: x n ≡ a ( m o d 2 k ) x^n\equiv a\pmod {2^k} xn≡a(mod2k)的不充分前提是 x n ≡ a ( m o d 2 k − 1 ) x^n\equiv a \pmod{2^{k-1}} xn≡a(mod2k−1)
而如果 x n ≡ a ( m o d 2 k − 1 ) x^n\equiv a\pmod{2^{k-1}} xn≡a(mod2k−1),则要么 x n ≡ a ( m o d 2 k ) x^n\equiv a\pmod{2^k} xn≡a(mod2k)要么 ( x + 2 k − 1 ) n ≡ a ( m o d 2 k ) (x+2^{k-1})^n\equiv a\pmod{2^{k}} (x+2k−1)n≡a(mod2k)。
解的总个数不会很多(实测证明这个剪枝跑得飞快),暴力 d f s dfs dfs即可。
二次剩余问题:求解形如
x 2 ≡ a ( m o d m ) x^2\equiv a\pmod m x2≡a(modm)
的同余方程。
首先,还是先分解成 x 2 ≡ a ( m o d p k ) x^2\equiv a\pmod {p^k} x2≡a(modpk)来处理。
当然可以按照 n n n次剩余的套路来解。
不过我们现在有优秀的 O ( log p k ) O(\log p^k) O(logpk)的解法。
现在的方程就是这样的: x 2 ≡ a ( m o d p ) x^2\equiv a\pmod p x2≡a(modp)。
首先考虑一个问题,无解。
为什么会无解?显然 x 2 ≡ ( p − x ) 2 ( m o d p ) x^2\equiv (p-x)^2\pmod p x2≡(p−x)2(modp)根据抽屉原理,这样下来总有一些抽屉是空的,这就是无解的情况。
若 x 2 ≡ a ( m o d p ) x^2\equiv a\pmod p x2≡a(modp)有解,则称 a a a为 % p \%p %p意义下的二次剩余类。
否则称 a a a为 % p \%p %p意义下的二次非剩余类。
我们定义勒让德符号( L e g e n d r e s y m b o l Legendre\text{ }symbol Legendre 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. (pa)=⎩⎪⎨⎪⎧1−10a是%p下的二次剩余a是%p下的二次非剩余a≡0(modp)
我们有欧拉准则: ( a p ) ≡ a p − 1 2 ( m o d p ) (\frac{a}p)\equiv a^{\frac{p-1}2}\pmod p (pa)≡a2p−1(modp)。
证明: 首先 p ∣ a p\mid a p∣a的时候欧拉准则显然成立。
否则由费马小定理我们有 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1\pmod p ap−1≡1(modp)
所以必然有 a p − 1 2 ≡ ± 1 ( m o d p ) a^{\frac{p-1}{2}}\equiv \pm1\pmod p a2p−1≡±1(modp)
先证明 ( a p ) = 1 (\frac{a}{p})=1 (pa)=1的情况
必要性: 当 a a a是 % p \%p %p意义下的二次剩余,即 ∃ x , x 2 ≡ a ( m o d p ) \exist x,x^2\equiv a\pmod p ∃x,x2≡a(modp)。
那么我们有
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 a2p−1≡(x2)2p−1≡xp−1≡1(modp)
必要性证明完毕。
充分性: 设 p p p有一个原根 g g g,那么必然有 g i ≡ a ( m o d p ) g^i\equiv a\pmod p gi≡a(modp)。
则:
g i ( p − 1 ) 2 ≡ 1 ( m o d p ) g^{\frac{i(p-1)}2}\equiv 1(mod\text{ }p) g2i(p−1)≡1(mod p)
由于 g g g为原根,所以必然会有 ( p − 1 ) ∣ i ( p − 1 ) 2 (p-1)\mid\frac{i(p-1)}{2} (p−1)∣2i(p−1)
即 i i i是偶数。
必然存在解 x 0 ≡ g i 2 ( m o d p ) x_0\equiv g^{\frac{i}2}\pmod p x0≡g2i(modp)
充分性证毕。
那么 ( a p ) ≡ − 1 ( m o d p ) (\frac{a}p)\equiv-1\pmod p (pa)≡−1(modp)的情况也就十分显然了。
首先由费马小定理 a p − 1 2 ≡ ± 1 ( m o d p ) a^{\frac{p-1}{2}}\equiv \pm 1\pmod p a2p−1≡±1(modp)
由于前面的欧拉准则在 ( a p ) = 1 (\frac{a}{p})=1 (pa)=1的必要性,二次非剩余的情况下 x 2 ≡ a p − 1 ≡ − 1 ( m o d p ) x^2\equiv a^{p-1}\equiv -1\pmod p x2≡ap−1≡−1(modp),显然不可能,违反了费马小定理。
以下所有运算均在 % p \%p %p意义下进行
设 b 2 − a ≡ w ( m o d p ) b^2-a\equiv w\pmod p b2−a≡w(modp),其中 w w w是 % p \%p %p意义下的二次非剩余
由于 w w w在 % p \%p %p意义下不存在平方根,类似于虚数设 i = w i=\sqrt w i=w。类似于复数重新定义 % p \%p %p意义下一个数为 ( a , b ) (a,b) (a,b),即 a + b w a+b\sqrt w a+bw。
接下来定义一个代数系统 < G , + , × > <G,+,\times> <G,+,×>满足:
( a , b ) + ( c , d ) = ( a + c , b + d ) (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) (a,b)×(c,d)=(ac+bdw,ad+bc)
显然 G G G是一个环,不知道什么是环的自行百度,百度百科
既然有结合律了。就可以快速幂。
那么有结论:上述方程的解为 x = ( b + i ) p + 1 2 x=(b+i)^{\frac{p+1}2} x=(b+i)2p+1
证明如下:
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} x2=(b+i)p+1=(b+i)p(b+i)
其中,由二项式定理
( 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} (b+i)p=k=0∑pCpkbkip−k
显然当 k ̸ = 0 or p k\not= 0\text{ or }p k̸=0 or p, C p k ≡ 0 ( m o d p ) C_p^k\equiv 0\pmod p Cpk≡0(modp)
所以有
( 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 (b+i)p≡bp+ip≡bp−1b+w2p−1i≡b−i(modp)
这个式子的推出同时用到了费马小定理和二次非剩余的特殊性质。
所以可以推出:
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 x2≡(b−i)(b+i)≡b2−w≡a(modp)
由于前文已经叙述了,由于有 t 2 ≡ ( p − t ) 2 ( m o d p ) t^2\equiv (p-t)^2\pmod p t2≡(p−t)2(modp),所以二次剩余的数量不会超过 O ( p 2 ) O(\frac{p}2) O(2p),我们随机出来一个数就有将近 1 / 2 1/2 1/2的概率是二次非剩余,直接随机寻找即可,期望次数为 2 2 2。
进行解的存在性判断稍微麻烦了一些
设: a = p c m a=p^cm a=pcm, p ∤ m p\nmid m p∤m。
c ≥ k c\ge k c≥k,直接返回0。
当 c < k c < k c<k,有解多了一个前提条件: c % 2 = 0 c\%2=0 c%2=0
必要性证明:
设:
x 0 2 ≡ a ( m o d p k ) x_0^2\equiv a\pmod{p^k} x02≡a(modpk)
x 0 = p t n , n % p ̸ = 0 x_0=p^tn,n\%p\not=0 x0=ptn,n%p̸=0
所以
x 0 2 = p 2 t n 2 x_0^2=p^{2t}n^2 x02=p2tn2
当 2 t < k 2t < 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}) (p2ts) % pk=p2t(s % pk−2t)
所以 p 2 t ∣ a p^{2t}|a p2t∣a,同时我们也可以这样将原方程化为
x 0 2 ≡ a / p c ( m o d p k − c ) x_0^2\equiv a/p^c\pmod {p^{k-c}} x02≡a/pc(modpk−c)
当新方程有解时,原方程也有解,将上面欧拉定则里面推理用的 p − 1 p-1 p−1换成 ϕ ( p k − c ) \phi(p^{k-c}) ϕ(pk−c)就行了。
最后解为 x = x 0 × p c 2 x=x_0\times p^{\frac{c}2} x=x0×p2c。
所以接下来只讨论 p ∤ a p\nmid a p∤a的情况。
现在求解方程
x 2 ≡ a ( m o d p k ) x^2\equiv a\pmod {p^k} x2≡a(modpk)
其中 p ∤ a p\nmid a p∤a
先解出
r 2 ≡ a ( m o d p ) r^2\equiv a\pmod p r2≡a(modp)
那么有
( 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} (r2−a)=kp⇒(r2−a)k≡0(modpk)
令 ( 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 (r2−a)k≡t2−u2a(modp)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 (r−a)k=t−ua(r+a)k=t+ua
这个运算仍然在扩域后进行。(可以证明上式显然是成立的,由二项式定理)
最终我们有
t 2 ≡ u 2 a ( m o d p k ) t^2\equiv u^2a\pmod {p^k} t2≡u2a(modpk)
解出来的方程就是
t 2 u − 2 ≡ a ( m o d p k ) t^2u^{-2}\equiv a\pmod {p^k} t2u−2≡a(modpk)
显然
g c d ( t , p ) = g c d ( u , p ) = 1 gcd(t,p)=gcd(u,p)=1 gcd(t,p)=gcd(u,p)=1
所以逆元用扩展欧几里得求一下就行了。
处理幂的方法与上面这种情况差不多,我们效仿上面先化成
x 2 ≡ a ( m o d 2 k ) , 2 ∤ a x^2\equiv a \pmod{2^k},2\nmid a x2≡a(mod2k),2∤a
那么现在呢,没有欧拉准则了啊。
从特殊情况谈起,先打一个表,把那些有解的 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(mod8)的时候有解啊。。。
实际上,我们有如下的蕴含关系:
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} a≡1(mod8)⇔∃x,x2≡a(mod2k)
必要性: 由于存在解 x 0 , x 0 2 ≡ a ( m o d 2 k ) x_0,x_0^2\equiv a\pmod{2^k} x0,x02≡a(mod2k)
由于 g c d ( a , 2 ) = 1 gcd(a,2)=1 gcd(a,2)=1,所以 g c d ( x 0 , 2 ) = 1 gcd(x_0,2)=1 gcd(x0,2)=1,不妨设 x 0 = 2 t + 1 x_0=2t+1 x0=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} a≡x02≡(2t+1)2≡4t(t+1)+1(mod2k)
显然 8 ∣ 4 t ( t + 1 ) 8\mid 4t(t+1) 8∣4t(t+1),所以 a ≡ 1 ( m o d 8 ) a\equiv 1\pmod8 a≡1(mod8)
充分性: 由下面叙述的求解方法易证。也就是说,在能够求出解的情况下,解总是存在 (废话) 。
1. k ≤ 2 k\le2 k≤2
特判。
2. k = 3 k=3 k=3
二次剩余方程 x 2 ≡ a ( m o d 2 3 ) x^2\equiv a\pmod {2^3} x2≡a(mod23)有解,当且仅当 a ≡ 1 ( m o d 2 3 ) a\equiv 1\pmod{2^3} a≡1(mod23),且本质不同的解有四个: ± 1 , ± 5 \pm1,\pm5 ±1,±5
换句话说,我们可以将这个解记为 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 x=±(x3+t3×22),t3∈Z,x3=1 or 5
3. k > 3 k > 3 k>3
假设我们已经知道方程 x 2 ≡ a ( m o d 2 q − 1 ) x^2\equiv a\pmod{2^{q-1}} x2≡a(mod2q−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 xq=±(xq−1+tq−1×2q−2),tq−1∈Z
考虑如何推导出 x q x_q xq和 t q t_q tq。
为了方便,后面记 a i = a % 2 i a_i=a\% 2^i ai=a%2i
对于一个 x 2 ≡ a ( m o d 2 q − 1 ) x^2\equiv a\pmod{2^{q-1}} x2≡a(mod2q−1)解 x q − 1 x_{q-1} xq−1来说,在 % 2 q \%2^q %2q意义下,只可能有:
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} 或是xq−12≡aq−1xq−12≡aq−1+2q−1(mod2q)(mod2q)
所以我们就要求出合适的 t q − 1 t_{q-1} tq−1的值,先代入方程 x 2 ≡ a ( m o d 2 q ) x^2\equiv a\pmod {2^q} x2≡a(mod2q)
( 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} (xq−1+2q−2×tq−1)2xq−12+2q−1tq−1tq−1≡aq≡aq≡2q−1aq−xq−12(mod2q)(mod2q)(mod2)
所以满足要求的 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} tq−1=2q−1aq−xq−12+2×tq,tq∈Z
回到方程 x 2 ≡ a ( m o d 2 q ) x^2\equiv a \pmod{2^q} x2≡a(mod2q)它的解就是
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} x=±(xq−1+2aq−xq−12+2k−1×tk),tk∈Z
从 q = 3 q=3 q=3的情况开始一路递推即可。
P.S.:本来还想讲三次剩余娱乐一下,结果发现没有题。。。
其实三次剩余比二次剩余要简单,有兴趣的可以自行了解一下。
几个定义:
证明一个函数是积性函数有显然的好处,能够加速处理出函数值。
当我们需要处理 f ( n ) f(n) f(n)的时候,如果直接求会出现效率问题,求出 n = ∏ i = 1 t p i k i n=\prod_{i=1}^tp_i^{k_i} n=∏i=1tpiki,则 f ( n ) = ∏ i = 1 t f ( p i k i ) f(n)=\prod_{i=1}^tf(p_i^{k_i}) f(n)=∏i=1tf(piki)。
在接下来的讨论中,所有函数不考虑恒等于 0 0 0的常数函数。
一些记号:
( f + g ) ( n ) = f ( n ) + 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为真的时候, [ a ] [a] [a]值为 1 1 1,否则值为 0 0 0。
定义两个数论函数的Dirichlet卷积为:
( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) g ( n d ) (f*g)(n)=\sum_{d\mid n}f(d)g(\frac{n}d) (f∗g)(n)=d∣n∑f(d)g(dn)
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} d(n)=d∣n∑1,σ(n)=d∣n∑d,ϵ(n)=d∣n∑μ(d),ϕ(n)=d∣n∑μ(d)dn,Id(n)=d∣n∑ϕ(d),即d=I∗I即σ=I∗Id即ϵ=μ∗I即ϕ=μ∗Id即Id=ϕ∗I
在接下来的部分中,将会证明后两个式子(前三个直接由定义得到)。
不过现在先看一个东西: g ( n ) = ∑ d ∣ n f ( d ) g(n)=\sum_{d\mid n}f(d) g(n)=∑d∣nf(d),即 g = f ∗ I g=f*I g=f∗I,我们有结论:如果 g g g是积性函数,则 f f f必然是积性函数(由Dirichlet卷积的性质不难发现 f f f是积性函数的时候 g 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 n=m1m2,gcd(m1,m2)=1。
由于 g g g是积性函数,则 g ( m 1 m 2 ) = g ( m 1 ) g ( m 2 ) g(m_1m_2)=g(m_1)g(m_2) g(m1m2)=g(m1)g(m2)。
展开左边得到:
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(m1m2)=d∣m1m2∑f(d)=d1∣m1∑d2∣m2∑f(d1d2)
展开右边得到:
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) g(m1)g(m2)=d1∣m1∑d2∣m2∑f(d1)f(d2)
所以得到:
∑ 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) d1∣m1∑d2∣m2∑f(d1d2)=d1∣m1∑d2∣m2∑f(d1)f(d2)
由恒等式的性质可以得到 f ( d 1 d 2 ) = f ( d 1 ) f ( d 2 ) f(d_1d_2)=f(d_1)f(d_2) f(d1d2)=f(d