数学とくに組合せ数学において、レーマー符号(レーマーふごう、: Lehmer code)は、n 個の数のすべての置換を符号化する方法の一つである。レーマー符号という名前はデリック・ヘンリー・レーマー英語版に由来するが、この符号は少なくとも1888年には知られていた[1][2]

符号 編集

レーマー符号は、n 個の数の置換が

 

個存在するという事実を利用している。置換 σ は 1, …, n の像の列 (σ1, …, σn) によって表すなら、n 個の数の並びによって符号化されることになる。しかし、こうした並びには置換を表さないもの(同じ数を二度使ったもの)も含まれている。ここで考察する符号は、先頭の数を n 個の数から選び、次の数は n − 1 個の数から選び、そうしていって、最後の数はたった1個の数から選んでできるものである。

レーマー符号は、次の列である。

 

記号 L(σ)i は、σi+1, …, σn のうち σi より小さいものの個数である。

i < j かつ σi > σj である添字の組 i < jσ逆転と呼び、L(σ)iは、逆転(i,j)がいくつあるかを表す(iは固定しiを変化させる)。このことからL(σ)1 + L(σ)2 + … + L(σ)nσ に逆転がいくつ現れるかを表していることが分かる。これは、恒等順列に変換するために必要な隣接互換の数と等しい。位置 iの値が0であればそこから右での最小であり(すなわちσiはその右にあるどのσjよりも小さい)、位置 iでの値niはそこから右での最大である。

符号化と復号 編集

符号化はそれぞれの位置ごとに逆転を数えることで行える。

また、次のような方法でインプレースに行うこともできる(ただし、現実的には単純に数える以上に効率的であるわけではない)。

この方法では、まず各要素を昇順にソートしたときの0から始まるインデックスへと置き換える。そして左から右へ順に、各エントリxについて、それより右でかつxより大きいエントリから1を引くことを繰り返す。 たとえば、B, F, A, G, D, E, Cは1, 5, 0, 6, 3, 4, 2という数列に置き換えられ、次のように処理される。

 

こうして、全エントリを処理し終わって得られた最後の行がレーマー符号である。 デコードはこの逆を行えばよい。右から左へ各エントリxについて、それより右にあるx以上のエントリに1を足すことを繰り返す。


関連項目 編集

出典 編集

  1. ^ Lehmer, D.H. (1960), “Teaching combinatorial tricks to a computer”, Proc. Sympos. Appl. Math. Combinatorial Analysis, Amer. Math. Soc. 10: 179–193 
  2. ^ Laisant, Charles-Ange (1888), “Sur la numération factorielle, application aux permutations” (フランス語), Bulletin de la Société Mathématique de France 16: 176–183, http://www.numdam.org/item?id=BSMF_1888__16__176_0 

関連文献 編集