利用Python求解阿基米德分牛問題
題目大意
問 太陽神有一牛群,由白、黑、花、棕四種顏色的公、母牛組成,其間關系如下,求每種牛的個數(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,那么難點主要如何優(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"\\")
這道題到這里基本上就算解完了,但是牛至少得是個整數(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求解阿基米德分牛問題的文章就介紹到這了,更多相關Python阿基米德分牛內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python?PyJWT庫簡化JSON?Web?Token的生成與驗證
PyJWT庫為Python開發(fā)者提供了簡便的生成和驗證JWT的工具,本文將深入介紹PyJWT庫的核心概念、功能以及實際應用,通過豐富的示例代碼,幫助大家更全面地了解和應用這一強大的JWT庫2023-12-12python使用htmllib分析網(wǎng)頁內容的方法
這篇文章主要介紹了python使用htmllib分析網(wǎng)頁內容的方法,涉及Python使用htmllib模塊的相關技巧,需要的朋友可以參考下2015-05-05python3+PyQt5實現(xiàn)自定義流體混合窗口部件
這篇文章主要為大家詳細介紹了python3+PyQt5實現(xiàn)自定義流體混合窗口部件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04python GUI庫圖形界面開發(fā)之PyQt5窗口布局控件QStackedWidget詳細使用方法
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5窗口布局控件QStackedWidget詳細使用方法,需要的朋友可以參考下2020-02-02