同余(看了也没用)

同余

定义

若整数 a a a和整数 b b b除以正整数 m m m的余数相同则称 a a a, b b b m o d mod mod m m m 同余记作 a ≡ b ( m o d a\equiv b (mod ab(mod m ) m) m).

同余的一些小性质

同加性:若 a ≡ b ( m o d   m ) a\equiv b(mod\ m) ab(mod m),则 a + c ≡ b + c ( m o d   m ) a+c\equiv b+c(mod\ m) a+cb+c(mod m)
同乘性:若 a ≡ b ( m o d   m ) a\equiv b(mod\ m) ab(mod m),则 a × c ≡ b × c ( m o d   m ) a\times c \equiv b\times c(mod\ m) a×cb×c(mod m),若 a ≡ b ( m o d   m ) , c ≡ d ( m o d   m ) a\equiv b(mod\ m) , c\equiv d (mod\ m) ab(mod m),cd(mod m),则 a × c ≡ b × d ( m o d   m ) a\times c \equiv b\times d (mod\ m) a×cb×d(mod m)
同幂性:若 a ≡ b ( m o d   m ) a\equiv b(mod\ m) ab(mod m),则 a c ≡ b c ( m o d   m ) a^c\equiv b^c(mod\ m) acbc(mod m)
a × b %   k = ( a % k ) × ( b % k ) % k a\times b\%\ k=(a\%k)\times(b\%k)\%k a×b% k=(a%k)×(b%k)%k

费马小定理

p p p是质数,则对于任意整数 a a a,有 a p ≡ a ( m o d a^p\equiv a(mod apa(mod p ) p) p).

扩展欧几里得

Bezout定理
对于任意整数 a a a, b b b存在一对整数 x x x, y y y满足 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b).
证明:
根据欧几里得定理,我们可以知道 g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a gcd(a,b)=gcd(b,a m o d mod mod b ) b) b),假设有一组数 x , y x,y x,y,
满足 b ∗ x + ( a − b ⌊ a b ⌋ ) y b*x+(a-b\lfloor\frac{a}{b}\rfloor)y bx+(abba)y;可以得到 a ∗ y + b ( x − ⌊ a b ⌋ ∗ y ) a*y+b(x-\lfloor\frac{a}{b}\rfloor*y) ay+b(xbay)
x ′ = y , y ′ = ( x − ⌊ a b ⌋ ∗ y ) x'=y,y'=(x-\lfloor\frac{a}{b}\rfloor*y) x=y,y=(xbay),则可以得到 a x ′ + b y ′ = g c d ( a , b ) ax'+by'=gcd(a,b) ax+by=gcd(a,b).
可以往下推到 b = 0 b=0 b=0时,显然有 x = 1 , y = 0 x=1,y=0 x=1,y=0成立.
根据数学归纳法,可知定理成立.
证毕。
乘法逆元
可以用扩欧和费马小定理两种方式
代码如下

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=20001000;
ll n,p;
ll f[N],ni[N],ci[N];//jie存阶层,ni存逆元,ci存P-2次方; 
ll fang(ll a,ll b)
{
	ll sum=1;
	while(b)
	{
		a%=p;
		sum%=p;
		if(b&1) sum=(sum%p*(a%p))%p;
		b=b>>1;
		a=(a%p*(a%p))%p;
	}
	return sum%p;
}
int main()
{
	freopen("invele.in","r",stdin);
	freopen("invele.out","w",stdout);
	cin>>n>>p;
	f[0]=1;
	f[1]=1;
	for(ll i=2;i<=n;i++) 
	f[i]=(f[i-1]*i)%p;
	ci[n]=fang(f[n],p-2);
	for(ll i=n-1;i>=1;i--)
	ci[i]=(ci[i+1]*(i+1))%p;
	for(ll i=1;i<=n;i++)
	{
		ni[i]=(ci[i]*f[i-1])%p;
	}
	for(ll i=1;i<=n;i++)
	printf("%lld\n",ni[i]);
	return 0;
}

版子请忽略freopen.
下面是扩欧

typedef long long ll;
void exgcd(ll a,ll b,ll &x,ll &y,ll &d)
{
    if (!b)
    {
        d=a;x=1;y=0;
        return;
    }
    exgcd(b,a%b,x,y,d);
    ll temp=x;
    x=y;
    y=temp-(a/b)*y;
}
int main()
{
    ll a,b,x,y,d;
    cin>>a>>b;
    exgcd(a,b,x,y,d);
    x=(x%b+b)%b;
    cout<<x<<endl;
    return 0;
}

代码里输出的x就是逆元的值了.

中国剩余定理

又称中国余数定理孙子定理
简单来说就是这样
{ x ≡ a 1 ( m o d   m 1 ) x ≡ a 2 ( m o d   m 2 ) ⋮ x ≡ a n ( m o d   m n ) \left\{\begin{matrix} x \equiv a_1(mod\ m_1)\\x \equiv a_2(mod\ m_2)\\\vdots\\x \equiv a_n(mod\ m_n) \end{matrix}\right. xa1(mod m1)xa2(mod m2)xan(mod mn)

对于这样的一个方程组如果任意的两个 m m m都互素,则一定有解
所以中国剩余定理就是解但 m m m互素的情况

我们尝试来构造这样一组解

M = m 1 × m 2 × ⋯ × m n , M i = M m i M = m_1 \times m_2 \times \cdots \times m_n,M_i = \frac{M}{m_i} M=m1×m2××mn,Mi=miM

M i M_i Mi只有在模 m i m_i mi时不为零,模其他 m m m都是零

由于我们希望在模 m i m_i mi时得到 a i a_i ai所以乘上 a i t i a_it_i aiti

其中 t i t_i ti M i M_i Mi在模 m i m_i mi时的逆元

所以最小正整数解就是 x = ∑ i = 1 n a i t i M i x = \sum_{i=1}^{n}a_it_iM_i x=i=1naitiMi,通解就是 x + k M x+kM x+kM

如果题目说明了的 m m m都是素数则可以用费马小定理
代码

int crt()
{
	int ans=0,M=1;
	for(int i=1;i<=n;i++)
	 M*=m[i];
	for(int i=1;i<=n;i++)
	{
		int Mi=M/m[i],invers=ksm(Mi,m[i]-2,m[i]);
		ans=(ans+a[i]*invers*Mi)%M;
	}
	return ans;
}

也可以用扩展欧几里得

inline int crt()
{
	int M=1,ans=0;
	for(int i=1;i<=n;i++) 
	M*=m[i];
	for(int i=1;i<=n;i++)
	{
		LL Mi=M/m[i],x,y;
		exgcd(Mi,m[i],x,y);
		ans=((ans+a[i]*Mi*x)%M+M)%M;
	}
	return ans;
}

证明中国剩余定理一定有解

我们举这个同余方程为例

{ x ≡ a 1 ( m o d   m 1 ) x ≡ a 2 ( m o d   m 2 ) \left\{\begin{matrix} x \equiv a_1(mod\ m_1)\\x \equiv a_2(mod\ m_2)\\ \end{matrix}\right. {xa1(mod m1)xa2(mod m2)

假设我们分别解出

{ x 1 = a 1 + k 1 × m 1 x 2 = a 2 + k 2 × m 2 \left\{ \begin{matrix} x_1 = a_1+k_1 \times m_1 \\ x_2 = a_2 + k_2 \times m_2 \end{matrix}\right. {x1=a1+k1×m1x2=a2+k2×m2

因为 x 1 = x 2 x_1 = x_2 x1=x2

所以 a 1 + k 1 × m 1 = a 2 + k 2 × m 2 a_1+k_1\times m_1 = a_2 + k_2 \times m_2 a1+k1×m1=a2+k2×m2

整理得 k 2 × m 2 − k 1 × m 1 = a 1 − a 2 k_2\times m_2 - k_1\times m_1 = a_1-a_2 k2×m2k1×m1=a1a2

这就是 a x + b y = d ax+by=d ax+by=d的形式

所以当 g c d ( m 1 , m 2 ) ∣ a 1 − a 2 gcd(m_1,m_2)|a_1-a_2 gcd(m1,m2)a1a2 时一定有解

又因为 m 1 m_1 m1 m 2 m_2 m2互质

所以 g c d ( m 1 , m 2 ) = 1 gcd(m_1,m_2) = 1 gcd(m1,m2)=1

显然中国剩余定理一定有解
.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值