一. 扩展欧拉定理
-
定理描述:
a x ≡ { a x m o d φ ( m ) G C D ( a , m ) = 1 a x m o d φ ( m ) + φ ( m ) G C D ( a , m ) ≠ 1 , x ≥ φ ( m ) ( m o d m ) a^x \equiv \begin{aligned} \begin{cases} a^{ x\ mod\ \varphi(m)}& GCD(a,\ m) = 1& \\ a^{ x\ mod\ \varphi(m) + \varphi(m)}& GCD(a,\ m)\not= 1,\ x \ge \varphi(m)& \end{cases} \end{aligned} (mod\ m) ax≡{ax mod φ(m)ax mod φ(m)+φ(m)GCD(a, m)=1GCD(a, m)=1, x≥φ(m)(mod m)
其中 a a a 是任意整数, x , m x,\ m x, m 是正整数。该定理可以简写为: a x ≡ a x m o d φ ( m ) + φ ( m ) ( m o d m ) a^x\equiv a^{x\ mod\ \varphi(m) + \varphi(m)}\ \ (mod\ m) ax≡ax mod φ(m)+φ(m) (mod m) ,其中 x ≥ φ ( m ) x\ge \varphi(m) x≥φ(m) ,不要求 G C D ( a , m ) = 1 GCD(a,\ m) = 1 GCD(a, m)=1。
-
前置芝士:
引理1:
{ x ≡ y ( m o d m 1 ) x ≡ y ( m o d m 2 ) ⇒ x ≡ y ( m o d L C M ( m 1 , m 2 ) ) \begin{cases} x \equiv y\ (mod\ m_1)\\ x \equiv y\ (mod\ m_2) \end{cases} \Rightarrow \ x\equiv y\ \ (mod\ LCM(m_1,\ m_2)) {x≡y (mod m1)x≡y (mod m2)⇒ x≡y (mod LCM(m1, m2))引理1证明:
由 已 知 得 , m 1 ∣ x − y , m 2 ∣ x − y 我 们 令 Δ = x − y , d = G C D ( m 1 , m 2 ) , m 1 = d n 1 , m 2 = d n 2 显 然 有 n 1 ∣ Δ , n 2 ∣ Δ ∵ G C D ( n 1 , n 2 ) = 1 ∴ n 1 n 2 ∣ Δ ∴ L C M ( m 1 , m 2 ) ∣ x − y ∴ x ≡ y ( m o d L C M ( m 1 , m 2 ) ) 由已知得, m_1\ |\ x-y ,m_2\ |\ x-y\\ 我们令\ \Delta = x-y,\ d = GCD(m_1,\ m_2),\ m_1 = dn_1,\ m_2=dn_2\\ 显然有\ n_1\ |\ \Delta,\ n_2\ |\ \Delta\\ \because GCD(n_1,\ n_2) = 1\\ \therefore n_1n_2\ |\ \Delta\\ \therefore LCM(m_1,\ m_2)\ |\ x-y\\ \therefore x\equiv y\ \ (mod\ LCM(m_1,\ m_2)) 由已知得,m1 ∣ x−y,m2 ∣ x−y我们令 Δ=x−y, d=GCD(m1, m2), m1=dn1, m2=dn2显然有 n1 ∣ Δ, n2 ∣ Δ∵GCD(n1, n2)=1∴n1n2 ∣ Δ∴LCM(m1, m2) ∣ x−y∴x≡y (mod LCM(m1, m2))
推论:-
当 G C D ( m 1 , m 2 ) = 1 GCD(m_1,\ m_2) = 1 GCD(m1, m2)=1 时, x ≡ y ( m o d m 1 m 2 ) x \equiv y\ (mod\ m_1m_2) x≡y (mod m1m2)
-
当有多个同余式时:
{ x ≡ y ( m o d m 1 ) x ≡ y ( m o d m 2 ) ⋮ x ≡ y ( m o d m n ) ⇒ x ≡ y ( m o d L C M ( m 1 , m 2 , … , m n ) ) \begin{cases} x \equiv y& (mod\ m_1)\\ x \equiv y& (mod\ m_2)\\ &\vdots\\ x \equiv y& (mod\ m_n) \end{cases} \Rightarrow x\equiv y\ (mod\ LCM(m_1,\ m_2,\ …,\ m_n)) ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡yx≡yx≡y(mod m1)(mod m2)⋮(mod mn)⇒x≡y (mod LCM(m1, m2, …, mn)) -
当 G C D ( m 1 , m 2 , … , m n ) = 1 GCD(m_1,\ m_2,\ …,\ m_n) = 1 GCD(m1, m2, …, mn)=1 时:
{ x ≡ y ( m o d m 1 ) x ≡ y ( m o d m 2 ) ⋮ x ≡ y ( m o d m n ) ⇒ x ≡ y ( m o d m 1 m 2 … m n ) \begin{cases} x \equiv y& (mod\ m_1)\\ x \equiv y& (mod\ m_2)\\ &\vdots\\ x \equiv y& (mod\ m_n) \end{cases} \Rightarrow x\equiv y\ (mod\ m_1\ m_2\ …\ m_n) ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡yx≡yx≡y(mod m1)(mod m2)⋮(mod mn)⇒x≡y (mod m1 m2 … mn)
引理2: p p p 是任意的素数, α \alpha α 是大于 1 1 1 的正整数,有 φ ( p α ) ≥ α \varphi(p^{\alpha})\ge \alpha φ(pα)≥α ,即 φ ( p α ) = p α − p α − 1 ≥ α \varphi(p^{\alpha})=p^{\alpha}-p^{\alpha-1}\ge \alpha φ(pα)=pα−pα−1≥α 。
引理2证明:我们先固定 α \alpha α 不动,即将 α \alpha α 视为常数,接着对 p p p 求导。
f ( p ) = p α − p α − 1 − α f ′ ( p ) = α p α − 1 − ( α − 1 ) p α − 2 ≥ α ( p α − 1 − p α − 2 ) > ( p − 1 ) ⋅ p α − 2 > 0 f(p)=p^{\alpha}-p^{\alpha-1}-\alpha\\ f'(p)=\alpha p^{\alpha-1}-(\alpha-1)p^{\alpha-2}\ge\alpha(p^{\alpha-1}-p^{\alpha-2})>(p-1)\cdot p^{\alpha-2} > 0 f(p)=pα−pα−1−αf′(p)=αpα−1−(α−1)pα−2≥α(pα−1−pα−2)>(p−1)⋅pα−2>0
显然对于任意的 α > 1 \alpha > 1 α>1 , f ( p ) f(p) f(p) 都是单调递增的,因此我们只需证明: f ( 2 ) = 2 α − 2 α − 1 − α ≥ 0 f(2)=2^{\alpha}-2^{\alpha-1}-\alpha \ge 0 f(2)=2α−2α−1−α≥0 。
g ( α ) = 2 α − 2 α − 1 − α = 2 α − 1 − α g ′ ( α ) = 2 α − 1 l n 2 − 1 ≥ g ′ ( 2 ) = 2 l n 2 − 1 > 0 g(\alpha)=2^{\alpha}-2^{\alpha-1}-\alpha=2^{\alpha-1}-\alpha\\ g'(\alpha)=2^{\alpha-1}ln2-1\ge g'(2)=2ln2-1>0 g(α)=2α−2α−1−α=2α−1−αg′(α)=2α−1ln2−1≥g′(2)=2ln2−1>0
所以我们可以知道 g ( α ) g(\alpha) g(α) 是单调递增的,所以 g ( α ) ≥ g ( 2 ) = 2 − 2 = 0 g(\alpha)\ge g(2)=2-2=0 g(α)≥g(2)=2−2=0 ,证毕。 -
-
证明正文:
-
假设 m = p α m=p^{\alpha} m=pα , p p p 是素数。
-
当 G C D ( a , p ) = 1 GCD(a,\ p) = 1 GCD(a, p)=1 ,由欧拉定理,我们可以知道 a x ≡ a x m o d φ ( p α ) ( m o d p α ) a^x \equiv a^{x\ mod\ \varphi(p^{\alpha})}\ (mod\ p^{\alpha}) ax≡ax mod φ(pα) (mod pα) 。
为什么会得到这个呢,是因为 a φ ( p α ) ≡ 1 ( m o d p α ) a^{\varphi(p^{\alpha})} \equiv 1\ (mod\ p^{\alpha}) aφ(pα)≡1 (mod pα) ,相当于 a x m o d φ ( p α ) + k φ ( p α ) ≡ a x m o d φ ( p α ) ⋅ 1 k ( m o d p α ) a^{x\ mod\ \varphi(p^{\alpha}) + k\varphi(p^{\alpha})}\equiv a^{x\ mod\ \varphi(p^{\alpha})}\cdot1^{k}\ (mod\ p^{\alpha}) ax mod φ(pα)+kφ(pα)≡ax mod φ(pα)⋅1k (mod pα) ,其中 x = x m o d φ ( p α ) + k φ ( p α ) x = x\ mod\ \varphi(p^{\alpha}) + k\varphi(p^{\alpha}) x=x mod φ(pα)+kφ(pα) 。
-
当 G C D ( a , p ) ≠ 1 GCD(a,\ p) \not=1 GCD(a, p)=1 ,即 G C D ( a , p ) = p GCD(a,\ p) = p GCD(a, p)=p ,令 a = k p a=kp a=kp 。
因为 x ≥ φ ( m ) x\ge \varphi(m) x≥φ(m) ,由引理2可知: x ≥ α x\ge \alpha x≥α ,因此 a x ≡ 0 ( m o d p α ) a^x\equiv 0\ (mod\ p^{\alpha}) ax≡0 (mod pα) 。
又因为 φ ( m ) ≥ α \varphi(m) \ge \alpha φ(m)≥α,因此 a x m o d φ ( m ) + φ ( m ) ≡ 0 ( m o d p α ) a^{x\ mod\ \varphi(m) + \varphi(m)}\equiv 0\ (mod\ p^{\alpha}) ax mod φ(m)+φ(m)≡0 (mod pα) 。
因此 a x ≡ a x m o d φ ( m ) + φ ( m ) ( m o d p α ) a^x\equiv a^{x\ mod\ \varphi(m) + \varphi(m)}\ (mod\ p^{\alpha}) ax≡ax mod φ(m)+φ(m) (mod pα) 。
-
-
当 m m m 为任意数时,根据欧拉函数的积性性质,将 m m m 唯一分解,依照 a x m o d φ ( p α ) + φ ( p α ) ≡ a x m o d φ ( m ) + φ ( m ) ( m o d p α ) a^{x\ mod\ \varphi(p^{\alpha})+\varphi(p^{\alpha})} \equiv a^{x\ mod\ \varphi(m)+\varphi(m)}\ (mod\ p^{\alpha}) ax mod φ(pα)+φ(pα)≡ax mod φ(m)+φ(m) (mod pα) (1)
其中 p α p^{\alpha} pα 是 m m m 唯一分解后的某一项。
式(1)证明如下:我们设
m ′ = p α , x = k 1 φ ( m ′ ) + r 1 , x = k 2 k φ ( m ′ ) + r 2 m' = p^{\alpha},\ x=k_1\varphi(m')+r_1,\ x=k_2k\varphi(m')+r_2 m′=pα, x=k1φ(m′)+r1, x=k2kφ(m′)+r2
其中
r 1 = x m o d φ ( m ′ ) , r 2 = x m o d k φ ( m ′ ) , k = φ ( m / p α ) , φ ( m ) = φ ( m ′ ) φ ( m / m ′ ) r_1=x\ mod\ \varphi(m'),\ r_2=x\ mod\ k\varphi(m'),\ k=\varphi(m/p^{\alpha}),\ \varphi(m) = \varphi(m')\varphi(m/m') r1=x mod φ(m′), r2=x mod kφ(m′), k=φ(m/pα), φ(m)=φ(m′)φ(m/m′)
那么我们有
r 1 = x − k 1 φ ( m ′ ) , r 2 = x − k 2 k φ ( m ′ ) r_1=x-k_1\varphi(m'),\ r_2=x-k_2k\varphi(m') r1=x−k1φ(m′), r2=x−k2kφ(m′)
式(1)变为
a x − k 1 φ ( m ′ ) + φ ( m ′ ) ≡ a x − k 2 k φ ( m ′ ) + k φ ( m ′ ) ( m o d p α ) a^{x-k_1\varphi(m')+\varphi(m')}\equiv a^{x-k_2k\varphi(m')+k\varphi(m')}\ (mod\ p^{\alpha}) ax−k1φ(m′)+φ(m′)≡ax−k2kφ(m′)+kφ(m′) (mod pα)
接着使用 m m m 为素数幂次的结论:
a [ x − k 1 φ ( m ′ ) + φ ( m ′ ) ] m o d φ ( m ′ ) + φ ( m ′ ) ≡ a [ x − k 2 k φ ( m ′ ) + k φ ( m ′ ) ] m o d φ ( m ′ ) + φ ( m ′ ) ( m o d p α ) ∴ a x m o d φ ( m ′ ) + φ ( m ′ ) ≡ a x m o d φ ( m ′ ) + φ ( m ′ ) ( m o d p α ) a^{[x-k_1\varphi(m')+\varphi(m')]\ mod\ \varphi(m')+\varphi(m')}\equiv a^{[x-k_2k\varphi(m')+k\varphi(m')]\ mod\ \varphi(m') + \varphi(m')}\ (mod\ p^{\alpha})\\ \therefore a^{x\ mod\ \varphi(m') + \varphi(m')} \equiv a^{x\ mod\ \varphi(m')+\varphi(m')}\ (mod\ p^{\alpha}) a[x−k1φ(m′)+φ(m′)] mod φ(m′)+φ(m′)≡a[x−k2kφ(m′)+kφ(m′)] mod φ(m′)+φ(m′) (mod pα)∴ax mod φ(m′)+φ(m′)≡ax mod φ(m′)+φ(m′) (mod pα)
因此结合前置芝士里的引理1的推论可知 a x ≡ a x m o d φ ( m ) + φ ( m ) ( m o d m ) a^x \equiv a^{x\ mod\ \varphi(m)+\varphi(m)}\ (mod\ m) ax≡ax mod φ(m)+φ(m) (mod m) 。证毕。
-
二. BSGS算法(Baby-Step-Giant-Step)
-
定理描述:
求满足 a x ≡ y ( m o d p ) a^x\equiv y\ (mod\ p) ax≡y (mod p) 的最小自然数 x x x 或报告无解,其中 a , p a,\ p a, p 互质。
-
求解过程:
根据欧拉定理, a φ ( p ) ≡ 1 ( m o d p ) a^{\varphi(p)}\equiv 1\ (mod\ p) aφ(p)≡1 (mod p) ,所以,如果有解,必然有一个在 [ 0 , φ ( p ) ) [0,\ \varphi(p)) [0, φ(p)) 内,显然 x ∈ [ 0 , p − 1 ) x\in[0,\ p-1) x∈[0, p−1)。
我们运用 meet-in-middle 的思想。设 x = k m − r ( 1 ≤ r ≤ m ) x=km-r(1\le r\le m) x=km−r(1≤r≤m) , m m m 是某个选定的数,那么 ( a m ) k ≡ y a r ( m o d p ) (a^m)^k\equiv ya^r\ (mod\ p) (am)k≡yar (mod p) 。枚举 r = 1 , 2 , … , m r=1,\ 2,\ …,\ m r=1, 2, …, m ,将 ( y a r m o d p , r ) (ya^r\ mod\ p,\ r) (yar mod p, r) 存入一张表。枚举 k = 1 , 2 , … , ⌈ p m ⌉ k=1,\ 2,\ …,\lceil \frac{p}{m}\rceil k=1, 2, …,⌈mp⌉ ,查询是否存在 r r r 使得 y a r ≡ ( a m ) k ( m o d p ) ya^r\equiv(a^m)^k\ (mod\ p) yar≡(am)k (mod p) 。如果存在,返回 k m − r km-r km−r ;如果未找到,则报告无解。
设表的插入和查询的时间复杂度分别是 O ( f ( p ) ) O(f(p)) O(f(p)) 和 O ( g ( p ) ) O(g(p)) O(g(p)) ,则本算法的时间复杂度为 O ( m f ( p ) + p m g ( p ) + l o g m ) O(mf(p)+\frac{p}{m}g(p)+log\ m) O(mf(p)+mpg(p)+log m) 。由基本不等式,有 m f ( p ) + p m g ( p ) ≥ 2 p f ( p ) g ( p ) mf(p)+\frac{p}{m}g(p)\ge2\sqrt{pf(p)g(p)} mf(p)+mpg(p)≥2pf(p)g(p) ,当且仅当 m f ( p ) = p m g ( p ) mf(p)=\frac{p}{m}g(p) mf(p)=mpg(p) 时,等号成立。使用 map 或哈希表时,有 f ( p ) = g ( p ) f(p)=g(p) f(p)=g(p) ,于是 m = p m=\sqrt{p} m=p 时算法有最优复杂度。
使用哈希表,BSGS 的时间复杂度是 O ( p ) O(\sqrt{p}) O(p) ;使用map,BSGS 的时间复杂度是 O ( p l o g p ) O(\sqrt{p}\ log\ p) O(p log p)。
以上通过设 x = k m − r x=km-r x=km−r ,而非 x = k m + r x=km+r x=km+r 是为了避免求逆元,但我们也可以知道逆元是一定存在的, a a a 、 p p p 互质的条件保证了这一点。
-
代码如下:
ll BSGS(ll A, ll B, ll C) { A %= C, B %= C; mp.clear(); int m = ceil(sqrt(C*1.0)); for (int i = 1; i <= m; i ++) { B = B * A % C; mp[B] = i; } ll tmp = fpow(A, m, C); B = 1; for (int i = 1; i <= m; i ++) { B = B * tmp % C; if (mp.count(B)) return ((ll)i*m - mp[B] + C) % C; } return -1; }
三. 扩展BSGS算法
-
定理描述:
求满足 a x ≡ y ( m o d m ) a^x\equiv y\ (mod\ m) ax≡y (mod m) 的最小自然数 x x x 或报告无解,其中 a , m a,\ m a, m 不要求互质。
-
求解过程:
由于 a , m a,\ m a, m 不互质,我们尝试将他转化为 a , m a,\ m a, m 互质的情况。
当 x > 0 x>0 x>0 时, a x ≡ y ( m o d m ) a^x\equiv y\ (mod\ m) ax≡y (mod m) 等价于 a x − 1 a + n m = y a^{x-1}a+nm=y ax−1a+nm=y ,由 裴蜀定理 可知,有解的条件是 G C D ( a , m ) ∣ y GCD(a,\ m)\ |\ y GCD(a, m) ∣ y ,设 d = G C D ( a , m ) d = GCD(a,\ m) d=GCD(a, m) ,则 a d a x − 1 + m d n = b d \frac{a}{d}a^{x-1}+\frac{m}{d}n=\frac{b}{d} daax−1+dmn=db ,即 a d a x − 1 ≡ b d ( m o d m d ) \frac{a}{d}a^{x-1}\equiv \frac{b}{d}\ (mod\ \frac{m}{d}) daax−1≡db (mod dm) ,如果这时的 G C D ( a , m d ) ≠ 1 GCD(a,\ \frac{m}{d})\not=1 GCD(a, dm)=1 ,则继续消减 m m m 。
设方程为 A x ≡ B ( m o d C ) A^x\equiv B\ (mod\ C) Ax≡B (mod C) , G C D ( A , C ) ! = 1 GCD(A,\ C)!=1 GCD(A, C)!=1 时,消减过程如下:
ll D = 1, cnt = 0; for (ll res; (res = gcd(A, C)) != 1, ++ cnt) { if (B % res) return -1; // 无解 B /= res, C /= res; D = D * (A/res) % C; }
执行完后,问题就变成了求 D ∗ A x − c n t ≡ B ( m o d C ) D*A^{x-cnt}\equiv B\ (mod\ C) D∗Ax−cnt≡B (mod C) ,即 A x − c n t ≡ B ∗ D − 1 ( m o d C ) A^{x-cnt}\equiv B*D^{-1}\ (mod\ C) Ax−cnt≡B∗D−1 (mod C) ,此时 A , C A,\ C A, C 互质,从而 D , C D,\ C D, C 互质,因此逆元存在。我们令 x − c n t = i ∗ m − j x-cnt=i*m-j x−cnt=i∗m−j ,其中 1 ≤ i , j ≤ m 1\le i,\ j\le m 1≤i, j≤m , m = ⌈ C ⌉ m=\lceil\sqrt{C}\rceil m=⌈C⌉ ,后面的做法就和 BSGS 一样了。
需要注意的是: x ≥ c n t x\ge cnt x≥cnt ,但是方程明显存在小于等于 c n t cnt cnt 的情况,所以消因子之前要做一次 O ( l o g 2 ( C ) ) O(log_2(C)) O(log2(C)) 的枚举,直接验证 A i m o d C = B A^i\ mod\ C=B Ai mod C=B ,这样考虑到了所有情况。
-
代码如下:
ll exBSGS(ll A, ll B, ll C) { if (C == 1) return 0; // 特判模数为 1 B %= C, A %= C; // 先取模 ll tmp = 1, cnt = 0, D = 1; for (int i = 0; i < 32; i ++) { // 当前步骤是做 log C 次枚举 if (tmp == B) return i; tmp = tmp * A % C; // 不需要用快速幂,累乘即可 } ll base = 1; ll D = 1, cnt = 0; for (ll res; (res = gcd(A, C)) != 1, ++ cnt) { // 消减因子 if (B % res) return -1; // 无解 B /= res, C /= res; D = D * (A/res) % C; } int ans = BSGS(A, B*Inv(D, C), C); // A, C 互质就可以用 BSGS if (ans == -1) return -1; return ans + cnt; // 不要忘了加 cnt }