1. 程式人生 > 其它 >【C#】GDAL3編譯(一):Windows下超詳細編譯C#版GDAL3(VS2015+.NET 4+32位/64位)

【C#】GDAL3編譯(一):Windows下超詳細編譯C#版GDAL3(VS2015+.NET 4+32位/64位)

前言

今天把數學一本通往後看了一頁,發現是中國剩餘定理。看完之後,一竅不通,於是自己在 奇妙的網路 上搜索資源,緩慢地學會了。

不會LATEX(

思路

一般來說中國剩餘定理需要求滿足條件的最小值,很容易想到這樣的值不止一個,所以就像求線性同餘方程(實際上,中國剩餘定理就是求特殊的線性同餘方程組)的解一樣,先找特殊解,然後利用通解公式找到最小正整數解。

宣告

中國剩餘定理可以簡化為求一個 x,使得

x % a[ 1 ] == b[ 1 ]

x % a[ 2 ] == b[ 2 ]

......

x % a[ n ] == b[ n ]

設所有 a[ 1->n ] 的積為 a

設m[ i ] = tot / a[i]

m[ i ]-1 為 m[ i ]在(mod a[ i ]) 意義下的逆元

通解

看完第一篇題解之後,我對於通解為什麼是 x + kb 產生了疑問。很多題解開篇就宣告,沒有給出解釋,被我直接跳過了。但是這東西其實非常簡單(所以正經題解不會解釋)。

我們設當前已經得到了一個解 x,另外還有一個解是 y。

那麼

x≡ b[ i ] (mod a[ i ])

y≡ b[ i ] (mod a[ i ])

所以

x≡ y (mod a[ i ])

所以

(y - x) | a[ i ]

同理

(y - x) | a[ j ]

  而因為對於所有的 a[ i ] a[ j ],i ≠ j,a[ i ] a[ j ]互質

  所以

(y - x) | a

也就是說

y = x + ka

構造特殊解

對於一個單獨的方程來看

x≡ b[ i ] (mod a[ i ])

我們可以用 一個 a[ i ]的倍數加上一個 ≡b[ i ] (mod a[ i ])的數字

考慮這個數字

b[ i ]≡ b[ i ] * 1≡ b[ i ] * (m[ i ] * m[ i ]-1) (mod a[ i ])

而我們驚奇的發現,這個數字 b[ i ] * m[ i ] * m[ i ]-1在不 moda[ i ]的情況下(畢竟如果 mod a[i]就成 1 了)是所有的 a[ j ],j≠ i的倍數。

也就是說,對於所有的方程組我們取出這樣一個 b[ i ] * m[ i ] * m[ i ]-1

並且相加,就可以得到一個特殊解 x。

為什麼呢?我們挨個檢查每個方程式。

對於方程式 i, 把 x 分解成 b[ i ] * m[ i ] * m[ i ]-1b[ j ] * m[ j ] * m[ j ]-1,j≠ i的和。

對於這個和

我們發現每一項的 m[ j ] 中必然會包含一個因子 a[ i ],因為m[ j ] 是 a 剝離出了 a[ j ],而沒有剝離出 a[ i ]。所以,這個和為 a[ i ] 的倍數。

對於這個數

b[ i ] * m[ i ] * m[ i ]-1,已經提到過,在 (mod a[ i ])的意義下 ≡b[ i ]。

兩者結合,這正是我們一開始考慮的一個倍數和一個數字。

顯然對於每個方程式 i,都可以像上述過程一樣滿足條件。故 x 可作為特殊解。

求最小正整數解

x % a

結語

數學苦手應該好好學數學。

從洛谷上搬運過來,為了自己的審美改格式,改了半個多小時,頭要掉了......

同時也發現了一些部落格園的功能,以後的格式應該會更用可讀性的。