コンピューターにおいて、線形フィードバック シフト レジスタ( LFSR ) は、入力ビットが前の状態の 線形関数であるシフト レジスタです。
単一ビットの線形関数として最も一般的に使用されるのは排他的論理和(XOR)です。したがって、LFSRは、入力ビットがシフトレジスタ全体の値の一部のビットのXORによって駆動されるシフトレジスタであることがほとんどです。
LFSRの初期値はシードと呼ばれ、レジスタの動作は決定論的であるため、レジスタによって生成される値のストリームは、現在の(または以前の)状態によって完全に決定されます。同様に、レジスタの取り得る状態は有限であるため、最終的には繰り返しサイクルに入る必要があります。しかし、適切に選択されたフィードバック関数を持つLFSRは、ランダムに見えるビットシーケンスを生成し、非常に長いサイクルを持つことがあります。
LFSRの応用としては、疑似乱数、疑似ノイズシーケンス、高速デジタルカウンタ、ホワイトニングシーケンスの生成などが挙げられます。LFSRはハードウェアとソフトウェアの両方で実装されており、広く利用されています。
伝送エラーの迅速なチェックに使用される巡回冗長検査(CRC)の数学は、LFSRの数学と密接に関連しています。[ 1 ]一般的に、LFSRの背後にある算術は、研究および実装の対象として非常に洗練されています。単純な構成要素を用いて、比較的複雑なロジックを構築することも可能です。しかし、LFSRほど洗練されていないものの、より優れた性能を発揮する他の手法も検討する必要があります。

次の状態に影響を与えるビット位置はタップと呼ばれます。図ではタップは[16,14,13,11]です。LFSRの右端のビットは出力ビットと呼ばれ、常にタップでもあります。次の状態を取得するには、タップビットのXOR演算を順に行います。次に、すべてのビットを1つ右にシフトし、右端のビットを破棄します。そして、タップビットのXOR演算結果を、空になった左端のビットにフィードバックします。擬似乱数出力ストリームを取得するには、各状態遷移の後に右端のビットを読み取ります。
LFSR またはその XNOR 対応物によって生成される数値のシーケンスは、グレイ コードや自然 2 進コード と同様に有効な2 進数値システムと見なすことができます。
LFSRにおけるフィードバックタップの配置は、有限体演算において2を法とする多項式 として表すことができます。これは、多項式の係数が1または0でなければならないことを意味します。これはフィードバック多項式または逆特性多項式と呼ばれます。例えば、タップが16、14、13、11ビット目(図参照)にある場合、フィードバック多項式は次のようになります。
多項式中の「1」はタップではなく、最初のビットへの入力(つまりx 0、つまり1に相当)に対応します。項のべき乗は、左から数えてタップされたビットを表します。最初のビットと最後のビットは、常にそれぞれ入力タップと出力タップとして接続されます。
LFSRが最大長であるためには、対応するフィードバック多項式がガロア体GF(2)上で原始的である必要があります。 [ 3 ] [ 4 ]これは、以下の条件が必要であることを意味します(ただし十分ではありません)。
最大長 LFSR を構築できる原始多項式の表は、以下および参考文献に記載されています。
与えられたLFSR長に対して、最大長タップシーケンスは複数存在する可能性があります。また、最大長タップシーケンスが1つ見つかると、自動的に別のタップシーケンスが続きます。nビットLFSRのタップシーケンスが[ n , A , B , C , 0](0はx 0 = 1 の項に対応)である場合、対応する「ミラー」シーケンスは[ n , n − C , n − B , n − A , 0]です。したがって、タップシーケンス[32, 22, 2, 1, 0] には、対応する[32, 31, 30, 10, 0]があります。どちらも最大長タップシーケンスとなります。
Cの例を以下に示します。
#include <stdint.h> unsigned lfsr_fib ( void ) { uint16_t start_state = 0xACE1u ; /* ゼロ以外の開始状態であればどれでも動作します。 */ uint16_t lfsr = start_state ; uint16_t bit ; /* コードの後半で bit<<15 を可能にするには 16 ビットである必要があります */ unsigned period = 0 ;do { /* タップ: 16 14 13 11; フィードバック多項式: x^16 + x^14 + x^13 + x^11 + 1 */ bit = (( lfsr >> 0 ) ^ ( lfsr >> 2 ) ^ ( lfsr >> 3 ) ^ ( lfsr >> 5 )) & 1u ; lfsr = ( lfsr >> 1 ) | ( bit << 15 ); ++期間; } while ( lfsr != start_state );返品期間; }高速パリティまたはポップカウント操作が利用可能な場合、フィードバック ビットは、特性多項式を持つレジスタの ドット積としてより効率的に計算できます。
bit=parity(lfsr&0x002Du);、または同等bit=popcnt(lfsr&0x002Du)/* & 1u */;(& 1upopcnt は真のパリティ関数になりますが、後のビットシフトによりbit << 15上位ビットは無関係になります。)回転操作が利用可能な場合、新しい状態は次のように計算できる。
lfsr=rotateright((lfsr&~1u)|(bit&1u),1);、または同等lfsr=rotateright(((bit^lfsr)&1u)^lfsr,1);このLFSR構成は、標準、多対一、または外部XORゲートとも呼ばれます。代替のガロア構成については、次のセクションで説明します。
同様の([16,15,13,4]の16ビットタップ)フィボナッチLFSRのサンプルPython実装は次のようになります。
start_state = 1 << 15 | 1 lfsr = start_state period = 0True の場合:タップ数: 16 15 13 4; フィードバック多項式: x^16 + x^15 + x^13 + x^4 + 1 bit = ( lfsr ^ ( lfsr >> 1 ) ^ ( lfsr >> 3 ) ^ ( lfsr >> 12 )) & 1 lfsr = ( lfsr >> 1 ) | ( bit << 15 ) period += 1 if lfsr == start_state : print ( period ) break16 ビットのレジスタが使用され、4 番目、13 番目、15 番目、および 16 番目のビットの XOR タップによって最大シーケンス長が確立されます。

フランスの数学者エヴァリスト・ガロアにちなんで名付けられたガロア構成の LFSR は、モジュラー LFSR、内部 XOR LFSR 、または1 対多 LFSRとも呼ばれ、従来の LFSR と同じ出力ストリームを生成できる (ただし時間的にオフセットがある) 代替構造です。[ 5 ]ガロア構成では、システムがクロックされると、タップでないビットは変更されずに 1 つ右にシフトされます。一方、タップは、次の位置に格納される前に出力ビットと XOR されます。新しい出力ビットは次の入力ビットになります。この効果として、出力ビットが 0 の場合、レジスタ内のすべてのビットが変更されずに右にシフトし、入力ビットが 0 になります。出力ビットが 1 の場合、タップ位置のビットがすべて反転し (0 の場合は 1 になり、1 の場合は 0 になります)、次にレジスタ全体が右にシフトされ、入力ビットが 1 になります。
同じ出力ストリームを生成するには、タップの順序が従来のLFSRの順序と対応している必要があります(上記参照)。そうでない場合、ストリームは逆になります。LFSRの内部状態は必ずしも同じではないことに注意してください。図示されているガロアレジスタは、最初のセクションのフィボナッチレジスタと同じ出力ストリームを持ちます。ストリーム間には時間オフセットが存在するため、各サイクルで同じ出力を得るには異なる開始点が必要になります。
以下は、図の 16 ビット最大周期ガロア LFSR の例の Cコード例です。
#include <stdint.h> unsigned lfsr_galois ( void ) { uint16_t start_state = 0xACE1u ; /* ゼロ以外の開始状態であればどれでも動作します。 */ uint16_t lfsr = start_state ; unsigned period = 0 ;do { #ifndef LEFT unsigned lsb = lfsr & 1u ; /* LSB(つまり、出力ビット)を取得します。 */ lfsr >>= 1 ; /* シフトレジスタ */ if ( lsb ) /* 出力ビットが 1 の場合、 */ lfsr ^= 0xB400u ; /* トグルマスクを適用します。 */ #else unsigned msb = ( int16_t ) lfsr < 0 ; /* MSB(つまり、出力ビット)を取得します。 */ lfsr <<= 1 ; /* シフトレジスタ */ if ( msb ) /* 出力ビットが 1 の場合、 */ lfsr ^= 0x002Du ; /* トグルマスクを適用します。 */ #endif ++ period ; } while ( lfsr != start_state );返品期間; }この分岐はと書くこともできます。一部のコンパイラでは、より効率的なコードが生成される場合があります。さらに、左シフトの変種では、MSBが自身への加算による繰り上がりとなるため、さらに優れたコードが生成される場合があります。 if(lsb)lfsr^=0xB400u;lfsr^=(-lsb)&0xB400u;lfsr
状態と結果のビットを組み合わせて並列計算することもできます。次の関数は、63ビットの多項式を用いて次の64ビットを計算します。
#include <stdint.h>uint64_t prsg63 ( uint64_t lfsr ) { lfsr = lfsr << 32 | ( lfsr << 1 ^ lfsr << 2 ) >> 32 ; lfsr = lfsr << 32 | ( lfsr << 1 ^ lfsr << 2 ) >> 32 ; lfsrを返します; }上記のような 2 進ガロア LFSR は、任意のq元アルファベット {0, 1, ..., q − 1} に一般化できます (たとえば、2 進の場合、q = 2 で、アルファベットは単に {0, 1} です)。この場合、排他的論理和コンポーネントは、- qを法とする加算に一般化され(XOR は 2 を法とする加算であることに注意してください)、フィードバック ビット (出力ビット) は、特定のタップ ポイントごとに定数であるq元値で ( qを法として)乗算されます。これは、フィードバックに 0 (フィードバックなし、つまりタップなし) または 1 (フィードバックあり) が乗算される 2 進の場合の一般化でもあることに注意してください。適切なタップ構成があれば、このような LFSR を使用して、qの任意の素数値のガロア体を生成することができます。
George Marsaglia [ 6 ]によって示され、Richard P. Brent [ 7 ] によってさらに分析されたように、線形フィードバックシフトレジスタはXOR演算とシフト演算を用いて実装できます。このアプローチは、これらの演算が一般的に最新のプロセッサ命令に効率的にマッピングされるため、ソフトウェアによる高速実行に適しています。
以下はジョン・メトカーフの7,9,13トリプレットを使用した16ビット最大周期Xorshift LFSRのCコード例である: [ 8 ]
#include <stdint.h> unsigned lfsr_xorshift ( void ) { uint16_t start_state = 0xACE1u ; /* ゼロ以外の開始状態であればどれでも動作します。 */ uint16_t lfsr = start_state ; unsigned period = 0 ;do { // http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html からの 7,9,13 トリプレット lfsr ^= lfsr >> 7 ; lfsr ^= lfsr << 9 ; lfsr ^= lfsr >> 13 ; ++ピリオド; } while ( lfsr != start_state );返品期間; }フィボナッチ構成とガロア構成の両方の2値LFSRは、行列を用いた線形関数として表現できる(GF(2)を参照)。[ 9 ] LFSRの特性多項式のコンパニオン行列を用い、シードを列ベクトルとして表すと、ステップ後のフィボナッチ構成のレジスタの状態は次のように表される。
対応するガロア形式の行列は次の通りである。
適切な初期化を行うには、
列ベクトルの上の係数:
元のシーケンスの 項a kを与えます。
これらの形式は任意の分野に自然に一般化されます。
次の表は、シフトレジスタの長さが最大24の場合の最大長フィードバック多項式(原始多項式)の例を示しています。最大長LFSRの形式は、ソロモン・W・ゴロムが1967年の著書で開発しました。[ 10 ]異なる原始多項式の数はシフトレジスタの長さとともに指数的に増加し、オイラーのトーシェント関数[ 11 ](OEISのシーケンスA011260 )を使用して正確に計算できます。
| ビット (n) | フィードバック多項式 | タップ | タップ(六角) | 期間 () |
|---|---|---|---|---|
| 2 | 11 | 0x3 | 3 | |
| 3 | 110 | 0x6 | 7 | |
| 4 | 1100 | 0xC | 15 | |
| 5 | 10100 | 0x14 | 31 | |
| 6 | 110000 | 0x30 | 63 | |
| 7 | 110万 | 0x60 | 127 | |
| 8 | 10111000 | 0xB8 | 255 | |
| 9 | 100010000 | 0x110 | 511 | |
| 10 | 1001000000 | 0x240 | 1,023 | |
| 11 | 10100000000 | 0x500 | 2,047 | |
| 12 | 111000001000 | 0xE08 | 4,095 | |
| 13 | 1110010000000 | 0x1C80 | 8,191 | |
| 14 | 11100000000010 | 0x3802 | 16,383 | |
| 15 | 110000000000000 | 0x6000 | 32,767 | |
| 16 | 1101000000001000 | 0xD008 | 65,535 | |
| 17 | 10010000000000000 | 0x12000 | 131,071 | |
| 18 | 100000010000000000 | 0x20400 | 262,143 | |
| 19 | 1110010000000000000 | 0x72000 | 524,287 | |
| 20 | 10010000000000000000 | 0x90000 | 1,048,575 | |
| 21 | 101000000000000000000 | 0x140000 | 2,097,151 | |
| 22 | 1100000000000000000000 | 0x300000 | 4,194,303 | |
| 23 | 10000100000000000000000 | 0x420000 | 8,388,607 | |
| 24 | 111000010000000000000000 | 0xE10000 | 16,777,215 |
LFSRはハードウェアで実装できるため、直接拡散スペクトル無線など、疑似乱数シーケンスを非常に高速に生成する必要があるアプリケーションで役立ちます。LFSRは、さまざまなプログラマブルサウンドジェネレータでホワイトノイズの近似値を生成するためにも使用されています。
LFSRの状態の繰り返しシーケンスは、クロック分周器として使用したり、非バイナリシーケンスが許容される場合のカウンタとして使用したりできます。これは、コンピュータのインデックスやフレーミング位置を機械可読にする必要がある場合によく見られます。[ 12 ] LFSRカウンタは、自然バイナリカウンタやグレイコードカウンタよりもフィードバックロジックが単純なため、より高いクロックレートで動作できます。ただし、LFSRがロックアップ状態(XORベースのLFSRの場合はすべて0、XNORベースのLFSRの場合はすべて1)にならないようにする必要があります。たとえば、起動時にシーケンス内の他の状態にプリセットします。LFSRでカウントアップとカウントダウンが可能です。LFSRはCPUのプログラムカウンタとしても使用されていますが、これにはプログラム自体を「スクランブル」する必要があり、ゲートが貴重な場合にゲートを節約するため(加算器よりも少ないゲートを使用)と速度向上のため(LFSRは長いキャリーチェーンを必要としないため)に行われます。
原始多項式の表は、LFSRをフィボナッチ形式またはガロア形式で配置することで最大周期が得られることを示しています。より長い周期を持つLFSRに、いくつかの状態をスキップしてシーケンスを短縮するロジックを追加することで、任意の周期を得ることができます。
LFSR は、単純な電気機械回路や電子回路から簡単に構築できること、周期が長いこと、出力ストリームが非常に均一に分散していることから、ストリーム暗号用の疑似乱数生成器として長い間使用されてきました。しかし、LFSR は線形システムであるため、暗号解読がかなり容易です。たとえば、既知の平文とそれに対応する暗号文があれば、攻撃者は前述のシステムで使用されている LFSR 出力ストリームの一部を傍受して復元し、その出力ストリームの一部からBerlekamp-Massey アルゴリズムを使用して、意図した受信者をシミュレートする最小サイズの LFSR を構築できます。この LFSR に傍受した出力ストリームの一部を入力すると、残りの平文が復元されます。
LFSR ベースのストリーム暗号では、この問題を軽減するために 3 つの一般的な方法が採用されています。
重要なLFSRベースのストリーム暗号には、 GSM携帯電話で使用されるA5/1とA5/2 、 Bluetoothで使用されるE0、そして縮小生成器などがある。A5/2暗号は既に解読されており、A5/1とE0には深刻な脆弱性がある。[ 14 ] [ 15 ]
線形フィードバックシフトレジスタは線形合同型ジェネレータと密接な関係がある。[ 16 ]
LFSR は、テストパターン生成 (徹底的なテスト、疑似ランダム テスト、または疑似徹底的なテスト) およびシグネチャ分析のための回路テストで使用されます。
完全LFSRは、 n入力回路のあらゆる入力を網羅するため、網羅的テストのためのパターン生成器として広く用いられます。最大長LFSRと重み付きLFSRは、疑似ランダムテストアプリケーションにおける疑似ランダムテストパターン生成器として広く用いられています。
組み込み自己テスト(BIST)技術では、すべての回路出力をチップ上に保存することはできませんが、回路出力を圧縮してシグネチャを形成し、後に(正常な回路の)ゴールデンシグネチャと比較することで故障を検出することができます。この圧縮にはロスがあるため、故障出力もゴールデンシグネチャと同じシグネチャを生成し、故障を検出できない可能性が常に存在します。この状態はエラーマスキングまたはエイリアシングと呼ばれます。BISTは、LFSRの一種であるマルチ入力シグネチャレジスタ(MISRまたはMSR)によって実現されます。標準的なLFSRは、1つのXORゲートまたはXNORゲートを備えており、ゲートの入力は複数の「タップ」に接続され、出力は最初のフリップフロップの入力に接続されます。MISRも同じ構造ですが、すべてのフリップフロップへの入力はXOR/XNORゲートを介して供給されます。例えば、4ビットMISRは、4ビットの並列出力と4ビットの並列入力を備えています。最初のフリップフロップの入力は、並列入力ビット0と「タップ」とのXOR/XNOR演算です。他のすべてのフリップフロップの入力は、前のフリップフロップの出力と対応する並列入力ビットとのXOR/XNOR演算です。したがって、MISRの次の状態は、現在の状態だけでなく、最後のいくつかの状態に依存します。したがって、入力シーケンスが毎回同じであれば、MISRは常に同じゴールデンシグネチャを生成します。最近のアプリケーション[ 17 ]では、LFSRの「タップ」としてセットリセットフリップフロップが提案されています。セットリセットフリップフロップは初期シードを保存してLFSRからビットストリーム全体を生成することができるため、BISTシステムのストレージを最適化できます。ただし、これはBISTのアーキテクチャの変更を必要とするため、特定のアプリケーションではオプションとなります。
短い繰り返しシーケンス (0 または 1 の連続など) がスペクトル線を形成して、受信機でのシンボル追跡を複雑にしたり、他の送信に干渉したりするのを防ぐため、データ ビット シーケンスは、変調および送信の前に線形フィードバック レジスタの出力と結合されます。このスクランブリングは、復調後に受信機で除去されます。LFSR が送信されたシンボル ストリームと同じビット レートで動作する場合、この手法はスクランブリングと呼ばれます。LFSRがシンボル ストリームよりも大幅に高速で動作する場合、LFSR によって生成されたビット シーケンスは チッピング コード と呼ばれます。チッピング コードは、バイナリ位相シフト キーイングまたは同様の変調方式を使用して送信する前に、排他的論理和を使用してデータと結合されます。結果として得られる信号の帯域幅はデータよりも高いため、これは拡散スペクトル通信の方式です。拡散スペクトルの特性のためだけに使われる場合、この手法は直接拡散スペクトルと呼ばれます。
どちらの方式も暗号化や暗号解読と混同すべきではありません。LFSRによるスクランブルと拡散は、盗聴から情報を保護するものではありません。LFSRは、堅牢かつ効率的な変調と復調を可能にする便利なエンジニアリング特性を備えた、同等のストリームを生成するために使用されます。
線形フィードバックレジスタを使用するデジタル放送システム:
LFSR を使用するその他のデジタル通信システム:
LFSR は、疑似ランダム ノイズを生成して対象の通信システムのノイズ フロアを上げるために、 無線妨害システムでも使用されます。
ドイツの時刻信号DCF77は、振幅変調に加えて、9段LFSR駆動の位相偏移変調を採用しており、受信時刻の精度とノイズが存在する状況でもデータストリームの堅牢性を高めています。 [ 19 ]
{{cite book}}: CS1 maint: location missing publisher (link)