線形帰還シフトレジスタ

線形帰還シフトレジスタ（せんけいきかんシフトレジスタ、）は、入力ビットが直前の状態の線形写像になっているシフトレジスタである。
値域が単一のビットとなる線形写像は、XORおよびXORの否定だけである。したがって、線形帰還シフトレジスタとは、その値を構成するビット列の一部の排他的論理和を入力ビットとするシフトレジスタである。
LFSR の初期値をシードと呼ぶ。レジスタの動作は決定的であるため、レジスタが生成する値の列はその状態によって完全に決定される。同様に、レジスタの取りうる状態は有限個であるため、最終的に周期的動作になる。しかし、帰還関数をうまく設定したLFSRは乱数のようなビット列を生成し、その周期も非常に長い。
LFSRの用途としては、擬似乱数生成、擬似ノイズ生成、高速デジタルカウンタ、白色化などがある。LFSR にはハードウェアによる実装もソフトウェアによる実装もある。
フィボナッチ LFSR.
LFSRで、次の入力ビットに影響を与えるビットを「タップ (tap)」と呼び、それらの位置を列挙したものをタップシーケンスと呼ぶ。図では、タップシーケンスが [16, 14, 13, 11, 0] である。タップは順次XORされ、その結果が左端にフィードバックされる。
LFSRの生成するビット列は、2進数やグレイコードと見なすことができる。
LFSRのタップシーケンスは2を法とする多項式で表せる。つまり、多項式の各項の係数は1か0である。これを帰還多項式あるいは特性多項式と呼ぶ。例えば、図のようにタップが16番目、14番目、13番目、11番目にあるとき、帰還多項式は次のようになる。
最後に1があるが、これはタップとは対応していない。これは、最初のビットへの入力に対応している（つまり、"x0" であり、1と等価である）。各項のべき乗部分はタップ位置を表していて、左端から何番目かに対応している。左端は常に入力、右端は常にタップとして連結する。
LFSRは、帰還多項式が（タップシーケンス）は原始多項式であるならば最長LFSRとなる。よって、次の性質を持つ。
最大LFSRを構築することができる原始多項式のリストを、下の表と参考文献に示す。
LFSRの長さによっては、最長となる複数の多項式が存在する。この場合、最長となるタップシーケンスが1つ見つかると、他は自動的に得られる。"n"ビットのLFSRで、タップシーケンス [n,A,B,C,0] が見つかったとき（0は formula_3 に対応）、もう1つのタップシーケンスは [n,n-C,n-B,n-A,0] である。例えば、[32,3,2,0] に対応するのは [32,30,29,0] である。どちらも最長である。
C/C++ のコーディング例を以下に示す。
 uint16_t reg = 0xACE1;
 uint16_t bit;
 while(1)
 bit = (reg & 0x0001) ^
 ((reg & 0x0004) » 2) ^
 ((reg & 0x0008) » 3) ^
 ((reg & 0x0020) » 5);
 reg = (reg » 1) | (bit « 15);
 printf("%04X\n",reg);
このコードでは、左端ビットが1番目の位置である。
ガロア LFSR.
フランス人数学者エヴァリスト・ガロアの名を冠したガロアLFSRは、通常のLFSRと同じビット列を生成できる別の構成である。ガロアLFSRでは、タップでないビットはクロック毎に次のフリップフロップにシフトされる（普通のLFSRと同じ）。タップの場合、新たな出力と前のビットの値をXORしたものを格納する。
通常のLFSRと同じ出力シーケンスを得るには、ビット順序を逆にする（図参照）。そうしないとシーケンスが逆転する。なお、LFSRの内部状態は同じである必要はない。図に示したガロアLFSRは、上の図で示したフィボナッチLFSRと同じ出力となる。
以下は32ビットの最長ガロアLFSRをC言語およびC++で実装したものである（unsigned int は32ビットと仮定）。
 unsigned int lfsr = 1;
 unsigned int period = 0; 
 do {
 lfsr = (lfsr » 1) ^ (-(lfsr & 1u) & 0xd0000001u); /* taps 32 31 29 1 */
 ++period;
 } while(lfsr != 1u);
次のコードは、図にある16ビットの例である。
 unsigned short lfsr = 0xACE1u;
 unsigned int period = 0; 
 do {
 lfsr = (lfsr » 1) ^ (-(short)(lfsr & 1u) & 0xB400u); 
 ++period;
 } while(lfsr != 0xACE1u);
用途.
LFSRはハードウェアでも実装できるため、高速な擬似乱数生成が必要な場面で便利である（直接シーケンス・スペクトラム拡散無線通信など）。
レーダーは、LFSRを使って送信波と受信波の時間差を測定し、反射体までの距離を判定するものがある。グローバル・ポジショニング・システムは、LFSRを使って高精度な相対時間オフセットを示すシーケンスを高速に転送する。ファミリーコンピュータはサウンドシステムの一部としてLFSRを装備している()。
カウンタとしての利用.
コンピュータのインデックスやフレーム指示位置は機械可読である必要がある。そこで順に増えていく2進数でなくてもよい場合、LFSRの周期的シーケンスを分周器やカウンタとして使うことができる。LFSRカウンタは、通常の2進カウンタやグレイコードカウンタよりもフィードバック論理回路が単純で、より高速に動作させることができる。ただし、LFSR全体が0にならないよう保証する必要があり、例えば初期状態のプリセットが必要である。上の表はLFSRの最長周期が記してある。必要な周期よりも長い周期のLFSRに状態をスキップする論理回路を付加することで、任意の周期のカウンタを得ることができる。
暗号での利用.
LFSRは、（特に軍事用途で）ストリーム暗号の擬似乱数生成器として使われてきた。これは機械式でも電子回路でも構成が簡単で、周期が長く分布が一様なためである。しかし、LFSRは線形システムであるため、暗号解読は比較的容易である。平文と対応する暗号文がわかっているとき、システムの使用するLFSRの出力を再現でき、Berlkamp-Massey法を使って最小サイズのLFSRを構築でき、容易に暗号文を復号できるようになる。
LFSRに基づく暗号におけるこのような問題への対策として、一般に以下の3つの手法がある。
LFSRに基づくストリーム暗号としては、GSM携帯電話で使っている A5/1 や A5/2、Bluetooth で使っている E0、 などがある。A5/2 は既に破られており、A5/1 と E0 も非常に弱いと言われている。LTEの暗号アルゴリズムUEA2,UIA2で使用されているストリーム暗号 も、LFSRを利用している。
デジタル放送/通信での利用.
0や1が連続すると、シンボルの区切りがわからなくなる危険性があるため、線形帰還シフトレジスタを使ってビットストリームを無作為化することが多い。この無作為化は受信側で復調後に除去される。LFSRと転送シンボルストリームが同じレートで動作する場合、この技法をスクランブリングと呼ぶ。LFSRの方がシンボルストリームよりずっと高速に動作し、信号送信時の帯域幅を拡張させる場合、これを直接シーケンス・スペクトラム拡散と呼ぶ。
LFSRによるスクランブリングは暗号化ではなく、解読には、一般的な暗号において必要な困難は全く無い。
LFSRを使っているデジタル放送システム:
その他のLFSRを使っているデジタル通信システム: