同余&逆元
1. 同余
1. 同余的基本概念及性质
- 若 x x x% m = a m=a m=a即m是 x-a 的一个因子, 则称x与a关于m同余,记作: x ≡ a ( m o d    m ) x \equiv a(mod \;m) x≡a(modm)
- 同余基本性质:
○1. 自反性: a ≡ a ( m o d    m ) a \equiv a(mod\;m) a≡a(modm)
○2. 对称性: a ≡ b ( m o d    m ) → b ≡ a ( m o d    m ) a \equiv b(mod\;m) \rightarrow b \equiv a(mod\;m) a≡b(modm)→b≡a(modm)
○3. 传递性: a ≡ b ( m o d    m ) , b ≡ c ( m o d    m ) → a ≡ c ( m o d    m ) a \equiv b(mod\;m),b \equiv c(mod\;m) \rightarrow a \equiv c(mod\;m) a≡b(modm),b≡c(modm)→a≡c(modm)
○4. 同加性: a ≡ b ( m o d    m ) c ≡ d ( m o d    m ) → a + c ≡ b + d ( m o d    m ) a \equiv b(mod\;m) c \equiv d(mod\;m) \rightarrow a+c \equiv b+d(mod\;m) a≡b(modm)c≡d(modm)→a+c≡b+d(modm)
○5. 同乘性: a ≡ b ( m o d    m ) c ≡ d ( m o d    m ) → a c ≡ b d ( m o d    m ) a \equiv b(mod\;m) c \equiv d(mod\;m) \rightarrow ac \equiv bd(mod\;m) a≡b(modm)c≡d(modm)→ac≡bd(modm)
○6. 同幂性: a ≡ b ( m o d    m ) → a n ≡ b n ( m o d m ) a \equiv b (mod\;m) \rightarrow a^n \equiv b^n(mod m) a≡b(modm)→an≡bn(modm)n是自然数
○7. 若 a ≡ b ( m o d    m ) , n ∣ m a \equiv b(mod\;m),n|m a≡b(modm),n∣m 则 a ≡ b ( m o d    n ) a \equiv b(mod\;n) a≡b(modn)
○8. 若 a c ≡ b c ( m o d    m ) , ( c , m ) = d ac \equiv bc(mod\;m),(c,m)=d ac≡bc(modm),(c,m)=d则 a ≡ b ( m o d    m d ) a \equiv b(mod\;\dfrac{m}{d}) a≡b(moddm)
○9. 若 ( m , n ) = 1 , a ≡ b ( m o d    m ) , a ≡ b ( m o d    n ) ⇔ a ≡ b ( m o d    m n ) (m,n)=1,a \equiv b(mod\;m),a \equiv b(mod\;n) \Leftrightarrow a \equiv b(mod\;mn) (m,n)=1,a≡b(modm),a≡b(modn)⇔a≡b(modmn)
2. 求解线性同余方程 a x ≡ c ( m o d    b ) ax≡c(mod\;b) ax≡c(modb)
可转化为求解方程: a x + b y = c ax+by=c ax+by=c
(同余方程和线性方程的关系很重要,经常用到!!)
1.预处理:
if(a<0) a=-a,c=-c;
while(c<0) c+=b;//保证 a,c 为正
2.第一步: 检验是否有解
int gcd=Gcd(a,b);
if((c%gcd)!=0) return -1;//若c不是gcd(a,b) 的倍数,则无解
//可以转化为直线上的整点来理解
3.第二步:求解同余方程: a x ≡ g c d ( a , b ) ( m o d b ) ax≡gcd(a,b)(mod b) ax≡gcd(a,b)(modb)即 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)
扩展欧几里得算法
inline int ex_gcd(int a,int b)
{
if(b==0) {
x=1;y=0;return a;}
int gcd=ex_gcd(b,a%b);
int tmp=x;x=y;
y=tmp-a/b*y;//扩欧
return gcd;
}
//最后得到的x即为原同余方程的一个可行解;
扩欧的证明:
当最后 b’==0 时a’==gcd(a,b) 则此时 a ′ x + b ′ y = g c d ( a , b ) ∗ x a'x+b'y=gcd(a,b)*x a′x+b′y=gcd(a,b)∗x
令 x = 1 , y = 0 x=1,y=0 x=1,y=0即得最后的一组解。
考虑从后往前推出 a x + b y = c ax+by=c ax+by=c的解:
设我们前一步求出的解为 x 1 , y 1 , 此 时 a , b 的 值 就 表 示 为 a , b , 当 前 的 解 表 示 为 x , y x_1,y_1,此时a,b的值就表示为a,b,当前的解表示为x,y x1,y1,此时a,b的值就表示为a,b,当前的解表示为x,y
那么因为 g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a gcd(a,b)=gcd(b,a% b ) , a b),a b),a% b = a − ( a / b ) ∗ b b=a-(a/b)*b b=a−(a/b)∗b有: b ∗ x 1 + ( a − ( a / b ) ∗ b ) y 1 = g c d ( a , b ) b*x_1+(a-(a/b)*b)y_1=gcd(a,b) b∗x1+(a−(a/b)∗b)y1=gcd(a,b)
则:
b ∗ x 1 + ( a − ( a / b ) ∗ b ) y 1 = a x + b y b*x_1+(a-(a/b)*b)y_1=ax+by b∗x1+(a−(a/b)∗b)y1=ax+by
整理得:
a y 1 + b ( x 1 − ( a / b ) y 1 ) = a x + b y ay_1+b(x_1-(a/b)y_1)=ax+by ay1+b(x1−(a/b)y1)=ax+by
容易看出:
x = y 1 , y = x 1 − ( a / b ) y 1 x=y_1,y=x_1-(a/b)y_1 x=y1,y=x1−(a/b)y1
即证。
4.第四步:根据题意得出答案
若要求出最小正整数解:
while(x<0) x+=b;x%=b;
b/=gcd;//mod 要变成 mod/gcd ;(mod 即为 b)
x=x*c/gcd;//同余的同乘性质
while(x<0) x+=b;x%=b;//最小正整数解
若要求出解的个数(或所有解)
int tot=gcd(a,b);// 只有gcd(a,b) 个解
//要求出每个解,只需对其不断加 b/gcd 即可(同时y-=a/gcd)
3.求解单变量模线性方程组(中国剩余定理)
有如下方程:
{ x ≡ a 1 ( m o d    m 1 ) x ≡ a 2 ( m o d    m 2 ) x ≡ a 3 ( m o d    m 3 ) … … … x ≡ a n ( m o d    m n ) \begin{cases} x \equiv a_1 (mod\;m_1)\\ x \equiv a_2 (mod\;m_2)\\ x \equiv a_3 (mod\;m_3)\\ \dots\dots \dots\\ x \equiv a_n (mod\;m_n)\\ \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x≡a1(modm1)x≡a2(modm2)x≡a3(modm3)………x≡an(modmn)
其中 ( m 1    m 2    m 3 … m n (m_1\;m_2\;m_3\dots m_n (m1m2m3…mn两两互质 ) ) )
为了方便表示,将x设为S
(1)设 M = Π i = 1 n m i M=\Pi^n_{i=1}m_i M=Πi=1nmi, 设 M i = M / m i M_i=M/m_i M