Linear feedback shift register?
In letzter Zeit stieß ich immer wieder in das Konzept des LFSR, das finde ich ganz interessant wegen Ihrer verbindungen mit den verschiedenen Bereichen und auch faszinierendes an sich. Es hat mich einige Mühe zu verstehen, die Letzte Hilfe war das wirklich gut Seite, viel besser als der (zunächst) kryptisch wikipedia-Eintrag. So wollte ich schreiben, einige kleine code für ein Programm, das funktioniert wie ein LFSR. Um genauer zu sein, der irgendwie zeigte, wie ein LFSR funktioniert. Hier ist die sauberste Sache, die ich tun konnte, nach einigen lenghtier versuche (Python):
def lfsr(seed, taps):
sr, xor = seed, 0
while 1:
for t in taps:
xor += int(sr[t-1])
if xor%2 == 0.0:
xor = 0
else:
xor = 1
print xor
sr, xor = str(xor) + sr[:-1], 0
print sr
if sr == seed:
break
lfsr('11001001', (8,7,6,1)) #example
Ich den Namen "xor" der Ausgang der XOR-Funktion nicht ganz richtig.
Dies ist jedoch nur gemeint, um zu zeigen, wie er seine Kreise über seine mögliche Zustände, in der Tat bemerkte Sie das register wird repräsentiert durch einen string. Nicht viel logischer Kohärenz.
Kann dies leicht verwandelte sich in ein schönes Spielzeug-man kann stundenlang zusehen (zumindest konnte ich 🙂
def lfsr(seed, taps):
import time
sr, xor = seed, 0
while 1:
for t in taps:
xor += int(sr[t-1])
if xor%2 == 0.0:
xor = 0
else:
xor = 1
print xor
print
time.sleep(0.75)
sr, xor = str(xor) + sr[:-1], 0
print sr
print
time.sleep(0.75)
Dann traf es mich, welchen nutzen hat das in software schreiben? Ich habe gehört, es kann generieren von Zufallszahlen; ist es wahr? wie?
Also, es wäre schön, wenn jemand könnte:
- erklären, wie man solch ein Gerät in der software-Entwicklung
- kommen mit einigen code, um den Punkt oben oder wie ich zu zeigen verschiedene Möglichkeiten, es zu tun, in jeder Sprache
Auch, wie theres nicht viel, didaktische Zeug um über dieses Stück Logik und digitalen schaltungen, es wäre schön, wenn dies ein Ort sein könnte für noobies (so wie ich), um ein besseres Verständnis dieser Sache, oder besser, zu verstehen, was es ist und wie nützlich es sein kann, wenn das schreiben von software. Sollte es sich um eine community-wiki?
Sagte, dass, wenn jemand fühlt sich an wie Golfen... du bist willkommen.
- Wenn Sie die Suche nach lfsr SO finden Sie eine Menge ...
- Ich habe, nicht so viel, was ich wollte
- Warum ist das tagged as code-golf?
- da würde ich (auch) gerne sehen, es Golf gespielt. wenn das nicht genug für den tag, tut mir Leid.
- in nur 2 Tagen habe ich verwendet LFSR zum transformieren eines ganzzahligen Sequenz, um eine semi-random ein und konvertieren Sie es dann zurück: stackoverflow.com/questions/9804100/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich, algorithmen, basierend auf LFSR sind sehr Häufig. CRC ist eigentlich direkt auf LFSR. Natürlich, in der informatik-Klassen, die Leute reden über Polynome, wenn Sie reden, wie der Eingabe Wert sein soll XORed mit den akkumulierten Wert, der in electornics engineering-wir reden über Armaturen statt. Sie sind die gleichen nur unterschiedliche Terminologie.
CRC32 ist ein sehr Allgemeines. Es erkennt Fehler in der Ethernet-frames. Das bedeutet, dass, wenn ich gebucht, diese Antwort, mein PC verwendet eine LFSR-basierten Algorithmus zum generieren eines hash-Wert der IP-Paket so, dass mein router kann überprüfen, dass das, was es ist, der übertragung nicht beschädigt ist.
Zip-und Gzip-Dateien sind ein anderes Beispiel. Beide CRC für die Fehlererkennung. Zip verwendet CRC32 und Gzip verwendet sowohl CRC16 und CRC32.
CRCs sind grundsätzlich von hash-Funktionen. Und es ist gut genug, um die internet-Arbeit. Was bedeutet LFSRs sind ziemlich gute hash-Funktionen. Ich bin mir nicht sicher, ob Sie wissen, aber im Allgemeinen gute hash-Funktionen gelten als gute Zufallsgeneratoren. Aber die Sache mit LFSR ist, dass die Auswahl der richtigen Armaturen (Polynome) ist sehr wichtig, um die Qualität des hash/random Zahl.
Dein code ist in der Regel Spielzeug-code, da es funktioniert auf einer Reihe von Einsen und Nullen. In der realen Welt LFSR arbeiten auf bits in einem byte. Jedes byte schieben Sie durch das LFSR änderungen der akkumulierte Wert des Registers. Dieser Wert ist praktisch eine Prüfsumme über alle bytes, die Sie haben, schieben Sie über das register. Zwei gemeinsame Wege mit, dass der Wert als eine zufällige Zahl ist entweder verwenden Sie einen Zähler und drücken Sie eine Sequenz von zahlen, die durch die register, wodurch die Umwandlung der linearen Reihenfolge 1,2,3,4 auf einige Hash-Sequenz wie 15306,22,5587,994, oder der Rückmeldung den aktuellen Wert in das register erzeugen einer neuen Zahl, die in scheinbar zufälliger Reihenfolge ab.
Es sollte angemerkt werden, dass dies naiv mit bit-Gefummel LFSR ist ziemlich langsam, da Sie verarbeitet werden müssen, um bits zu einer Zeit. So können die Leute haben sich mit Möglichkeiten, mittels im Voraus berechneter Tabellen zu tun, es werden acht bits zu einem Zeitpunkt oder sogar 32 bit zu einer Zeit. Dies ist der Grund, warum Sie fast nie sehen LFSR-code in freier Wildbahn. In den meisten Produktions-code, es tarnt sich als etwas anderes.
Aber manchmal ist ein einfaches bit-twiddling LFSR kann in handliches kommen. Ich schrieb einmal ein Modbus Treiber für ein PIC-Mikro und das verwendete Protokoll CRC16. Eine vorab berechnete Tabelle erfordert 256 Byte Speicher und meine CPU hatte nur 68 Byte (Ich bin nicht kidding). So hatte ich die Verwendung eines LFSR.
Da war ich auf der Suche für einen LFSR-Implementierung in Python, ich stolperte über dieses Thema. Ich fand jedoch, dass die folgende war ein wenig genauer nach meinen Bedürfnissen:
Den oben LFSR-generator ist, basierend auf GF(2k) Modul Infinitesimalrechnung (GF = Galois-Feld). Dass gerade ein Algebra-Kurs, ich werde das erklären der mathematischen Weg.
Let ' s start, indem, zum Beispiel, GF(24), das entspricht {a4x4 + a3x3 + a2x2 + a1x1 + a0x0 | a0, a1, ..., a4 ∈ Z2} (um zu klären, Zn = {0,1,...,n-1} und damit Z2 = {0,1}, d.h. ein bit). Dies bedeutet, dass diese ist die Menge aller Polynome des vierten Grades, mit allen Faktoren, die entweder vorhanden ist oder nicht, aber da Sie keine vielfachen dieser Faktoren (z.B. es gibt keine 2xk). x3, x4 + x3, 1 und x4 + x3 + x2 + x + 1 sind Beispiele für Mitglieder dieser Gruppe.
Nehmen wir diesen Satz modulo einem Polynom vierten Grades (D. H., P(x) ∈ GF(24)), z.B. P(x) = x4+x1+x0. Diese modulo-operation auf einer Gruppe wird auch als bezeichnet GF(24) /P(x). Für Ihre Referenz, P(x) beschreibt die 'taps' innerhalb der LFSR.
Wir auch ein willkürliches Polynom von Grad 3 oder niedriger (so dass es nicht betroffen ist, indem Sie unsere E-Modul, sonst könnten wir genauso gut führen Sie die modulo-operation direkt auf ihm), z.B. A0(x) = x0. Jetzt alle nachfolgenden Eini(x) wird durch Multiplikation mit x: Ai(x) = Ai-1(x) * x mod P(x).
Da wir in einem begrenzten Feld, die modulus-operation kann eine Wirkung haben, aber nur, wenn die resultierende Ai(x) hat mindestens einen Faktor x4 (unsere höchste Faktor in P(x)). Beachten Sie, dass, da wir mit zahlen in Z2, die Durchführung der modulo-operation selbst ist nichts anderes als das bestimmen, ob jedes ai wird eine 0 oder 1 durch addition der beiden Werte von P(x) und Ai(x) zusammen (also, 0+0=0, 0+1=1, 1+1=0, oder "xoring" diese zwei).
Jedes Polynom kann geschrieben werden als ein Satz von bits, zum Beispiel x4+x1+x0 ~ 10011. Die A0(x) kann angesehen werden als die Samen. Das 'mal x' operation gesehen werden kann, als eine Verschiebung nach Links-Betrieb. Die modulus-operation kann als eine bit-Maskierung Betrieb, mit der Maske als unser P(x).
Den Algorithmus oben dargestellt erzeugt deshalb (ein unendlicher Strom von) gültige vier-bit-LFSR Muster. Zum Beispiel für unsere definiert Ein0(x) (x0) und P(x) (x4+x1+x0), können wir definieren die folgende erste Ergebnisse gezeitigt, die in GF(24) (beachten Sie, dass Ein0 ist nicht nachgegeben, bis am Ende der ersten Runde-Mathematiker in der Regel beginnt mit der Zählung bei "1'):
Beachten Sie, dass Sie Ihre Maske muss eine '1' an der vierten position, um sicherzustellen, dass Ihre LFSR erzeugt vier-bit-Ergebnisse. Beachten Sie auch, dass eine " 1 " vorhanden sein muss, an der nullten position, um sicherzustellen, dass Ihre bitstream-würde nicht am Ende mit einem 0000 bit-Muster, oder, dass das Letzte bisschen würde unbenutzt (wenn alle bits werden nach Links verschoben ist, würden Sie auch am Ende mit einer null an der position 0. nach einer Schicht).
Nicht alle P(x)'s unbedingt werden Generatoren für GF(2k) (d.h., nicht alle Masken von k bits generieren, die 2k-1-1 zahlen). Zum Beispiel x4 + x3 + x2 + x1 + x0 erzeugt 3 Gruppen von 5 verschiedenen polynomals jeder, oder "3 Zyklen der Periode 5": 0001,0010,0100,1000,1111; 0011,0110,1100,0111,1110; und 0101,1010,1011,1001,1101. Beachten Sie, dass 0000 kann nie generiert werden, und kann Sie nicht erzeugen jede andere Zahl.
In der Regel die Ausgabe eines LFSR ist das bit, das ist 'verschoben', die eine '1' wenn modulus-operation durchgeführt wird, und eine '0' wenn er es nicht ist. LFSR ist mit einer Frist von 2k-1-1, die auch als pseudo-noise PN oder-LFSR ist, befolgen Sie die Golomb-die Zufälligkeit postuliert, die sagt so viel wie, dass das Ausgabe-bit ist zufällig 'genug'.
Sequenzen von diesen bits haben daher Ihre Nutzung in der Kryptographie, zum Beispiel in der A5/1 und A5/2 mobile encryption standards oder E0 Bluetooth-standard. Sie sind jedoch nicht so sicher, wie man möchte: die Berlekamp-Massey-Algorithmus kann verwendet werden, um reverse-Engineering die charakteristische polynomal (P(x)) des LFSR. Starke Verschlüsselung-standards verwenden daher Nicht-lineare FSR's oder ähnlichen, nicht-lineare Funktionen. Ein Verwandtes Thema sind die S-Boxen bei AES.
Hinweis, dass ich die
int.bit_length()
operation. Dies wurde nicht umgesetzt, bis Python 2.7.Wenn Sie würde nur wie eine endliche bit-Muster, die Sie überprüfen könnten, ob der seed gleich das Ergebnis und dann brechen Sie Ihre Schleife.
Können Sie meine LFSR-Methode in einer for-Schleife (z.B.
for xor, pattern in lfsr(0b001,0b10011)
) oder Sie können wiederholt aufrufen, die.next()
Betrieb auf das Ergebnis der Methode, die einen neuen(xor, result)
-pair-Mädchen jedes mal.Es gibt viele Anwendungen von LFSRs. Eine von Ihnen ist die Lärmbelastung, zum Beispiel der SN76489 und Varianten (auf dem Master System, Game Gear, MegaDrive, NeoGeo Pocket, ...) verwenden ein LFSR erzeugen weiß/periodic noise. Es ist eine wirklich gute Beschreibung der SN76489 das LFSR auf dieser Seite.
Machen es wirklich elegante und Pythonic, versuchen Sie, erstellen einen generator an, der
yield
-ing aufeinanderfolgende Werte aus der LFSR. Auch im Vergleich zu einer Fließkomma -0.0
ist unnötig und verwirrend.Einem LFSR ist nur eine von vielen Möglichkeiten zum erstellen von pseudo-Zufallszahlen in Computern. Pseudo-zufällig, denn es zahlen nicht wirklich random - Sie können ganz einfach wiederholen lassen, indem beginnend mit der seed (Startwert) und Verfahren mit der gleichen mathematischen Operationen.
Unten ist eine Variante, die auf Ihren code mit Integer-zahlen und binären Operatoren statt des strings. Es verwendet auch die Ausbeute, wie jemand vorschlug.
Wenn wir davon ausgehen, dass Saatgut ist eine Liste von ints, anstatt ein string (oder konvertieren, wenn es nicht ist), dann die folgenden sollte das tun, was Sie wollen, mit ein bisschen mehr Eleganz:
Beispiel :