Table of Contents

魔方陣数え上げの戦略

用語の定義については こちらをご覧ください。

2N+2個の魔方組を用意する

N次の魔方陣を作るには、以下の制約を満たす合計2N+2個の魔方組(行N個、列N個、対角2個)を用意する必要があります。

行の組と列の組はそれぞれ大きさの順にソートされた組として生成し、行の順序、列の順序は後で検討するものとします。またこの段階では、対角魔方組の要素は対角線上にあるとは限らず、自由な配置を許すものとし、それゆえに「候補」と呼ばれます。

重複の排除

定義から言って、また効率の面から言っても、回転と反転の自由度から生じる重複は避けなくてはいけません。回転と反転には合わせて8通りの自由度がありますが、それらは以下の3つの操作の組み合わせで作り出すことができます。

  1. 主対角線を軸とする反転 (行と列の交換、または転置とも言えます)
  2. 水平反転
  3. 180度回転(水平反転と垂直反転の同時実行とも言えます)

上記 1.と 2.から生じる重複は、それぞれ以下のような条件を課すことで、除去できます。

変換 3. はM-変換の一部であり、最後の節で議論します。

相補対

大部分の魔方陣は補数変換による対を作ります。この対の一方のみを生成し、他方の生成を省略することで数え上げの手間を省くことができます。ただし、補数変換の結果が元の魔方陣と同じになる例外的なケースを正しく扱うよう、注意が必要です。

ここで、3つの場合分けを導入します。魔方陣の行または列をなす最大の魔方組が、行の補数組、列の補数組のうち最大のものと比べて

  1. 大きい場合
  2. 小さい場合
  3. 等しい場合

1. と 2. のケースは補数変換により互いに1対1に対応するため、1. だけ数えて 2倍することで、2.の数え上げを省略することができます。3. の場合は単にそのまま数え上げます。

3. のケースがすべて自己補数的だとは限りません。3.のケースをさらに細かく分解してさらに無駄を省くことができるかも知れません。ただしその分解によるオーバーヘッドが大きくならなければです。

効率的な魔方陣の数え上げ

上記の条件を満たす 2N+2個の魔方組が与えられたとして、対角魔方組(候補)の要素が正しく配置できるかどうはまだわかりません。我々に残された自由度である、行の並べ替え、列の並べ替えによって魔方陣が構成できるかどうかを調べる必要があります。

数学(群論)の言葉で言うと