利用Python求解阿基米德分牛问题

 更新时间:2023年03月09日 08:32:03   作者:微小冷  
这篇文章主要为大家详细介绍了如何利用Python优雅地求解阿基米德分牛问题,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下

题目大意

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

公牛中,白牛多于棕牛,二者之差为黑牛的1/2+1/3;黑牛多于棕牛,二者之差为花牛的1/4+1/5;花牛多于棕牛,二者之差为白牛数的1/6+1/7

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

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

这个题其实是毫无难度的,但非要用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) % 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个未知数7个方程,显然没有唯一解,考虑到x3貌似是最小的值,所以最后希望用x3来表示其他数。

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

结果

查看一下结果

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

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

在sympy中,对于一个分数r,r.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​=76379457
x1​=52223598
x2​=43030680
x3​=32859792
y0​=48646815
y1​=31170942
y2​=26238080
y3​=38698608

这些牛加一起有349247972头,全世界大概有10万亿头,看来太阳神的牛还是比较多的。

到此这篇关于利用Python求解阿基米德分牛问题的文章就介绍到这了,更多相关Python阿基米德分牛内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python自动化爬取天眼查数据的实现

    Python自动化爬取天眼查数据的实现

    本文将结合实例代码,介绍Python自动化爬取天眼查数据的实现,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • pandas 实现字典转换成DataFrame的方法

    pandas 实现字典转换成DataFrame的方法

    今天小编就为大家分享一篇pandas 实现字典转换成DataFrame的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python实现2048小游戏

    python实现2048小游戏

    本文给大家分享的是个人修改自某网友的Python实现2048小游戏的代码,推荐给大家,有需要的小伙伴可以参考下。
    2015-03-03
  • 使用Python实现FTP文件自动传输脚本

    使用Python实现FTP文件自动传输脚本

    这篇文章主要为大家详细介绍了如何使用Python实现FTP文件自动传输脚本,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下
    2023-12-12
  • 在Python中使用正则表达式的方法

    在Python中使用正则表达式的方法

    这篇文章主要介绍了在Python中使用正则表达式的方法,讲到了专门对正则表达式提供支持的扩展库re,需要的朋友可以参考下
    2015-08-08
  • python数据分析近年比特币价格涨幅趋势分布

    python数据分析近年比特币价格涨幅趋势分布

    这篇文章主要为大家介绍了python分析近年来比特币价格涨幅趋势的数据分布,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • pytorch + visdom CNN处理自建图片数据集的方法

    pytorch + visdom CNN处理自建图片数据集的方法

    这篇文章主要介绍了pytorch + visdom CNN处理自建图片数据集的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • python基于xml parse实现解析cdatasection数据

    python基于xml parse实现解析cdatasection数据

    这篇文章主要介绍了python基于xml parse实现解析cdatasection数据的方法,是非常实用技巧,需要的朋友可以参考下
    2014-09-09
  • python Airtest自动化测试工具的的使用

    python Airtest自动化测试工具的的使用

    本文主要介绍了python Airtest自动化测试工具的的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Pyqt5实现英文学习词典

    Pyqt5实现英文学习词典

    这篇文章主要为大家详细介绍了Pyqt5实现英文学习词典的相关方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06

最新评论