阿基米德分牛问题及其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} x0x3=(21+31)x1x1x3=(41+51)x2x2x3=(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) % 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个方程,显然没有唯一解,考虑到 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} x0y0=336781x3=15647522316515x3x1y1=5689x3=18255441731719x3x2y2=4255x3=20537371639880x3y3=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万亿头,看来太阳神的牛还是比较多的。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504438.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排序——交换排序(冒泡排序与快速排序)

本专栏和大家分享关于排序的算法,其中有插入排(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排)、交换排序(冒泡排序和快速排序)、归并排序以及其他非基于比较的排序 本文与大家分享交换排序 目录 …

SAP FICO 银企直联

银企直联是指企业通过互联网或专线连接的方式,使企业的SAP系统与商业银行的业务系统通过特定的数据接口实现连接,在SAP系统中可以直接查询银行账户的余额和明细,实现付款、银企对账、自动出具余额调节表等功能。 在这主要介绍SAP相关CALLSS配…

C++—vector的介绍及使用 vector的模拟实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

Python绘制线图之plt.plot()的介绍以及使用

在Python中plt.plot是matplotlib库中的一个函数,用于绘制点和线,并对其样式进行控制,下面这篇文章主要给大家介绍了关于Python绘制线图之plt.plot()的介绍以及使用的相关资料,需要的朋友可以参考下 plt.plot() 是Matplotlib库中用于绘制线图(折线图)的主…

【递归】有序分数(SBT)

给定一个整数 N,请你求出所有分母小于或等于 N,大小在 [0,1][0,1] 范围内的最简分数,并按从小到大顺序依次输出。 例如,当 N5时,所有满足条件的分数按顺序依次为: 0/1,1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4…

Python | Leetcode Python题解之第1题两数之和

题目: 题解: class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:n len(nums)for i in range(n):for j in range(i 1, n):if nums[i] nums[j] target:return [i, j]return []

GT收发器PHY层设计(4)上板验证

文章目录 前言一、实验平台二、通道1收发数据三、通道2收发数据 前言 在前面三篇内容当中详细介绍了基于GT的PHY设计,本篇内容进行上板测试,主要查看接收数据是否能正确对齐 一、实验平台 俩个光口相互通信,即1发2收,2发1收 发…

C++要学到什么程度才能找到实习?

在考虑 C 学习到何种程度可以找到实习时,以下是一些具体的方向和建议。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我…

Win11 家庭版/专业版开启Hyper-V

​ 目录 收起 一、安装Hyper-V 二、启用Hyper-V Hyper-V是Windows专业版专属功能,但大多数(除商业本)品牌机内置的Windows都是家庭版。只能通过命令开启,方法如下: Windows专业版请直接阅读启用Hyper-V部分 一、安装Hy…

云服务器4核8G配置优惠价格表,买一年送3个月,12M公网带宽

腾讯云轻量4核8G12M服务器优惠价格646元15个月,买一年送3个月,配置为轻量4核8G12M、180GB SSD盘、2000GB月流量、12M带宽,腾讯云优惠活动页面 yunfuwuqiba.com/go/txy 活动链接打开如下图: 腾讯云4核8G服务器租用价格 腾讯云&…

中间件安全(apache、tomcat)

靶场: vulfocus Apache Apache HTTP Server 是美国阿帕奇( Apache )基金会的一款开源网页服务器。该服务器具有快速、可靠且可通过简单的API进行扩充的特点,发现 Apache HTTP Server 2.4.50 中针对 CVE - 2021 - 41773 的修复…

【c++】类和对象(六)深入了解隐式类型转换

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们来到初始化列表,隐式类型转换以及explicit的内容 目录 1.初始化列表1.1构造函数体赋值1.2初始化列表1.2.1隐式类型转换与复制初始化 1.3e…

R2GenCMN中的Encoder_Decoder结构

R2GenCMN中的 Encoder_Decoder 结构 Encoder_Decoder 结构直接关系到文本的生成,它结构参考的transformer的结构 我们这里主要看代码的实现,从视觉编码器的输出开始 1. 模型结构 首先介绍一下整体结构,这里的baseCMN其实就是一个包装了的T…

Learning from Multiple Annotator Noisy Labels via Sample-wise Label Fusion

confusion matrix P n ( r ) _n^{(r)} n(r)​ pillow8.3.1和python3.7.11的环境不好满足,不建议复现

前端学习<二>CSS基础——12-CSS3属性详解:动画详解

前言 本文主要内容: 过渡:transition 2D 转换 transform 3D 转换 transform 动画:animation 过渡:transition transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征,可以实现元素不同状态间的平滑过渡…

LeetCode226:反转二叉树

题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 解题思想 使用前序遍历和后序遍历比较方便 代码 class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) return root;swap(root->left, root…

查生意在SFE连锁加盟展会展示口碑力量,助力创业者精准抉择

在这个信息爆炸的时代,对于广大创业者而言,选择正确的连锁加盟项目犹如在繁星中寻找璀璨北斗。为了更好地服务于这个需求日益增长的市场,查生意一站式连锁经营口碑评分查询服务平台应运而生,并已在上海连锁加盟展会(SF…

<PaddlePaddle学习使用P1>——《PaddlePaddle教程》

一、PaddlePaddle概述 1.什么是PaddlePaddle PaddlePaddle官网地址链接:https://www.paddlepaddle.org.cn/ 为什么学习PaddlePaddle: 2.PaddlePaddle特点 PaddlePaddle优点(目前): PaddlePaddle缺点(目…

c语言例题,实现一个整型有序数组的二分查找

c语言中,有很多可以实现效果的方法,而在一个整型有序的数组中,我们可以使用二分查找的方法来实现对于一个数组中的元素查找。二分查找的优点在于本身需要的计算是比较少的,一次计算查找排除掉数组中一半的元素,尤其对于…

C语言自定义类型

本篇文章主要介绍三种自定义类型,分别是:结构体、联合体、枚举。 一.结构体 1.结构体类型的声明 直接举一个例子: //一本书 struct s {char name[10]; //名称char a; //作者int p; //价格 }; 2.特殊的声明 结构体也可以不写结构体标…