全体数独题总解数问题再探
在上一篇(探究一个问题:全体数独题的总解数是多少?)里只对 S 的值做了上界估算,严格来说,还应对 S 的值做下界估算。另外,其中对 S 值的上界估算还是显著偏大,还可以做精确度更高的估算。
由于 H = S / (6! · 6!),以下尝试对 H 值,即如下 1R1B1C 数独题的总解数,做更高精确度的估算。
123 456 789
456 000 000
789 000 000
200 000 000
300 000 000
500 000 000
600 000 000
800 000 000
900 000 000
考察第 2 行的空位,先看第三节,显然只能填 {1,2,3};再看第二节,显然只能填 {7,8,9},这样,第 2 行的 6 个空位整体会有 3! · 3! = 36 种可能(比上一篇里的 6! 的估算小很多)。选取其中一种,得到如下的 12R1B1C 型数独题的一个代表:
123 456 789
456 789 123
789 000 000
200 000 000
300 000 000
500 000 000
600 000 000
800 000 000
900 000 000
为避免占用太多的字母标记不同数独题的总解数而引起的混乱,以下用 ss(Q) 来表示数独题 Q 的总解数,ss 是 solution sum 的缩写。全空数独题记作 ALL0,于是有:
δ := ss(ALL0),S := ss(1R),H := ss(1R1B1C)
δ = 9! · S ①
S = 6!2 · H ②
H = 3!2 · ss(12R1B1C) ③
② 和 ③ 这两个等式,实际上并没有给出严格的证明,后面再考察是否要把其中的 = 换成 ≈。
继续估算这个 12R1B1C 型数独题代表的总解数,考察第 3 行的空位,第二节只能填 {1,2,3},第三节只能填 {4,5,6},同样,第 3 行的 6 个空位整体会有 3! · 3! 种可能。选取其中一种,得到如下的 123R1C 数独题:
123 456 789
456 789 123
789 123 456
200 000 000
300 000 000
500 000 000
600 000 000
800 000 000
900 000 000
并有:
H = 3!2 · ss(12R1B1C) = 3!4 · ss(123R1C) ④
继续估算 123R1C 的总解数,考察第 2 列的空位,先看第三节,这一节是第 2 列和第 7 宫的共同部分,由于
{2,5,8} ∪ {6,8,9} = {2,5,6,8,9}
这一节能填值的集合为 {1,3,4,7},而且 3 必需填在这一节(第 2 列的第二节也属于第 4 宫,且第 4 宫已经有 3),先填 3,有 3 种可能,再填另两个位置,有 3 · 2 中可能,即第 2 列第三节整体有 3 · 3 · 2 = 18 种填值可能。这时第 2 列第二节要填 6 和 9,以及 {1,4,7} 中填完第三节后剩下的那个数,即第二节有 3! 种填值可能。所以,第 2 列的 6 个空位整体有 18 · 3! = 3 · 3!2 种填值可能。选取其中一种,作为 123R12C 型数独题的代表,如下所示:
123 456 789 456 789 123 789 123 456 260 000 000 390 000 000 570 000 000 630 000 000 810 000 000 940 000 000
此时有:
H = 3!4 · ss(123R1C) = 3 · 3!6 · ss(123R12C) ⑤
接着考察 123R12C 型数独题的这个代表,依次考察第 4 宫和第 7 宫,等效于考察第 3 列,可知第 3 列的第二节可填值为 {1,4,8},第 3 列的第三节可填值为 {2,5,7},且都可以独立选值,因此,第 3 列的 6 个空位整体有 3! · 3! 种取值可能。选取其中一种,作为 123R123C 型数独题的代表,如下所示:
123 456 789 456 789 123 789 123 456 261 000 000 394 000 000 578 000 000 632 000 000 815 000 000 947 000 000
此时有:
H = 3 · 3!6 · ss(123R12C) = 3 · 3!8 · ss(123R123C) ⑥
接着考察 123R123C 数独题的这个代表,来看第 5 行,[5,5] 和 [5,8] 两个空位的填值只能选自 {1,6,7} ...慢着!此时剩余的空位并不多,可以考虑直接用 SudokuSolver 2.5 求解,具体如下:
D:\read\num\Release>sudoku.exe Order please: load-quiz s.txt Quiz loaded. Order please: show 123 456 789 456 789 123 789 123 456 261 000 000 394 000 000 578 000 000 632 000 000 815 000 000 947 000 000 Order please: runrun 10000 ... 17682) No more solution (solution sum is 2600). Run-run time: 1091 milliseconds; current solutions: 2600 steps: 0 # 0 # 17682 total solutions: 0 # 0 # 2600. Order please:
总解数为 2600 个。于是由 ⑥,有
H = 3 · 3!8 · ss(123R123C)
= 3 · 1679616 · 2600 = 13,101,004,800
再由 ②,有
S = 6!2 · H
= 7202 · 13,101,004,800
= 6,791,560,888,320,000
这里的 H 和 S 的估值比上一篇里的估算值小多了。还用 2 秒一万的速度计算,一天是 4.32 亿
13,101,004,800 / 432,000,000 = 30.3264 天
这是直接求 H 值大约需要的时间。这样看,上一篇里的估算(2.75 亿年)太离谱了。
比较这一组数:
H = 13,101,004,800 232 = 4,294,967,296 S = 6,791,560,888,320,000 264 = 18,446,744,073,709,551,616 δ = 9! · S = 2,464,521,615,153,561,600,000 296 = 79,228,162,514,264,337,593,543,950,336
可以看到,H 刚超出 232 的界限,是 232 的 3 倍左右;而 S 没有超出 264;δ 也没有超出 296。
本篇里黄色标注的等式都没有经过严格证明,现在来具体分析一下。
上述处理过程中,问题的关键在于每次细分出来的某一类型的数独题代表有没有一般性,即这个代表是不是真的能代表同类型的其他数独题。比如,上面以
123 456 789 456 789 123 789 123 456 261 000 000 394 000 000 578 000 000 632 000 000 815 000 000 947 000 000
为 123R123C 型数独题的代表,通过程序计算出该题有 2600 个解。但是 123R123C 型数独题具体有 3! · 3! = 36 个,如果这个代表真的具有一般性,那么每个该型的数独题都会有 2600 个解。可以用程序求解几个同型数独题,看看有没有反例,比如:
123 456 789 456 789 123 789 123 456 261 000 000 398 000 000 574 000 000 632 000 000 815 000 000 947 000 000
运行结果如下:
... 17682) Forward guess [8,4] level 9 at 2 out of 2 17684) No more solution (solution sum is 2552). Run-run time: 3431 milliseconds; current solutions: 2552 steps: 0 # 0 # 17684 total solutions: 0 # 0 # 2552.
果然有反例。这说明,上述分析过程中黄色标注的等式里的 = 都应该换成 ≈,还是一种估算,而不是精确求值。
当然,上面的分析方法可以加以改进用于精确求值,就是每次细分出来的某一类型的数独题有 m 个实例,就分别去对这 m 个实例求其总解数,最后实际上就成了求一棵多叉树的叶子节点总数的问题。结合编程,应该还是可以把 S 值精确求出来,再乘上 9! 就能得到 δ 的精确值。