同余方程 学习笔记

裴蜀定理

上一篇提到过,\(ax+by=c\)有解,当且仅当\(c=m*gcd(a,b)\) (m为正整数)

所以当\(gcd(a,b)=1\)时,c可以取任意数

线性同余方程

推导

形如 \(ax \equiv c \pmod b\) 的东西叫线性同余方程 (Congruence Equation)

怎么解?

这不就相当于 \((ax-c)\%b==0\),即\((ax-c)\)为\(b\)倍数吗!

设它为 \(-y\) 倍,这样不就有 \((ax-c)=-by\),就是 \(ax+by=c\) 了吗!(所以为什么要设为-y倍就是如此——让化简后式子精简)

然后这不就一个exgcd搞定了吗!做完了!Time: \(O(logn)\)

例题

**同余方程,一句话题意:给 \(a\)、\(b\) 值,求 \(a x \equiv 1 \pmod b\) 合法的 \(x\)

#include<bits/stdc++.h>
using namespace std;
int a,b,xx,yy;

void exgcd(int p,int q,int &x,int &y){
	if(!q){x=1,y=0;return;}
	exgcd(q,p%q,x,y);
	int tmp=x;
	x=y,y=tmp-(p/q)*y;
}

int main(){
	cin>>a>>b;
	exgcd(a,b,xx,yy);
	while(xx<=0)xx+=b;
	cout<<xx%b;
}

中国剩余定理

给定\(a_i,n_i\)(所有n两两互质),求x的可行解。方程组如下:

\(\left\{\begin{array}{l} x \equiv a_{1}\left(\bmod n_{1}\right) \\ x \equiv a_{2}\left(\bmod n_{2}\right) \\ \vdots \\ x \equiv a_{k}\left(\bmod n_{k}\right) \end{array}\right.\)

怎么求呢?(下面两行是精简版,不理解可以直接跳至第三行)

一句话 \(\Large{x=\sum_{i=1}^{k}a_i*\frac {\prod_{j=1}^n n_{_j}}{n_{_i}}*inv[\,\frac {\prod_{j=1}^n n_{_j}}{n_{_i}}\,]}\)(啊这)

其中\(inv[x]\)如果它的分母是\(n_i\)则表示整个式子模\(\prod_{i=1}^kn_k\)下的逆元

  • 具体来说,首先计算 \(n=\prod_{i=1}^n n_i\)。

    然后对于每个式子 \(m_i=\frac{n}{n_i}\),并计算其在 模\(n_i\)意义 下的逆元 \(m_i^{-1}\)。接下来计算\(c_i=m_im_i^{-1}\) (\(c_i\)不要取模)

    最后 \(x=\sum_{i=1}^{-1}a_ic_i(mod\,\,n)\)

Time: \(O(k)\),k是式子的数量

证明:不知道。

上一篇:中国剩余定理


下一篇:Hibernate注解----类级别注解以及属性注解详解----图片版本