用Python优雅地求解阿基米德分牛问题
创始人
2024-05-31 04:32:33
0

文章目录

    • 题目大意
    • sympy求解
    • 结果

题目大意

太阳神有一牛群,由白、黑、花、棕四种颜色的公、母牛组成,其间关系如下,求每种牛的个数。

  • 公牛中,白牛多于棕牛,二者之差为黑牛的12+13\frac{1}{2}+\frac{1}{3}21​+31​;黑牛多于棕牛,二者之差为花牛的14+15\frac{1}{4}+\frac{1}{5}41​+51​;花牛多于棕牛,二者之差为白牛数的16+17\frac{1}{6}+\frac{1}{7}61​+71​
  • 母牛中,白牛是全体黑牛的13+14\frac{1}{3}+\frac{1}{4}31​+41​;黑牛是全体花牛的14+15\frac{1}{4}+\frac{1}{5}41​+51​;花牛是全体棕牛的15+16\frac{1}{5}+\frac{1}{6}51​+61​;棕牛是全体白牛的16+17\frac{1}{6}+\frac{1}{7}61​+71​

如果用字母x0,x1,x2,x3x_0, x_1, x_2, x_3x0​,x1​,x2​,x3​分别表示白、黑、花、棕各色的公牛数;用y0,y1,y2,y3y_0, y_1, y_2, y_3y0​,y1​,y2​,y3​分别表示白、黑、花、棕各色母牛数,则得8 个未知数的如下7 个方程

x0−x3=(12+13)x1x1−x3=(14+15)x2x2−x3=(16+17)x0y0=(13+14)(x1+y1)y1=(14+15)(x2+y2)y2=(15+16)(x3+y3)y3=(16+17)(x0+y0)\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_1+y_1)\\ y_1=(\frac{1}{4}+\frac{1}{5})(x_2+y_2)\\ y_2=(\frac{1}{5}+\frac{1}{6})(x_3+y_3)\\ y_3=(\frac{1}{6}+\frac{1}{7})(x_0+y_0)\\ \end{aligned} x0​−x3​=(21​+31​)x1​x1​−x3​=(41​+51​)x2​x2​−x3​=(61​+71​)x0​y0​=(31​+41​)(x1​+y1​)y1​=(41​+51​)(x2​+y2​)y2​=(51​+61​)(x3​+y3​)y3​=(61​+71​)(x0​+y0​)​

这个题其实是毫无难度的,但非要用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*i+2)+frac(2*i+3))*x[i+1])for i in range(4):ind = (i + 1) % 4fs.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个未知数7个方程,显然没有唯一解,考虑到x3x_3x3​貌似是最小的值,所以最后希望用x3x_3x3​来表示其他数。

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

结果

查看一下结果

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

x0=781x3336x1=89x356x2=55x342y0=2316515x31564752y1=1731719x31825544y2=1639880x32053737y3=806221x3684579\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} x0​x1​x2​y0​y1​y2​y3​​=336781x3​​=5689x3​​=4255x3​​=15647522316515x3​​=18255441731719x3​​=20537371639880x3​​=684579806221x3​​​

这道题到这里基本上就算解完了,但是牛至少得是个整数,所以接下来要做的是求解分母的最小公倍数。

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, x+y)
for key in res2:print(sympy.latex(key), "=", res2[key], r"\\")

结果如下

x0=76379457x1=52223598x2=43030680x3=32859792y0=48646815y1=31170942y2=26238080y3=38698608x_{0} = 76379457 \\ x_{1} = 52223598 \\ x_{2} = 43030680 \\ x_{3} = 32859792 \\ y_{0} = 48646815 \\ y_{1} = 31170942 \\ y_{2} = 26238080 \\ y_{3} = 38698608 \\ x0​=76379457x1​=52223598x2​=43030680x3​=32859792y0​=48646815y1​=31170942y2​=26238080y3​=38698608

这些牛加一起有349247972头,全世界大概有10万亿头,看来太阳神的牛还是比较多的。
在这里插入图片描述

相关内容

热门资讯

手机安卓系统版本高,安卓高版本... 亲爱的手机控们,你们有没有想过,你的手机安卓系统版本是不是已经落后了呢?别急,让我带你一起探索一下这...
系统8.0的安卓手机,性能与体... 你有没有发现,最近手机界可是热闹非凡呢!各大品牌纷纷推出了搭载安卓8.0系统的手机,这可不仅仅是系统...
有车载安卓系统吗,引领智能驾驶... 你有没有想过,开车的时候,手机导航不够智能?车载系统又太复杂?别急,今天就来给你揭秘一个超级酷炫的秘...
安卓系统的混音软件,混音软件深... 你有没有想过,用手机也能轻松成为音乐混音大师?没错,就是那种在夜店嗨翻天,让舞池沸腾的DJ级混音!现...
安卓系统破解限制设备,揭秘设备... 安卓系统破解限制设备:探索技术自由的边界在数字化时代,智能手机已经成为我们生活中不可或缺的一部分。它...
安卓系统奔溃图片,探寻崩溃背后... 手机突然黑屏了,屏幕上还出现了一堆奇怪的符号,这可真是让人心头一紧啊!你有没有遇到过安卓系统奔溃的情...
小米安卓8.0系统机型,升级体... 你有没有发现,最近手机圈里的小道消息可是越来越热闹了!小米安卓8.0系统机型,这可是个热门话题。咱们...
系统双清能降系统吗安卓,提升性... 手机系统卡顿得像蜗牛爬?别急,今天就来给你揭秘一个神奇的操作——系统双清,看看它能不能让你的安卓手机...
国内安卓系统优化最好,探寻国内... 你有没有发现,现在手机更新换代的速度简直就像坐上了火箭!各大品牌纷纷推出自家的新机,而其中最让人关注...
安卓系统app源码提取,源码提... 你有没有想过,那些在手机里默默无闻的安卓应用,其实背后有着自己的“源代码”呢?没错,今天就要带你一探...
原生安卓5.1系统更新,探索新... 亲爱的手机控们,你们有没有想过,你的手机系统是不是真的安全可靠呢?今天,就让我带你一起探索一下原生安...
安卓变ios系统平板,探索iO... 你有没有想过,把你的安卓平板变成苹果平板呢?想象那光滑的屏幕、流畅的操作,还有那独特的iOS系统,是...
安卓系统拍摄软件下载,畅享摄影... 手机里的照片总是不够完美?别急,今天就来给你安利一波安卓系统里的拍摄软件,让你的手机瞬间变身专业摄影...
vivo安卓系统更新系统版本,... 亲爱的vivo手机用户们,你们是不是也和我一样,对手机系统更新充满了期待呢?每次系统升级,都像是给我...
安卓5.0系统移植教程,从准备... 你有没有想过,给你的手机换换口味?比如,把安卓5.0系统移植到你的手机上,让它焕发新生?别急,这就带...
如何给安卓系统装iphone系... 亲爱的安卓用户们,是不是觉得自己的手机用久了,有点审美疲劳了呢?想要换换口味,体验一下iPhone的...
mlul系统跟安卓系统哪个好,... 亲爱的读者们,你是否曾在使用手机时,对系统的好坏产生过疑惑?今天,就让我带你深入探讨mlul系统和安...
安卓系统英语阅读app,Rev... 你有没有发现,手机里的英语阅读app就像是个神奇的宝库,里面藏着各种各样的宝藏,让你在碎片化的时间里...
安卓9系统无刘海,无刘海设计引... 你有没有发现,最近手机界可是热闹非凡呢!各大品牌纷纷推出了自己的新机,而其中最引人注目的,莫过于那些...
电脑刷入安卓系统,从Windo... 你有没有想过,你的电脑也能装上安卓系统呢?没错,就是那个我们手机上常用的安卓系统!今天,就让我带你一...