第18講 一般種法×末項確定法(魔方陣作成マクロVer.4)への挑戦
第1話 一般種法とは?
いままで末項確定法を含め、魔方陣作成を力業で行ってきました。
末項確定法で多少工夫をして場合の数が、多少は減ったとはいえ、
5次魔方陣なら、基本的には25!のすべての場合を調べその内魔方陣になるものを探しだしていました。
しかし、25!は1×2×3×・・・×25=1.5511210043331E+25=約160000000000000000000000000という膨大なものです。
いくらコンピュータの処理速度が速いからといって、
これは無茶というものです。
まして10次魔方陣なら、100!=9.33262154439442E+157=約9×10の157乗
もあります。9の後0がなんと157個も並ぶのです。
これは、日本語の数の最大単位無量大数(複数説があるようですが大きい方でも10の88乗)を遙かに超えています。
これでは、世界最速を計測したスーパーコンピュータ京をもってしてもとても扱いきれません。
プログラムの世界では、計算量が急速に増えていってコンピュータが手に負えなくなる現象を計算爆発といいます。
プログラミングにおいては、常に計算爆発の危険性があります。
今回の発想では、5次魔方陣においてすでに計算爆発を起こしているといってよいでしょう。
では、力業でなく工夫するにはどうしたらよいでしょうか。
1から25をセルに並べて、行・列・対角線の合計が同じになるものを探すでは、
数が大きすぎます。
数学の有力な思考方法は、分析と総合です。
大きすぎる数を小さい要素に分析してから、
それを総合するという発想で考えてみましょう。
普通魔方陣は、5次魔方陣なら1から25までセルに入れていきますが、
要素にすっきり分けるために、0から24まで入れるとしましょう。
通常の魔方陣にするには、完成した魔方陣のすべてのセルに1を加えればよいだけです。
0から24と考えると、それぞれの数は5で割った余りと商に分割することが出来ます。
例えば19は、
19=5×3+4
です。
つまり、10進数の19を5進数で表現すれば4です。
ですから、数を2つの要素に分割するには、
5進数に表し、十の位の要素(正確には5の位の要素でしょうか?)3と一のくらいの要素4に分割すればよいのです。
そして、それぞれに要素の行・列・対角線の合計が同じになるようにしなさいなら、
負担はかなり小さくなります。
0 | 4 | 2 | 0 | 4 |
0 | 3 | 3 | 1 | 3 |
4 | 0 | 2 | 3 | 1 |
4 | 1 | 0 | 4 | 1 |
2 | 2 | 3 | 2 | 1 |
3 | 3 | 0 | 2 | 2 |
0 | 2 | 4 | 3 | 1 |
0 | 1 | 2 | 3 | 4 |
4 | 0 | 4 | 1 | 1 |
3 | 4 | 0 | 1 | 2 |
そして、一方を10の位の数字、他方を1の位の数字として合体します。
03 | 43 | 20 | 02 | 42 |
00 | 32 | 34 | 13 | 31 |
40 | 01 | 22 | 33 | 14 |
44 | 10 | 04 | 41 | 11 |
23 | 24 | 30 | 21 | 12 |
そして、これを十進数に翻訳します。
翻訳は10の位の数字に5をかけ、それに1の位の数字を足します。
34を例にとると、
5×3+4=19
3 | 23 | 10 | 2 | 22 |
0 | 17 | 19 | 8 | 16 |
20 | 1 | 12 | 18 | 9 |
24 | 5 | 4 | 21 | 6 |
13 | 14 | 15 | 11 | 7 |
そして、すべてのセルに1を加えます。
4 | 24 | 11 | 3 | 23 |
1 | 18 | 20 | 9 | 17 |
21 | 2 | 13 | 19 | 10 |
25 | 6 | 5 | 22 | 7 |
14 | 15 | 16 | 12 | 8 |
これで魔方陣が完成します。
私は、
0 | 4 | 2 | 0 | 4 |
0 | 3 | 3 | 1 | 3 |
4 | 0 | 2 | 3 | 1 |
4 | 1 | 0 | 4 | 1 |
2 | 2 | 3 | 2 | 1 |
3 | 3 | 0 | 2 | 2 |
0 | 2 | 4 | 3 | 1 |
0 | 1 | 2 | 3 | 4 |
4 | 0 | 4 | 1 | 1 |
3 | 4 | 0 | 1 | 2 |
などを魔方陣の一般種と呼んでいます。
種(『しゅ』または『たね』)と呼ぶ理由は、2つを組み合わせれば魔方陣を生産できるからです。
種の条件は、0から4までの数字でセルが埋まっていて行・列・対角線の合計が同じになることです。
では、なぜ一般と付け加えているのでしょうか。
特別な種=特殊種が存在するからです。
特殊種とは次のようなものです。
3 | 1 | 0 | 2 | 4 |
2 | 4 | 3 | 1 | 0 |
1 | 0 | 2 | 4 | 3 |
4 | 3 | 1 | 0 | 2 |
0 | 2 | 4 | 3 | 1 |
これも行・列・対角線の合計が同じですから種です。
ただし、どの行・列・対角線を見ても同じ数字が並びません。
このような特別の条件をもっている種を特殊種と呼ぶのです。
そして、特殊種とその他の種をひっくるめて一般種と呼ぶのです。
実は、この条件の多い特殊種は5次や7次などの素数次の場合は、
簡単に作る方法があります。
左表をご覧になればお分かりのように、
1行目の31024が次行以下2つずつずれて再現しています。
したがって、素数次については特殊種法によって超高速な魔方陣作成ソフトを作ることが出来ます。
特殊種法については、後の講で扱います。
特殊種法で確かに、素数次魔方陣は出来ますが、
汎用的な魔方陣作成ソフトを作るには、
一般種を利用するしかありません。
汎用的というのは4次、6次、9次、10次、12次なでも出来るようにするということです。
さて、魔方陣作成マクロVer.4に挑戦したいと思いますが、留意点が2つあります。
まず、一つ目ですが、種は実は自由に組み合わせること出来るわけではありません。
例えば、次の場合
0 | 4 | 2 | 0 | 4 |
0 | 3 | 3 | 1 | 3 |
4 | 0 | 2 | 3 | 1 |
4 | 1 | 0 | 4 | 1 |
2 | 2 | 3 | 2 | 1 |
4 | 2 | 0 | 1 | 3 |
0 | 1 | 3 | 4 | 2 |
3 | 4 | 2 | 0 | 1 |
2 | 0 | 1 | 3 | 4 |
1 | 3 | 4 | 2 | 0 |
結婚できません。結婚させると、
04 | 42 | 20 | 01 | 43 |
00 | 31 | 33 | 14 | 32 |
43 | 04 | 22 | 30 | 11 |
42 | 10 | 01 | 43 | 14 |
21 | 23 | 34 | 22 | 10 |
何が問題であるかお分かりですか。
10進数に翻訳してさらにすべて1加えて見ましょう。
5 | 23 | 11 | 2 | 24 |
1 | 17 | 19 | 10 | 18 |
24 | 5 | 13 | 16 | 7 |
23 | 6 | 2 | 24 | 10 |
12 | 14 | 20 | 13 | 6 |
確かに、行・列・対角線の合計はすべて65になっています。ところが、問題があります。
5 | 23 | 11 | 2 | 24 |
1 | 17 | 19 | 10 | 18 |
24 | 5 | 13 | 16 | 7 |
23 | 6 | 2 | 24 | 10 |
12 | 14 | 20 | 13 | 6 |
魔方陣は1から25の数字が漏れなく重複なくすべて入る必要があります。
つまり、1から25の数字が一つずつ入っていなければならないのです。
ところが、今回作った方陣は重複があちらこちらにあります。
ということは漏れもたくさんあるということです。
例えば、3,4などが漏れています。
実は、結婚には相性があるのです。
最初の例
0 | 4 | 2 | 0 | 4 |
0 | 3 | 3 | 1 | 3 |
4 | 0 | 2 | 3 | 1 |
4 | 1 | 0 | 4 | 1 |
2 | 2 | 3 | 2 | 1 |
3 | 3 | 0 | 2 | 2 |
0 | 2 | 4 | 3 | 1 |
0 | 1 | 2 | 3 | 4 |
4 | 0 | 4 | 1 | 1 |
3 | 4 | 0 | 1 | 2 |
は結婚が可能です。いかなる条件を満たすときに、結婚できるのでしょうか。考えてみましょう。
第16講第4話へ 第2話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る