偶置換・奇置換(2)
「群論の計算(9) - エレファント・コンピューティング調査報告」や「エレファントな線形代数(5) - エレファント・コンピューティング調査報告」では以下のようなことを説明しています。
ここでは、「バブルソート」は隣接する2つの要素を交換することを繰り返すものとします。
リストの 番目の要素を
と書くとき、集合
の元の個数をリストの「転倒数」と呼びます。TypeScriptで書くと以下のようになります。
function inversion_count(list: number[]): number { var count = 0; for (var i = 0; i < list.length - 1; i++) { for (var j = i + 1; j < list.length; j++) { if (list[i] > list[j]) { count++; } } } return count; }
隣接する2つの要素を交換すると、「転倒数」は 1 増加、または 1 減少します。「バブルソート」では減少する場合に交換するので、「バブルソート」の交換の回数と「転倒数」は一致します。
ここまでをまめると、まず「バブルソート」の交換の回数が偶数である置換は偶置換、奇数である置換は奇置換と定義します。「バブルソート」の一回の交換によって「転倒数」は 1 減少するので、「バブルソート」は終了して、任意の置換は偶置換または奇置換となり、偶置換のとき「転倒数」は偶数、奇置換のとき「転倒数」は奇数となります。
次にある置換 とある互換(2つの要素を交換する置換)
の合成
を考えます。
をリストで表したものの
の位置と
の位置を入れ替える操作を、隣接する要素を入れ替える操作の合成で表します。TypeScriptで書くと以下のようになります。
function exchange_neighbor(list: number[], a: number, b: number): void { // 隣の要素同士を交換して a と b を交換 // a, b は 0 から、a ≦ b for (var i = a; i < b; i++) { exchange(list, i, i + 1); } for (var i = b - 1; i > a; i--) { exchange(list, i - 1, i); } }
隣接する要素を入れ替える操作の回数は となります。よって
が偶置換のときは
は奇置換、
が奇置換のときは
は偶置換となります。帰納的に、偶数個の互換の合成は偶置換、奇数個の互換の合成は奇置換となります。