第19講 特殊種による魔方陣ソフトの高速化
第1話 特殊種とは?

第17講の魔方陣ソフトの改良をもってしても6次以上の魔方陣ではまったく歯が立ちませんでした。
計算量が多すぎて、コンピュータが手に負えなくなってしまうわけです。
6次ですでに36!=約3710000000000000000000000000000000000000通りも場合が存在するのですから、
いくらコンピュータといえど、手も足も出ません。
計算量が飛躍的に増えていってコンピュータが手に負えない状態を
計算爆発といいます。
実は、プログラマーはこの計算爆発の問題といつも対峙しているわけです。
プログラマーは計算爆発が起こらないように、常に注意していなければならないのです。
計算量が少なくなるように工夫しなければならないのです。

前のソフトは、すべての場合を調べてしまおうというソフトですが、
このソフトは1000個作成などに限定しても5次が限界です。
何度も紹介してきましたが、
講義が進むと26次魔方陣でも、1秒に数千個も魔方陣を作成できるようになります。
そこへ向けて講義は進んでいきます。

今回紹介する方法は、私が特殊種法と名付けているものです。
この方法は、数独問題作成ソフトにおいても、基本的には踏襲されています。
基本的にはと書きましたのは、若干改良しているからです。
したがって、数独問題作成ソフトを製作されたい方は、
この講は必読の講となります。
今回の改良によって、7次8次9次10次あたりが作成可能になります。


さて、特殊種法とは何か。詳しくは、魔方陣の研究(特に、小学生・中学生のための魔方陣授業第2回第3回第4回)を参照していて頂きたいと思いますが、
ここでも簡単に説明しておきます。

5次魔方陣の場合を例に説明しましょう。

1 7 13 19 25
18 24 5 6 12
10 11 17 23 4
22 3 9 15 16
14 20 21 2 8


問題難度が高い理由は、
1から25までの数字を扱っていることです。
つまり、大きな数字を扱っていることが理由です。
問題が複雑な場合、どうしたらよいでしょうか。
問題を単純化すればよいのです。
数学において問題を簡単にする有用な方法は、
分析による方法です。
分析によって2つの要素に分解すればよいのです。

2要素に分解しやすいように、
すべてのセルから1引いたものを考えておきます。





0 6 12 18 24
17 23 4 5 11
9 10 16 22 3
21 2 8 14 15
13 19 20 1 7


もとの魔方陣に戻すには、
各セルに1加えるだけです。
2要素にするにはどうしたらよいでしょうか。
答えは5進数で表現し直すことです。
例えば、
19=3×5+4
ですから19は5進数で表現すると、34となります。
(1×10+9から10進数では19と表現しました。)
全部5進数で表記し直すと、

0 11 22 33 44
32 43 4 10 21
14 20 31 42 3
41 2 13 24 30
23 34 40 1 12


となります。
さらに、
2要素であることを強調するために
1など1桁を01などと表現し直すと、














00 11 22 33 44
32 43 04 10 21
14 20 31 42 03
41 02 13 24 30
23 34 40 01 12



なります。
さらに、これを5の位の数字と1の位の数字を分けて、
二つの表にします。














0 1 2 3 4
3 4 0 1 2
1 2 3 4 0
4 0 1 2 3
2 3 4 0 1



















0 1 2 3 4
2 3 4 0 1
4 0 1 2 3
1 2 3 4 0
3 4 0 1 2



この二つの表こそが、
5次魔方陣の特殊種(これは私が名付けたもので一般的な使用法ではありません。)です。
なぜ種と名付けているのか。
それは、種を二つ組み合わせれば魔方陣ができるからです。

つまり、二つの表は魔方陣の種(たね)というわけです。
では、特殊の意味は何でしょうか。
これは、魔方陣の種の中でも特殊なものです。
もっと一般的な種も存在するので、
特殊な種(たね)ということで特殊種(とくしゅしゅ)と名付けたわけです。
今回は特殊種による方法なので、10次あたりまでできるようになるわけですが、
6次魔方陣の場合は、特殊種法ではできないことがオイラーによって証明されています。
6次魔方陣ができるようになるためには、次に学ぶ一般種法が必要です。

特殊種の特殊性とは何でしょうか。
それは各行・各列・各対角線上に0から4までの数字が一つずつ入っていることです。
つまり、各行・各列・各対角線上には同じ数字は重複してはいることはありません。
各行・各列・各対角線にはかならず0,1,2,3,4の5つが入るので合計は自動的にすべて同じ10になります。

種の考え方は、24を丸ごと扱ったのでは数字が大きすぎるため場合の数が増えてしまい手に負えなくなるので、
二つの要素、すなわち5の位と1の位の数字に分解し、
それぞれの場合について各列・各行・各対角線の合計が同じになるようにしてから、
それを合体しようということなのです。
つまり、分析と総合です。

この講では、この特殊種をコンピュータに二つ作らせそれを合体することによって、
魔方陣を作成してしまおうというわけです。
作成速度は、5次においてさえ前のソフトより軽く100万倍は超えるでしょう。


では、皆さんコンピュータに特殊種を作らせるソフトを考えて見てください。
5次なら0,1,2,3,4の5つの数字を各列・各行・各対角線上に一つずつ入れるようにして頂きたいのです。
今回も頭が爆発しそうになるほど難問ですよ。
ヒントは、第17講の魔方陣ソフトを改良すればよいのです。

ただし、3次魔方陣の特殊種は存在しませんので、4次以上が対象になります。
nには4以上代入が前提になります。


第18講第2話へ 第19講第2話へ


VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座