蝉与蟒蛇同步


假设你想知道你的曾祖母是什么时候出生的。你在任何地方都找不到有记录的年份。但你确实发现了她父亲的一封没有注明日期的信,信中提到了她的出生和一个奇怪的细节:13年和17年的蝉成群结队。

你稍微研究一下,就会发现13年的蝉应该在明年出来,17年的蝉是去年出来的。你的曾祖母是什么时候出生的?

由于13年和17年是相对优质的,13年和17年蝉将每13×17=221年同步它们的时间表。假设你的曾祖母出生在n几年前的事了。在以下情况下的剩余部分n被13除以必须是12,余数在n被17除以必须是1。我们必须求解这对同余式n=12模13及n=1 mod 17.中国剩余定理说这对同余式有一个解,并且定理的证明给出了一个计算该解的算法。

Python库SymPy有一个求解线性同余的函数。

>>> from sympy.ntheory.modular import solve_congruence
>>> solve_congruence( (12, 13), (1, 17) )
(103, 221)

这说明我们已经进入了13年和17年蝉的联合周期103年。那么你的曾祖母是103年前出生的。(解324=103+221在数学上也是可能的,但在生物学上是不可能的。)

您可以使用相同的SymPy函数来求解具有更多同余的系统。例如,明年什么时候会举办夏季奥运会,13年、17年的蝉会蜂拥而至?这里有几种方法可以解决这个问题。首先,您可以找到最后的计算一下这件事发生的时间,然后找出下一次它会在什么时候发生。你需要解决n=1/4(自从我们去年举办夏季奥运会以来)n=12模13及n=1 mod 17。

>>> from sympy.ntheory.modular import solve_congruence
>>> solve_congruence( (1, 4), (12, 13), (1, 17) )
(545, 884)

所以蝉和夏季奥运会在545年前是同步的。(嗯,如果现代奥运会存在于中世纪,他们就会是这样的。)这表明它们将在885-545=339年后再次同步。

这里有一个更直接的方法。我们想知道夏季奥运会什么时候会比现在的周期提前3年,13年的蝉会比现在提前1年,17年的蝉会比现在的周期提前16年,我们想知道的是什么时候夏季奥运会比现在的周期提前3年,13年的蝉比现在的周期提前1年,17年的蝉比现在的周期提前16年。

>>> from sympy.ntheory.modular import solve_congruence
>>> solve_congruence( (3, 4), (1, 13), (16, 17) )
(339, 884)

顺便说一句,你可以使用负整数和同余,所以你可以用(-1,17)来表示17年的蝉将回到1年前,而不是在它们的周期中提前16年。