数论学习三之——中国剩余定理

所谓中国剩余定理,实际上就是同余方程组,下面我们给出中国剩余定理的定义:
The Chinese Remainder Theorem: n 1 , n 2 , . . . , n k n_1,n_2,...,n_k n1,n2,...,nk是两两互素的正整数,则我们可以得到同余方程组
a ≡ a 1 m o d    n 1 a ≡ a 2 m o d    n 2 ⋯ a\equiv a_1\mod n_1 \\ a\equiv a_2\mod n_2 \\ \cdots aa1modn1aa2modn2
a ≡ a k m o d    n k a\equiv a_k\mod n_k aakmodnk
有模 n = n 1 n 2 . . . n k n=n_1n_2...n_k n=n1n2...nk的唯一解
同余方程组可以转换为多项式 a = ( a 1 ∗ c 1 + . . . a i ∗ c i + . . . a k ∗ c k ) a=(a_1*c_1+...a_i*c_i+...a_k*c_k) a=(a1c1+...aici+...akck).由这个多项式我们可以直接求出 a a a来。
这个时候我们又遇到了个问题,怎么求出 c i c_i ci
c i = m i ∗ m i − 1 c_i=m_i*m_i^{-1} ci=mimi1(证明咱就不证了,嘿嘿嘿)
注意:这里的 m i − 1 m_i^{-1} mi1并不是 1 m i \frac{1}{m_i} mi1而是 m i m_i mi的逆元
其实中国剩余定理本身并没有模板,给出的一个同余方程组,关键在于逆元的求解,那么逆元是什么意思的,这就是解释——设 m i − 1 m_i^{-1} mi1 m i m_i mi的逆元, 那么 ( a m i ) % p = ( a ∗ m i − 1 ) % p (\frac{a}{m_i})\%p = (a*m_i^{-1})\%p (mia)%p=(ami1)%p (再次强调这里的 m i − 1 m_i^{-1} mi1 m i m_i mi的逆元)
下面我们给出几种求逆元的方法:

一、蒙哥马利快速幂求逆元
(注意:只有当p为质数的时候才能用,所以快速幂求逆元有很大的局限性)

typedef long long ll;
ll q_pow(ll a, ll b, ll m)		//快速幂
{
    long long ans = 1;
    while(b)
    {
        if(b&1)
        {
            ans = (ans * a) % m;
        }
        a = (a * a) % m;
        b >>= 1;
    }
    return ans;
}

ll get_inv(ll x, ll p) 		//逆元求解
{ 
	return bin(x, p - 2, p); 
}

二、扩展欧几里得求逆元

ll exgcd(ll a, ll b, ll &x, ll &y)		//扩展欧几里得算法
{
	if(b == 0)
	{
		x = 1;
		y = 0;
		return a;
	}
	ll d = exgcd(b, a % b, x, y);
	ll t = x;
	x = y;
	y = t - a / b * y;
	return d;
}

ll get_inv(ll a, ll M) 		//扩欧求逆元
{ 
	static ll x, y; 
	assert(exgcd(a, M, x, y) == 1); 
	return (x % M + M) % M; 
}

然后以后遇到这种类型的题目,又是套模板了,嘿嘿嘿!
如下给出典型例题:
P O J POJ POJ 1006
H D O J HDOJ HDOJ 4569

你可能感兴趣的:(数论)