数论学习笔记3

一. 扩展欧拉定理
  1. 定理描述
    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) axax 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

  2. 前置芝士

    引理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)) {xy (mod m1)xy (mod m2) xy  (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  xym2  xy Δ=xy, d=GCD(m1, m2), m1=dn1, m2=dn2 n1  Δ, n2  ΔGCD(n1, n2)=1n1n2  ΔLCM(m1, m2)  xyxy  (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) xy (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)) xyxyxy(mod m1)(mod m2)(mod mn)xy (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) xyxyxy(mod m1)(mod m2)(mod mn)xy (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α1pα2)>(p1)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α1ln21g(2)=2ln21>0
    所以我们可以知道 g ( α ) g(\alpha) g(α) 是单调递增的,所以 g ( α ) ≥ g ( 2 ) = 2 − 2 = 0 g(\alpha)\ge g(2)=2-2=0 g(α)g(2)=22=0 ,证毕。

  3. 证明正文

    • 假设 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}) axax 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}) ax0 (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}) axax 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=xk1φ(m), r2=xk2kφ(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}) axk1φ(m)+φ(m)axk2kφ(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[xk1φ(m)+φ(m)] mod φ(m)+φ(m)a[xk2kφ(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) axax mod φ(m)+φ(m) (mod m)

      证毕。

二. BSGS算法(Baby-Step-Giant-Step)
  1. 定理描述:

    求满足 a x ≡ y   ( m o d   p ) a^x\equiv y\ (mod\ p) axy (mod p) 的最小自然数 x x x 或报告无解,其中 a ,   p a,\ p a, p 互质。

  2. 求解过程:

    根据欧拉定理, 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, p1)

    我们运用 meet-in-middle 的思想。设 x = k m − r ( 1 ≤ r ≤ m ) x=km-r(1\le r\le m) x=kmr(1rm) m m m 是某个选定的数,那么 ( a m ) k ≡ y a r   ( m o d   p ) (a^m)^k\equiv ya^r\ (mod\ p) (am)kyar (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 kmr ;如果未找到,则报告无解。

    设表的插入和查询的时间复杂度分别是 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=kmr ,而非 x = k m + r x=km+r x=km+r 是为了避免求逆元,但我们也可以知道逆元是一定存在的, a a a p p p 互质的条件保证了这一点。

  3. 代码如下:

    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算法
  1. 定理描述:

    求满足 a x ≡ y   ( m o d   m ) a^x\equiv y\ (mod\ m) axy (mod m) 的最小自然数 x x x 或报告无解,其中 a ,   m a,\ m a, m 不要求互质。

  2. 求解过程:

    由于 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) axy (mod m) 等价于 a x − 1 a + n m = y a^{x-1}a+nm=y ax1a+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} daax1+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}) daax1db (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) AxB (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) DAxcntB (mod C) ,即 A x − c n t ≡ B ∗ D − 1   ( m o d   C ) A^{x-cnt}\equiv B*D^{-1}\ (mod\ C) AxcntBD1 (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 xcnt=imj ,其中 1 ≤ i ,   j ≤ m 1\le i,\ j\le m 1i, jm m = ⌈ C ⌉ m=\lceil\sqrt{C}\rceil m=C ,后面的做法就和 BSGS 一样了。

    需要注意的是: x ≥ c n t x\ge cnt xcnt ,但是方程明显存在小于等于 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 ,这样考虑到了所有情况。

  3. 代码如下:

    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
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值