您的位置:首页 > 其它

欧几里得gcd+扩展欧几里得exgcd模板

2016-07-24 00:16 330 查看
gcd:辗转相除

参考核心代码:

int gcd(int a,int b)
{
if(!b) return a;
return gcd(b,a%b);
}

exgcd:扩展欧几里得 求gcd(x,y)=ax+by;
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
int gcd=exgcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-(a/b)*y;
return gcd;
}模 ay===1(mod m)即 ay=1+mk;
使其有解 代码如下:

int mod_inverse(int a,int m)
{
int x,y;
exgcd(a,m,x,y);
return (m+x%m)%m;
//由于可能x为负数,所以对m取模再+m再取模使x为正
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论 模板