先说一个典故:淮安民间传说着一则故事——“韩信点兵”,其次有成语“韩信点兵,多多益善”。韩信带1500名兵士打仗,战死四五百人,站3人一排,多出2人;站5人一排,多出4人;站7人一排,多出6人。韩信马上说出人数:1049。而在一千多年前的《孙子算经》中,也有这样一道算术题:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”按照今天的话来说:一个数除以3余2,除以5余3,除以7余2,求这个数。这样的问题,也有人称为“韩信点兵”.它形成了一类问题,也就是初等数论中的解同余式问题。在《孙子算经》中,该书的作者已经给出了该类问题的具体描述以及该类问题的解法。这个发现要比西方早很多年,现在这个问题的推广和解法被称之为中国剩余定理。
到了明代,到了明代,数学家程大位用诗歌概括了这一算法,他写道:
三人同行七十稀,五树梅花廿一枝;
七子团圆月正半,除百零五便得知。
这首诗的意思是:用3除所得的余数乘上70,加上用5除所得余数乘以21,再加上用7除所得的余数乘上15,结果大于105就减去105的倍数,这样就知道所求的数了。
下面给出中国剩余定理的一般描述和证明。
中国剩余定理描述:
- 令 n1, n2, …, nt为两两互素的正整数;
- 令 N= n1*n2* …*nt (其中t是一个正整数);
- 则以下同余系统:x= a1 mod n1, x= a2 mod n2, …, x= at mod nt, 中x会在[0, N-1]内有唯一解。
下面给出中国剩余定理的证明:
首先我们计算N/ni,其中i=1,2,3,...,t。(即N/ni = n1*n2*...*n(i-1)*n(i+1)*...*nt,不包括ni),由n1到nt这t个数两两互素,可以知道N/ni和ni互素,也就是说(N/ni,ni)的最大公约数是1.
这样我们就可以定义:
- yi * (N/ni) = 1 mod ni
即
- yi 等于N/ni模ni的逆
这样算出所有的yi我们就可以构造一个x如下:
下面我们来验证这个x是否满足上面同余系统中的要求:
对于同余系统中的第i个方程:
- x mod ni
- = (N/n1)*y1*a1 + (N/n2)*y2*a2 + ... + (N/ni)*yi*ai + ... + (N/nt)*yt*at mod ni
- = (N/ni)*yi*ai mod ni //因为只有(N/ni)这一项中没有ni这一个因子
- = ai //由上面的分析知道yi是(N/ni)对于模ni的逆,即yi * (N/ni) = 1 mod ni
所以对于所有i, 1≤ i ≤t,都有:
下面可以用这种方法来解同余式组:
例如:
- x = 2 mod 3
- x = 3 mod 5
- x = 2 mod 7
第一步我们计算N=3×5×7=105,然后计算N/ni:
N/n1=35, N/n2=21, N/n3=15
然后来求所有的yi:
y1 = 35 模 3 的逆 =2 , y2= 21模 5的逆 =1 , y3 = 15模7的逆 =1;
得到了这些之后,就直接用上面构造的那个x,就可以得到所求解了:
x = 35×2×2 + 21×1×3 + 15×1×2 mod 105 = 23
不确定的话再代入检验一下。