利用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使用kombu连接信息中包含#号问题排查方式

    Python使用kombu连接信息中包含#号问题排查方式

    文章描述了在部署Python项目到生产环境时遇到的一个错误,即端口号无法正确转换为整数值,该错误在测试环境和本地调试中没有出现,但在生产环境中才出现,通过分析错误信息和代码,作者发现问题出在URL解析过程中,特别是在处理包含特殊字符(如#号)的URL时
    2024-12-12
  • Python中使用json.load()和json.loads()加载json数据的方法实例

    Python中使用json.load()和json.loads()加载json数据的方法实例

    在python编程中,我们经常要用到json对象作为数据交换格式,下面这篇文章主要给大家介绍了关于Python中使用json.load()和json.loads()加载json数据的方法实例,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • python利用WordCloud模块实现词云绘制

    python利用WordCloud模块实现词云绘制

    wordcloud是词云绘图模块,封装了WordCloud词云类,是词云的基本载体,下面小编就来和大家详细讲讲如何利用WordCloud模块实现词云绘制吧,希望对大家有所帮助
    2023-10-10
  • Python生成器(Generator)详解

    Python生成器(Generator)详解

    这篇文章主要介绍了Python生成器(Generator)详解,本文讲解了什么是生成器、简单生成器、带yield 语句的生成器、加强的生成器等内容,需要的朋友可以参考下
    2015-04-04
  • 详解requirements.txt的生成和安装

    详解requirements.txt的生成和安装

    本文主要介绍了详解requirements.txt的生成和安装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 对pytorch中的梯度更新方法详解

    对pytorch中的梯度更新方法详解

    今天小编就为大家分享一篇对pytorch中的梯度更新方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python学习教程之常用的内置函数大全

    Python学习教程之常用的内置函数大全

    python给我们提供了很多已经定义好的函数,下面这篇文章主要给大家介绍了关于Python学习教程之一些常用的内置函数,文中分享了关于数学函数、功能函数、类型转换函数、字符串处理和序列处理函数的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • python双向链表实例详解

    python双向链表实例详解

    这篇文章主要为大家详细介绍了python双向链表实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 使用python复制PDF中的页面的操作代码

    使用python复制PDF中的页面的操作代码

    操作PDF文档时,复制其中的指定页面可以帮助我们从PDF文件中提取特定信息,如文本、图表或数据等,以便在其他文档中使用,本文将介绍如何使用Python 在同一文档中复制PDF页面,或者复制页面到另一PDF文档中,需要的朋友可以参考下
    2024-09-09
  • Pytorch多GPU训练过程

    Pytorch多GPU训练过程

    这篇文章主要介绍了Pytorch多GPU训练过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论