栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > 学术 > 人文期刊 > 电脑报

阿基米德群牛问题的分析及Python求解验证

电脑报 更新时间: 发布时间: 学术归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

阿基米德群牛问题的分析及Python求解验证

王德贵

“群牛问题”在古希腊科学家阿基米德的研究课题中比较特别,是以诗句的形式出现在给埃拉托塞尼的一封信中。虽然其真实性有待考证,因为“群牛问题”大概很早以前就已存在,阿基米德只是重新研究而已,但历史上对这个问题的研究,却丰富了初等数论的内容。

下面我们也来分析一下群牛问题,并用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。

问这牛群是怎样组成的?(二)创意来源

通过了解知名数学难题的解题思路,并将其用于Python编程,提高我们的数学和编程水平。在我搜索的“100个数学难题”中第一个问题就是“群牛问题”,经过分析和研究,自觉颇有收获。

这是一道解不定方程组问题,有8个未知数,7个方程,有无数组解,我们可以求出最小正整数解。这个解数值较大,即使通过Python求最小正整数解也不容易。(三)设计思路

按照编程解方程的惯性思路,方程的解可以使用枚举法去求。结果当Python程序运行后却没有输出结果(所有程序后面给出)。分析原因发现是因为解的数值过大,必须寻求更好的求解方法。(四)程序设计过程1.枚举法

最普通的思路,不需要过多考虑,用枚举法一个个去测试(图1)。

测试1万个数的时间复杂度是10的12次方,需要运行30多个小时。通过搜索已知最小正整数解的值很大,枚举法获得结果的时间过长,必须去寻找更简捷的方法。2.对已知答案验证出错

(1)验证解出错

在网上搜索到了群牛问题的一组正整数解,代入方程直接验证,运行结果后面4个全部为“False”(图2)。

False表示解并不符合原題目的这项条件(图3)。

(2)验证另一组带n的解也出错

搜索到的另一组解是带n的,代入方程验证结果更奇怪(图4)。

当n=1时,有两个“False”(图5)。

当n=5时,有1个“False”(图6)。

为什么我把搜到的答案拿来验证都没法通过,问题出在哪里呢?为什么不同的解验算的“False”数目还不一样?

在分析这些问题产生的原因过程中,我发现了一个库函数Sympy,它可以帮我解决问题!3.SymPy库函数

(1)SymPy库简介

SymPy库函数是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。它完全由Python写成,不依赖于外部库。SymPy支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散数学、几何学、概率与统计、物理学等方面的功能。

SymPy的安装和使用这里不做介绍,我只分析它求解方程的方法SymPy.solve()。Solve()是一个数学术语,主要是用来求解代数方程(多项式方程)的符号解析解。

(2)方程求解:先看个简单例子(图7)。运行就可以直接求出方程的解{x: -1, y: 4},感觉到Python的强大了吗?

(3) 群牛问题求解方程

根据题目设8个未知数,代入7个方程(图8)。

运行结果(图9)

咦?怎么结果不是整数?原来是方程式中出现了除法运算,在Python中除法运算结果都是浮点数,而计算(1/2+1/3)、(1/3+1/4)导致运算结果与实际结果相去甚远。用通分去掉分母,得到下列程序(图10)。

运行结果。程序运行的结果表示出8个未知数间的关系,由于是7个方程8个未知数,所以这是一个齐次不定方程,有无数组解(图11)。

经过分析,我们发现所有的分母都是“604357”的倍数。且牛的数目一定都是整数,所以s一定是604357*9的倍数,令s=5439213,可以求出最小正整数解。

白公牛数: 10366482

黑公牛数: 7460514

花公牛数: 7358060

棕公牛数: 4149387

白母牛数: 7206360

黑母牛数: 4893246

花母牛数: 3515820

棕母牛数: 54392134.验证

將我们计算出来的结果代入原方程,验证是否正确,下面来验证一下(图12)。

运行结果还是有“False”!仔细分析问题产生的原因和解方程过程中出问题的原因相同,都是因为Python中分数计算结果是用浮点数保存的,会产生误差导致验证失败。将浮点运算改为除法运算,不让运算出现小数,式子虽然麻烦,但验证结果全部是True(图13)。

5.结论

通过对“群牛问题”结果的验证,我们已经知道当在Python中遇到“1/3”这样的分数,由于浮点小数的精度问题会导致计算结果出现偏差,要提高数值精度,就必须避免“1/3”这样的运算。(五)改进与心得

通过分析计算,我们可以得到下列关系式:

gb=10366482*n

ge=7460514*n

ga=7358060*n

gz=4149387*n

mb=7206360*n

me=4893246*n

ma=3515820*n

mz=5439213*n

于是修改验证代码第2行为n=int(input(“输入正整数:”))我们就可以得到求解通式,n=1时为最小正整数解。

另外还可以将后面7个算式去掉分母,变成整式来验证。

本文的分析过程,就是我研究这个问题的真实过程,发现问题直到最后求解并得到验证,前后花了一个多月的时间。在研究过程中,也曾想放弃,后来参考了一些资料,并不断产生新思路,不断发现新方法,最终解决问题,我想这就是学习提高的一个过程吧。

我在学习Python的过程中,有三点感受:抄、改、创。

抄:就是开始学习的时候,照抄照搬,先理解基本知识。

改:当理解的深度提高后,就想把原来的程序做一下修改,变成自己想要的效果。

创:就是在前两个基础上,可以自己创造出新的程序。

一点心得,有不妥之处,请不吝赐教!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/xueshu/247746.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号