目录
拓展欧几里得
给定a,b,求解公式ax=by=gcd(a,b):
int exgcd(int a,int b,int &gcd,int &x,int &y)
{
if(!b)
{
gcd=a;x=1;y=0;
}
else
{
ecgxd(b,a%b,gcd,y,x);
y-=x*(a/b);
}
}
注意:解不唯一,假设x1,y1是一组解,则x1+t*b/gcd(a,b)和y1-t*a/gcd(a,b)。
贝祖定理拓展
如果ax+by=n有解,充要条件是n%gcd(a,b)==0.
证明:
- 设d=gcd(a,b),则根据贝祖定理ax+by=d有解;
- 推出(a/d)x+(b/d)y=1有解,再推出a(n/d)x+b(n/d)y=n有解;
- 因已知ax+by=n有整数解,故上式的(n/d)x和(n/d)y均为整数,故n/d为整数,得证。
一元线性同余方程:形如ax=c(mod b)的同余式,其中x未知。
求解一元线性同余方程等价于求ax+by=c。
求解ax+by=c:
- 先判断是否有解——根据充要条件(如果有解,则有gcd(a,b)个模b不同余的解);
- 先用拓展欧几里得求解ax+by=d的一组特解x1,y1;
- 设k=c/d,则方程的解集为:x=kx1+t(b/d),y=ky1+t(a/d);
模逆
拓展欧几里得算法求解的即为a关于b的模逆。
递推线性逆元打表:inv[1]=1;inv[i]=(p-p/i)*inv[p%i]%p。
逆元的一个重要性质:当p为奇素数时,1~(p-1)的整数模p的所有逆元对应1~(p-1)的所有整数,既是单射又是满射。(比如p=7,1~6模7的逆元分别为1,4,5,2,3,6)。
中国剩余定理
设k组数(ai,bi),其中bi两两互素,要找到最小的正整数x,满足方程组 x=ai(%bi)。
算法步骤:
- 令B=b1*b2*b3*……*bn,mi=B/bi;
- 显然gcd(mi,bi)=1,采用拓展欧几里得算出 xi 满足mi*xi=1(%bi);
- 方程组的解x=(a1x1m1+a2x2m2+……+akxkmk)%B
- 此方程组任意两个解模B同余,因此x就是最小的。
费马小定理
欧拉降幂
求(%m)的值,其中a、b都极大。