マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第13章 様々な魔方陣の作成および自動生成
第1話 素数次魔方陣の作成
私は、作成と生成を異なる意味で使っています。
作成とは、作り方をプログラマーがコンピュータに教えるだけです。
ですから、200次魔方陣でもコンピュータはあっという間に作ってしまいます。
それに対して生成とくに自動生成とはコンピュータ自身が試行錯誤をして
魔方陣を作り出すことです。
そして、私が価値を置いているのは自動生成です。
第6章は魔方陣の作成となっていたと思います。
今確認しました。作成となっています。
作成と生成という言葉を分けて使っているということは、
第10章第2話で説明しています。
生成の方に価値を高く置いているのは二つ理由があります。
1つはプログラミングするのが生成の方が難しいという理由です。
もう一つは、これから紹介する素数次魔方陣、
例えば5次魔方陣は5!×5!=14400通りあると説明しますが、
実はその14400通りの魔方陣については数学者は同一の魔方陣と見なすからです。
どういうことでしょうか。
それについては5次魔方陣を作成してから説明します。
1行目に0,1,2,3,4という数字を置きます。

そして、2行目以降2つずつ右へずらします。

2つずらすとは例えば0の動きに注目してください。
0が2つずつずれていますね。
1も動きを追うと2つずつずれています。
その他も右に2つずつずれています。

を私は魔方陣の種(たね)と呼んでいます。
よく観察してください。答は2行下に書きます。

2本の対角線の合計・5行の行合計・5列の列合計はいずれも10になります。
何かに似ていませんか。
そうです。魔方陣に似ています。
さて、次に

を右に3つずらします。
今回も2本の対角線の合計・5行の行合計・5列の列合計はいずれも10になります。

さて、なぜ魔方陣の種なのでしょうか。2つを並べて書いてみましょう。

そして左側の数字には5をかけて、対応する場所にある右側の数字を足します。

最後にすべてに1を加えます。

これは何ですか。

2本の対角線・5行の行合計・5列の列合計がすべて65です。
そうです。5次魔方陣になっているのです。
しかも、これは完全魔方陣です。

対角線だけでなくすべての斜め行合計が65になるです。
この様な魔方陣を完全魔方陣と言います。

最初に並べる数字は0,1,2,3,4の順列になっていれば任意のものを入れることができます。

そして、これについても2つずらしと3つずらしを行います。

左側の数字には5をかけて、対応する場所にある右側の数字を足します。

すべてに1を加えます。

これも完全魔方陣になっていることを
すべての斜め行・すべて行・すべての列の合計を計算して確認してください。


どう考えても2つは異なる魔方陣です。
では皆さん、手作業でやって作った魔方陣をコーディングしてコンソール上にアウトプットしてください。
初心者には大変難しい課題ですが、頑張ってプログラミングしてください。
をずらしましが、1行目の並びは任意ですから
5!×5!で14400通りの魔方陣ができることを確認してください。


先生まだ肝心なこと説明していませんよ。
この2つどう考えても異なる魔方陣ですよ。どうして同一魔方陣なんですか。
とても良い質問です。
それに答えるためには、第2話への課題を実現する必要があります。
課題はプログラミングしてコンソール画面上に魔方陣をアウトプットすることです。
いきなりは無理ですから、
をコンピュータに作らせて、
コンソール画面に表示させてください。

(
種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
種2
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
魔方陣表示
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
プロジェクト終了
)