您的位置:首页 > 其它

扩展欧几里得求乘法逆元

2016-06-02 12:18 274 查看
参考http://blog.csdn.net/zhjchengfeng5/article/details/7786595

#include <stdio.h>
#include <math.h>
__int64 ans_gcd(__int64 a,__int64 b,__int64 *x,__int64 *y)
{
if (b==0)
{
*x=1;
*y=0;
return a;
}
__int64 ans=ans_gcd(b,a%b,x,y);
__int64 temp=*x;
*x=*y;
*y=temp-a/b*(*y);
return ans;
}
__int64 calculate(__int64 a,__int64 b)
{
__int64 x,y,ans;
__int64 gcd=ans_gcd(a,b,&x,&y);
if (1%gcd!=0)//如果a与b不互质则没有乘法逆元
return -1;
x=x*(1/gcd);
b=abs(b);
ans=x%b;
if (ans<=0)
ans=ans+b;
return ans;
}
int main()
{

__int64 i,j,a,b,ans;
int n;
scanf("%d",&n);
while(n--)
{
scanf("%I64d%I64d",&a,&b);
ans=calculate(a,b);//求a关于b的乘法逆元
if (ans==-1)
printf("Not Exist\n");
else
printf("%I64d\n",ans);

}
return 0;
}




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