レーマー符号
数学とくに組合せ数学において、レーマー符号(レーマーふごう、英: 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での値n − iはそこから右での最大である。
符号化と復号
[編集]符号化はそれぞれの位置ごとに逆転を数えることで行える。
また、次のような方法でインプレースに行うこともできる(ただし、現実的には単純に数える以上に効率的であるわけではない)。
この方法では、まず各要素を昇順にソートしたときの0から始まるインデックスへと置き換える。そして左から右へ順に、各エントリxについて、それより右でかつxより大きいエントリから1を引くことを繰り返す。 たとえば、B, F, A, G, D, E, Cは1, 5, 0, 6, 3, 4, 2という数列に置き換えられ、次のように処理される。
こうして、全エントリを処理し終わって得られた最後の行がレーマー符号である。 デコードはこの逆を行えばよい。右から左へ各エントリxについて、それより右にあるx以上のエントリに1を足すことを繰り返す。
関連項目
[編集]出典
[編集]- ^ Lehmer, D.H. (1960), “Teaching combinatorial tricks to a computer”, Proc. Sympos. Appl. Math. Combinatorial Analysis, Amer. Math. Soc. 10: 179–193
- ^ Laisant, Charles-Ange (1888), “Sur la numération factorielle, application aux permutations” (フランス語), Bulletin de la Société Mathématique de France 16: 176–183
関連文献
[編集]- Mantaci, Roberto (2001), “A permutation representation that knows what "Eulerian" means”, Discrete Mathematics and Theoretical Computer Science (4): 101–108
- Knuth, Donald (1981), The art of computer programming, 3, Reading: Addison-Wesley, pp. 12–13