中國古代數(shù)學算法的Python實現(xiàn)

看了這篇《沒有定理的中國古代數(shù)學,如何站在世界之巔?》。雖然我覺得題目很標題黨,不過里面的內容很有趣啊,講解了中國古代數(shù)學里的幾個算法。由于我正在學Python,所以自然就拿來練手了。

可以運行的代碼在這里


更相減損術

“術曰:以少減多,更相減損,求其等也?!?/p>

def 更相減損術(a,b):
    while (a != b):
        if a > b:
            a=a-b
        else :
            b=b-a
    return a

這個很好寫啦,讀入兩個數(shù)a和b,求其等也,就是一直要求到兩個數(shù)相等為止。
所以用條件循環(huán)while,當a不等于b時就一直重復算。算什么呢,以少減多,就是判斷一下誰大.
如果a>b, 就用a-b替換a,否則就用b-a替換b。
一直到兩個數(shù)減到相等為止,就可以隨便返回其中一個數(shù)作為最大公約數(shù)了。


大衍求一術

這個好帥,是求解ax≡1(mod b)。就是說a乘以x除以b所得的余數(shù)等于1。詳細的解說還是看那篇公眾號的文章吧。

def 大衍求一術(a,b):
    m=np.matrix( [ [a,1], [b,0] ] )
    while (m[0,0] != 1 ):
        if m[0,0]>m[1,0]:
            m[0,:]=m[0,:]-m[1,:]
        else:
            m[1,:]=m[1,:]-m[0,:]
        if m[1,0]==1:
            return 1
        else:
            return m[0,1]

因為打算用矩陣,所以要首先導入Numpy包,python很強大的一點就是有各種包,只要import一下就好像有了超能力。
大衍求一術要求先生成一個2*2的矩陣

a 1
b 0

這樣的,所以先用np.matrix產生一個矩陣m,注意python的序數(shù)是從0開始的,所以m[0,0]=a, m[0,1]=1, m[1,0]=b, m[1,1]=0。

然后跟前面的更相減損術差不多,也是減來減去,區(qū)別是以行為單位來減,終點是把a的位置變成1,比大小的時候是用左邊那列的元素比大小。

所以如果m[0,0]>m[1,0],那就把上一行減去下一行m[0,:]-m[1,:],再替換掉上面一行m[0,:]=m[0,:]-m[1,:]。反之亦然。一直重復,直到m[0,0] == 1。

通常是返回m[0,1]的數(shù)值就可以了。但有可能a,b互質,所以需要分情況討論一下。


我的古文水平和編程水平都還不夠高,不然把中國古代數(shù)學中的種種算法都寫出程序也是一件很風雅的事情。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容