仅代表个人观点,如有雷同,一定是他抄我的。如有错误,那一定是你rp不好
—— 我
这次的博客是关于用扩展欧几里得求逆元的一些小技巧的感想。
推导扩展欧几里得的过程
令f=gcd(a,b)
则有f=ax+by
由欧几里得推出f=gcd(a,b)=gcd(b,amodb)
则
f=bx′+amodby′=bx′+(a−(a/b)∗b)y′……“/”是整除=bx′+ay′−a/b∗by′=ay′+b(x′−a/by′)
对比上下两式可得
x=y′
y=(x′−a/b)
到目前为止,推导差不多结束。
但是,发现x’和y’是当前状态的下一个状态,所以我们需要从结果反推。
由欧几里得推出,最终结果的状态为:
a=f,b=0
将结果代入
ax+by=f
可得
x=1,y=0
于是可以递归反推当前
x,y
,得到同余方程的一组解。
至于通解,不详细证明。
若
x′
,
y′
是一组特殊解,则通解为:
x=x′+tb/f
y=y′−ta/f
扩展欧几里得的作用
扩欧的作用之一就是求逆元。
逆元定义为:当满足
a×x=1(modp)
时,x为a在mod p下的逆元。
如何求这个逆元呢?这是个同余方程,可以用扩欧。
上面的条件等价于 ax+py=1
于是我们就能用扩欧求出一组x,y,的解。
线性扩欧
这才是重点好吧。
注:不是线性求一个,而是线性求连续一段 1到n所有数的逆元。
设p=ki+r (i>r)
∴ki+r≡0(modp)
∴kr−1+i−1≡0(modp)
∴i−1≡−ki−1(modp)
∴i−1≡−⌊pi⌋×(pmodi)−1(modp)
推导到这一步,整个式子就是只跟i和p有关了。
其中,
i−1
是i的逆元,这个式子就是一个递推式了。