博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
乘法逆元模板
阅读量:6702 次
发布时间:2019-06-25

本文共 1211 字,大约阅读时间需要 4 分钟。

1.扩展欧几里得求逆元

typedef long long ll;//ax + by = gcd(a,b)//传入固定值a,b.放回 d=gcd(a,b), x , yvoid extendgcd(ll a,ll b,ll &d,ll &x,ll &y){    if(b==0){d=a;x=1;y=0;return;}    extendgcd(b,a%b,d,y,x);    y-=x*(a/b);}//Ax=1(mod M),gcd(A,M)==1//输入:10^18>=A,M>=1//输出:返回x的范围是[1,M-1]ll GetNi(ll A,ll M){    ll rex=0,rey=0;    ll td=0;    extendgcd(A,M,td,rex,rey);    return (rex%M+M)%M;}

2.根据欧拉定理求逆元,当mod素数时可以速度较快。

//a^b%mod 快速幂long long Quk_Mul(long long a,long long b,long long mod){    long long qsum=1;    while(b)    {        if(b&1) qsum=(qsum*a)%mod;        b>>=1;        a=(a*a)%mod;    }    return qsum;}//欧拉函数:复杂度O(n^(0.5)),返回[1,n-1]中所有和n互素的数的个数和ll phi(ll x){    ll sum=x;    for(ll i=2;i*i<=x;i++)    {        if(x%i==0)        {            sum=sum-sum/i;            while(x%i==0) x/=i;        }    }    if(x!=1) sum=sum-sum/x;    return sum;}//Ax=1(mod M),gcd(A,M)==1//输入:10^18>=A,M>=1//输出:返回x的范围是[1,M-1]//复杂度:如果M是素数,则直接用M-2代替phi(M)-1 复杂度为O(logM)//       如果M不是素数,则复杂度为O( M^(0.5) ) 好慢。ll GetNi(ll A,ll M){    //return Quk_Mul(A, phi(M)-1, M);    return Quk_Mul(A, M-2, M);}

3.对于a/b (mod m),不要求b和m互质。前提当然b能整除a

(a/b) % m等于a%(b*m)/b

只要是bm不需要高精度,这种方法是很好用的。

证明还是很好证的:

(a/b) mod m = a/b – k*m = (a – k*b*m)/b =(a%(b*m))/b;

 

转载地址:http://cvgoo.baihongyu.com/

你可能感兴趣的文章
小程序类似抖音视频整屏切换
查看>>
19-03-25
查看>>
activity idea编写bpmn流程文件
查看>>
windows Virtualbox下配置Ubuntu,且用ssh连接
查看>>
PAT 1048 数字加密
查看>>
JVM原理探究及调优方法论
查看>>
iphoneX样式兼容
查看>>
Java缓存浅析
查看>>
关于微信小程序swiper的问题
查看>>
android 连接指定wifi
查看>>
爱屋吉屋病死后,链家、中原、我爱我家们却哭不得笑不得
查看>>
《PWA实战:面向下一代的Progressive Web APP》读书笔记
查看>>
redux 源码详解
查看>>
Android屏幕适配
查看>>
你真的懂函数吗?
查看>>
区块链技术怎么构架落地应用?
查看>>
西宁a货翡翠,孝感a货翡翠
查看>>
告诉你银行在年底为存储做的小动作
查看>>
函数中的apply,call入门介绍
查看>>
XCode10 swift4.2 适配遇到的坑
查看>>