溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Python求解阿基米德分牛問題

發(fā)布時間:2023-03-09 09:45:25 來源:億速云 閱讀:102 作者:iii 欄目:開發(fā)技術

今天小編給大家分享一下怎么用Python求解阿基米德分牛問題的相關知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

題目大意

 太陽神有一牛群,由白、黑、花、棕四種顏色的公、母牛組成,其間關系如下,求每種牛的個數(shù)。

公牛中,白牛多于棕牛,二者之差為黑牛的1/2+1/3;黑牛多于棕牛,二者之差為花牛的1/4+1/5;花牛多于棕牛,二者之差為白牛數(shù)的1/6+1/7

母牛中,白牛是全體黑牛的1/3+1/4;黑牛是全體花牛的1/4+1/5;花牛是全體棕牛的1/5+1/6;棕牛是全體白牛的1/6+1/7

如果用字母x0,x1, x2 , x3分別表示白、黑、花、棕各色的公牛數(shù);用y0,y1,y2,y3分別表示白、黑、花、棕各色母牛數(shù),則得8 個未知數(shù)的如下7 個方程

怎么用Python求解阿基米德分牛問題

這個題其實是毫無難度的,但非要用Python,那么難點主要如何優(yōu)雅地表達這個過程,這里選用的是sympy符號計算。

所以第一步,先給定一些符號

import sympy
x0,x1,x2,x3 = sympy.symbols("x0,x1,x2,x3")
y0,y1,y2,y3 = sympy.symbols("y0,y1,y2,y3")
x = [x0,x1,x2,x3]
y = [y0,y1,y2,y3]

sympy求解

然后將阿基米德分牛問題轉化為Python代碼,其優(yōu)雅之處在于,這些分數(shù)的構建遵循自然數(shù)遞增的規(guī)律,故可通過循環(huán)來生成,非常便捷。

frac = lambda x : sympy.Rational(1,x)
fs = []
for i in range(3):
    fs.append(x[i]-x[3]-(frac(2*i+2)+frac(2*i+3))*x[i+1])

for i in range(4):
    ind = (i + 1) % 4
    fs.append(y[i]-(frac(i+3)+frac(i+4))*(x[ind]+y[ind]))

這樣就得到了待求方程組

>>> for f in fs: print(f)
...
x0 - 5*x1/6 - x3
x1 - 9*x2/20 - x3
x2 - 55*x3/42
-7*x1/12 + y0 - 7*y1/12
-9*x2/20 + y1 - 9*y2/20
-11*x3/30 + y2 - 11*y3/30
-13*x0/42 - 13*y0/42 + y3

但是,8個未知數(shù)7個方程,顯然沒有唯一解,考慮到x3貌似是最小的值,所以最后希望用x3來表示其他數(shù)。

res = sympy.solve(fs, x[:3]+y)

結果

查看一下結果

for key in res:
    print(sympy.latex(key), "&=", sympy.latex(res[key]), r"\\")

怎么用Python求解阿基米德分牛問題

這道題到這里基本上就算解完了,但是牛至少得是個整數(shù),所以接下來要做的是求解分母的最小公倍數(shù)。

在sympy中,對于一個分數(shù)r,r.p為分子,r.q為分母;lcm可求解其最小公倍數(shù)。

denominators = [(v/x3).q for v in res.values()]
x3Res = sympy.lcm(denominators)
# 32859792

然后讓將x3的值加入fs,

fs.append(x3-x3Res)
res2 = sympy.solve(fs, x+y)
for key in res2:
    print(sympy.latex(key), "=", res2[key], r"\\")

結果如下

x0=76379457
x1=52223598
x2=43030680
x3=32859792
y0=48646815
y1=31170942
y2=26238080
y3=38698608

這些牛加一起有349247972頭,全世界大概有10萬億頭,看來太陽神的牛還是比較多的。

以上就是“怎么用Python求解阿基米德分牛問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI