マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第9章 関数の再帰的使用

第1話 知的革命について

皆さん、魔方陣は確かに面白いが、遊びにすぎないとか実用的なものに結びつかないと考えていませんか。

ですが、私が数独の自動生成に成功した理由は魔方陣の自動生成を研究していたからです。

20年ほど前に数独の存在を知りました。

当時栃木県立黒磯南高校に勤務していたのですが、

当時の校長は数学の先生でしたが、数独と囲碁をこよなく愛する方で、

数学科の職員の前に来て数独の話などをよくする先生でした。

存在を知ったとき、確かに面白そうなパズルであると思いましたが、

すぐに魔方陣自動生成を応用すれば数独自動生成に成功するはずだと、

直観しました。

実際に、1週間もかからずに数独の自動生成に成功しました。

ただ、当時は試行錯誤法で解かせていたので4題に1題の割合で仮定法を使わなければ解けない数独を生成していました。

数独ファンは、仮定法を邪道な方法と見なします。

そして、数独ファンは正当な解き方を理詰めと呼びます。

現在私がサイトに公表し、下野新聞と南信州新聞に提供している数独自動生成ソフトは、

すべて理詰めで解ける問題しか生成しません。

純粋な試行錯誤法=純粋な仮定法で魔方陣を自動生成させていたので、

初期の数独自動生成は、理詰めで解けない数独を1/4の確率で生成してしまっていました。

これを改良するには、コンピュータに人間と同じ考えで生成した数独を解かせなければなりませんでした。

理詰めで解ける数独のみを生成するソフトの開発は、大変でしたが2週間も研究すると開発に成功しました。

人間と同じように考えさせるにはどうしたらよいか、

頭が爆発しそうになるほど大変な作業でしたが、最初のコツを組む込むときに考えた色塗り(もちろん比喩です)のアイデアが

すべてのコツに使えることがわかり、理詰めで解ける問題のみを生成する数独自動生成に成功したのです。

そして、ヒント数20なると18時間も生成に要している問題は、

C++マルチスレッドプログラミングによって解決して平均で20秒程度で生成できるようになって、

下野新聞でもヒント数20の数独をスイスイ掲載できるようになったのです。

理詰めで解けるとは、必ずいかなる局面でも1つに数字に確定できるマス(セル)が存在していて、

それを論理的に突き止めて、その空欄(マス)を埋めるとまたどこかのマスが1つの数字に確定できます。

そして、それを最後まで繰り返すのが、私の開発した数独自動生成ソフトの出題する数独なのです。

数独ファンやナンプレファンの皆さん仮定法=試行錯誤法をぜひすてて理詰めで解くようにしましょう。

なぜなら、理詰めで解いた時に達成感は仮定法で解いた時とは次元の異なる達成感になるからです。

理詰めで解けば、数独ファンまたはナンプレファンが仮定法=試行錯誤法を邪道な解き方であるとする理由が、

心底理解できます。


理詰めで解ける数独のみを生成させるには、

今回革命を体験して抱く方法に加えて、色塗りという発想を必要としましたが、

魔方陣の自動生成を直接応用してできた、

空欄候補数字探索には必要不可欠な方法でした。

空欄候補数字探索という探索があってこその色塗りなのです。

ですから、理詰めで解ける問題しか生成しない数独自動生成ソフトと言えども、

今回体験する革命が必要だったのです。

その革命とは、2次元を1次元に還元して関数の再帰的方法によって魔方陣を自動生成させるものです。

for文だと3次魔方陣の段階で9次for文、4次なら16次for文、5次なら25次for文、・・・、100次なら10000次元for文処理になり、

これはプログラムが複雑になりすぎて不可能です。

10000次元for文処理に相当するものでさえ可能なのが、

この章で学ぶ関数の再帰的方法なのです。

前にも申し上げました。

2次元を1次元に還元×再帰的方法という方法こそが魔方陣の自動生成を可能にしたもの、すなわち、知の革命なのです。

そして、この知の革命は数独自動生成に応用できるだけでなく、

時間割編制ソフト開発、パズル生成、スケジューリング、AIの探索アルゴリズムにも応用できる

実用性の高い技術なのです。

ですから、本サイトが魔方陣の作成や生成を中心的な題材に選んできた理由は、

遊戯性にあるのではなく、実用性にあるのです。

知的好奇心のある方なら魔方陣や数独は大変面白い課題ですから、

遊戯性も兼ね備えた実用性があると訂正した方がよいでしょうか。

皆さん、ぜひ覚えてほしいことがあります。

知的好奇心がある人は、他の人より創造性に優れ学習能力も高い人です。

例えば、魔方陣を見て下らないと思う人は、

残念ながら、知の原動力である知的好奇心がない人であると言わざるを得ません。

どんなことにも興味がある人は、能力が高く創造性に富んでいます。

理由は簡単です。

知的好奇心がある人は何でも興味を持ち、

自分の頭脳を鍛え、いろいろな知識を身につけているからです。

三角関数に出会ったときに、面白いと思う人は発展性のある人です。

数学ってなぜ勉強するのと高校生によく聞かれました。

その答えは面白いから勉強するのです。

そして、興味を持って取り組んでいくと頭脳が鍛えられ、

いろいろな知識も身についていくのです。

AIが可能になったのはニューラルネットワークの仕組みを学び取り入れたことが大きいです。

AIの深層学習には、三角関数や微分積分が必須のものです。

ですから、意識していませんが我々が学んだり考えたりするときに、

私たちは無意識に三角関数や微分積分を動かしているのです。

このは関数関係でできているというのが分析哲学の主張ですが、

その関数は、すべて三角関数を合成すれば構成できることが数学的に証明されているのです。

したがって、この世は三角関数でできているのです。

だから、そんなの社会に出てから使わないと思うのではなく、

面白そうだと思えるように自己変革をしていく必要があります。

自己変革すれば高い学力、高い能力、高い創造性を持つことになります。

作成と生成を区別する理由は、

作成は魔方陣のつくり方をコンピュータに教えて作らせているだけなのに対して、

生成の方は、コンピュータが試行錯誤をして2本対角線合計・すべての行合計・すべての列合計が同じなるものをみつけだして、

コンソール画面に打ち出していて次元が異なるからです。

ですから、魔方陣自動生成は大変面白い課題なのです。




さて、第2話の課題です。

普通ただ順列と呼ぶものを私はn次順列と読みます。

3次順列なら

123 132 213 231 312 321

なぜn次順列と呼ぶかと申しますと、9次順列を作りそれを2次元に並び返して、

2本対角線合計・すべての行合計・すべての列合計が同じになる9次順列を作れば、

3次魔方陣が作れるからです。

同様に16次順列から4次魔方陣、25次順列から5次魔方陣、・・・、n * n 次順列から n 次魔方陣を生成できます。

それで、n次順列という概念を提起するのです。

第2話の課題です。

for文によって3次順列をすべて生成してください。



123 132 213 231 312 321
総数 = 6


const int n = 3;//具体的な数字を使うのではなく、 n を使うと汎用性のあるプログラムになる!

void n次順列(int* a);// 1次元配列配列

int main() {


  int a[n]; // 1次元配列


  n次順列(a);

;

とすることです。 

総数 = すべての場合の数もカウントして入れてください。





第8章第19話へ 第9章第2話へ

本講義トップへ