python之逆元(数论倒数)

倒数想必大家都知道吧
a的倒数是b,那么 a × b = 1 a\times b=1 a×b=1
那数论倒数呢?数论基本就是取模同余,应该也能猜到了吧
在模p意义下,a的逆元是b,有 a × b ≡ 1 ( m o d   p ) a\times b\equiv 1(mod\space p) a×b1(mod p)
也就是 a × b a\times b a×b可以是1,也可以是1+p,也可以是1+2p……
注意:只有gcd(a,p)=1时才有解,也就是a和p互质。
那么逆元怎么求呢?
第一种:
费马得意地笑着( •̀ ω •́ )✧
费马小定理登场!!
当p是质数时 x p − 1 ≡ 1 ( m o d   p ) x^{p-1}\equiv 1(mod\space p) xp11(mod p)那么两边 ÷ x \div x ÷x x p − 2 ≡ x − 1 ( m o d   p ) x^{p-2}\equiv x^{-1}(mod\space p) xp2x1(mod p)
那么这下子容易了,直接求 x p − 2   m o d   p x^{p-2}\space mod\space p xp2 mod p就行了。
快速幂求解就完事。


第二种:
欧几里得一脚踹翻费马<(  ̄^ ̄)(θ(θ☆( >_<
如果p不是质数,那么你不得不用扩展欧几里得。
同余方程重在于变形 a × b ≡ 1 ( m o d   p ) ⇒ a × b + p × k = 1 a\times b\equiv 1(mod\space p)\Rightarrow a\times b+p\times k = 1 a×b1(mod p)a×b+p×k=1
这个就是再熟悉不过的exgcd的了(前提是gcd(a,p)=1)
不了解exgcd的那些事?

def exgcd(a, b):
    if b == 0:
        return 1, 0, a
    else:
        x, y, q = exgcd(b, a % b)
        x, y = y, (x - (a // b) * y)
        return x, y, q


def inf(a,p):
    x, y, q = exgcd(a,p)
    if q != 1:
        raise Exception("No solution.")
    else:
        return (x + p) % p #防止负数

你可能感兴趣的:(python,算法,数论)