
数学において、集合の順列は2つの異なる意味を持つ可能性がある。
最初の意味の例として、集合 {1, 2, 3} の 6 つの順列 (順序) が挙げられます。タプルとして表すと、(1, 2, 3)、(1, 3, 2)、(2, 1, 3)、(2, 3, 1)、(3, 1, 2)、(3, 2, 1) となります。文字がすべて異なる単語のアナグラムも順列です。元の単語では文字がすでに順序付けられており、アナグラムでは文字の順序が入れ替わります。有限集合の順列の研究は、組み合わせ論と群論において重要なトピックです。
順列は、数学のほぼすべての分野、そして他の多くの科学分野で用いられています。コンピュータ科学では、ソートアルゴリズムの解析に、量子物理学では、粒子の状態記述に、生物学では、 RNA配列の記述に用いられます。
n個の異なるオブジェクトの順列の数はn の階乗であり、通常はn !と表記されます。これは、 n以下のすべての正の整数の積を意味します。
2番目の意味によれば、集合Sの置換は、SからS自身への全単射として定義される。 [ 2 ] [ 3 ]つまり、SからSへの関数であり、その関数ではすべての要素が像の値としてちょうど1回出現する。このような関数はこれは、 Sの要素を並べ替えたもので、各要素iは対応する例えば、順列 (3, 1, 2) は関数に対応します。定義される ある集合のすべての順列の集合は、その集合の対称群と呼ばれる群を形成します。群演算とは、関数(ある並べ替えを次々と実行する)の合成であり、その結果として別の関数(並べ替え)が得られます。
初等組み合わせ論において、k順列、または部分順列とは、集合から選択されたk個の異なる要素の順序付けられた配列のことである。kが集合のサイズと等しい場合、これらは前述の意味での順列となる。

順列のような形をした六芒星は、紀元前1000年頃から中国の『易経』(ピンイン:Yi Jing)で使用されていた。
ギリシャでは、プルタルコスがカルケドンのクセノクラテス(紀元前396年~314年)がギリシャ語で可能な異なる音節の数を発見したと記している。これは順列と組み合わせの難問を解こうとした記録に残る最初の試みだっただろう。[ 4 ]
アラブの数学者で暗号学者のアル=ハリール(717年 - 786年)は、『暗号メッセージの書』を著した。この書には、母音の有無を問わず、可能なすべてのアラビア語の単語を列挙するために、順列と組み合わせが初めて用いられている。 [ 5 ]
n個の物体の順列の数を決定する規則は、紀元1150年頃のインド文化において知られていた。インドの数学者バースカラ2世の『リラヴァティ』には、次のように訳される一節が含まれている。
1ずつ増加し、桁数まで続く等差数列の乗算の積は、特定の数字を持つ数の変動になります。[ 6 ]
1677年、ファビアン・ステッドマンは、チェンジリンギングにおける鐘の順列の数を説明する際に階乗について述べた。2つの鐘から始め、「まず、2つは2通りの方法で変化させることができる」と述べ、1 2と2 1を示すことでそれを説明した。[ 7 ] 次に、3つの鐘では「3から2つの数字を3回生成する」と説明し、これも図解している。彼の説明には、「3を捨てると1.2が残る。2を捨てると1.3が残る。1を捨てると2.3が残る」という記述がある。[ 8 ] 次に4つの鐘に移り、捨てる議論を繰り返して、3つの異なるセットが4つあることを示す。これは実質的に再帰的なプロセスである。彼は「捨てる」方法を使用して5つの鐘に進み、結果として得られる120通りの組み合わせを表にまとめた。[ 9 ] この時点で彼は諦めて次のように述べている。
さて、これらの方法の性質は、1 つの数の変化がそれより小さいすべての数の変化を包含するものであり、... 1 つの数の変化の完全な集合は、それより小さいすべての数の完全な集合を 1 つの全体に結合することによって形成されるように見える。[ 10 ]
ステッドマンは順列の考察を広げ、アルファベットの文字の順列の数や、20頭の馬がいる厩舎の馬の順列の数を考察している。[ 11 ]
一見無関係に見える数学的な問題を順列を用いて研究した最初の事例は、1770年頃、ジョセフ・ルイ・ラグランジュが多項式方程式の研究において、方程式の根の順列の性質が方程式の解法可能性と関連していることに気づいた時に現れた。この研究の流れは、最終的にエヴァリスト・ガロアの研究を通してガロア理論へと発展し、根号を用いて(未知数が1つの)多項式方程式を解く際に何が可能で何が不可能かを完全に記述する理論となった。現代数学においても、問題を理解するためにそれに関連する特定の順列を研究する必要がある同様の状況は数多く存在する。
n個の要素に対する置換としての順列の研究は、コーシーの研究(1815年の論文)を通じて、群を代数構造として捉える概念につながった。
置換は、第二次世界大戦中にナチス・ドイツが使用した暗号装置であるエニグマ機の暗号解読において重要な役割を果たした。特に、置換の重要な性質の1つである、2つの置換が同じサイクルタイプを持つ場合に共役であるという性質は、暗号学者マリアン・レジェフスキーによって1932年から1933年にかけてドイツのエニグマ暗号を解読するために使用された。[ 12 ] [ 13 ]
数学のテキストでは、順列を小文字のギリシャ文字で表すのが慣例となっている。[ 14 ]
順列は、集合Sからそれ自身への全単射(可逆写像、1対1かつ全射関数)として定義できる。 恒等置換は次のように定義される。すべての要素について、そして、数で表すことができる、[ a ]または単一の1サイクル(x)による。[ 15 ] [ 16 ]
n個の要素を持つ集合のすべての順列の集合は対称群を形成する。ここで、群演算は関数の合成である。したがって、2つの順列に対してそしてグループ内で彼らの製品定義される 合成は通常、ドットやその他の記号なしで書かれます。一般に、2 つの順列の合成は可換ではありません。つまり、通常、順列はそして平等ではない。
集合から集合自身への全単射として、順列は集合の再配置を実行する関数であり、能動順列または置換と呼ばれます。古い観点では、順列はSのすべての要素の順序付けられた配置またはリストであり、受動順列と呼ばれます。[ 17 ]この定義によれば、§ 1 行表記のすべての順列は受動的です。この意味は、能動的変換と受動的変換およびその他の場所で受動的 (つまり別名) がどのように使用されているかとは微妙に異なります。 [ 18 ] [ 19 ]では、すべての順列は受動的解釈が可能であると考えられます (1 行表記、2 行表記などに関係なく)。
順列は、巡回群の軌道である、 1つまたは複数の互いに素なサイクルに分解することができる。集合Sに作用する。サイクルは、要素に置換を繰り返し適用することによって見つかる。ここで我々はk個の要素からなるサイクルをkサイクルと呼ぶ。(下記の「 サイクル表記」の項を参照。)
順列の不動点は、それ自身を取る要素xである。1サイクルを形成する固定点を持たない順列は、置換と呼ばれます。2 つの要素 (単一の 2 サイクル) を交換し、他の要素を固定したままにする順列は、転置と呼ばれます。
順列を便利に表現するために、いくつかの表記法が広く用いられています。順列の性質は、順列される要素の性質には依存せず、その数のみに依存するため、標準集合を考えることがよくあります。サイクル表記は簡潔で順列の構造を明確に示すため、広く用いられています。特に断りのない限り、本稿ではサイクル表記を用います。
コーシーの2行記法[ 20 ] [ 21 ]では、1行目にSの要素を、2行目に各要素の像を列挙します。例えば、関数によって与えられるS = {1, 2, 3, 4, 5, 6}の順列は次のようになります。
次のように書くことができます
Sの要素は最初の行に任意の順序で現れる可能性があるため、この順列は次のように書くこともできます。
Sの要素に「自然な」順序がある場合、[ b ]とします。そして、2行表記の最初の行にはこれを使用します。
この仮定の下では、最初の行を省略して、順列を1行表記で次のように書くことができる。
すなわち、Sの要素の順序付けられた配置として。[ 22 ] [ 23 ]下記で説明するサイクル表記と一行表記を区別するように注意する必要がある。一般的な用法としては、一行表記では括弧やその他の囲み記号を省略し、サイクル表記では括弧を使用する。一行表記はワード表現とも呼ばれる。[ 24 ]
上記の例は次のようになります。
(これらの項目を区切るためにカンマを使用するのは、一部の項目に2桁以上の数字が含まれる場合に限るのが一般的です。)
この簡潔な形式は、初等的な組み合わせ論やコンピュータサイエンスでよく用いられます。特に、順列を辞書式順序を用いて大きいか小さいかで比較するような用途で役立ちます。
サイクル表記は、集合Sの要素に置換を繰り返し適用する効果を表し、その軌道をサイクルと呼びます。置換はサイクルのリストとして記述されます。異なるサイクルは互いに素な要素の集合を含むため、これは「互いに素なサイクルへの分解」と呼ばれます。
順列を書き出すサイクル表記では、次のように進めます。
また、1サイクルは推論できるため省略するのが一般的です。S内のどのサイクルにも現れない任意の要素xについては、暗黙のうちに次のことが仮定されます。[ 25 ]
1サイクルを省略するという慣例に従うと、個々のサイクルは、サイクルに含まれないすべての要素を固定する順列(長さが1より大きいサイクルが1つだけ存在する巡回順列)として解釈できます。すると、互いに素なサイクルのリストは、これらの巡回順列の合成として見なすことができます。たとえば、1行順列サイクル表記では次のように表すことができます。 これは構成と見なすことができる巡回置換の 一般的に順列は可換ではないが、互いに素なサイクルは可換である。例えば、次のようになる。 また、各サイクルは異なる開始点から書き換えることができます。たとえば、 したがって、与えられた順列の互いに素なサイクルは、さまざまな方法で記述することができる。
サイクル表記の便利な特徴は、各サイクル内の要素の順序を逆にすることで順列を反転できることです。たとえば、
任意の順列には、多くの組み合わせ論的文脈、特に後述するフォアタの全単射において有用な、特定のサイクル表記法が存在する。標準的なサイクル表記法は次のように定義される。
例えば、は順列です標準サイクル記法(ミクロス・ボーナの用語)では、[ 26 ]リチャード・スタンレーはこれを標準表現と呼び、[ 27 ]マーティン・アイグナーは標準形式を使用しています。[ 24 ]セルゲイ・キタエフも「標準形式」という用語を使用していますが、両方の選択を逆にしています。つまり、各サイクルは最初にその最小要素をリストし、サイクルは最小要素の降順でソートされます。[ 28 ]
2 つの順列の合成を表す方法は 2 つあります。最も一般的な表記法では、は、任意の要素xを にマッピングする関数です。最も右側の順列が最初に引数に適用されます。[ 29 ] なぜなら、引数は関数の右側に書かれているからです。
順列の乗算に関する別の規則は、関数の左側に引数を記述することによって得られます。これにより、最も左側の順列が最初に作用します。[ 30 ] [ 31 ] [ 32 ] この表記では、順列はしばしば指数として記述されるため、xに作用するσはx σと記述されます。すると、積は次のように定義されます。この記事では、最も右側の順列を最初に適用する最初の定義を使用します。
関数合成演算は群の公理を満たします。結合法則を満たします。、また、2 つ以上の順列の積は通常括弧なしで記述されます。合成演算には単位元(単位順列)もあります。)、そして各順列逆数を持つ(その逆関数)。
順列を順序付けられた配置として捉える概念は、特に古い文献において順列と呼ばれてきたいくつかの一般化を許容する。
古い文献や初等教科書では、nのk順列(部分順列、重複のないシーケンス、バリエーション、または配置と呼ばれることもある) は、 n個の集合のk個の要素からなる部分集合の順序付き配置 (リスト) を意味する。[ c ] [ 33 ] [ 34 ]このようなk順列 ( k配置)の数は、は、次のような記号で様々に表されます。、 、、、、 または[ 35 ]式[ 36 ]で計算される。
k > nの場合は 0 であり、それ以外の場合は次の値になります。
この製品は、は非負整数であり、組み合わせ論以外でも重要です。ポッホハマー記号として知られています。または- 番目の下降階乗:
この順列という用語の使い方は、部分集合を意味する組み合わせという用語と密接に関連しています。つまり、集合Sのk 組み合わせは、 Sのk個の要素からなる(順序付けされていない)部分集合です。Sのk組み合わせを考えられるすべての方法で順序付けると、S の k 順列が得られます。したがって、n個の集合のk組み合わせの数C ( n , k ) は、 nのk順列の数と次の関係にあります。
これらの数値は二項係数とも呼ばれ、通常は次のように表記されます。:
集合Sのk個の要素の順序付けられた配列で、繰り返しが許されるものをkタプルと呼びます。これらは、通常の意味での順列ではありませんが、繰り返しのある順列と呼ばれることもあります。また、アルファベットS上の単語または文字列とも呼ばれます。集合S がn個の要素を持つ場合、 S上のkタプルの数は、

Mが有限多重集合である場合、多重集合順列とは、 Mの要素を順序付けた配列であり、各要素はMにおけるその重複度と正確に等しい回数だけ出現する。いくつかの文字が繰り返される単語のアナグラムは、多重集合順列の例である。[ d ] Mの要素の重複度(ある順序で)が、、...、そしてそれらの合計(つまりMのサイズ)がnである場合、 Mの多重集合順列の数は多項係数によって与えられる:[ 37 ] 例えば、MISSISSIPPI という単語の異なるアナグラムの数は[ 38 ]です。
多重集合Mのk置換とは、 Mのk個の要素からなる列であり、各要素はMにおけるその要素の重複度(要素の繰り返し回数)以下で出現する。この場合、置換の数は生成関数によって決定できる。係数の倍製品の中で
上記の例を続けると、MISSISSIPPI の文字の多重集合の場合、結果として得られる生成関数は次のようになります。 したがって、11-順列の数は34650(上記と同じ結果)ですが、kが0から11までの範囲のk-順列の数も得られます。
順列は、配置として考えると、線形順序の配置と呼ばれることがあります。しかし、対象が円形に配置されている場合、この区別された順序は弱まります。どの要素も開始要素とみなせるため、配置には「最初の要素」はありません。異なる対象を円形に配置することを円形順列と呼びます。[ 40 ] [ e ]これらは、線形配置の最後の要素を先頭に移動することによって生成される同値関係に関して、これらの対象の通常の順列の同値類として形式的に定義できます。
2つの円順列は、一方を回転させて他方に変換できる場合に同等である。以下の4つの文字に関する4つの円順列は、同等であるとみなされる。
円形の配置は反時計回りに読むため、回転によって一方を他方に合わせることはできないので、以下の2つは等価ではありません。
n個の要素を持つ集合には、 ( n – 1)!個の円順列が存在する。
n 個の異なるオブジェクトの順列の数はn ! です。
k個の互いに素なサイクルを持つn個の順列の数は、符号なしの第1種スターリング数であり、次のように表される。または[ 41 ]
順列のサイクル(固定点を含む)n個の要素を持つ集合のサイクルは、その集合を分割します。したがって、これらのサイクルの長さはnの整数分割を形成し、これはサイクルタイプ(またはサイクル構造またはサイクル形状)と呼ばれます。サイクルタイプには、固定点ごとに「1」があります。、転置ごとに「2」、など。サイクルタイプはは
これはより簡潔な形式で[1 1 2 2 3 1 ]と書くこともできます。より正確には、一般形は次のようになります。、 どこはそれぞれの長さのサイクルの数です。特定のサイクルタイプの順列の数は[ 42 ]です。
n個の要素を持つ集合のサイクルタイプの数は、分割関数の値に等しい。。
一般に、サイクル記法で記述された順列の合成は、簡単に説明できるパターンには従わない。合成のサイクルは、合成されるサイクルとは異なる場合がある。ただし、順列を共役させるという特殊なケースでは、サイクルタイプは保持される。別の順列によってつまり、製品を形成するということです。。 ここ、は共役ですによるそしてそのサイクル表記は、サイクル表記を次のようにすることで得られる。適用その中のすべてのエントリに対して。[ 43 ]したがって、2 つの順列は、同じサイクル タイプを持つ場合にのみ共役であることがわかります。
順列の順序は、。これは、そのサイクルの長さの最小公倍数です。たとえば、は。
有限集合のすべての順列は、転置の積として表すことができます。[ 44 ] 与えられた順列に対してそのような表現は多数存在する可能性がありますが、それらはすべて偶数個の転置を含むか、すべて奇数個の転置を含むかのどちらかです。したがって、すべての順列はこの数に応じて偶数または奇数に分類できます。
この結果は、符号を割り当てるように拡張することができ、次のように記述される。それぞれの順列に対して。もしは均等でもし奇数です。次に、2 つの順列についてそして
したがって、
順列の符号は、その順列行列の行列式に等しい(下記参照)。
順列行列は、各列と各行にちょうど1つの要素1を持ち、他のすべての要素が0であるn × n行列です。{1, 2, ..., n }の順列に順列行列を割り当てる方法はいくつかあります。自然なアプローチの1つは、次のように定義することです。線形変換であるこれは標準基底を置換するによる、そして定義するその行列となる。つまり、j番目の列がn × 1 列ベクトルと等しい: その ( i , j ) 要素は、 i = σ ( j )の場合に 1、それ以外の場合は 0 です。線形写像の合成は行列乗算によって記述されるため、この構成は置換の合成と互換性があることがわかります。 例えば、1行順列製品があります、対応する行列は次のとおりです。

文献では、行列に置換σが関連付けられる逆の慣例もよく見られる。その ( i , j ) 要素は、 j = σ ( i )の場合に 1 であり、それ以外の場合は 0 です。この規約では、順列行列は順列とは逆の順序で乗算されます。つまり、この対応関係では、置換行列は標準の右側に作用する。行ベクトル:。
右側のケイリー表は、3つの要素の順列に対するこれらの行列を示しています。
一部のアプリケーションでは、置換される集合の要素同士が比較されます。そのためには、集合Sが全順序を持ち、任意の2つの要素を比較できる必要があります。このようなアプリケーションで最も頻繁に使用される集合は、通常の≤関係を持つ集合{1, 2, ..., n }です。
順列のいくつかの性質は、1行表記で書かれた順列を数列として考えると、S の全順序と直接関係している。。
nの順列σの 上昇とは、次の値が現在の値より大きい位置i < nの任意の位置のことです。つまり、iが上昇であるのは、 例えば、順列3452167は、1、2、5、6の位置に上昇位置を持ちます。
同様に、降下とは、 i < nの位置で、 だから、すべてのiは上昇か下降のどちらかです。
順列の昇順列とは、両端で延長できない、空でない連続した増加部分列のことです。これは、連続する上昇の最大列に対応します(後者は空列になることもあります。連続する2つの下降の間には、長さ 1の昇順列が存在します)。これに対し、順列の増加部分列は必ずしも連続しているとは限りません。これは、1行表記の値の一部を省略して得られる増加列です。例えば、順列2453167には、昇順列245、3、167がありますが、増加部分列は2367です。
順列にk − 1 回の降下がある場合、それはk回の昇順の和集合でなければならない。[ 45 ]
k回の上昇を伴うnの順列の数は、(定義により)オイラー数である。これは、 k回の降下を伴うnの順列の数でもあります。ただし、一部の著者はオイラー数を定義しています。k 回の上昇ランを持つ順列の数として、これはk − 1 回の降下に対応します。[ 46 ]
順列σ 1 σ 2 ... σ nの超過とは、σ j > jとなるインデックスjのことである。不等式が厳密でない場合 (つまり、σ j ≥ jの場合)、jは弱い超過と呼ばれる。k個の超過を持つn順列の数は、k 個の降下を持つn順列の数と一致する。[ 47 ]
順列σのレコードまたは左から右への最大値は、すべてのj < iに対してσ ( j ) < σ ( i )となる要素iです。
Foataの基本全単射は、与えられた標準サイクル形式を持つ置換σを置換に変換します。その一行表記では、括弧を除いた同じ要素のシーケンスが表されます。[ 27 ] [ 48 ]例えば:
ここで、 σの各標準サイクルの最初の要素は、レコード (左から右への最大値) になります。与えられた逆変換を構築するには、そのレコードを見つけて括弧を挿入すればよい。上記の例で、該当するレコードに下線を引く:これにより、 σのサイクルを再構築することが可能になります。
以下の表はS = {1, 2, 3}の 6 つの順列に対するσについて、各辺の太字は全単射で使用される表記法を示しています。σの正準サイクル表記。
第一の系として、レコードがちょうどk個あるn順列 の数は、サイクルがちょうどk個あるn順列の数に等しい。この最後の数は、符号なしの第 1 種スターリング数である。さらに、Foataのマッピングは、k個の弱い超過を持つn個の順列を、 k -1個の上昇を持つn個の順列に変換します。[ 48 ] 例えば、(2)(31) = 321はk = 2個の弱い超過を持ち(インデックス1と2)、f (321) = 231はk -1 = 1個の上昇を持ちます(インデックス1、つまり2から3へ)。

順列σの反転とは、順列の要素の順序が逆になっている位置のペア( i , j )のことである。 そして[ 50 ]したがって、 降下とは、隣接する 2 つの位置での反転のことです。たとえば、σ = 23154では、( i , j ) = (1, 3)、(2, 3)、(4, 5) であり、ここで ( σ ( i ), σ ( j )) = (2, 1)、(3, 1)、(5, 4) です。
反転は値のペア ( σ ( i ), σ ( j )) として定義されることもあります。これは反転の数には影響しません。また、逆ペア ( σ ( j ), σ ( i )) は、逆順列σ −1に対して上記の意味で反転となります。
反転の数は、順列の要素がどの程度順不同であるかを示す重要な尺度であり、σとσ −1で同じです。k個の反転を持つ順列を正しい順序に戻す(つまり、恒等順列に変換する)には、隣接する転置を順次適用(右乗算)することで常に可能であり、 k回のそのような操作のシーケンスが必要です。さらに、隣接する転置には任意の妥当な選択で十分です。各ステップで、i をそれまでに修正された順列の降順としたときの i と i + 1 の転置を選択すれば十分です(転置によってこの特定の降順は削除されますが、他の降順が生成される場合があります)。これは、このような転置を適用すると反転の数が1 減少するためです。この数がゼロでない限り、順列は恒等順列ではないため、少なくとも 1 つの降順が存在します。バブルソートと挿入ソートは、この手順でシーケンスを正しい順序にするための特殊な例と解釈できます。ちなみに、この手順は、任意の置換σが隣接する転置の積として表せることを証明しています。これは、 σを恒等式に変換するような転置の任意のシーケンスを単純に反転させればよいからです。実際、σを恒等式に変換する隣接する転置のすべてのシーケンスを列挙することで、(反転後)σを隣接する転置の積として表す最小長のすべての式の完全なリストが得られます。
nのk回の反転を伴う順列の数は、マホニアン数で表されます。[ 51 ]これは、製品の拡張において
表記法はq 階乗を表します。この展開はネックレスの研究でよく見られます。
させてそのためそしてこの場合、逆転の重みをは小林(2011)は列挙式を証明した。
n個のものの順列を表す方法の 1 つは、 0 ≤ N < n ! を満たす整数Nを用いることです。ただし、数値と順列を順序付き配列 (シーケンス) として表現した形式との間で変換するための便利な方法が用意されていることが前提となります。これは任意の順列を最もコンパクトに表現する方法であり、コンピュータにおいては、Nがマシン ワードに収まるほどnが小さい場合に特に有効です。32 ビット ワードの場合、これはn ≤ 12 を意味し、64 ビット ワードの場合、これはn ≤ 20 を意味します。変換は、数値のシーケンスd n、d n −1、...、d 2、d 1の中間形式を介して行うことができます。ここで、 d iはiより小さい非負の整数です( d 1は常に 0 なので省略できますが、d 1 が存在すると、その後の順列への変換の説明が容易になります)。まず最初のステップは、N を階乗数体系で表現することです。これは、n !より小さい数の場合、連続する桁の基数 (位取りまたは乗数) が( n − 1)!、( n − 2)!、...、2!、1! となるような、特定の混合基数表現です。2 番目のステップでは、この数列をレーマー符号、または (ほぼ同等に) 反転表として解釈します。
順列σのレーマーコードでは、数値d n は最初の項σ 1の選択を表し、数値d n −1は残りのn − 1個の要素の中から 2 番目の項σ 2の選択を表し 、以下同様です。より正確には、各d n +1− i は項σ iより厳密に小さい残りの要素の数を表します。これらの残りの要素は、後の項σ jとして必ず現れるため、数値d n +1− iは、 i をより小さいインデックスとして含む反転( i , j )の数 ( i < jかつσ i > σ jとなる値jの数)をカウントします。σの反転表もほぼ同じですが、ここではd n +1− k は、 k = σ jが反転した順序で現れる 2 つの値のうち小さい方として現れる反転 ( i , j )の数をカウントします。 [ 52 ]
どちらのエンコーディングも、n × nローテ図[ 53 ] (ハインリヒ・アウグスト・ローテにちなんで命名) で視覚化できます。この図では、( i , σ i ) の点が順列のエントリを示し、( i , σ j ) の十字が反転 ( i , j ) を示します。反転の定義により、十字は、列の点 ( j , σ j ) と行の点 ( i , σ i ) の両方の前に来る任意の正方形に表示されます。レーマーコードは連続する行の十字の数をリストし、反転表は連続する列の十字の数をリストします。これは、逆順列のレーマーコードであり、その逆も同様です。
レーマーコードd n、d n −1、 ...、d 2、d 1を順序付き集合Sの順列に効果的に変換するには、まずSの要素を昇順に並べたリストから始め、 iが1 からnまで増加するにつれて、 σ i をリスト内の他のd n +1− i個の要素に先行する要素に設定し、その要素をリストから削除します。反転表d n、d n −1、 ...、d 2、d 1を対応する順列に変換するには、 d 1からd nまでの数値をたどりながら、最初は空のシーケンスにSの要素を大きい順から小さい順に挿入します。反転表の数値dを使用するステップでは、 Sの要素を、すでに存在するd個の要素に先行する位置にシーケンスに挿入します。あるいは、 n個の空きスロットの行から始めて、反転表の数値とSの要素の両方を逆の順序で処理し、各ステップで、 d個の空きスロットの前の空きスロットにSの要素を配置することもできます。
連続する自然数を階乗数体系に変換すると、それらの数列は辞書式順序で生成されます(これは、混合基数数体系の場合と同様です)。さらにそれらを順列に変換すると、レーマー符号の解釈が使用されている限り、辞書式順序が保持されます (反転表を使用すると、順列を最初のエントリの値ではなくエントリ 1 の位置で比較することから始まる、異なる順序になります)。階乗数体系表現における数値の合計は順列の反転の数を示し、その合計の偶奇性は順列の符号を示します。さらに、反転表のゼロの位置は順列の左から右への最大値 (例では 6、8、9) を示し、レーマー符号のゼロの位置は右から左への最小値 (例では値 1、2、5 の 4、8、9 の位置) を示します。これにより、すべての順列におけるそのような極値の分布を計算できます。レーマーコードd n、d n −1、 ...、d 2、d 1を持つ順列は、 d i ≥ d i +1の場合に限り、上昇n − iを持ちます。
計算においては、与えられた値列の順列を生成する必要が生じる場合があります。最適な方法は、ランダムに選択された順列の一部が必要なのか、すべての順列が必要なのか、そして後者の場合、特定の順序付けが必要かどうかによって異なります。また、与えられた値列の要素間に等しい値が存在する可能性を考慮する必要があるかどうかも問題となります。もし考慮する必要があるならば、異なる多重集合の順列のみを生成すべきです。
nの順列を生成する明白な方法は、レーマー符号の値(おそらくnまでの整数の階乗数表現を使用)を生成し、それらを対応する順列に変換することです。しかし、後者の手順は単純ではありますが、任意の位置でシーケンスからの選択と削除をそれぞれn回行う必要があるため、効率的に実装するのは困難です。シーケンスを配列またはリンクリストとして表現する場合、どちらも(異なる理由で)変換を実行するために約n 2/4回の操作が必要です。n は比較的小さい場合(特にすべての順列の生成が必要な場合)はそれほど大きな問題ではありませんが、ランダム生成と体系的生成の両方において、はるかに優れた単純な代替手段が存在することがわかっています。このため、レーマー符号から順列への変換をO ( n log n )時間で実行できる特別なデータ構造を使用することは、確かに可能ですが、有用ではないようです。
与えられたn個の値のシーケンスのランダムな順列を生成する場合、ランダムに選択されたnの順列をシーケンスに適用するか、シーケンスの異なる (多重セット) 順列の集合からランダムな要素を選択するかは、どちらでも違いはありません。これは、値が重複する場合、同じ順列シーケンスになるnの異なる順列が多数存在する可能性があるにもかかわらず、そのような順列の数は、考えられるすべての結果で同じであるためです。n ! の増加により n が大きい場合に実行不可能になる系統的生成とは異なり、ランダム生成ではnが小さいと想定する理由はありません。
ランダムな順列を生成する基本的な考え方は、0 ≤ d i < iを満たすn ! 個の整数のシーケンスd 1、d 2、...、d nのいずれかをランダムに生成し( d 1は常にゼロなので省略可能)、それを全単射対応によって順列に変換することです。後者の対応については、(逆) シーケンスをレーマーコードとして解釈することができ、これにより、1938 年にRonald FisherとFrank Yatesによって初めて発表された生成方法が得られます。[ 54 ] 当時はコンピュータによる実装は問題ではありませんでしたが、この方法は、レーマーコードから順列に効率的に変換するという、上記で概説した困難に悩まされています。これは、別の全単射対応を使用することで解決できます。d iを使用してシーケンスの残りのi個の要素 ( iの値が減少するにつれて)の中から要素を選択した後、要素を削除してさらに要素を 1 つ下にシフトしてシーケンスをコンパクトにするのではなく、その要素を最後に残った要素と交換します。このように、選択のために残っている要素は、元のシーケンスと同じ順序で出現しない場合でも、各時点で連続した範囲を形成します。整数のシーケンスから順列へのマッピングはやや複雑ですが、即時帰納法によって、各順列が正確に1つの方法で生成されることがわかります。選択された要素がたまたま最後に残った要素である場合、スワップ操作を省略できます。これは条件をテストするほど頻繁には発生しませんが、すべての順列を生成できることを保証するために、最後の要素は選択の候補に含まれていなければなりません。
のランダムな順列を生成するための結果として得られるアルゴリズムは、擬似コードで次のように記述できます。a[0], a[1], ..., a[n − 1]
nから2までiをループし、 d i ← { 0, ..., i − 1 } のランダムな要素をループし、 a [ d i ] とa [ i − 1 ]を交換します。これは、配列の初期化と次のように組み合わせることができます。a[i] = i
iを0からn −1まで繰り返すd i +1 ← { 0, ..., i } のランダムな要素a [ i ] ← a [ d i +1 ] a [ d i +1 ] ← id i +1 = iの場合、最初の代入では初期化されていない値がコピーされますが、2 番目の代入では正しい値iで上書きされます。
しかし、Fisher-Yates は順列を生成するための最速のアルゴリズムではありません。なぜなら、Fisher-Yates は本質的に逐次アルゴリズムであり、「分割統治」手順は並列で同じ結果を達成できるからです。[ 55 ]
与えられた数列のすべての順列を体系的に生成する方法は数多くあります。[ 56 ] 古典的でシンプルかつ柔軟なアルゴリズムの 1 つは、次の順列が存在する場合に辞書順列を見つけることに基づいています。このアルゴリズムは、重複する値も処理でき、その場合は各異なるマルチセット順列を 1 回ずつ生成します。通常の順列の場合でも、辞書順列で Lehmer コードの値 (おそらく階乗数システムを使用) を生成し、それらを順列に変換するよりもはるかに効率的です。このアルゴリズムは、まず数列を (弱)増加順にソートすること (これにより辞書順列で最小の順列が得られます) から始まり、次の順列が見つかるまで繰り返します。この方法は14 世紀のインドのNarayana Panditaに遡り、頻繁に再発見されています。[ 57 ]
以下のアルゴリズムは、与えられた順列の次の順列を辞書式順序で生成します。与えられた順列は、その場で変更されます。
例えば、数列 [1, 2, 3, 4] (昇順) が与えられ、インデックスがゼロベースであるとすると、手順は次のようになります。
このアルゴリズムに従うと、次の辞書順列は [1, 3, 2, 4] となり、24 番目の順列は [4, 3, 2, 1] となります。この時点でa [ k ] < a [ k + 1] が存在しないため、これが最後の順列であることがわかります。
この方法は、最初のソートを除いて、シーケンス全体で償却すると、順列ごとに約3回の比較と1.5回のスワップを使用します。[ 58 ]
上記のアルゴリズムの代替として、スタインハウス・ジョンソン・トロッターアルゴリズムがあり、これは、出力内の連続する2つの順列が隣接する2つの値を入れ替えることで異なるという性質を持つ、与えられたシーケンスのすべての順列の順序を生成します。この順列の順序は、17世紀のイギリスの鐘つき職人に知られており、彼らの間では「プレーンチェンジ」として知られていました。この方法の利点の1つは、1つの順列から次の順列への変化が小さいため、1つの順列あたり定数時間で実装できることです。また、出力順列を1つおきにスキップすることで、偶数順列のサブセットも簡単に生成でき、これも1つの順列あたり定数時間で実行できます。[ 57 ]
スタインハウス-ジョンソン-トロッターの代替としてヒープのアルゴリズム[ 59 ]があり、ロバート・セジウィックは1977年に、これは応用において最も速い順列生成アルゴリズムであると述べている[ 56 ] 。
次の図は、長さのすべての順列を生成するための、前述の3つのアルゴリズムすべての出力を示しています。および文献に記載されている6つの追加アルゴリズム。

交換の明示的なシーケンス(転置、2サイクル))はここで説明されており、前のチェーンに(左側に)各スワップを適用すると新しい順列が生成され、すべての順列をそれぞれ一度だけ取得できます。[ 65 ]このカウント/生成手順には、追加の構造(ネスト構造と呼ぶ)があり、ステップで与えられます。完全に取得した後、引き続き取得します剰余類によるので適切な剰余類代表を選択することによって以下に説明します。順次生成される場合、最後の要素があります生成後スワップによって、次の順列は しなければならない一部の人にとって.次に生成されたすべてのスワップ が繰り返され、コセット全体が生成されます。その剰余類の最後の順列に到達する次のスワップでは、順列を別の剰余類の代表に移動させる必要があります。。
同じように続けると、剰余類の代表が得られます。剰余類について で; 順序付けられた集合()は剰余類の開始集合と呼ばれます。これらの代表のうち2つが同じ剰余類に含まれるのは、次の場合に限ります。 つまり、 結論として、順列は、任意の に対して が成り立つ場合に限り、すべて異なる剰余類の代表である。、(繰り返し条件なし)。特に、生成されたすべての順列が異なっているためには、値は区別される。その過程で、そして、これが再帰手順を提供する。
例:明らかに、1つは建設する重複なし条件を満たす剰余類の開始には、2 つの可能性しかありません。につながる生成を続ける適切な剰余類の開始点(重複禁止条件を満たすもの)が必要です。便利な選択肢があります。結果として .次に、構築するために剰余類の開始点として便利な選択肢(重複なし条件を満たす)は結果として。
上記の例から帰納的にさらに高次の概念へと進むことができる同様に、コセットの開始を選択するで 以下のように:すべての剰余類の開始を 1 に等しく選択し、奇数の選択剰余類の開始は等しいこのような選択肢では、「最後の」順列はのために奇妙で のために平 (これらの明示的な式を用いることで、カウント/生成ステップにおける特定のインデックスの順列を最小限の計算で容易に計算できます。そのためには、インデックスを階乗ベースで記述することが有効です。例えば、インデックスの順列は次のようになります。は:最終的に、。
スワップ順列による乗算は計算時間が短く、新しく生成される順列ごとに必要なスワップ乗算は1回だけなので、この生成手順は非常に効率的です。さらに、各順列の最後の順列は単純な公式で表されます。 部分群のブロック単位で処理できるため、スワップを1回ずつ行うよりも少ないステップで特定のインデックスを持つ順列に直接アクセスでき、さらに時間を節約できます。
順列は、ターボ符号などの誤り検出訂正アルゴリズムの インターリーバコンポーネントで使用されます。たとえば、3GPP Long Term Evolution移動体通信規格ではこれらのアイデアが使用されています (3GPP 技術仕様 36.212 [ 66 ] を参照)。このようなアプリケーションでは、特定の望ましい特性を満たす順列を高速に生成するという問題が生じます。その方法の 1 つは順列多項式に基づいています。また、Unique Permutation Hashing における最適なハッシュのベースとしても使用されます。[ 67 ]
順列を表すには、小文字のギリシャ文字(特にπ、σ、τ)を使用するのが一般的です。
置換、例えば、複数の人の名前の置換は、名前または人のどちらかを移動させることとして考えることができる。別名の観点では、置換は
各人に新しい名前または
別名を割り当てるものとみなされる(ラテン語の
alias
= 別々に)。あるいは、アリバイの観点では、人々を新しい名前に対応する場所に移動させる(ラテン語の
alibi
= 別の場所で)。
1815年に初めて順列記法(順列を上下に書き、両方を括弧で囲む記法)を使用した。
{{citation}}ISBN /日付の不一致(ヘルプ)