在上一篇(探究一個問題:全體數獨題的總解數是多少?)里只對 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! 就能得到 δ 的精確值。