关于正实平面上P、Q点迭代游戏的终止性分析与验证的技术问询
我最近碰到了一个让我有点头疼的迭代问题,用常规的数学方法入手感觉难度很大(我本身数学功底不算强),不过意外发现它和物理模型有很强的关联,能帮我得到一个部分解。先把问题完整描述一下:
问题定义
在正实数平面上有两个点P和Q,坐标分别为(Px, Py)和(Qx, Qy)。我们定义一次「步骤」的规则如下:
- 对P点操作:把P中较大的坐标值减去较小的那个(举个例子,如果Px > Py,那么Px会更新为
Px - Py);同时把较小的那个坐标值翻倍(接上面的例子,Py会变成2*Py) - 对Q点操作:找到P中较小的坐标对应的坐标轴,将Q在该轴上的坐标更新为
(Qx + Qy)/2(还是上面的例子,因为Py < Px,所以Qy会被更新为(Qx+Qy)/2)
整个游戏由一系列这样的步骤组成,当Qx = Qy时游戏终止,问题要求我们求出终止时这个相等的值。
我的测试尝试
为了更好地理解这个问题,我写了一段Python脚本用来随机测试初始坐标:
import random import time while True: result = [] Px, Py = random.choice(range(1, 1001)), random.choice(range(1, 1001)) Qx, Qy = random.choice(range(1, 1001)), random.choice(range(1, 1001)) result.append([Px, Py, Qx, Qy]) while Qx != Qy: if Px > Py: Px -= Py Py += Py Qy = (Qx+Qy)/2 else: Py -= Px Px += Px Qx = (Qx+Qy)/2 result.append([Px, Py, Qx, Qy]) print(result) time.sleep(5)
这段脚本每5秒输出一次测试结果(避免输出太快刷屏)。不过我有个顾虑:有些初始坐标可能会让游戏无限循环下去,但因为Python的浮点数精度限制,脚本会误以为Qx和Qy相等从而终止程序。不过我通过物理模型找到了一个闭合公式,能直接得到正确的最终值:
物理模型带来的闭合解
我把Px和Py看成两个相同材质物体的质量,Qx和Qy看成它们各自的温度。这样一来,每一步操作就对应了热传递和质量转移:温度低的物体“接收”和自身相等的质量(温度高的物体失去对应质量),然后两者接触达到热平衡,新的温度就是原来两个温度的算术平均。
不管游戏的步骤是有限还是无限,最终的平衡温度就相当于把所有质量混合后的最终温度,这是个很经典的物理模型,对应的公式就是:
(Px*Qx + Py*Qy) / (Px + Py)
说白了就是以质量为权重的加权平均温度。不过我还是有个疑问:有没有初始值会让游戏真的无限进行下去?
编辑1
在讨论中,CyclotomicField指出如果初始时Px和Py相等,游戏会进入明显的无限循环。假设规则保持和之前的情况一致,这种对称场景确实会让游戏无限持续下去。现在我想知道:有没有非平凡的无限循环情况?
编辑2
我后来才反应过来一个关键问题:之前那个边缘情况的无限循环原因,其实适用于所有游戏——因为把其中一个值更新为两者的均值时,这个均值不可能等于另一个值(除非初始就相等),而且Q的坐标更新和P的状态无关,也就是说,只要初始Qx≠Qy,游戏就永远不会终止?
现在我也开始试着从数学角度更清晰地理解Q的坐标更新模式,想搞清楚它的变化规律到底是怎样的。
备注:内容来源于stack exchange,提问作者Mathathon

