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

2019-04-13 12:37发布

class="markdown_views prism-tomorrow-night"> 本文参考刘汝佳《算法竞赛入门经典》(第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;ii++) 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;iint)((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时,方程解唯一,否则,方程无解。