「孫子問題」在現代數論中是乙個一次同餘問題,它最早出現在我國公元四世紀的數學著作《孫子算經》中。《孫子算經》捲下「物不知數」題說:有物不知其數,三個一數餘二,五個一數餘三,七個一數又餘二,問該物總數幾何?顯然,這相當於求不定方程組: n=
3x+2
, n=
5y+3
, n=
7z+2
, 《孫子算經》所給答案是n=23。由於孫子問題資料比較簡單,這個答數通過試算也可以得到。中國數學家秦九韶於2023年做出了完整的解答,口訣如下:
三人同行七十希,
五樹梅花廿一支,
七子團圓正半月,
除百零五使得知。
這個解法實際上是,首先利用秦九韶發明的大衍求一術求出5和7的最小公倍數35的倍數中除以3餘數為1的最小乙個70(這個稱為35相對於3的數論倒數),3和7的最小公倍數21相對於5的數論倒數21,3和5的最小公倍數15相對於7的數論倒數15。然後70×2+21×3+15×2-2×105=233便是可能的解之一。它加減3、5、7的最小公倍數105的若干倍仍然是解,因此最小的解為233除以105的餘數23。
附註:這個解法並非最簡,因為實際上35就符合除3餘2的特性,所以最小解是:35×1+21×3+15×2-105=23。最小解加上105的正整數倍都是解。下面分析一下孫子算經的演算法,乙個數滿足除以3餘2,除以5餘3,除以7餘2.那麼我們先假設這個數n = a+b+c。如果a除以3餘2(a≡2(mod3))且b和c是3的倍數。b除以5餘3(b≡3(mod5))且a,c都是5的倍數,c除以7餘2(c≡2(mod7))且a,b都是7的倍數。那麼n就是我們要找的數。總結下來,a應該滿a≡2(mod3)且a是5和7的公倍數;b≡3(mod5),且b是3和7的公倍數;c≡2(mod7),且c是3和5的公倍數。我們設a=k1*35(35是5和7的最小公倍數,則k1*35可以表示5和7的所有公倍數,k1是正整數)b=k2*21,c=k3*15;再取合適的k1,k2,k3的值使得a≡2(mod3),b≡3(mod5),c≡2(mod7).可得a=140,b=63,c=30.則n=233,又因為3,5,7的最小公倍數是105,在減去105得23.故所得最小整數為23,n=23+k*105都滿足條件。
我們可以將上訴問題改為求一次同餘方程的形式即:
k1*35≡1(mod3)求出k1*35的最小值為70,k1=2;
k2*21≡1(mod5)求出k2*21的最小值為21,k2=1;
k3*15≡1(mod7)求出k3*15的最小值為15,k3=1;
我們想得到a模3餘1題中要求餘2,所以用70再乘以2就得到a,這時a模3就餘2了,同理用21*3,15乘以2。再相加得到n=2*35*2+1*21*3+1*15*2=233。233所在的模105的剩餘類都滿足條件即n=23+k*105.
例如:4關於模7的乘法逆元為多少?
4*x≡1(mod 7)
這個方程等價於求乙個x和k,滿足
4x=7k+1
其中x和k都是整數。
若ax=1 mod f 則稱a關於模f的乘法逆元為x。也可表示為ax≡1(mod f)。
當a與f互素時,a關於模f的乘法逆元有唯一解。如果不互素,則無解。如果f為素數,則從1到f-1的任意數都與f互素,即在1到f-1之間都恰好有乙個關於模f的乘法逆元。
例如,求5關於模14的乘法逆元:
14=5*2+4
5=4+1
說明5與14互素,存在5關於14的乘法逆元。
1=5-4=5-(14-5*2)=5*3-14
因此,5關於模14的乘法逆元為3。
在模運算中,
加法單位元是0,因為(0+a) mod m = a mod m;
乘法單位元是1,因為(1×a) mod m = a mod m
定義 對a∈zm,存在b∈zm,使得a+b ≡ 0 (mod m),則b是a的加法逆元,記b= - a。
定義 對a∈zm,存在b∈zm,使得a×b ≡1 (mod m),則稱b為a的乘法逆元。
其求法可用歐幾里德演算法:
extended euclid(d,f)//演算法求d關於模f的乘法逆元d−
1 ,即 d∗
d−1m
odf=
1 (x1,x2,x3) := (1,0,f); (y1,y2,y3) := (0,1,d)
if (y3=0) then return d−
1 = null //無逆元
if (y3=1) then return d−
1 = y2 //y2為逆元
q := x3 div y3 //整除
(t1,t2,t3) := (x1 - q*y1 , x2 - q*y2,x3 - q*y3)
(x1,x2,x3) := (y1,y2,y3)
(y1,y2,y3) := (t1,t2,t3)
goto 2
以上解法若推廣到一般情況,便得到了中國剩餘定理的乙個構造性證明。
一般地,中國剩餘定理是指若有一些兩兩互質的整數 ,則對任意的整數:a1,a2,…an,以下聯立同餘方程組對模有公解:
有解的判定條件,並用構造法給出了在有解情況下解的具體形式。
中國剩餘定理說明:假設整數m1
,m2,
...,
mn兩兩互質,則對任意的整數:a1
,a2,
...,
an,以上同餘方程組 有解,並且通解可以用如下方式構造得到: 設m
=m1∗
m2∗.
..∗m
n=∏n
i=1m
i 是整數m1
,m2,
...,
mn的乘積,並設mi
=m/m
i 是除了mi
以外的n−
1 個整數的乘積。 設t
i=m−
1i為m
i 模mi
的數論倒數(ti
為mi 模mi
意義下的乘法逆元)mi
ti≡1
(modm)
i∀∈
以上同餘方程組的通解形式為x=
a1t1
m1+a
2t2m
2+..
.+an
tnmn
+km=
∑i=1
nait
imi+
km,k
∈z.
在模m的意義下,方程組只有乙個解:x=
(∑i=
1nai
timi
)(modm
)擴充套件歐幾里得演算法的推導參考:擴充套件歐幾里得演算法
#include
typedef long long ll;
ll extended_euclid(ll a, ll b, ll *x, ll *y)
printf("before a:%lld,b:%lld,*x:%lld,*y:%lld\r\n",a,b,*x,*y);
d = extended_euclid(b, a%b, x, y);
ll temp = *x;
*x = *y;
*y = temp - a/b*(
*y);
printf("after a:%lld,b:%lld,*x:%lld,*y:%lld\r\n",a,b,*x,*y);
return d;
}ll chinese_remainder(ll a, ll w, ll len)
for (i=0;im=n/w[i];
d = extended_euclid(w[i], m, &x, &y);
printf("x:%lld,y:%lld\r\n",x,y);
ret=(ret+y
*m*a[i])%n;
}return (n+ret%n)%n;
}int main()
,w = ;
printf("chinese_remainder:%lld\r\n",chinese_remainder(a,w,3));
return
0;}
中國剩餘定理(孫子定理)
設m1,m2 mk是k個兩兩互素的正整數 則同餘方程組 x a1 mod m1 x a2 mod m2 x ak mod mk 記m m1 m2 m3 mk 有bj使mm j bj 1 m odmj 則x i 1 kmmj aj bjps x不一定是最小的需要mod m 例題 求下列同餘方程組最小解...
中國剩餘定理(孫子定理)
中國剩餘定理,也叫孫子定理,是數論中的又乙個重要定理,那麼它是幹什麼用的呢?簡單來說,這是乙個用來求一元線性同餘方程組的定理。叫做孫子定理的原因就是該定理最早可見於南北朝時期的著作 孫子算經 捲下第二十六題,叫做 物不知數 問題,原文如下 有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。問物...
中國剩餘定理 即 孫子定理
中國剩餘定理 即 孫子定理 中國古代求解一次同余式組 見 同餘 的方法。是 數論中乙個重要定理。又稱中國剩餘定理。中國剩餘定理 解法如下 假設存在乙個數m m a a m b b m c c 並且a,b,c必須倆倆互質。滿足這一條件下 存在乙個r1 使得 k1 a b r1 k1 c 1.存在乙個r...