文章目录

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

题目大意

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

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

如果用字母 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_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个方程,显然没有唯一解,考虑到 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} 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"\\")

结果如下

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 \\ x0​=76379457x1​=52223598x2​=43030680x3​=32859792y0​=48646815y1​=31170942y2​=26238080y3​=38698608

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

用Python帮阿基米德分牛相关推荐

  1. Python:阿基米德棋盘放米问题

    国王与数学家阿基米德下棋,在棋盘上放米,国王输了,国王问阿基米德要什么奖赏? 阿基米德对国王说: 我只要在棋盘上第一格放一粒米,第二格放二粒,第三格放四粒,第四格放十六粒--- 按这个倍增的比例放满整 ...

  2. 华为陈帮华:数字化转型的阿基米德技术支点

    编辑:阿冒 设计:沐由 春天来了! 在经历了一次停办.两次规模严重缩水之后,2023年世界移动通信大会(MWC)--也就是我们通常所说的"巴展",终于在美丽的巴塞罗那盛况再现. 来 ...

  3. 考研数学——Python绘制极坐标图,画笛卡尔心形线、玫瑰线、阿基米德螺线、伯努利双纽线(加深图像理解)

    <张宇基础30讲>第一讲的几张极坐标图象,这里用Python来实现一下,加深理解,并学习绘制极坐标图像. 1.笛卡尔心形线 公式: import numpy as np import ma ...

  4. python画笛卡尔心形线方程_考研数学——Python绘制极坐标图,画笛卡尔心形线、玫瑰线、阿基米德螺线、伯努利双纽线(加深图像理解)...

    <张宇基础30讲>第一讲的几张极坐标图象,这里用Python来实现一下,加深理解,并学习绘制极坐标图像. 1.笛卡尔心形线 公式: import numpy as np import ma ...

  5. python阿凡提与国王下棋_阿基米德与国王下棋的故事

    阿基米德与国王下棋的故事 说到市场倍增原理,熟悉数学故事的人可能都会联想到与此相关的这样一则故事.故事说 有一位国王与数学家阿基米德下棋.国王说我们这样干下棋好象不够刺激,要么赌点什么吧!阿基米德说好 ...

  6. 计算机采用阿基米德,阿基米德与这个历时两千多年无人能解的牛群问题

    阿基米德是一位伟大的古代科学家,在圆周率.无穷大等概念上取得了惊人的理论发现,还发明了一些在他那个时代处于先进水平的技术. 此外,他还炮制出了一道史上最糟糕的智力题. 相信我,"牛群问题&q ...

  7. matlab-高数 polar 极坐标系 绘制阿基米德线,心形线

    2019独角兽企业重金招聘Python工程师标准>>>      matlab : R2018a 64bit       OS : Windows 10 x64 typesettin ...

  8. 使用阿基米德螺线进行数据可视化

    最近开发了一个新的R包spiralize,可以使用阿基米德螺线对数据进行可视化.在数据可视化中,螺线具有以下两个优点:1. 可以可视化具有非常长的数据轴的数据,同时能够提高可视化的分辨率:2.可以有效 ...

  9. lisp语言画阿基米德线_120种UG表达式曲线画法(阿基米德螺旋线、数学方程式)...

    在UG中利用[规律曲线]|[根据方程]绘制各种方程曲线: 1.极坐标(或柱坐标r,θ,z)与直角坐标系(x,y,z)的转换关系: x=r*cos(θ):y=r*sin(θ):z=z 2.球坐标系(r, ...

最新文章

  1. 使用Null Object设计模式[转]
  2. C语言编译和链接详解(通俗易懂,深入本质)
  3. python3 threading是否被抛弃_Python3中的线程模块是否发生了变化?如果是,怎么办?...
  4. 分享些我见到的听到的各种创业经历(有成功也有失败)——分析下创业成功要做到哪些...
  5. solr6.6.2之拼音联想
  6. 高中计算机课简单介绍,高中课程介绍
  7. gst 测试摄像头命令
  8. ios android与wp,在iOS与Android间选择WP
  9. 适合计算机编程开发的笔记本电脑推荐
  10. 抢红包算法 c++_字节跳动|垂直策略|算法岗招聘
  11. MySQL中计算两个年份的相差
  12. 高频电容 低频电容
  13. caffe 搭建参数服务器(1)—— 用MPI实现多节点同时训练一个模型
  14. Jenkin权限控制——基于角色授权策略
  15. Hadoop之——setfacl 设置访问控制列表异常
  16. c语言 bnf,c语言bnf范式.pdf
  17. jxls2.0的基础使用
  18. 快过年了,来分享一个个人制作的节日祝福软件
  19. 各种热门经典Scratch小游戏,这里应有尽有(2)
  20. matlab 判断颜色程序,MATLAB中的颜色控制

热门文章

  1. 字段太长,无法录入数据库
  2. Servlet 教程 各个知识点简单概括
  3. EI数据库下载的记录主要格式说明
  4. 三、肺癌检测-肺癌检测代码项目文件准备
  5. 网页版结题报告html没了,课题结题报告丢了怎么办
  6. solr 近实时搜索
  7. UE特效--Spline蓝图--制作数字城市道路分析
  8. EventBus使用教程
  9. 发那科机器人接线电源_【干货】Fanuc机器人电气硬件介绍,很全面!
  10. 局域网、广域网、互联网三者的区别以及应用领域