您的位置:首页 > 其它

洛谷Oj-P1082 同余方程-扩展欧几里得

2018-03-25 16:59 323 查看
题目描述:

求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解。

AC代码:

void ex_gcd(int a,int b,int &x,int &y)
{
if(b == 0)
{
x = 1;
y = 0;
}
else
{
ex_gcd(b,a % b,y,x);
y -= (a / b) * x;
}
return;
}
int main()
{
int a,b,x,y;
cin >> a >> b;
ex_gcd(a,b,x,y);
cout << (x + b) % b << endl;//防止x为负数,但是为什么对b取模呢
return 0;
}


解决方法:

ax≡1(modb),b≥2

ax=by+1

ax−by=1有解

由裴蜀定理得,gcd(a,b) = 1

ax−by=gcd(a,b)可以用扩展欧几里得算法来求解

扩展欧几里得算法:

ax+by=gcd(a,b)

a=⌊ab⌋b+a%b①

gcd(a,b)=gcd(b,a%b)②

代入①、②

{⌊ab⌋b+a%b}x+by=gcd(b,a%b)

⌊ab⌋bx+(a%b)x+by=gcd(b,a%b)

b{⌊ab⌋x+y}+(a%b)x=gcd(b,a%b)



x′=⌊ab⌋x+y

y′=x

a′=b

b′=a%b

数论这一部分还是不太懂……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: