标签:构造 欧几里德算法 nbsp 过程 log 方法 思想 lin line
事实上,我们可以直接在欧几里德算法求解 gcd(a, b) 的过程中,构造一组 ax + by = gcd(a, b) 的解
这个方法依赖于递归的思想
边界:b = 0 时, a * 1 + b * 0 = gcd(a, b)
设我们找到了一组 b * x + (a % b) * y = gcd(a, b) 的解,那么:
--> b * x + (a - [a / b] * b]) * y = gcd(a, b)
--> a * y + b * (x - [a / b] * y) = gcd(a, b)
令 x’ = y, y’ = (x - [a / b] * y),可以得到:
ax’ + by’ = gcd(a, b)
LL Exgcd(LL a,LL b,LL &x,LL &y){ if (b==0){ x=1; y=0; return a; } LL G=Exgcd(b,a%b,x,y),tx=x; x=y; y=tx-a/b*y; return G; }
事实上,扩欧可以用来求逆元:
形如 a * x ≡ 1 (mod p) 的式子
可以看成: a * x + p * y ≡ 1 (mod p)
显然,当且仅当 gcd(a, p) = 1 时存在一组解(x, y)满足条件,也就是存在a mod p的逆元。
我们很容易知道 x 就是a mod p 的逆元。
LL GetInv(LL a,LL p){ LL x,y; LL G=Exgcd(a,p,x,y); return (x%p+p)%p; }
标签:构造 欧几里德算法 nbsp 过程 log 方法 思想 lin line
原文地址:http://www.cnblogs.com/Dance-Of-Faith/p/7779837.html