同余方程详解

匆匆过客 提交于 2020-02-07 00:07:40

同余概述

定义: 同余给定正整数mm,若用mm去除两个整数aabb,所得的余数相同,称a和b对模mm同余,记作ab(mod m)a≡b(mod\ m),并称该式为同余式,否则,称aabb对模mm不同余。
定理:

  1. ab(mod m)a≡b(mod\ m),当且仅当m(ab)m|(a-b)
  2. ab(mod m)a≡b(mod\ m),当且仅当存在正整数kk,使得a=b+kma=b+km
  3. 同余关系是等价关系,即
    (1)自反性:aa(mod m)a≡a(mod\ m)
    (2)对称性:ab(mod m)a≡b(mod\ m),则 ba(mod m)b≡a(mod\ m)
    (3)传递性:ab(mod m),bc(mod m)a≡b(mod\ m),b≡c(mod\ m),则 ac(mod m)a≡c(mod\ m)

定义:由与同余关系是等价关系,对于所有整数会被分为mm的集合,这些集合称为模mm剩余类(同余类)。每个集合中的任意两个数都是模mm同余的。
定义:一个整数集合,且满足对于任意的整数在此集合中存在一个元素与该整数模mm同余,该整数012...m10,1,2,... ,m-1的集合是模mm的完全剩余系。
定理:若aabbccdd是整数,mm是正整数,且ab(mod m),cd(mod m)a≡b(mod\ m),c≡d(mod\ m),则:
4. a+bb+c(mod m)a+b≡b+c(mod\ m)
5. abbc(mod m)a-b≡b-c(mod\ m)
6. acbc(mod m)ac≡bc(mod\ m)
7. acbc(mod m),c0ac≡bc(mod\ m),c≠0,则ab(mod mgcd(m,c))a≡b(mod\ \frac{m}{gcd(m,c)})
8. ax+cy=bx+dy(mod m)ax+cy=bx+dy(mod\ m),其中xyx,y为任意整数,即同余式可以相加
9. acbd(mod m)ac≡bd(mod\ m),即同余式可以相乘
10. anbna^n≡b^nn>0n>0
11. f(a)f(b)(mod m)f(a)≡f(b)(mod\ m),其中f(x)f(x)为任一整数多项式

定理:若a,b,c,d为整数,m为正整数,则:

  1. ab(mod m)a≡b(mod\ m),且dmd|m,则ab(mod d)a≡b(mod\ d)
  2. ab(mod m)a≡b(mod\ m),则(a,m)=(b,m)(a,m)=(b,m),其中(a,m)(a,m)aamm的最大公约数
  3. ab(mod mi) (1in)a≡b(mod\ m_i)\ (1≤i≤n),同时成立,当且仅当ab(mod[m1,m2,...,mn])a≡b(mod[m_1,m_2,...,m_n])

证明上式1, 若ab(mod m)a≡b(mod\ m) ,则axbx(mod m)ax≡bx(mod\ m),令xd=mxd=m,两边同除xxab(mod mgcd(m,x))a≡b(mod\ \frac{m}{gcd(m,x)})gcd(m,x)=xgcd(m,x)=x,即ab(mod d)a≡b(mod\ d)
证明上式2,若ddaamm的公约数,且m(ab)dadmm|(a-b),d|a,d|m,所以dbd|b,对于所有dd上式都成立,反之亦然成立,即aammbbmm的公约数集相同,所以(a,m)=(b,m)(a,m)=(b,m)

一元线性同余方程

定义:aba,b是整数,mm是正整数,形如axb(mod m)ax≡b(mod\ m),且xx是未知整数的同余式称为一元线性同余方程.
定理:aba,b是整数,mm是正整数,(a,m)=d(a,m)=d.如果dbd|b,则方程恰有dd个模mm的不同余的解,否则方程无解。
证明:方程有解时,(axb)=ym(ax-b)=ymyy为整数,即axym=bax-ym=b,由裴蜀定理可知,对任何整数aba、b和它们的最大公约数dd,关于未知数xxyy的线性不定方程(称为裴蜀等式):若a,ba,b是整数,且gcd(a,b)=dgcd(a,b)=d,那么对于任意的整数x,yx,y,都有ax+byax+by一定是dd的倍数,特别地,一定存在整数x,yx,y,使ax+by=dax+by=d成立。因为y为整数,不是定值,所以把上式化为adxmdy=bd\frac{a}{d}x-\frac{m}{d}y=\frac{b}{d},随着yy值变化,xx存在dd个不同余的解。所以如果(a,m)=d(a,m)=ddbd|b,那么方程恰有dd个不同余解 ,dd个解分别关于md\frac{m}{d}同余,分别为xx+mdx+2md...x+(d1)mdx,x+\frac{m}{d},x+2*\frac{m}{d},...,x+(d-1)*\frac{m}{d}

求解一元线性同余方程时可以使用扩展欧几里得算法.

void exgcd(int a,int b,int&d,int&x,int&y)//扩展欧几里得算法
{
    if(b==0)
    {
        x=1,y=0;
        d=a;
        return;
    }
    else 
    {
        int r=exgcd(b,a%b,x,y); //r=GCD(a,b)=GCD(b, a%b)
        int t=x;
        x=y;
        y=t-a/b*y ;
        return;
    }
}
int f(int a,int b,int m)//计算同余方程所有解
{
	int x,y,d;
	exgcd(a,m,d,x,y);
	if(b%d)
		return -1;//无解
	x=x*(b/d)%m;
	for(int i=1;i<=d;i++)
		ans[i]=(x+(i-1)*m/d)%m;
}

一元线性同余方程组

任意的一元线性同余方程组都可以化为xb(mod m)x≡b(mod\ m),而一元线性同余方程组就是多个这样的式子联合求解。
例如:xb1(mod m1)x≡b_1(mod\ m_1)xb2(mod m2)x≡b_2(mod\ m_2),这两个方程就构成了一个同余方程组。
m=[m1,m2]m=[m_1,m_2],此时方程组有解的充分必要条件是(m1,m2)b1b2(m_1,m_2)|b_1-b_2,此时方程仅有一个非负整数解。
证明:讲两式写为x=b1+m1y1,x=b2+m2y2x=b_1+m_1y_1,x=b_2+m_2y_2,联立可得b1+m1y1=b2+m2y2b_1+m_1y_1=b_2+m_2y_2,即m1y1m2y2=b1b2m_1y_1-m_2y_2=b_1-b_2,由裴蜀定理可知成立。此时方程的解即为(b1+m1y1)%m(b_1+m_1y_1)\%m(b2+m2y2)%m(b_2+m_2y_2)\%m
上面式子m1y1m2y2=b1b2m_1y_1-m_2y_2=b_1-b_2可由扩展欧几里得求解y1y_1y2y_2.
对于多个方程的方程组,这样两两求解合并即可求出最后的解。

int solve()
{
    int n,m1,b1,m2,b2,x,y,d,flag=1;
    cin>>n>>m1>>b1;
    for(int i=1;i<n;i++)
    {
        cin>>m2>>b2;
        int c=b2-b1;
        exgcd(m1,m2,d,x,y);
        if(c%d!=0)
            flag=0;
        x=(x*c/d)%(m2/d);//求小于m2/d的解
        b1=m1*x+b1;
        m1=m1*(m2/d);//合并后m应为m1和m2的最小公倍数
    }
    if(flag) return b1;
    else return -1;
}

中国剩余定理

中国剩余定理是中国古代求解一次同余式组的方法。是数论中一个重要定理。又称中国余数定理。
给定一个同余式组如下:
S{xa1(mod m1)xa2(mod m2)xa1(mod m1)    .    .    .xan(mod mn) S\left\{ \begin{aligned} &x≡a_1(mod\ m_1)&\\ &x≡a_2(mod\ m_2)&\\ &x≡a_1(mod\ m_1)&\\ &\ \ \ \ .&\\ &\ \ \ \ .&\\ &\ \ \ \ .&\\ &x≡a_n(mod\ m_n)&\\ \end{aligned} \right.
中国剩余定理说明:假设整数m1,m2,...,mnm_1,m_2, ... ,m_n两两互质,则对任意的整数:a1,a2,...,ana_1,a_2, ... ,a_n,方程组SS有解,并且通解可以用如下方式构造得到:
M=i=1nmiMi=Mmiti=Mi1M=\prod\limits_{i=1}^n{m_i},M_i=\frac{M}{m_i},t_i=M_i^{-1}(tit_iMiM_imim_i意义下的逆元),即tiMi1(mod mi)t_iM_i≡1(mod\ m_i)
那么方程组的通解x=a1t1M1+a2t2M2+...+antnMn+kMx=a_1t_1M_1+a_2t_2M_2+...+a_nt_nM_n+kM
在模M情况下只有一个解x=(i=1naitiMi)mod Mx=(\sum\limits_{i=1}^n{a_it_iM_i})mod\ M
下面证明摘自百度百科:
摘自百度百科
中国剩余定理求解同余方程组:

int m[maxx];
int intChina(int n)
{
    int M=1,Mi,x0,y0,d,ans=0;
    for(int i=1;i<=n;i++)
        M*=m[i];
    for(int i=1;i<=n;i++)
    {
        Mi=M/m[i];
        exgcd(Mi,m[i],d,x0,y0)
        ans=(ans+Mi*x0*a[i])%M;
    }
    return ans;
}

由中国剩余定理可得的两个定理

  1. aba,b是正整数,那么有(2a1,2b1)=2(a,b)1(2^a-1,2^b-1)=2^(a,b)-1.
  2. 正整数2a12b12a-1,2b-1是互质的,当且仅当a与b是互质的。

中国剩余定理应用:
poj1006.Biorhythms
题目大意:人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxx=1e6+7,M=21252;
void exgcd(int a,int b,int&d,int&x,int&y)
{
    if(b==0)
    {
        x=1,y=0;
        d=a;
        return;
    }
    else
    {
        exgcd(b,a%b,d,x,y);
        int t=x;
        x=y;
        y=t-a/b*y ;
        return;
    }
}
int m[maxx],a[maxx];
int intChina(int n)
{
    int Mi,x0,y0,d,ans=0;
    for(int i=1;i<=n;i++)
    {
        Mi=M/m[i];
        exgcd(Mi,m[i],d,x0,y0);
        ans=(ans+Mi*x0*a[i])%M;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(0);
    int p,e,i,d,s=1;
    m[1]=23,m[2]=28,m[3]=33;
    while(cin>>p>>e>>i>>d&&p!=-1)
    {
        a[1]=p;
        a[2]=e;
        a[3]=i;
        int ans=intChina(3);
        while(ans<=d)
            ans+=M;
        cout<<"Case "<<s++<<": the next triple peak occurs in "<<ans-d<<" days."<<endl;
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!