福田网站制作报价,使用模板怎么建站,软文是什么意思,做游戏开发需要学哪些技术文章目录 题目大意sympy求解结果 题目大意
问 太阳神有一牛群#xff0c;由白、黑、花、棕四种颜色的公、母牛组成#xff0c;其间关系如下#xff0c;求每种牛的个数。
公牛中#xff0c;白牛多于棕牛#xff0c;二者之差为黑牛的 1 2 1 3 \frac{1}{2}\frac{1}{3} 21… 文章目录 题目大意sympy求解结果 题目大意
问 太阳神有一牛群由白、黑、花、棕四种颜色的公、母牛组成其间关系如下求每种牛的个数。
公牛中白牛多于棕牛二者之差为黑牛的 1 2 1 3 \frac{1}{2}\frac{1}{3} 2131黑牛多于棕牛二者之差为花牛的 1 4 1 5 \frac{1}{4}\frac{1}{5} 4151花牛多于棕牛二者之差为白牛数的 1 6 1 7 \frac{1}{6}\frac{1}{7} 6171母牛中白牛是全体黑牛的 1 3 1 4 \frac{1}{3}\frac{1}{4} 3141黑牛是全体花牛的 1 4 1 5 \frac{1}{4}\frac{1}{5} 4151花牛是全体棕牛的 1 5 1 6 \frac{1}{5}\frac{1}{6} 5161棕牛是全体白牛的 1 6 1 7 \frac{1}{6}\frac{1}{7} 6171
如果用字母 x 0 , x 1 , x 2 , x 3 x_0, x_1, x_2, x_3 x0,x1,x2,x3分别表示白、黑、花、棕各色的公牛数用 y 0 , y 1 , y 2 , y 3 y_0, y_1, y_2, y_3 y0,y1,y2,y3分别表示白、黑、花、棕各色母牛数则得8 个未知数的如下7 个方程 x 0 − x 3 ( 1 2 1 3 ) x 1 x 1 − x 3 ( 1 4 1 5 ) x 2 x 2 − x 3 ( 1 6 1 7 ) x 0 y 0 ( 1 3 1 4 ) ( x 1 y 1 ) y 1 ( 1 4 1 5 ) ( x 2 y 2 ) y 2 ( 1 5 1 6 ) ( x 3 y 3 ) y 3 ( 1 6 1 7 ) ( x 0 y 0 ) \begin{aligned} x_0-x_3(\frac{1}{2}\frac{1}{3})x_1\\ x_1-x_3(\frac{1}{4}\frac{1}{5})x_2\\ x_2-x_3(\frac{1}{6}\frac{1}{7})x_0\\ y_0(\frac{1}{3}\frac{1}{4})(x_1y_1)\\ y_1(\frac{1}{4}\frac{1}{5})(x_2y_2)\\ y_2(\frac{1}{5}\frac{1}{6})(x_3y_3)\\ y_3(\frac{1}{6}\frac{1}{7})(x_0y_0)\\ \end{aligned} x0−x3(2131)x1x1−x3(4151)x2x2−x3(6171)x0y0(3141)(x1y1)y1(4151)(x2y2)y2(5161)(x3y3)y3(6171)(x0y0)
这个题其实是毫无难度的但非要用Python那么难点主要如何优雅地表达这个过程这里选用的是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代码其优雅之处在于这些分数的构建遵循自然数递增的规律故可通过循环来生成非常便捷。
frac lambda x : sympy.Rational(1,x)
fs []
for i in range(3):fs.append(x[i]-x[3]-(frac(2*i2)frac(2*i3))*x[i1])for i in range(4):ind (i 1) % 4fs.append(y[i]-(frac(i3)frac(i4))*(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个未知数7个方程显然没有唯一解考虑到 x 3 x_3 x3貌似是最小的值所以最后希望用 x 3 x_3 x3来表示其他数。
res sympy.solve(fs, x[:3]y)结果
查看一下结果
for key in res:print(sympy.latex(key), , sympy.latex(res[key]), r\\)x 0 781 x 3 336 x 1 89 x 3 56 x 2 55 x 3 42 y 0 2316515 x 3 1564752 y 1 1731719 x 3 1825544 y 2 1639880 x 3 2053737 y 3 806221 x 3 684579 \begin{aligned} x_{0} \frac{781 x_{3}}{336} x_{1} \frac{89 x_{3}}{56} x_{2} \frac{55 x_{3}}{42} \\ y_{0} \frac{2316515 x_{3}}{1564752} y_{1} \frac{1731719 x_{3}}{1825544} y_{2} \frac{1639880 x_{3}}{2053737} y_{3} \frac{806221 x_{3}}{684579} \\ \end{aligned} x0y0336781x315647522316515x3x1y15689x318255441731719x3x2y24255x320537371639880x3y3684579806221x3
这道题到这里基本上就算解完了但是牛至少得是个整数所以接下来要做的是求解分母的最小公倍数。
在sympy中对于一个分数rr.p为分子r.q为分母【lcm】用于求解最小公倍数。
denominators [(v/x3).q for v in res.values()]
x3Res sympy.lcm(denominators)
# 32859792然后让将x3的值加入fs
fs.append(x3-x3Res)
res2 sympy.solve(fs, xy)
for key in res2:print(sympy.latex(key), , res2[key], r\\)结果如下 x 0 76379457 x 1 52223598 x 2 43030680 x 3 32859792 y 0 48646815 y 1 31170942 y 2 26238080 y 3 38698608 x_{0} 76379457 \\ x_{1} 52223598 \\ x_{2} 43030680 \\ x_{3} 32859792 \\ y_{0} 48646815 \\ y_{1} 31170942 \\ y_{2} 26238080 \\ y_{3} 38698608 \\ x076379457x152223598x243030680x332859792y048646815y131170942y226238080y338698608
这些牛加一起有349247972头全世界大概有10万亿头看来太阳神的牛还是比较多的。