用Python帮阿基米德分牛
文章目录
- 题目大意
- 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)x1x1−x3=(41+51)x2x2−x3=(61+71)x0y0=(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} x0x1x2y0y1y2y3=336781x3=5689x3=4255x3=15647522316515x3=18255441731719x3=20537371639880x3=684579806221x3
这道题到这里基本上就算解完了,但是牛至少得是个整数,所以接下来要做的是求解分母的最小公倍数。
在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"\\")
结果如下
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帮阿基米德分牛相关推荐
- Python:阿基米德棋盘放米问题
国王与数学家阿基米德下棋,在棋盘上放米,国王输了,国王问阿基米德要什么奖赏? 阿基米德对国王说: 我只要在棋盘上第一格放一粒米,第二格放二粒,第三格放四粒,第四格放十六粒--- 按这个倍增的比例放满整 ...
- 华为陈帮华:数字化转型的阿基米德技术支点
编辑:阿冒 设计:沐由 春天来了! 在经历了一次停办.两次规模严重缩水之后,2023年世界移动通信大会(MWC)--也就是我们通常所说的"巴展",终于在美丽的巴塞罗那盛况再现. 来 ...
- 考研数学——Python绘制极坐标图,画笛卡尔心形线、玫瑰线、阿基米德螺线、伯努利双纽线(加深图像理解)
<张宇基础30讲>第一讲的几张极坐标图象,这里用Python来实现一下,加深理解,并学习绘制极坐标图像. 1.笛卡尔心形线 公式: import numpy as np import ma ...
- python画笛卡尔心形线方程_考研数学——Python绘制极坐标图,画笛卡尔心形线、玫瑰线、阿基米德螺线、伯努利双纽线(加深图像理解)...
<张宇基础30讲>第一讲的几张极坐标图象,这里用Python来实现一下,加深理解,并学习绘制极坐标图像. 1.笛卡尔心形线 公式: import numpy as np import ma ...
- python阿凡提与国王下棋_阿基米德与国王下棋的故事
阿基米德与国王下棋的故事 说到市场倍增原理,熟悉数学故事的人可能都会联想到与此相关的这样一则故事.故事说 有一位国王与数学家阿基米德下棋.国王说我们这样干下棋好象不够刺激,要么赌点什么吧!阿基米德说好 ...
- 计算机采用阿基米德,阿基米德与这个历时两千多年无人能解的牛群问题
阿基米德是一位伟大的古代科学家,在圆周率.无穷大等概念上取得了惊人的理论发现,还发明了一些在他那个时代处于先进水平的技术. 此外,他还炮制出了一道史上最糟糕的智力题. 相信我,"牛群问题&q ...
- matlab-高数 polar 极坐标系 绘制阿基米德线,心形线
2019独角兽企业重金招聘Python工程师标准>>> matlab : R2018a 64bit OS : Windows 10 x64 typesettin ...
- 使用阿基米德螺线进行数据可视化
最近开发了一个新的R包spiralize,可以使用阿基米德螺线对数据进行可视化.在数据可视化中,螺线具有以下两个优点:1. 可以可视化具有非常长的数据轴的数据,同时能够提高可视化的分辨率:2.可以有效 ...
- lisp语言画阿基米德线_120种UG表达式曲线画法(阿基米德螺旋线、数学方程式)...
在UG中利用[规律曲线]|[根据方程]绘制各种方程曲线: 1.极坐标(或柱坐标r,θ,z)与直角坐标系(x,y,z)的转换关系: x=r*cos(θ):y=r*sin(θ):z=z 2.球坐标系(r, ...
最新文章
- 使用Null Object设计模式[转]
- C语言编译和链接详解(通俗易懂,深入本质)
- python3 threading是否被抛弃_Python3中的线程模块是否发生了变化?如果是,怎么办?...
- 分享些我见到的听到的各种创业经历(有成功也有失败)——分析下创业成功要做到哪些...
- solr6.6.2之拼音联想
- 高中计算机课简单介绍,高中课程介绍
- gst 测试摄像头命令
- ios android与wp,在iOS与Android间选择WP
- 适合计算机编程开发的笔记本电脑推荐
- 抢红包算法 c++_字节跳动|垂直策略|算法岗招聘
- MySQL中计算两个年份的相差
- 高频电容 低频电容
- caffe 搭建参数服务器(1)—— 用MPI实现多节点同时训练一个模型
- Jenkin权限控制——基于角色授权策略
- Hadoop之——setfacl 设置访问控制列表异常
- c语言 bnf,c语言bnf范式.pdf
- jxls2.0的基础使用
- 快过年了,来分享一个个人制作的节日祝福软件
- 各种热门经典Scratch小游戏,这里应有尽有(2)
- matlab 判断颜色程序,MATLAB中的颜色控制