線形帰還シフトレジスタ

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

線形帰還シフトレジスタ(せんけいきかんシフトレジスタ、: linear feedback shift register, LFSR)は、入力ビットが直前の状態の線形写像になっているシフトレジスタである。

値域が単一のビットとなる線形写像は、XORおよびXORの否定だけである。したがって、線形帰還シフトレジスタとは、その値を構成するビット列の一部の排他的論理和を入力ビットとするシフトレジスタである。

LFSR の初期値をシードと呼ぶ。レジスタの動作は決定的であるため、レジスタが生成する値の列はその状態によって完全に決定される。同様に、レジスタの取りうる状態は有限個であるため、最終的に周期的動作になる。しかし、帰還関数をうまく設定したLFSRは乱数のようなビット列を生成し、その周期も非常に長い。

LFSRの用途としては、擬似乱数生成、擬似ノイズ生成、高速デジタルカウンタ、白色化などがある。LFSR にはハードウェアによる実装もソフトウェアによる実装もある。

フィボナッチ LFSR[編集]

16ビットのフィボナッチLFSR。タップ番号を黒で示しており、それが多項式の項に対応する。これは最長LFSRであり、全て0の状態以外の65535個の状態遷移をする。図示されている状態 ACE1(16進)の後は 5670 となる。

LFSRで、次の入力ビットに影響を与えるビットを「タップ (tap)」と呼び、それらの位置を列挙したものをタップシーケンスと呼ぶ。図では、タップシーケンスが [16, 14, 13, 11, 0] である。タップは順次XORされ、その結果が左端にフィードバックされる。

  • 入力に影響する出力を「タップ」と呼ぶ(図では黒)。
  • 最長LFSRはM系列を生成する。最長LFSRとは、全ビットがゼロという状態以外の全てのとりうる状態(2^n-1)が周期に現れるLFSRである。(全ビットがゼロの場合、全く変化しない。初期状態として設定しない限り、最長LFSRにおいて自然にそうなることはない)

LFSRの生成するビット列は、2進数グレイコードと見なすことができる。

LFSRのタップシーケンスは2を法とする多項式で表せる。つまり、多項式の各項の係数は1か0である。これを帰還多項式あるいは特性多項式と呼ぶ。例えば、図のようにタップが16番目、14番目、13番目、11番目にあるとき、帰還多項式は次のようになる。

x^{16} + x^{14} + x^{13} + x^{11} + 1\,

最後に1があるが、これはタップとは対応していない。これは、最初のビットへの入力に対応している(つまり、x0 であり、1と等価である)。各項のべき乗部分はタップ位置を表していて、左端から何番目かに対応している。左端は常に入力、右端は常にタップとして連結する。

最長LFSRを構成する多項式(タップシーケンス)の性質を以下に示す。

  • LFSRが最長となるのは、タップ数が偶数の場合のみである。非常に長いレジスタであっても2個や4個のタップで十分である。
  • タップ集合は互いに素でなければならない。全タップ間の1以外の公約数が存在してはならない。
  • LFSRの長さによっては、最長となる複数の多項式が存在する。
  • 最長となるタップシーケンスが1つ見つかると、他は自動的に得られる。nビットのLFSRで、タップシーケンス [n,A,B,C,0] が見つかったとき(0は x^0=1 に対応)、もう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したものを格納する。

16ビットのガロアLFSR。黒い番号は上のフィボナッチLFSRと同じ多項式の項に対応しているが、シフト方向が逆である点に注意。このレジスタも全て0状態以外の65535個の最長の状態遷移をする。図に示されている ACE1 の状態の次は E270 となる(16進)。

通常のLFSRと同じ出力シーケンスを得るには、ビット順序を逆にする(図参照)。そうしないとシーケンスが逆転する。なお、LFSRの内部状態は同じである必要はない。図に示したガロアLFSRは、上の図で示したフィボナッチLFSRと同じ出力となる。

  • ガロアLFSRでは、全タップの値を使って入力を生成するわけではなく、XORは個別に各タップ位置で行われる。つまり、XOR演算を並列に実行でき、高速化が可能である。
  • ソフトウェアで実装すると、ワード全体のビット演算で一度にXORできるので、さらに効率的な実装になる。

以下は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となる多項式の例[編集]

ビット数 帰還多項式 周期
n 2^{n}-1
4 x^{ 4 }+x^{ 3 }+1 15
5 x^{ 5 }+x^{ 3 }+1 31
6 x^{ 6 }+x^{ 5 }+1 63
7 x^{ 7 }+x^{ 6 }+1 127
8 x^{ 8 }+x^{ 6 }+x^{ 5 }+x^{ 4 }+1 255
9 x^{ 9 }+x^{ 5 }+1 511
10 x^{ 10 }+x^{ 7 }+1 1023
11 x^{ 11 }+x^{ 9 }+1 2047
12 x^{ 12 }+x^{ 11 }+x^{ 10 }+x^{ 4 }+1 4095
13 x^{ 13 }+x^{ 12 }+x^{ 11 }+x^{ 8 }+1 8191
14 x^{ 14 }+x^{ 13 }+x^{ 12 }+x^{ 2 }+1 16383
15 x^{ 15 }+x^{ 14 }+1 32767
16 x^{ 16 }+x^{ 14 }+x^{ 13 }+x^{ 11 }+1 65535
17 x^{ 17 }+x^{ 14 }+1 131071
18 x^{ 18 }+x^{ 11 }+1 262143
19 x^{ 19 }+x^{ 18 }+x^{ 17 }+x^{ 14 }+1 524287
25 to 168 [1]

出力ストリームの特性[編集]

  • 1と0は連続して出現することがある。例えば、出力ストリーム 0110100 は5つの連続から構成されていると見ることができ、その長さは順に 1,2,1,1,2 である。最長LFSRの1周期には 2^{n-1} 個の連続が出現する(例えば、6ビットのLFSRでは32個の連続がある)。そのうち 1/2 は長さが1、1/4 は長さが2ビットで、0の最長の連続は n-1 ビットであり、1の最長の連続は n ビットが1回だけある。これは真の乱数の統計的特性と全く同じである。
  • LFSRの出力ストリームは決定的である。現在の状態を知っていれば、次の状態を正確に予測できる。これは真に無作為な事象にはない特徴である。
  • 出力ストリームは両方向である。最長LFSRとなるタップシーケンスが2つある場合、両者の状態遷移は逆順序になる。

用途[編集]

LFSRはハードウェアでも実装できるため、高速な擬似乱数生成が必要な場面で便利である(直接シーケンス・スペクトラム拡散無線通信など)。

レーダーは、LFSRを使って送信波と受信波の時間差を測定し、反射体までの距離を判定するものがある。グローバル・ポジショニング・システムは、LFSRを使って高精度な相対時間オフセットを示すシーケンスを高速に転送する。ファミリーコンピュータはサウンドシステムの一部としてLFSRを装備している([2])。

カウンタとしての利用[編集]

コンピュータのインデックスやフレーム指示位置は機械可読である必要がある。そこで順に増えていく2進数でなくてもよい場合、LFSRの周期的シーケンスを分周器やカウンタとして使うことができる。LFSRカウンタは、通常の2進カウンタやグレイコードカウンタよりもフィードバック論理回路が単純で、より高速に動作させることができる。ただし、LFSR全体が0にならないよう保証する必要があり、例えば初期状態のプリセットが必要である。上の表はLFSRの最長周期が記してある。必要な周期よりも長い周期のLFSRに状態をスキップする論理回路を付加することで、任意の周期のカウンタを得ることができる。

暗号での利用[編集]

LFSRは、(特に軍事用途で)ストリーム暗号擬似乱数生成器として使われてきた。これは機械式でも電子回路でも構成が簡単で、周期が長く分布が一様なためである。しかし、LFSRは線形システムであるため、暗号解読は比較的容易である。平文と対応する暗号文がわかっているとき、システムの使用するLFSRの出力を再現でき、Berlkamp-Massey法を使って最小サイズのLFSRを構築でき、容易に暗号文を復号できるようになる。

LFSRに基づく暗号におけるこのような問題への対策として、一般に以下の3つの手法がある。

  • LFSRの状態のうち、一部のビット非線形に組み合わせて使う。
  • 2つ以上のLFSRの出力を非線形に組み合わせて使う。
  • LFSRのクロックを不定間隔で進める(alternating step generator)。

LFSRに基づくストリーム暗号としては、GSM携帯電話で使っている A5/1A5/2Bluetooth で使っている E0shrinking generator などがある。A5/2 は既に破られており、A5/1 と E0 も非常に弱いと言われている。

デジタル放送/通信での利用[編集]

0や1が連続すると、シンボルの区切りがわからなくなる危険性があるため、線形帰還シフトレジスタを使ってビットストリームを無作為化することが多い。この無作為化は受信側で復調後に除去される。LFSRと転送シンボルストリームが同じレートで動作する場合、この技法をスクランブリングと呼ぶ。LFSRの方がシンボルストリームよりずっと高速に動作し、信号送信時の帯域幅を拡張させる場合、これを直接シーケンス・スペクトラム拡散と呼ぶ。

LFSRによるスクランブリングは暗号とは異なる概念であり、それで盗聴を防ぐことはできない。

LFSRを使っているデジタル放送システム:

  • ATSC (北米)
  • DAB (デジタルラジオ)
  • DVB-T (ヨーロッパ、オーストラリア)
  • NICAM (イギリスなどのテレビ用デジタル音声システム)

その他のLFSRを使っているデジタル通信システム:

関連項目[編集]

外部リンク[編集]