从 @端木弗貢 的答案中可以提炼出一个公式: ,其中 x 代表一个干支的组合在六十甲子中的次序,a 和 b 分别代表其中天干、地支的次序。
@端木弗貢 是通过「凑」的方法得到这个公式的。其实,推导类似的公式有系统的方法,即利用中国剩余定理。我就以本题为例,讲解一下中国剩余定理背后的直觉和套路。不过说实话,严格按照定理来推导,过程还是有些麻烦,最好还是适当地引入「凑」的成分。
中国剩余定理解决的是这样的问题:已知一个数除以若干个数的余数,求这个数。比如,要求「壬寅」年是六十甲子中的第几年,就是问:一个数除以 10 余 9,除以 12 余 3,这个数是多少?显然,这样的数可以有很多,它们之间相差所有除数的最小公倍数;我们只要随便找到一个,就可以推出所有其它的了。
中国剩余定理告诉我们:可以先求出若干个「单位解」,再把它们线性组合起来得到答案。所谓「单位解」,就是除以某一个除数余 1,而除以其它除数余 0 的解。上面 10、12 这两个除数有些蹊跷,我们先换一组 —— 设三个除数分别为 3, 4, 5,那么 40, 45, 36 就是它们对应的「单位解」:
我们可以先随便猜一个初始答案,比如 0,它除以所有的除数都余 0。然后,我们往答案上加减这些「单位解」,就可以单独调整答案除以某一个除数的余数,而不影响除以其它除数的余数。比如,往答案上加 40,就可以让除以 3 的余数加 1,而除以 4 和 5 的余数不变。根据这个思路,不难发现,最终的答案,就会是每个「单位解」与其对应的余数的乘积之和。如果要求一个数除以 3, 4, 5 分别余 p, q, r,那么答案就会是 。
那么问题来了:40, 45, 36 这三个「单位解」是怎么找到的呢?不会是硬凑的吧?当然不是。
以 40 这个单位解为例:我们要找一个数 n,除以 4 和 5 都余 0,而除以 3 余 1。为了满足「除以 4 和 5 都余 0」,n 必须是 4 和 5 的最小公倍数(20)的若干倍,即 n = 20t。使得 n 除以 3 余 1 的 t,叫做「模 3 下 20 的数论倒数」。「数论倒数」可以用扩展的辗转相除法系统地求解,不过在这篇答案里,我就把它略过了,因为对于比较小的数来说,数论倒数「凑」起来更快。对于本例,不难凑出 t = 2,m = 40。这也是 t 在模 3 同余意义下的唯一解。
一般地,设各个除数为 ,除了 以外其它除数的最小公倍数为 ,则第 个单位解就是 ,其中 是模 下 的数论倒数,即 。中国剩余定理则可以表述为:如果一个数 除以 的余数为 ,那么就有 ,其中 是所有除数的最小公倍数。
数论倒数要有解,要求除数 与其它除数的最小公倍数 互质。这也就是要求所有的除数两两都互质。此时 就是所有除数之积,而 就等于 。
现在回到最初的干支问题:两个除数分别是 10 和 12,并不互质。怎么办呢?
先把原始问题写成同余方程组的形式:
和 不互质。我们可以把每个同余方程拆开,使得每个方程的模都只有一个质因子:
这一步很简单,因为余数(a 和 b)可以保持不变。
下面要做的,就是对于模的质因子相同的那些方程,检验它们是否矛盾。在本例中,就是要检验第一、三个方程,也就是确认 a 和 b 的奇偶性相同。这是成立的:在干支中,奇数号天干只能搭配奇数号地支,偶数号天干只能搭配偶数号地支。
检验完了之后,同一组方程中可以只留下模的指数最高的那一个;在本例中,就是留下第三个方程,丢掉第一个方程。于是得到:
呀,除数们正好是 3, 4, 5!于是可以套用之前已经求得的「单位解」,得到:
上面,我们把两个除数 10 和 12 都拆得七零八落,很麻烦。能不能简单点儿?其实可以,只不过这样的方法就不系统了。在本例中,我们可以只拆 10,不拆 12:
确认 a 和 b 的奇偶性相同后,可以丢掉第一个方程:
两个除数 5 和 12 互质。下面要求出两个除数在模对方下的数论倒数:
不难凑出 ,于是两个「单位解」就是 和 ,同样可以得到 。
36 和 25 这两个系数好大,不好算也不好记。不过我们可以稍微再化简一下。
记得 a 和 b 的奇偶性相同吗?这就是说, 。
由此可以得到 。嗯,我承认,这一步是凑的。
从刚刚得到的答案中减掉这个式子,就能把系数弄小了:
这个结果就十分方便计算和记忆了。