中国剩余定理

在做C入门题的时候做了这个

在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:

  • 按从1至5报数,记下最末一个士兵报的数为1;
  • 再按从1至6报数,记下最末一个士兵报的数为5;
  • 再按从1至7报数,记下最末一个士兵报的数为4;
  • 最后按从1至11报数,最末一个士兵报的数为10;

请编写程序计算韩信至少有多少兵。

输入格式:

本题无输入

输出格式:

输出韩信至少拥有的士兵人数。


好像又回到了小学,发现这个是中国剩余定理的内容,有关数论,还有与之相关的还有什么欧几里得,以及线性同余,表示自己对这个并不感什么兴趣啊,但是一查发现就这种数论还有蛮多的应用,我这里先做一些初步的吧,不想做深入地探究,毕竟这不是我最终想做的事。

搜索了那么多,然后发现wiki上的其实比较权威,或许真正我敢去硬着头皮看这些公式的时候就试在wiki上的吧,之前都被那种什么公式给吓到了。所以大家不要怕,就耐下性子看看。

把wiki上的粘过来了。

形式描述[编辑]

用现代数学的语言来说明的话,中国剩余定理给出了以下的一元线性同余方程组:

{\displaystyle (S):\quad \left\{{\begin{matrix}x\equiv a_{1}{\pmod {m_{1}}}\\x\equiv a_{2}{\pmod {m_{2}}}\\\vdots \qquad \qquad \qquad \\x\equiv a_{n}{\pmod {m_{n}}}\end{matrix}}\right.} (S) : \quad \left\{ \begin{matrix} x \equiv a_1 \pmod {m_1} \\ x \equiv a_2 \pmod {m_2} \\ \vdots \qquad\qquad\qquad \\ x \equiv a_n \pmod {m_n} \end{matrix} \right.

有解的判定条件,并用构造法给出了在有解情况下解的具体形式。

中国剩余定理说明:假设整数m1m2, ... , mn其中任两数互质,则对任意的整数:a1a2, ... , an,方程组{\displaystyle (S)}(S)有解,并且通解可以用如下方式构造得到:

  1. {\displaystyle M=m_{1}\times m_{2}\times \cdots \times m_{n}=\prod _{i=1}^{n}m_{i}}M = m_1 \times m_2 \times \cdots \times m_n = \prod_{i=1}^n m_i是整数m1m2, ... , mn的乘积,并设{\displaystyle M_{i}=M/m_{i},\;\;\forall i\in \{1,2,\cdots ,n\}}M_i = M/m_i, \; \; \forall i \in \{1, 2, \cdots , n\},即{\displaystyle M_{i}}M_{i}是除了mi以外的n − 1个整数的乘积。
  2. {\displaystyle t_{i}=M_{i}^{-1}}t_i = M_i^{-1}{\displaystyle M_{i}}M_{i}{\displaystyle m_{i}}m_{i}数论倒数{\displaystyle t_{i}M_{i}\equiv 1{\pmod {m_{i}}},\;\;\forall i\in \{1,2,\cdots ,n\}.}t_i M_i \equiv 1 \pmod {m_i},  \; \; \forall i \in \{1, 2, \cdots , n\}.
  3. 方程组{\displaystyle (S)}(S)的通解形式为:{\displaystyle x=a_{1}t_{1}M_{1}+a_{2}t_{2}M_{2}+\cdots +a_{n}t_{n}M_{n}+kM=kM+\sum _{i=1}^{n}a_{i}t_{i}M_{i},\quad k\in \mathbb {Z} .}x = a_1 t_1 M_1 + a_2 t_2 M_2 + \cdots + a_n t_n M_n + k M= k M + \sum_{i=1}^n a_i t_i M_i, \quad k \in \mathbb{Z}. 在模{\displaystyle M}M的意义下,方程组{\displaystyle (S)}(S)只有一个解:{\displaystyle x=\sum _{i=1}^{n}a_{i}t_{i}M_{i}.}x = \sum_{i=1}^n a_i t_i M_i.

证明[编辑]

从假设可知,对任何{\displaystyle i\in \{1,2,\cdots ,n\}}i \in \{1, 2, \cdots , n\},由于{\displaystyle \forall j\in \{1,2,\cdots ,n\},\;j\neq i,\;\;\operatorname {gcd} (m_{i},m_{j})=1}\forall j \in \{1, 2, \cdots , n\}, \; j\neq i, \; \; \operatorname{gcd}(m_i, m_j) = 1 ,所以{\displaystyle \operatorname {gcd} (m_{i},M_{i})=1.}\operatorname{gcd}(m_i, M_i) = 1. 这说明存在整数{\displaystyle t_{i}}t_{i}使得{\displaystyle t_{i}M_{i}\equiv 1{\pmod {m_{i}}}.}t_i M_i \equiv 1 \pmod {m_i}.这样的{\displaystyle t_{i}}t_{i}叫做{\displaystyle M_{i}}M_{i}{\displaystyle m_{i}}m_{i}的数论倒数。考察乘积{\displaystyle a_{i}t_{i}M_{i}}a_i t_i M_i可知:

{\displaystyle a_{i}t_{i}M_{i}\equiv a_{i}\cdot 1\equiv a_{i}{\pmod {m_{i}}},} a_i t_i M_i \equiv a_i \cdot 1 \equiv a_i \pmod {m_i},
{\displaystyle \forall j\in \{1,2,\cdots ,n\},\;j\neq i,\;\;a_{i}t_{i}M_{i}\equiv 0{\pmod {m_{j}}}.} \forall j \in \{1, 2, \cdots , n\}, \; j\neq i, \; \; a_i t_i M_i \equiv 0 \pmod {m_j}.

所以{\displaystyle x=a_{1}t_{1}M_{1}+a_{2}t_{2}M_{2}+\cdots +a_{n}t_{n}M_{n}}x = a_1 t_1 M_1 + a_2 t_2 M_2 + \cdots + a_n t_n M_n满足:

{\displaystyle \forall i\in \{1,2,\cdots ,n\},\;\;x=a_{i}t_{i}M_{i}+\sum _{j\neq i}a_{j}t_{j}M_{j}\equiv a_{i}+\sum _{j\neq i}0\equiv a_{i}{\pmod {m_{i}}}.} \forall i \in \{1, 2, \cdots , n\}, \; \; x = a_i t_i M_i + \sum_{j \neq i} a_j t_j M_j \equiv a_i + \sum_{j \neq i} 0 \equiv a_i \pmod {m_i}.

这说明{\displaystyle x}x就是方程组{\displaystyle (S)}(S)的一个解。

另外,假设{\displaystyle x_{1}}x_1{\displaystyle x_{2}}x_2都是方程组{\displaystyle (S)}(S)的解,那么:

{\displaystyle \forall i\in \{1,2,\cdots ,n\},\;\;x_{1}-x_{2}\equiv 0{\pmod {m_{i}}}.} \forall i \in \{1, 2, \cdots , n\}, \; \;  x_1 - x_2 \equiv 0 \pmod {m_i} .

{\displaystyle m_{1},m_{2},\ldots ,m_{n}}m_1, m_2, \ldots, m_n两两互质,这说明{\displaystyle M=\prod _{i=1}^{n}m_{i}}M =\prod_{i=1}^n m_i整除{\displaystyle x_{1}-x_{2}}x_1 - x_2. 所以方程组{\displaystyle (S)}(S)的任何两个解之间必然相差{\displaystyle M}M的整数倍。而另一方面,{\displaystyle x=a_{1}t_{1}M_{1}+a_{2}t_{2}M_{2}+\cdots +a_{n}t_{n}M_{n}}x = a_1 t_1 M_1 + a_2 t_2 M_2 + \cdots + a_n t_n M_n是一个解,同时所有形式为:

{\displaystyle a_{1}t_{1}M_{1}+a_{2}t_{2}M_{2}+\cdots +a_{n}t_{n}M_{n}+kM=kM+\sum _{i=1}^{n}a_{i}t_{i}M_{i},\quad k\in \mathbb {Z} } a_1 t_1 M_1 + a_2 t_2 M_2 + \cdots + a_n t_n M_n + k M= k M + \sum_{i=1}^n a_i t_i M_i, \quad k \in \mathbb{Z}

的整数也是方程组{\displaystyle (S)}(S)的解。所以方程组{\displaystyle (S)}(S)所有的解的集合就是:


{\displaystyle \{kM+\sum _{i=1}^{n}a_{i}t_{i}M_{i}\;;\quad k\in \mathbb {Z} \}.}
\{k M + \sum_{i=1}^n a_i t_i M_i  \; ; \quad k \in \mathbb{Z} \}.


其实看完了之后大家可以把我上面的题目给用下面的代着做一下,然后也就基本能判断是否掌握。但是呢我想既然这个知识对自己没什么用,那么我就要从中学习到一些思想,看看咱们老祖宗是怎么想出这样简单的方法。

第一次做的话我们大多数人都会想慢慢搜索,从第一个数满足的条件中找出所有,再在这里面找满足第二个的,以此类推。。。。但是呢这样要循环的太多了,所以我们要分析,分析的话必然是找规律,我们现在有两个问题,第一个数到底怎么判断出来,所有的数之间到底有什么规律。这里第一个问题就是我们的题目,而第二个问题是我们蛮自然会想到的,但是很有可能不会去深究。(其实在解决很多问题的时候我们可能会觉得现在的问题是什么,然后就完全集中于那个问题,其实这就像我们一直做题目里面有第一问有第二问一样,有的时候我们解决的问题只给出了最后一问,或者说没有给出前几问来引导你,这时候可能就需要我们自己的一些发散,把自己心中想问的问题记录下来,然后先看看那个问题怎么解决,然后呢,实在无法解决的时候,我们就看看自己心中问的一些问题)

这里第一个问题就是自己无法想到,而第二个问题,其实也难以直接看出,我们需要设处两个数,然后问问自己,第一个满足一系列的那个情况,第二满足一系列的条件,那我们两者之间到底有什么联系呢,数与数之间嘛,我们在高中做数列,分析规律的时候无非就是加加减减,看看得出来的东西是否有规律,不行的话再乘个方。

这里我们自然就想到了减,那么减的话,又代表了什么呢,在把他跟那些条件放在一起,然后就发现这个除所有得出来的余数是0,注意我们这里讨论的是他们都互质的情况,所以这个差值必然就是所有数的最小公倍数。

可是把这个问题解决了好像对我们第一个问题的用处也不大,那么我们就这样想,现在我们要同时满足很多个条件,要同时考虑起来非常的麻烦,所以我们看看能不能每一次只用考虑一个,然后再把他们组合到一起,比如说上面的除以5余1,我可以找到很多数,然后我除6余5,同样的,我们要建立一个统一的规则,然后把这些个组合到一起,但是他们除某一个的时候不会对别的产生影响,比方说除5余1是某个数,然后其他的相加起来除5必须得是0,同样的这是个互相的关系,你除6余5,我本来除5余1的部分以及其他的部分除以6就要整除,这样的话自然想到了上面wiki的Mi,而这里就是我的每一个部分都是有一个Mi,现在呢要解决的问题就是这个又要含有Mi 又能够除以某一个数指定余多少,这个该怎么做,这个好像涉及到欧几里得算法,唉又要去查了,先不管了!

还剩下非互质的情况,以及辗转相除法,以及辗转相除法在别的东西里面的应用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值