拓展欧几里得算法求乘模逆元

前言:仅个人小记。之前已经证明了 “若正整数a,b互素,则必然存在b以内的正整数k,使得ak%b=1” 成立。本文进一步借助 拓展欧几里得算法,给出快速求解 k 值的方法,即求解乘法逆元的方法,具体多快?时间复杂度为O(log(b))。另外,除了在这里产生了求乘法逆元的需要,其他很多场合也有求解乘法逆元的需要,比如CRT中国剩余定理算法中、模幂乘循环群中求解逆元等。

前要知识

  1. 如果 a m o d    b = 1 , 则 a ⊥ b a\mod b=1,则a\perp b amodb=1ab。参看 https://blog.csdn.net/qq_25847123/article/details/99944096
  2. a与c互质且b与c互质,则必然ab与c互质。 参看 https://blog.csdn.net/qq_25847123/article/details/95765764
  3. 拓展欧几里得算法。参看 https://blog.csdn.net/qq_25847123/article/details/100672171

问题交代

给出
a x % p = 1 ax\%p=1 ax%p=1
x = ? x=? x=?

求解开始

前要知识1知,既然 a x % p = 1 ax\%p=1 ax%p=1 成立,则必然 a x ⊥ p ax\perp p axp,进而再由前要知识2必然有 a ⊥ p , x ⊥ p a\perp p,x\perp p ap,xp,所以必然有 a, p 的最大公约数为 1,记为 gcd(a,p)=1
a x % p = 1 ⇔ a x = k p + 1 , k 为 任 意 整 数 ax\%p=1\\ \Leftrightarrow ax=kp+1,k为任意整数 ax%p=1ax=kp+1,k k = − y k=-y k=y则有
a x = − y p + 1 ax=-yp+1 ax=yp+1进而
a x + p y = 1 ax+py=1 ax+py=1 a x + b y = 1 ⇔ a x + p y = 1 ⇔ a x + p y = g c d ( a , b ) ax+by=1\Leftrightarrow ax+py=1\Leftrightarrow ax+py=gcd(a,b) ax+by=1ax+py=1ax+py=gcd(a,b)此时问题转为拓展欧几里得算法求解问题,借助拓展欧几里得算法可以解出 x,即求解出 a 的乘模逆元。

代码求解展示(python)

 def getMulInverse(self,a,b):
        ''' 求解乘法逆元
        
        a,b互素,ak%b=1 ,求 a 的逆元 k
        
        本质上就是构建 ax+by=1 这个方程,然后借助拓展欧几里得算法进行求解
        显然 要求 ax%b=1 中 x,就等价于求解 (ax+by)%b=1 中的 x,就等价于求 ax+by=1中的 x
        '''
        if self.gcd(a,b)!=1:
            print('a,b不互素。模数为b的情况下,a 不存在逆元')
            return -1
        
        x,y,g = self.exGCD(a,b)# 调用拓展欧几里得函数
        return x

你可能感兴趣的:(数学杂类记录)