我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用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阿基米德分牛内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要为大家详细介绍了如何利用Python优雅地求解阿基米德分牛问题,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
2023-03-09

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

今天小编给大家分享一下怎么用Python求解阿基米德分牛问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。题目大意问 太阳神
2023-07-05

Python怎么解决阿基米德分牛问题

阿基米德分牛问题是一个数学问题,它的解法并不依赖于编程语言。下面是一种解决阿基米德分牛问题的数学方法:1. 首先,设定一个初始的牛的数量n,假设初始牛的分布是均匀的。2. 然后,将这些牛分成两个群体,每个群体都有n/2头牛。3. 对于每个群
2023-08-15

怎么用Python/R语言分别解决金字塔数求和问题

本篇内容介绍了“怎么用Python/R语言分别解决金字塔数求和问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、前N阶乘求和阶乘是基斯顿
2023-06-29

牛顿法、梯度下降法、最小二乘法的原理以及利用它们解决实际问题的python编程

  牛顿法、梯度下降法、最小二乘法的原理以及利用它们解决实际问题的python编程  一、牛顿法原理  1、产生背景    2、牛顿迭代公式  二、梯度下降法原理  根据计算梯度时所用数据量不同,可以分为三种基本方法:批量梯度下降法(Bat
2023-06-01

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录