1.ナンプレ界をにぎわしていた、大きな問題があった
昔から、ナンプレには問題が1つありました。
雑誌など巷に出回っているナンプレには、通常、24個前後のヒント数字が書かれています。
そこからスタートして残り57個程度の空白マスを数字で埋めていき、ナンプレを完成させていくわけですね。
当然ですが、ヒントの個数に規定はありません。
唯一解を持つ物ならヒントは何個あっても良く、難易度などに応じて多かったり少なかったりします。
たまに20個くらいしかないナンプレもあったりする。
ヒントの少ないナンプレを作るのは非常に難しい。
だから、それにチャレンジしたくなる人も現れる。
そして、「ヒント個数のギリギリを知りたい」という欲求も自然な流れと言えるでしょう。
ナンプレ問題図にあるヒント数字、どこまで少なくできるんだろう?
これが昔からの問題だったんです。
この問題、多くの数学者達も注目するほどの大きな物でした。
2000年代中頃にはこの最少ヒント数問題について雑誌などで言及があり、その後コンピュータを使った研究がなされました。
2008年頃、オーストラリアの大学で「ヒント8個のナンプレに唯一解は存在しない」ことを確認し、その翌年には「ヒント12個でも唯一解には不十分」を示すためのコンピュータ計算をほとんど完了していたようです。
2010年には、台湾の大学で「ヒント16個のナンプレが存在するかどうか」の探索が開始されました。同年の『人工知能の諸技術に関する国際会議(TAAI)』のプロシーディング(論文冊子)にも 最少ヒント数問題 が収録されています。この探索チームは、2011年末の時点で14億個以上ものナンプレを検証し終えていました。
他にもこんな話があったりします。
2008年には、なんと17歳の女性が「ヒント16個のナンプレは存在しない」ことを証明したという!
『Jugend forscht(ドイツの青少年科学コンテスト)』にエントリーし、Junge Wissenschaft 誌にも発表したそうです。
ただ、その証明には穴があったようで、せっかくの証明は残念な結果に終わってしまいました。
もし証明が正しければ、あるいは穴を直すことができれば、「17歳少女が証明した!」という事実は数学界やナンプレ界にかなり衝撃を走らせたかもしれませんね。
ちょいと1枚のナンプレ完成図を紹介しましょう。
図1-1 です。
まぁ、見た目は何の変哲もない完成図ですね😅
しかし、この完成図はそんじょそこらの完成図とは違います。
実は、この盤面からはヒント17個の問題図を29個も作れるんです。
81個の数字からうまいこと17個をヒント数字にして問題図を作る。すると、それはちゃんと唯一解を持つという!
ヒント17個って、実はすごいことなんです。
ヒント24個未満のナンプレを作ること自体が大変なのに、ヒント17個は至難の業。もはや神の領域。
1つの盤面に神29柱も宿っているとは、神秘的としか言いようがない。
この「29個」という記録、2010年前後の時点では未だ破られていません(現在はどうかはわかりません)。
こんなにも凄い盤面なら、これを徹底サーチすれば16ヒントナンプレが見つかりそうな気がしますよね!
そういう期待が高まるのは当然であり、実際、肯定的解決の有力候補でした。
しかし、別の視点に立つと、否定的な解決も見えてくる。
もし仮に16ヒントナンプレが存在したとすると、65個(81-16=65)ある空白マスの1つにヒント数字を入れてしまえば「1つの盤面に17ヒントナンプレが65個もできる」わけですよね。
なのに、最高記録がたったの29個とはどういうことか?
そのギャップの説明がつかず、「唯一解を持つ16ヒントナンプレはどうやら存在しそうにない」とも予想できるんです。
果たしてどちらに軍配が上がるのか。
当時はまだ「神のみぞ知る」でした。
いろんな議論が飛び交った難問でしたが、2012年1月、とうとう解決の時が訪れます。
否定的な解決ではあったけれど、それでも「ヒント数字の最少は17個」は大きな結論だと言えるでしょう。
その証明方法はと言うと、「プログラムを組んでゴリゴリ実行した」で終わりです😅
でも、そこには秀逸なアイデアや数学的な理論が取り入れられて工夫がなされていた。
その部分を話していこうかと思います。
ここで、ひとつ注意書き。
当ページの内容は、Gary McGuire, Bastian Tugemann, Gilles Civario の3人による論文『There is no 16-Clue Sudoku: Solving the Sudoku Minimum Number of Clues Problem via Hitting Set Enumeration』(2013年9月改訂版)を基にしています。
当ページでは、この論文を「原論文」と呼ぶことにします。
原論文の内容を正しく解釈して話すことを心掛けていますが、誤訳や誤解釈をしている可能性はゼロとは言えません。
また、なるべく話をわかりやすくするために厳密性を欠いている箇所もあります。
したがって、当ページの正確性について完全な保証はできません。
正確な内容を知りたい方々は、当ページではなく原論文をご覧ください。
原論文は学術記事サイト『arXiv』のこのページでダウンロード可能です。
2.単純にやると酷い目に遭う
証明すべき結論は「唯一解を持つ16ヒントナンプレは存在しない」です。
ということは、「ヒント16個」に注目した具体的方法を考えるのが普通と言えますね。
とりあえず、最も直線的な方法はこれかな?
完成図から単純に数字を16個選んでヒント数字にする。
果たして、そのナンプレは解けるだろうか……?
ナンプレの完成図に並んでいる81個の数字のうち16個を残し、他の数字を全部消去する。
そうしてできたナンプレが解けるかどうかを確かめる。
この方法をシラミ潰しで行う。
もぅ単純明快! 誰もが思いつくやり方ですよね。
ところが、この方法はいとも簡単に頓挫するんです。
それはなぜか?
まずは1つ計算してみましょう。
81個の数字から16個を選ぶ。それは何通りあるだろうか?
1個のナンプレを検証するのに、3京3000兆通り以上もの数字選択が必要です😅
もぅもぅもぅ、この回数だけでノックアウトです😅
しかも、これは「たった1個のナンプレ完成図に対する回数」です。
当然、完成図がたった1個だなんてわけがない!
では、全部で何個あるのだろう?
その個数は…… 6,670,903,752,021,072,936,960個 です。
なんだか聞いてて一瞬脳ミソが止まるような数ですよね。
わかりやすく4桁に区切ってみますよ。
66,7090,3752,0210,7293,6960個。
66垓です😅
ガイですよ、ガイ😅
9×9サイズのナンプレの完成図は、全部で66垓個もあるんです。
まぁ、一応「垓」という命数は世の中に無いわけじゃぁありません。
例えば、サイト『物質・材料研究機構(NIMS)』によると、一円玉を構成するアルミニウム原子は 約222垓個 あるそうです。
他には、サイト『お札と切手の博物館』によると 10垓ペンゴ なんていう紙幣が発行寸前だったとか。
でも、やっぱり桁外れに多いよね😅
3.3京に66垓。
単純な方法だと途方もないどころの話じゃぁないんですね。
3.3京×66垓のループ処理なんて、コンピュータですらサジを投げます😅
この「個数」という壁が天を貫くほど高すぎる。
ただ、これに関しては朗報があります。
実は、この66垓個は、ほんの少し異なっていても別物として数えています。
例えば、数字1と2を交換しただけ、ヨコ2列を交換しただけ、盤面を裏返しにしただけ、etc...
当サイトの『ナンプレ完成形はどこまで増やせる?』というページでは、1つの完成図に数字置換やら列交換やら変換をアレコレ施して別の完成図をたくさん作りました。
そのページでは「4兆個できた」「1兆個だ」などとしゃべっていますが、それらの完成図は全て本質的に同じです。
例えば、個々の数字はただの記号に過ぎないから、数字1〜9を入れ替えたところで本質は変わらないですもんね。
だから、それらを1個ずつ検証しても意味はありません。論理展開も結論もダブりまくって無駄なだけ。
というわけで、「本質的に異なる完成図だけを相手にすればOK!」となるんですね。
その個数は既に判明しています。
全部で 5,472,730,538個 です。
よって、66垓個ではなく54億個だけを対象にすれば良いわけです。
……とは言っても、3.3京×54億でもコンピュータはサジを投げます😅
だから、単純な方法では問題解決など夢のまた夢なんですね。
というわけで、別のところに注目する必要がある。
次セクションでは、唯一解の本質部分に目を向けてみましょう。
5.さぁ果たして16ヒントナンプレは存在するか?
さて、手順 1. を終えて、完成図から12マス以下の MUS が全て集まりました。
次は手順 2. を行いましょう。
この MUS 達を基に、唯一解を持つ可能性のある問題図を作成します。
そういや、セクション4-2では、こう述べましたっけ。
ヒント数字達は全ての MUS を完全網羅していなきゃいけない。
MUS を1つでも見逃していたら、もうその問題図は唯一解を持たない。
「不備1つでもう論外となる!」と叫んだヤツです。
実は、このことは MUS を12マス以下に限定したとしても成り立ちます。
そこで、ここからは「MUS は全て12マス以下である」として話を進めていくことにします。
不備1つで不合格となってしまう。
ということは、手順 2. を行う時は不備を起こさぬよう、収集した MUS の中から16マスを選ぶことにします。
その16マスの数字で問題図を作り、それが唯一解を持つかどうかを検証するわけです。
マス選びの具体的な手順はこんな感じ。
- ある MUS から1個目のマスAを選び、Aを含む全ての MUS に印を付ける。
- まだ印の付いていない MUS から2個目のマスBを選び、Bを含む全ての MUS に印を付ける。
- まだ印の付いていない MUS から3個目のマスCを選び、Cを含む全ての MUS に印を付ける。
- 以下、4個目、5個目、……と繰り返す。
全ての MUS が書かれたチェックシートを作っておく、と捉えるとわかりやすいですね。
マスを1個選ぶたびに、該当の MUS にチェック印✔️を付ける。
16マスに到達するまでに全ての MUS に✔️が付けば合格! その問題図は唯一解の可能性を秘めています。
なお、マス選びをする際、既に✔️の付いた MUS から選ぶ必要はありません。
なぜかと言うと、セクション4-1で説明した minimal unavoidable set の性質により、次の2つが許されるからです。
- どの MUS にもヒント数字を1個置くだけで良い。
- ヒント数字は MUS 内のどこに置いても良い。
✔️が付いた時点でその MUS 内部にヒント数字が置かれることが確定し、その MUS 内部では複数解が起こりません。
よって、同じ MUS からわざわざ2個も3個もマスを選ぶ意味はないんです。
5-1.本当にこの方法で大丈夫?
ただ、ここでちょいと疑問が1つ出てきます。
セクション4-3の末尾で軽く述べましたが、MUS は全て12マス以下なんです。
13マス以上は1つもない。それどころか、unavoidable set 全体から見てもほんの一部でしかありません。
そんな少ない MUS 達だけで、唯一解の可能性のある問題図を全部作れるんだろうか……??
いかにも検証漏れが起きそうで怖いですよね。
しかし、その心配は要りません。
その理由を説明しましょう。
チェックシート法で MUS の中からマスを選んでいった時、選択マスの組み合わせは数多く存在します。
そして、マス選びの結果は3通りに分かれます。
- 【1】
- 16マスを選んでも全ての MUS を完全網羅できなかった。
- 【2】
- 16マスを選んで初めて全ての MUS を完全網羅した。
- 【3】
- 16マスに達する前に全ての MUS を完全網羅できた。
【1】の場合は不合格です。
完全網羅が絶対必要ですもんね。
【2】の場合は合格。唯一解の可能性を秘めています。
その16マスの数字で問題図を作って検証すればOKです。
【3】の場合も合格。唯一解の可能性を秘めています。
ただし、さらにマスを何個か追加して16マスに増やしてから問題図を作ります。
以下で詳しく説明しましょう。
2つの数字a, bのある全18マスは unavoidable set だから、どのマスも必ず何かしらの unavoidable set に属しています。
だから、unavoidable set 達は必ず盤面全体を覆い尽くします。
しかし、12マス以下の MUS では盤面を覆いきれない可能性が出てきます。
図5-1(※イメージ図です)を例にとりましょう。
色の付いた領域が MUS だとします。
どの MUS にも覆われていないマス(白色)がありますね。
そして、13マス選んだ時点で MUS 達を完全網羅できました。
この時、その13マスを含む問題図をたくさん作れます。
具体的には、未選択の68マスから3マスを選んで合計16マスに増やしてから問題図を作るんです。
そして、それらを全て検証します。
これは 68C3 通りのローラー作戦をすれば良いだけなので、未選択マスがそれぞれどの unavoidable set に属するかを知らなくてもOKです。
この【2】【3】で得られた問題図、これが検証すべき物の全てです。
あ、「チェックシート以外の方法だと他の問題図ができるんじゃない?」という疑問も出てきそうだ。
でも、これも心配には及びません。
チェックシート法を使わずに適当に16マスを選んだとしても、結果はやっぱり【1】【2】【3】のどれかになります。
たまたま【2】【3】の場合に該当したとしても、その問題図は今述べた「検証すべき物の全て」の中に含まれています(【3】の場合はローラー作戦の問題図の1つに当てはまる)。
したがって、12マス以下限定の MUS でも大丈夫なんです。
原論文のチームが12マス以下に限定した理由は、作業効率化のためです。
全ての minimal unavoidable set を収集対象にすると、16マス選ぶのに時間がかかる。かと言って、マス数の少ない set ばかりだと【3】のパターンが激増してローラー作戦だらけになる。
このジレンマの折衷案が「12マス以下限定の MUS 収集」だったのでしょう。
原論文では「12以下の要素を持つ unavoidable set 達が総合的にベストな結果を与えるということがわかった」と述べています。
5-2.あとは1個ずつ検証して結論へ
さぁ、12マス以下の MUS でも手順 2. には差し支えないということがわかりました。
安心して問題図を作っていけますね。
チェックシート法の手順をもう一度。
- ある MUS から1個目のマスAを選び、Aを含む全ての MUS に印を付ける。
- まだ印の付いていない MUS から2個目のマスBを選び、Bを含む全ての MUS に印を付ける。
- まだ印の付いていない MUS から3個目のマスCを選び、Cを含む全ての MUS に印を付ける。
- 以下、4個目、5個目、……と繰り返す。
この作業の進め方は簡単です。
まず、6マスの MUS を最初に選んだとすると、マスAの選び方は6通りある。
最初の MUS からは6つに分岐する。
分岐先のそれぞれに対してマスB選択用に MUS を選び、そこからさらに分岐する。
さらにマスC選択用に MUS を選んで分岐する。
これを繰り返します。
最終的には「ツリー構造」と呼ばれる枝分かれ構造ができあがります。
後は、それぞれの末端までツリーをたどってマスを拾い上げ、問題図を全部作って手順 2. は終わり。
手順 3.「その問題図達が唯一解を持つかどうかそれぞれ検証する」に移ります。
これが1個の完成図に対する作業の全てです。
これを 5,472,730,538個の完成図に対して行い(手順 4.)、16ヒントナンプレが存在するか否かを調査すれば全行程終了です。
結果は……
- 「ヒント16個のナンプレ問題は1つも存在しない」でした。
「ヒント16個のナンプレ問題は存在するか?」
原論文のチームによるこのプロジェクトは、2005年8月に始まりました。
ナンプレ完成図をくまなく探索するためのソフトウェア「checker」を開発し、ゴールへ向けての第一歩を踏み出しました。
2007年中は休眠状態だったものの、2008年下半期には checker の高速化のヒントを得てプロジェクトを再開。
2009年初めに2代目の checker をゼロから開発し、二度目の旅立ちをしています。
その旅は約3年もの長い月日をかけ、2012年1月1日、大きなゴールへとたどり着いたのでした。
6.おまけ
ここからは余談です。
ちょっとした話を2つしましょう。
6-1.ちょっとした工夫を紹介
手順 2. の「マス選び」に施した工夫をちょびっと紹介しましょう。
まず、簡単な工夫は「収集した MUS 達をマス数の少ない順に並べ直した」ということ。
先頭には4マスの MUS を並べ、続いて6マス、8マス、……最後は12マスの MUS、と昇順にソートしたわけです。
これは序盤の分岐の量を抑えるためです。
次に、「複数の MUS 達を1つにまとめて clique という物を作る」というアイデアも盛り込みました。
まず「clique って何だ?」だと思うので、その説明から。
図6-1 には2つの MUS がありますね。黄色と緑色です。
そして、この2つは重なっていません。つまり、マスを共有していません。
この時、黄色と緑色をまとめて「14マスの unavoidable set」とみなすことができますね。
このように、重なりの全くない MUS を1つにまとめてできた unavoidable set を clique と呼びます。
黄色+緑色の clique にヒント数字が2個必要だということは明らかですね。
これを 次数2の clique と呼びます。
一般にはこう定義されます。
- 互いに重ならないn個の MUS を合成させてできた unavoidable set を 次数nの clique と呼ぶ。
次数は「必要なヒント数字の個数」そのものですね。
この clique も手順 2. の効率化に大きく貢献しました。
例えば、もし15マス選んだ時点で✔️が1つも付いていない次数2の clique があった時、16個目のマスを選んでもしょーがないですよね。
その clique からマスを2個選ばなきゃ複数解が確定してしまうのに、1個しか選べないですもんね。
だから、その場合は15個目のマスを取り消して改めて別のマスを15個目に選ぶ。
こういうことができるわけです。
12マス選んだ時点で✔️が1つも付いていない次数5の clique があった時も同様で、この場合はもっと効率が良いですよね。
ツリー構造の探索には「バックトラック」というテクニックがありますが、ツリーの先端だけでなく途中の枝ごとバッサリ切れる。
この時間短縮は非常に大きい!
原論文のチームは、手順 1. で MUS を全て収集した後、重なっていない MUS 同士を合成してたくさんの clique を作って手順 2. に活用しました。
実際は次数2〜5の clique を全部作ったので、12マス目以降の枝切りが大いに捗ったことでしょう。
バサッと鋭い切れ味! テレショップで大人気の高枝切りバサミも真っ青だったに違いない😅
プログラミングの観点では、プライマリー/レプリカ方式でコンピュータ同士を連携させたりなど並列処理も取り入れたようです。
他にもまだまだ工夫はいっぱい施されました。
なんせ54億個もの完成図が相手ですもんね。効率化は大事です。
6-2.ヒッティングセット問題
最後は、数学色の強い話。
とは言っても、うわべだけをちょろっと話して終わりです。
セクション5のマス選びに関連して、原論文の中には「hit」という単語が割と目立ちます。
これは「ヒッティングセット問題 (hitting set problem)」と関連が深いからなんです。
寡聞にして私はその問題を知りませんでしたが、集合論やグラフ理論などに詳しい方々なら「集合被覆問題」「頂点被覆問題」などの問題を既に思い出していたかもしれません。
この時、全ての \(S_k\ (k=1, 2, \cdots, n)\) に対して \(S_k \cap H=\emptyset\)(\(\emptyset\) は空集合)となるような集合 \(H\) は見つかるだろうか?
ただし、\(H\) の要素数は \(p\) であるとする。
「どの集合 \(S_1, \ S_2,\ \cdots,\ S_n\) にも交差する集合 \(H\) を作る」という作業をするわけですね。
実は、この作業はセクション5のマス選びと同じなんです。
- 集合 \(U\) はナンプレ完成図。
- 集合 \(S_1,\ S_2,\ \cdots,\ S_n\) は MUS 達( \(n\) は MUS の個数)。
- 集合 \(H\) はヒント数字として選ばれたマス達。
- 16マス選ぶことを想定しているので、\(p=16\)。
\(H\) が各 \(S_k\) に交差することを「\(H\) は \(S_k\) にヒットする」と言い、\(H\) 自身を「ヒッティングセット」と言います。
セクション5では、作成したヒッティングセットをそのまま問題図にして唯一解を検証していったんですね。
16ヒントナンプレ問題の解決にヒッティングセット問題が直接役立ちました。
このヒッティングセット問題、数学以外の分野にもいくつかの応用があるようですね。
原論文にも例が載っています。
Such situations occur in bioinformatics (gene expression analysis), software testing as well as computer networks, and when finding optimal drug combinations; the last of these papers lists protein network discovery, metabolic network analysis and gene ontology as further areas in which hitting set problems naturally arise. Besides, our algorithm can be applied to the hypergraph transversal problem, which appears in artificial intelligence and database theory.
バイオインフォマティクスとか遺伝子オントロジーとか私には完全に未知の世界ですが、ヒッティングセットは非常に有用な概念なんだろうなとは伝わってきます。
探せば他にも応用はあるかもしれませんね。
参考・参照
- Gary McGuire/Bastian Tugemann/Gilles Civario 著,
『There is no 16-Clue Sudoku: Solving the Sudoku Minimum Number of Clues Problem via Hitting Set Enumeration』,
https://arxiv.org/abs/1201.0749v2, (参照 2022. 8.29.) - 物資・材料研究機構(NIMS)『材料のチカラ』- 原子のせかいであそぼう!,
https://www.nims.go.jp/chikara/workshop/atomkids/, (参照 2022.11.24.) - 国立印刷局, 『お札と切手の博物館』- 史上最高額のお札 ハンガリー 10垓ペンゴ,
https://www.npb.go.jp/ja/museum/tenji/gallery/10gai-pengo.html, (参照 2022.11.24.)
更新履歴
- 2022.12.17.
- 新規公開。