看了這篇《沒有定理的中國古代數(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ù)學中的種種算法都寫出程序也是一件很風雅的事情。