孫子問題 中國剩餘定理

2021-08-07 12:39:12 字數 4090 閱讀 2730

「孫子問題」在現代數論中是乙個一次同餘問題,它最早出現在我國公元四世紀的數學著作《孫子算經》中。《孫子算經》捲下「物不知數」題說:有物不知其數,三個一數餘二,五個一數餘三,七個一數又餘二,問該物總數幾何?顯然,這相當於求不定方程組: 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...