Generalized feedback shift register ( GFSR) är en variant av Towsworths pseudo-slumptalsgenerator (PRNG) föreslogs av Theodore Lewis och William Payne 1973.
Tanken bakom GFSR- algoritmen är att den grundläggande linjära återkopplingsskiftregistersekvensen , baserad på ett primitivt trinomial , skrivs i kolumner, , med förnuftigt valda cykliska skift. och är godtyckliga naturliga tal sådana att , och ungefär lika med och , bör undvikas på grund av de dåliga egenskaperna hos den resulterande sekvensen. [ett]
Således kan alla ord i GFSR-utmatningen ses som vektorer av längd , med koefficienter från mängden som lyder rekursionen
där är XOR , eller bitvis addition modulo 2 , och [2]
Den linjära kongruentialgeneratorn visar dålig enhetlighet i n-rymden. Figuren ger ett exempel på resultatet av arbetet för 384 poäng (a) och 512 (b). [ett]
Alternativt ger ett linjärt återkopplingsskiftregister (FSR) en enhetlig fördelning i n-dimensionell rymd om registrets längd är delbar med n. Kanske ger FSR-sekvenser fler möjligheter att förbättra det n-dimensionella rummet, men perioden begränsas av maskinordet . Dessutom minskar decimering, för att erhålla enhetlighet i n-dimensionellt utrymme, cykelns längd ytterligare. [ett]
På grund av detta skapades ett generaliserat återkopplingsskiftregister, kapabelt att generera godtyckligt stora sekvenser, oavsett storleken på maskinordet, även med en god n-dimensionell fördelning och hög hastighet. [ett]
Figuren förutser ett exempel på resultatet av GFSR-operationen med ett polynom , ett 9-bitars maskinord och ett cykliskt skifte med 93 [1]
Lewis och Payne introducerade olika typer av generatorer som kallas generaliserade återkopplingsskiftregister. Denna metod är snabb och kan generera samma sekvenser på datorer med olika maskinordslängder , men den har en nackdel med initialisering. [3]
Först måste en initial matris med icke- degenererad bitstorlek bildas. Lewis och Payne visade att om den relativa förskjutningen mellan intilliggande kolumner är konstant, så är matrisen inte degenererad. Det konstanta skiftet valdes godtyckligt till . [3]
För det andra föreslog Lewis och Payne, för att undertrycka effekten av icke-slumpmässighet i den initiala matrisen, att kassera de första siffrorna innan generatorn användes. Så om du behöver en lång sekvens och en stor, tar initieringsprocessen mycket tid.
En annan nackdel, som kan vara mer betydande, är att det inte finns någon teoretisk motivering för att sekvensen kommer att ha k-fördelningsegenskapen. Termen k-fördelning betyder att varje k-tuppel av -bittal förekommer en gång i en hel period, förutom nolltupeln. De visade att sekvensen kan vara k-fördelad, för , men detta är ett nödvändigt, inte ett tillräckligt villkor. [3]
Bright (Bright) och Enison (Enison) utförde tester för equipartition i utrymmen med hög dimension av en liten del av sekvensen med en stor period. Det visade sig att de statistiska egenskaperna i testerna inte upprepar egenskaperna för hela sekvensen. [3]
Arvillias och Maritsas föreslog en generator av GFSR-typ, som har en effekt av 2. De visade att sekvenselement, nästan jämnt fördelade över perioden, kan erhållas i en cykel med hjälp av en switch och skiftregister . I detta fall bestäms den relativa förskjutningen analytiskt. Detta innebär att initieringsprocessen blir lika snabb som genereringen av slumptal. Men återigen finns det inga garantier i k-fördelningen. [3]
Ingångsvärden:
Algoritm:
1. Vi skapar en array av bitvektorer , längs vilka vi kommer att röra oss med ett index och ett hjälpindex . 2. Initiera arrayen med den initiala bitsekvensen. Sätt lika med 0. 3. Vi beräknar nästa vektor, men eftersom matrisen av längd , då beräknas indexen modulo , på grund av vilket På det här sättet 4. Öka med en och fortsätt till beräkningen av nästa vektor, tills sekvensen börjar upprepas (sekvenslängd ) [1]Låt ett polynom ges , och .
Elementen i sekvensen uppfyller likheten för . Enligt polynomet , så vi kan ta reda på elementen i sekvensen
och så vidare.
Därmed får vi sekvensen
För att skapa en bra slumpmässig sekvens använder vi Kendall-algoritmen (Kendall). Även om det finns flera varianter av denna algoritm kommer vi att ta den som flyttar den initiala sekvensen 1111100011011101010000100|101100 framåt med 6 bitar. Det vill säga 1011001111100011011101010|000100 och så vidare 3 gånger till. Så får vi
siffra | efterföljande |
---|---|
0 | 1111100011011101010000100 101100 |
ett | 1011001111100011011101010 000100 |
2 | 0001001011001111100011011 101010 |
3 | 1010100001001011001111100 011011 |
fyra | 0110111010100001001011001 111100 |
bildas från de första bitarna av sekvenserna, - från den andra, för liknande.
De efterföljande beräknas enligt regeln .
11010 | 01001 | 00111 | |||
10001 | 10 000 | 01111 | |||
11011 | 10110 | 10010 | |||
11100 | 10100 | 01100 | |||
10011 | 01110 | 00101 | |||
00001 | 11111 | 10101 | |||
01101 | 00100 | 00011 | |||
01000 | 11 000 | 10111 | |||
11101 | 01011 | 11001 | |||
11110 | 01010 | 00110 |
Enligt utvecklarna har det generaliserade återkopplingsskiftregistret en godtyckligt lång period, oavsett längden på maskinordet på den dator som exekverar algoritmen, det är snabbare än andra pseudoslumpsekvensgeneratorer , och algoritmen är också lätt att genomföra. [ett]
Enligt forskning varierar antalet 0:or och 1:or i utdatasekvensen markant, vilket motsäger Golombs postulat . Dessutom, om vi tar ett heltal N och delar upp sekvensen i tuplar av N ord, så för en slumpmässig sekvens måste fördelningen av ettor i dessa tuplar följa binomialfördelningen Bin(N, 1/2). Men det visade sig att detta villkor inte är uppfyllt. Detta beror på det faktum att varje ord endast beror på de två föregående, och därför "utjämnas" inte övervikten av ettor eller nollor av modulo 2-adderaren. [2]
En välkänd modifiering av skiftregistret med generaliserad feedback kallad " Mersenne Vortex ", föreslog av Makoto Matsumoto och Takuji Nishimura 1997. Perioden för denna generator är enorm och är lika med Mersenne-talet . Mersenne-virveln tillhör klassen av spolgeneratorer baserade på skiftregister med generaliserad återkoppling. Dess förenklade diagram visas i figuren.
Tänk på den vanligaste versionen av denna algoritm - MT19937. Den använder 624 minnesceller, som var och en innehåller ett 32-bitars heltal. I det här fallet skrivs den återkommande regeln för bildandet av en sekvens av utgående ord enligt följande:
& 0x80000000) | & 0x7ffffffff))× , (i = 0, 1 , 2, …)
Det vill säga, vid varje k:te steg tas den mest signifikanta biten av ordet , och 31 bitar från ordet , och sedan sammanfogas de resulterande delarna , följt av multiplicering av resultatet med matrisen
där = 0x9908B0DF i hexadecimal.
Efter det läggs resultatet till modulo 2 till ordet som beräknades i det föregående 397:e steget. Sedan flyttas innehållet i alla celler ett steg åt vänster, och resultatet skrivs till den lediga cellen. [2]