您的位置:首页 > 其它

乘法逆元与费马小定理

2016-05-17 19:54 274 查看
逆元:类似倒数和相反数的概念,具体自己百度,我也是百度的,这让我想起了离散数学中提到了左逆右逆,哎,离散没学好啊。

乘法逆元:我们知道(A/B)%M=(A∗(1/B))%M。令1/B等于H,那么H就是B关于M的乘法逆元,其实就是关于M的一个相反数,B∗H≡(1%M)

那么我们如何求乘法逆元呢

扩展欧几里得算法

费马小定理

扩展欧几里得算法

B∗H≡(1%M)可以等价于B∗X+M∗Y=1,那么我们主需要调用欧几里得算法求解出来就可以了。

int cal(int a,int b)
{
int x,y;
int Gcd=gcd_extend(a,b,x,y);

if(1%Gcd)
return -1;

x*=1/Gcd;
b/=Gcd;
b=b<0? -b:b;
int ans=x%b;
ans=ans<=0? ans+b:ans;
return ans;
}


费马小定理

费马小定理:假如M是素数,且H与M互质,那么HM−1≡(1%M)

那么联立我们之前的A∗H≡(1%M)

得出乘法逆元H=AM<
cc35
/span>−2

这个地方不能简单调用Pow这个库函数,我们要自己写一个带模的快速幂算法。

int cal(int x,int m,const int MOD)
{
int ans=1;
while(m){
if(m&1)
ans=ans*x%MOD;
m>>=1;
x=x*x%MOD;
}
return ans;
}


参考

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