『ラテン方陣』

『ラテン方陣』解答


◆新潟県 加藤 英晴 さんからの解答。

【問題1】

(1)

(2)

(3)

1行目の他の配列(あと4!−1)に対しても,それぞれこれと同じ数(24)だけ種類があることは明らか(実際に挙げません(略))です。

【問題2】の解答

(1)

【問題1】の(2)の解答より,
|L(3)|=12

(2)

【問題1】の(3)の解答より,
|L(4)|=4!×24=576

(3)

一般は,未解決の問題だったと思います。

|L(n)|=n!(n−1)!Iと表せ,

I=I=I=1,
I=4
I=56
I=9408
I=16942080 だそうですが,
一般の Iについては,知られていないそうです。

【問題3】の解答

任意のnに対して,L(n)は生成可能です。

1行目が1 2 3 ・・・・ n のものだけ生成すれば,
1行目の他の配列(あとn!−1)に対しても,文字の置換で,
それぞれ同じ数((n−1)!I)ずつ生成できる。

n次正方行列

1112・・・1n
2122・・・2n
n1n2・・・nn

を用意する。

(1)

1行目の1列目2列目・・・n列目
2行目の1列目2列目・・・n列目
・・・
n行目の1列目2列目・・・n列目
の順で決定する。

(2)

11=112=2・・・1n=n

(3)a21は,a11と異なるように決める。
22は,a12とa21と異なるように決める。
という具合に,各要素を決めるときは,その以左のどれとも,以上のどれとも同じにならないように選ぶ。

そう選べないときは,一つ前の要素の選び方を変える。
それでも選べないときは、その前の要素の選び方を変える。

各要素を決めるとき,以左のどれとも,以上のどれとも同じにならない数は何通りかあり,その選び方の違いが,生成される方陣の違いになる。
これで しらみつぶせます。

(感想)

何だか,定義を言い換えただけのようなアルゴリズムで,無意味な気もします。


◆東京都 ぽこぺん さんからのコメント。

【加藤英晴さんの生成アルゴリズムに関するコメント】

(1) 第1行に対しては

 a1j = j (1≦j≦n)

のように決めますが,同時に,第1列に対しても

 ai1 = i (1≦i≦n)

と決めるべきです。

この二つの条件を満たす Latin 方陣の個数が,
問題2(3)の解答に書かれた In となります。

この条件を満たす各 Latin 方陣に対して,
その第2行〜第n行を入れ替え ((n-1)!通り),

さらに第1列〜第n列を入れ替える (n!通り) ことにより,すべての Latin 方陣が漏れなく重複なく得られることはすぐわかります。

(2) 上記の二条件を満たす Latin 方陣を求めるには,単純なシラミ潰しではなく,攪乱順列(=完全順列)を使うべきです。

すなわち,与えられた n に対して,

 p(j) ≠ j (1≦j≦n)

を満たす攪乱順列 {p(j)} のすべての組をあらかじめ求めておきます。

この個数が

a(n) = n! ( 1
2!
-1
3!
+1
4!
-1
5!
+- …+(-1)n
n!
)

であり, a(n)
n!
1
e
となることはよく知られています。

ここで,このすべての組を

 Pk = {{p(j)} | p(1) = k} (2≦k≦n)

に分割しておき,Latin 方陣の第k行(2≦k≦n)を Pk から選ぶようにすれば,シラミ潰しの範囲を非常に狭めることができます。

明らかに |P2| = ... = |Pn| ですから,
第k行(2≦k≦n)の選択肢は a(n)
n-1
通りずつあります。

したがって,

{ a(n)
n-1
}n-1通り

だけを調べればいいというわけです。


 『ラテン方陣』へ

 数学の部屋へもどる