Come vengono utilizzati gli LFSR in applicazioni reali come PRNG?


8

Sto programmando un LFSR (Linear Feedback Shift Register) nel software per scopi di apprendimento e ho riscontrato alcune limitazioni nel suo uso come generatore di numeri pseudo-casuali (PRNG).

  • Se il seed ha pochi bit '1' e pochi tap vengono utilizzati, richiede un "tempo di avvio" elevato per produrre un output apparentemente casuale, con una distribuzione quasi uguale tra '1 e' 0 o brevi '0. Immagino che con più tocchi tale avvio sarebbe molto più veloce, ma tutte le tabelle precalcolate che trovo danno due o quattro tocchi.
  • I numeri sequenziali sono altamente correlati, il che è prevedibile, dato che se il bit di uscita è 0, il numero successivo sarà la metà di quello precedente. Per un LFSR a 15 bit con tocchi [15, 14], la stampa di una coppia di numeri sequenziali come punti in un piano fornisce quanto segue. Un PRNG ideale dovrebbe diffondere questi punti in tutto il luogo.

Immagine

So che gli LFSR sono usati come contatore hardware veloce, ma ho anche visto che è usato come PRNG per creare rumore bianco. Come viene utilizzato in applicazioni del mondo reale con una qualità così scarsa?


Come sottolinea @rawbrawb, gli LFSR non sono molto buoni per generare numeri pseudocasuali. Se si utilizza solo una parte del contenuto del registro a scorrimento (ad es. 16 bit meno significativi in ​​un LFSR di lunghezza 32 bit) come numero casuale, le cose vanno molto peggio. Vedi queste domande e risposte recenti su crypto.SE per ulteriori informazioni al riguardo.
Dilip Sarwate,

Risposte:


4

Una fonte eccellente per tutte le cose PRNG è "Sequenze di registro a scorrimento" di Solomon Golomb. Discute le varie classi e tecniche.

L'avvio ripristinando tutti i registri è un modo. O un carico parallelo di un seme è un altro. Ma ricorda che una puntura di tutti gli zeri è uno stato valido.

La scelta dei codici giusti è importante in quanto non tutte le impostazioni di feedback su un registro a scorrimento garantiscono una sequenza PRNG massima.

Il modo in cui si opera un PRNG influisce sulle sue prestazioni.

Per un registro a 15 bit e cercare i codici, [15,4] è massimo come [15,1] ma [15,14] non è elencato. -> Fonte- "Diffusione di sistemi e applicazioni" - Robert Dixon 3rd Ed. Pg 94. Questo libro è un ottimo riferimento per l'implementazione.

In generale, i LFSR producono PRNG scadenti e la pratica generale è usare solo i bit inferiori. In alternativa è possibile generare due PRNG di lunghezze e codici diversi e xo i bit inferiori per generare il nuovo codice. Probabilmente dovrebbe essere usato meno di 1/2 della lunghezza della punta. Quindi un registro di lunghezza a 30 e 31 bit e XOR i 15 LSB.

NIST ha un eccellente codice di test qui . Quindi sì, fa schifo, per PRNG.


Se si dispone del set di tocchi [nbits, a, b, c], un altro set è massimo [nbits, nbits-a, nbits-b, nbits-c]. In questo modo, sia [15,14] che [15,1] sono massimi.
Bruno Kim,

A seconda della configurazione del registro, all-zero o all-one non sono validi. Nella maggior parte delle cose che faccio, all-zero non è valido, ma lo hai notato come valido sopra, quindi volevo assicurarti che questo fosse gettato là fuori. ;)
Aaron D. Marasco il

Aggiunti i dettagli su come ottenere prestazioni migliori. Ma non lo fa bene. Li ho usati in SSDS - la natura auto-correlante. Mi ero dimenticato dei doppi.
segnaposto

Idea interessante, per XOR diversi LFSR, ma immagino che i numeri sarebbero ancora correlati. Probabilmente è meglio usare la risposta di Tim ed eseguire un ciclo completo prima di scegliere un altro numero.
Bruno Kim,

@BrunoKim non è originale, è più efficiente in termini di calcolo o area. La sua lunghezza di ripetizione sarebbe anche 2 ^ 30th.
segnaposto

7

I numeri sequenziali sono altamente correlati, il che è prevedibile, dato che se il bit di uscita è 0, il numero successivo sarà la metà di quello precedente. Per un LFSR a 15 bit con tocchi [15, 14], la stampa di una coppia di numeri sequenziali come punti in un piano fornisce quanto segue. Un PRNG ideale dovrebbe diffondere questi punti in tutto il luogo.

Se si desidera generare numeri casuali con un LFSR a 15 bit, non si estrae un nuovo numero casuale ogni ciclo di clock. Come hai detto, poiché aggiungi un nuovo bit al registro per ogni ciclo di clock, il valore in ciclo Ne N+1sarà fortemente correlato. Se vuoi generare valori casuali (supponendo che tu abbia i tocchi corretti), allora devi estrarre un nuovo valore solo ogni 15 orologi.

Un LFSR garantisce solo un bit casuale per ciclo, non 15 bit casuali.


1
Sto codificando numeri di bit arbitrari. In generale, se voglio un numero intero casuale (64 bit), dovrei usare un LFSR a 128 bit (seguendo il suggerimento di rawbrawb) e fare 64 iterazioni prima di scegliere un numero? Non mancherebbe qualche numero e altri ne selezionano più del previsto per una distribuzione "uniforme"?
Bruno Kim,

2

Un esempio reale può essere trovato nel Manuale di riferimento della famiglia di microprocessori RISC MPC7450. Il 7450 utilizzava un pRNG per la sostituzione di L2 e L3 composto da 16 dispositivi di chiusura con tre semplici registri a scorrimento con bit da 0 a 4, bit da 5 a 9 e bit da 10 a 15. Il bit 0 proviene da un XOR di bit 4 e 15, il bit 5 proviene da un XOR dei bit 4 e 9 e il bit 10 proviene da un XOR dei bit 6 e 15. Il modo di sostituzione nelle cache a 8 vie è indicato dai bit 4, 9 e 15 per L2 e dai bit 0 , 5 e 10 per L3. I bit venivano spostati ad ogni ciclo, ma ovviamente le sostituzioni della cache non si verificavano così frequentemente. (È stato anche fornito un meccanismo sostitutivo alternativo contro-basato.)

Questo è stato riconosciuto come potenzialmente problematico:

A causa della latenza della ricerca nella cache L2, ci sono 3 cicli di clock tra una lettura mancata e l'allocazione della linea di sostituzione. Pertanto, sarebbe possibile che lo stesso modo possa essere scelto per la sostituzione per due, o anche tre mancate letture consecutive con l'algoritmo come descritto sopra. Per evitare ciò, l'algoritmo effettivo confronta una linea di sostituzione selezionata con le tre linee di sostituzione precedenti. Se la linea selezionata corrisponde a una delle tre precedenti, viene automaticamente aggiunto un valore di uno, due o tre al valore che seleziona la modalità di sostituzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.