(数论)模运算、同余、逆元

本文参考刘汝佳《算法竞赛入门经典》(第2版)

模运算

(a+b) mod n = ((a mod n)+(b mod n)) mod n
(a-b) mod n = ((a mod n)-(b mod n)) mod n
ab mod n=((a mod n)(b mod n)) mod n

1)大整数取模(利用高精度乘法)

for(int i=0;i<len;i++)
    ans=(int)((long long)ans*10+a[i]-'0')%MOD;

2)幂取模

题目:求a^n mod m

int pow_mod(int a,int n,int m){
    int ans=1;
    for(int i=0;i<n;i++)
        ans=(int)((long long)ans*a%m);
}

分治法对上述代码改进如下:

(代码来自刘汝佳《算法竞赛入门经典》(第2版))

int pow_mod(int a,int n,int m){
    if(n==0) return 1;
    int x=pow_mod(a,n/2,m);
    long long ans=(long long)x*x % m;
    if(n%2==1) ans=ans*a%m;
    return (int)ans;
}

同余

a≡b(mod n)。含义是a mod n = b mod n

显然,如果a=b+kn,k是整数,那么a≡b(mod n)成立。a≡b(mod n)等价于a-b是n的整数倍。

1)题目(模线性方程组):输入正整数a,b,n,解方程ax≡b(mod)n。

【分析】原方程等价于ax-b是n的整数倍,不妨设ax-b=ny,即ax-ny=b,题目转化成求解方程ax-ny=b,直接用学过的求解二元一次不定方程的扩展欧几里得算法即可解决本问题。需要补充的是满足x≡y(mod n)的y也是原方程的根,这一点很容易证明,直接设x=y+kn带入到原方程即证得。

2)逆元

ax≡1(mod n),x是a关于模n的逆。

可以转化成ax-ny=1,用扩展欧几里得解方程求出逆元,而ax-ny=1要有解,必须使得1是gcd(a,n)的整数倍,则a,n必须互素。而当gcd(a,n)=1时,方程解唯一,否则,方程无解。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值