Forum: FPGA, VHDL & Co. Prüfen ob Wert teil eines LFSR


von Vincent H. (vinci)


Lesenswert?

Guten Abend

Ich hab in einem VHDL Kurs unter anderem die Aufgabenstellung ein LFSR 
mit einem gegebenen Feedback-Polynom zu realisieren. Den Code hatte ich 
relativ schnell runter getippt und er funktioniert auch, lediglich eine 
Theorie-Frage bezüglich dem LFSR bereitet mir ein wenig Kopfschmerzen.

Ich soll prüfen, ob eine gewisse Zahl vom LFSR ausgegeben wird.

Konkret lautet das Polynom x^28 + x^3 + 1
Zu prüfen gilt, ob 0x2b0638b als Ausgabe vorkommt.
Als Resetwert wird das LFSR mit lauter 1ern beladen.

Woher weiß ich nun, ob 0x2b0638b vorkommt?

Grüße
Vincent

von Chris L. (chk1987) Benutzerseite


Lesenswert?

nach jedem schiebevorgang die folge mit diesem wert vergleichen...

von Vincent H. (vinci)


Lesenswert?

Die Aufgabenstellung ist eine Theoriefrage. Ich bezweifle stark, dass 
der Lektor von uns verlangt einen 28Bit breiten Vektor händisch 
durchzuschieben, bis wir den gesuchten Wert erreichen...

In meiner Simulation wird der Wert trotz 100MHz Takt erst nach ~2,4s 
erreicht. Das wäre also wohl eine Lebensaufgabe.

von Detlef _. (detlef_a)


Lesenswert?

Vincent Hamp schrieb:

>>Ich bezweifle stark, dass
> der Lektor von uns verlangt einen 28Bit breiten Vektor händisch
> durchzuschieben, bis wir den gesuchten Wert erreichen...

Kann man ja einen Rechner machen lassen. Der Wert 0x2b0638b wird 
erreicht und zwar nach 358655852 Runden.

> In meiner Simulation wird der Wert trotz 100MHz Takt erst nach ~2,4s
> erreicht. Das wäre also wohl eine Lebensaufgabe.

Meine desktop Gurke braucht für die komplette Lösung nen paar Sekunden. 
Das Polynom produziert allerdings keine maximum length sequence 
http://de.wikipedia.org/wiki/Maximum_Length_Sequence. MLS bis 168er 
Ordnung gibts hier:
http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf

allerdings mit 0 als Startwert und XNOR Rückkopllung.

> Die Aufgabenstellung ist eine Theoriefrage.

Dann würde mich die Lösung dazu sehr interessieren. Ich bin leider nicht 
in der Lage zu bestimmen, ob ein Polynom eine MLS liefert oder nicht 
(außer duch Probieren, das geht aber bei z.B. 168er Ordnung nicht mehr).

math rulez!
Cheers
Detlef

PS. Ich hoffe, dass ich mich nicht verdaddelt habe, ist aber nicht 
auszuschließen.


/*******************************************************************/
int main(int  argc , char ** argv)
/*******************************************************************/
{
   unsigned char *f,c;
   unsigned long k,p;

f=(char *)malloc(1<<26);
if(f==NULL){printf("geht nich \n"); return;}

for(k=0;k<(1<<26);k++) {
  if((k&((1<<16)-1))==0) printf("%d \n",k);
  f[k]=0;
}

p=0xffffffff;

for(k=0;k<(1<<29);k++) {
  if((k&((1<<19)-1))==0) printf("%d \n",(1<<29)-k);
  p=p&((1<<29)-1);
  if(p==0x2b0638b) { printf("yo %d %x %x \n",k,p,f[p>>3]); return;}
  c=f[p>>3]&(unsigned char)(1<<(p&7));
  if(c) { printf("gibbs schon %d %x %x \n",k,p,f[p>>3]); return;}
  f[p>>3] |= (unsigned char)(1<<(p&7));
  p = (p<<1)|(((p>>28)&1)^((p>>3)&1));
}

for(k=0;k<(1<<26);k++) {
  if((k&((1<<16)-1))==0) printf("%d \n",k);
  //if(f[k] != 0xff)
  printf("xxxxxxxxxxxxxxxxxxxx %d %x \n",k,f[k]);
}
return 0;
}

von Vincent H. (vinci)


Lesenswert?

Hallo

Danke für deine Antwort.
Die Xilinx Note hab ich auch bereits gelesen.

Weiters hab ich dann folgendes Dokument entdeckt:
http://jaja.kn.vutbr.cz/~kajan/lfsr.pdf

Interessanterweise gibt es da eine Tabelle, in der 28 und 3 als 
"Polynomial 1-Terms (Xn)" sehr wohl gelistet ist. Kurz dacht ich dann, 
dass XOR und XNOR Verknüpfungen unterschiedliche Polynome erfordern... 
das dürft aber leider auch nicht der Fall sein:
"The polynomial used to generate the maximum length sequence is the same 
for
Fibonacci/Galois implementations, and with XOR or XNOR gates for 
feedback."

Jetzt bin ich beim Überfliegen des Dokuments nicht wirklich schlau 
geworden, was der Tabelleneintrag "Polynomial 1-Terms (Xn)" überhaupt 
ist...


Hab meine Antwort aber vorerst mal so begründet, dass 28/3 sehr wohl MSL 
taps sind, sonst wär die Frage imho nicht zu beantworten.

von Klakx (Gast)


Lesenswert?

mal andersrum gefragt:
wenn die bitbreite ausreicht, wird dann nicht alles irgendwann  beim 
LSFR erreicht? hab leider auch keine gescheite quelle gefunden

von Klakx (Gast)


Lesenswert?

natürlich außer 0

von Vincent H. (vinci)


Lesenswert?

Also mein Wissen hier is auch sehr lückenhaft, jedoch weiß ich, dass ein 
LFSR ausschließlich in Kombinationen mit den richtigen Feedback Taps 
(bzw. dem richtigen Feedback Polynom) eine sogenannte Maximal Sequence, 
sprich 2^n-1 states annimmt.

Was ich bisher so mitbekommen hab gibt es aber für jede Bitbreite 
etliche "richtige" Feedback Taps, die dieses Maximum erzeugen.

/edit
Hier eine der bisher besten Seiten, die ich diesbezüglich ergoogled hab:
http://www.newwaveinstruments.com/resources/articles/m_sequence_linear_feedback_shift_register_lfsr.htm

/edit2
Abhängig von der Art der Verknüpfung (XOR / XNOR) kann auch ein mit 
lauter 1ern befülltes LFSR ein gelockter State sein.

von Detlef _a (Gast)


Lesenswert?

Es gibt jeweils einen gelockten state, bei XOR feedback alles 0, bei 
XNOR alles 1. Dass die Polynome für XOR/XNOR und Galois/Fibonacci 
feedback gleich sind war mir nicht bewußt, muß man mal ausprobieren.

Ich hatte allerdings die Liste mißverstanden, die beginnen die Zählung 
der Register bei 1, nicht bei 0, bei Deinem Polynom gibts also nur 28 
Stellen und nicht 29, wie ich angenommen hatte. Als Länge der MLS wird 
im neueren Xilinx Dokument für n=28 auch 268435455 angegeben, das sind 
2^28-1.

Ich werde das Programm nochmal modden müssen.

Wenn Xilinx sagt, dass das Polynom ne MLS produziert, wird das stimmen. 
Also lautet die Antwort auf die Originalfrage: ja, 0x2b0638b kommt vor, 
genauso wie jede andere Zahl aus dem Feld mit Ausnahme der 0.

Gerne würde ich wissen wie man bestimmt, ob ein Polynom eine MLS 
erzeugt. Lieber noch würde ich für eine gegebene MLS Länge das Polynom 
erzeugen können, ich glaube aber, das geht nur durch Probieren.

Gute Nacht
Detlef

von Lattice User (Gast)


Lesenswert?

Detlef  _a schrieb:
> ich glaube aber, das geht nur durch Probieren.

Da irrst du dich.

Eines der grössten bekannten Polynome das eine MLS erzeugt ist:

x^6972593 + x^3037958 + 1 (*)

und das hat man garantiert nicht mit probieren gefunden :-)

Eine Xilinx App Note verlinkt eine Tabelle die bis zum Grad 168 geht, 
auch das ist viel zu gross zum Durchprobieren.

(*) The Great Trinomial Hunt (Richard P. Brent, Paul Zimmermann)

von Detlef _a (Gast)


Lesenswert?

Yo, Du hast Recht, aber wie gehts denn sonst, das Finden und 
Verifizieren, hast Du einen Hinweis wo was zu finden ist? Die Xilinx 
Appnote hatte ich selber zitiert.

Cheers
Detlef

von Lattice User (Gast)


Lesenswert?

Detlef _a schrieb:
> Yo, Du hast Recht, aber wie gehts denn sonst, das Finden und
> Verifizieren, hast Du einen Hinweis wo was zu finden ist?


Stichwort ist "primitive polynomal"

http://mathworld.wolfram.com/PrimitivePolynomial.html
http://en.wikipedia.org/wiki/Primitive_polynomial_%28field_theory%29
http://en.wikipedia.org/wiki/Euler%27s_totient_function

von Hagen R. (hagen)


Lesenswert?

bzw.

"irreducible and primitive polynom"


falls du was mit PASCAL Code anfangen kannst hier mein Source:

Gruß Hagen
1
{ follow procedures create and check suitable Polynoms for above
2
  Linear Feedback Shift Registers.
3
  Such polynoms must be primitive, irreducible to produce maximal
4
  length LFSR's. }
5
6
7
type
8
  TFactors = array[0..6] of Cardinal;
9
10
function FactorOrder(var Factors: TFactors; Degree: Integer): Integer;
11
// find factors of 2^Degree-1 = possible Order of Polynom
12
// can be surrely more optimized, but the runtime here is not important yet
13
// as example:
14
//   For all orders from 2^0 -1 upto 2^32-1 exists only 33 possible primefactors.
15
//   Instead to looping trough all odd numbers as factors we could reduce the
16
//   loopcount if we use a lookuptable of all the 33 possible primefactors.
17
var
18
  Order,Rest,Prime,Bound,Factor,LastFactor: Cardinal;
19
begin
20
  Result := 0;
21
  LastFactor := 0;
22
  Prime := 3;
23
  Order := $FFFFFFFF shr (32 - Degree);
24
  Rest := Order;
25
  Bound := Round(Sqrt(Rest));
26
  while (Rest <> 1) and (Prime < Bound) do
27
    if Rest mod Prime = 0 then
28
    begin
29
      Rest := Rest div Prime;
30
      Factor := Order div Prime;
31
      if Factor <> LastFactor then
32
      begin
33
        LastFactor := Factor;
34
        Factors[Result] := Factor;
35
        Inc(Result);
36
      end;
37
      Bound := Round(Sqrt(Rest));
38
    end else Inc(Prime, 2);
39
  if Result > 0 then
40
  begin // only if 2^Degree-1 it self isn't prime
41
    Factors[Result] := Order div Rest;
42
    Inc(Result);
43
  end;
44
end;
45
46
function PolyIsPrimitive(Poly: Cardinal; Degree: Integer; const Factors: TFactors; FactorCount: Integer): Boolean;
47
// small, clean and efficient for small Degrees upto 32
48
// for larger Degrees we should go with real GF(2) arithmetic
49
type
50
  TPolyMatrix = array[0..31] of Cardinal;
51
52
  procedure PolyCopy(var D: TPolyMatrix; const S: TPolyMatrix);
53
  {$IFDEF ASM}
54
  asm
55
         XCHG  EAX,EDI
56
         XCHG  EDX,ESI
57
         MOV   ECX,32
58
         REP   MOVSD
59
         MOV   EDI,EAX
60
         MOV   ESI,EDX
61
  end;
62
  {$ELSE}
63
  begin
64
    Move(S, D, SizeOf(S));
65
  end;
66
  {$ENDIF}
67
68
  procedure PolyInit(var M: TPolyMatrix; Poly: Cardinal; Degree: Integer);
69
  var
70
    L: Cardinal;
71
    I: Integer;
72
  begin
73
    L := $80000000;
74
    M[Degree -1] := L;
75
    for I := 0 to Degree -2 do
76
    begin
77
      L    := L shr 1;
78
      M[I] := L;
79
    end;
80
    for I := 0 to Degree -2 do
81
    begin
82
      if Odd(Poly) then M[I] := M[I] or $80000000;
83
      Poly := Poly shr 1;
84
    end;
85
  end;
86
87
  procedure PolyMul(var R: TPolyMatrix; const M: TPolyMatrix; Degree: Integer);
88
  {$IFDEF ASM}
89
  // speedup >40% over all, and of course follow asm is nothing important or special tricky
90
  asm
91
         PUSH  EDI
92
         PUSH  ESI
93
         PUSH  EBX                       
94
         PUSH  EBP
95
         LEA   EDI,[EAX + ECX * 4]  // on top of R, eg @R[Degree]
96
         LEA   ESI,[EDX + ECX * 4]  // on top of M
97
         NEG   ECX                  // -Degree, we loop from -Degree upto 0
98
         MOV   EBP,ECX
99
  @@1:   MOV   EDX,[ESI + EBP * 4]  // outerloop
100
         XOR   EAX,EAX
101
         PUSH  ECX                  // save -Degree, eg. loopcounter
102
  @@2:   ADD   EDX,EDX              // inner loop, branchfree xor'ing is important for speed
103
         SBB   EBX,EBX
104
         AND   EBX,[EDI + ECX * 4]
105
         XOR   EAX,EBX
106
         INC   ECX
107
         JNZ   @@2
108
         POP   ECX                  // restore loopcounter
109
         INC   EBP
110
         PUSH  EAX                  // push T[] on stack
111
         JNZ   @@1
112
         SUB   EDI,4
113
  @@3:   POP   DWord Ptr [EDI]      // R[] = T[]
114
         SUB   EDI,4
115
         INC   ECX
116
         JNZ   @@3
117
         POP   EBP
118
         POP   EBX
119
         POP   ESI
120
         POP   EDI
121
  end;
122
  {$ELSE}
123
  var
124
    T: TPolyMatrix;
125
    I,J: Integer;
126
    N,D: Cardinal;
127
  begin
128
    for I := 0 to Degree -1 do
129
    begin
130
      N := M[I];
131
      D := 0;
132
      for J := 0 to Degree -1 do
133
      begin
134
        if N and $80000000 <> 0 then D := D xor R[J];
135
        N := N shl 1;
136
      end;
137
      T[I] := D;
138
    end;
139
    PolyCopy(R, T);
140
  end;
141
  {$ENDIF}
142
143
  procedure PolyPowMod(var R: TPolyMatrix; const M: TPolyMatrix; N: Cardinal; Degree: Integer);
144
  var
145
    L: Cardinal;
146
  begin
147
    PolyCopy(R, M);
148
    L := $80000000;
149
    while N and L = 0 do L := L shr 1;
150
    while L > 1 do
151
    begin
152
      L := L shr 1;
153
      PolyMul(R, R, Degree);
154
      if L and N <> 0 then PolyMul(R, M, Degree);
155
    end;
156
  end;
157
158
var
159
  P,M: TPolyMatrix;
160
  I,J: Integer;
161
  State: Cardinal;
162
begin
163
  Result := False;
164
  PolyInit(M, Poly, Degree);
165
  PolyCopy(P, M);
166
  State := P[0];
167
  for I := 1 to Degree do
168
  begin
169
    PolyMul(P, P, Degree);
170
    if P[0] = State then
171
      if I = Degree then
172
      begin
173
        for J := 0 to FactorCount -1 do
174
        begin
175
          PolyPowMod(P, M, Factors[J], Degree);
176
          if P[0] = $80000000 then Exit;
177
        end;
178
        Result := True;
179
        Exit;
180
      end else Exit;  
181
  end;    
182
end;
183
184
function FindPrimitivePolynom(Poly: Cardinal; Degree: Integer): Cardinal;
185
// on PIV 1.5 GHz
186
// 4.95 ms (asm) 6.97 ms (pascal) on degree 32 searches
187
// 0.41 ms (asm) 0.60 ms (pascal) on degree 16 searches
188
// on random input about 1/16 are primitive polynoms
189
// Poly / 2, means Result *2 +1 = real polynom
190
191
  function EvenParity(Poly: Cardinal): Boolean;
192
  // returns TRUE if count of bits set to 1 in Poly is even
193
  {$IFDEF ASM}
194
  asm
195
       MOVZX  EDX,AX
196
       SHR    EAX,16
197
       XOR    EAX,EDX
198
       XOR     AH,AL
199
       SETP    AL
200
  end;
201
  {$ELSE}
202
  var
203
    I: Cardinal;
204
  begin
205
    I := 0;
206
    while Poly <> 0 do
207
    begin
208
      Inc(I, Poly and 1);
209
      Poly := Poly shr 1;
210
    end;
211
    Result := not Odd(I);
212
  end;
213
  {$ENDIF}
214
215
var
216
  Factors: TFactors;
217
  Mask: Cardinal;
218
  FactorCount: Integer;
219
begin
220
  if Degree > 0 then
221
  begin
222
    Mask := $FFFFFFFF shr (32 - Degree);   // eg. 2^Degree -1
223
    Poly := Poly and Mask or 1 shl (Degree -1);
224
    FactorCount := FactorOrder(Factors, Degree);
225
    while Poly <= Mask do
226
      if PolyIsPrimitive(Poly, Degree, Factors, FactorCount) then
227
      begin
228
        Result := Poly;
229
        Exit;
230
      end else
231
      repeat
232
        Inc(Poly);
233
      until (Poly > Mask) or EvenParity(Poly);
234
  end;
235
  Result := 0;
236
end;
237
238
function IsPolynomPrimitive(Poly: Cardinal): Boolean;
239
// on PIV 1.5 GHz
240
// ~0.446 ms on random polys with degree 32
241
// ~0.052 ms on random polys with degree 16
242
var
243
  Factors: TFactors;
244
  FactorCount,Degree: Integer;
245
  P: Cardinal;
246
begin
247
  Degree := 0;
248
  P := Poly;
249
  while P <> 0 do
250
  begin
251
    P := P shr 1;
252
    Inc(Degree);
253
  end;
254
  if Degree > 0 then
255
  begin
256
    FactorCount := FactorOrder(Factors, Degree);
257
    Result := PolyIsPrimitive(Poly, Degree, Factors, FactorCount);
258
  end else Result := False;
259
end;

von Hagen R. (hagen)


Lesenswert?

um nun zu prüfen ob eine "zahl" durch ein Polynom in GF(2) erzeugbar ist 
muß man das Polynom und diese Zahl in nicht mehr reduzierebare und 
primitive Polynome zerlegen, quasi das gleiche machen wie eine 
natürliche Zahl in deren Primzahlpotenzen zu zerlegen. Zwei natürliche 
Zahlen sind dann teilerfremd wenn sie eine Primzahlpotenz enthalten die 
nicht in beiden Primzahlpotenzzerlegungen der beiden Zahlen vorkommt. 
Gleiches gilt für GF(2).

Ist das gewählte Polynom des LFSRs also primitiv und nicht reduzierbar 
(quasi wie eine Primzahl in N) dann gilt: wenn die "Zahl" kleiner der 
Order -1 des Polynoms und nicht Null ist dann ist sie Bestandteil der 
Menge der erzeugbaren "Zahlen" des LFSRs => MLS.

Gruß hagen

von Lattice User (Gast)


Lesenswert?

@Hagen Re

Da ich mich bisher nur so am Rande damit beschäftigt habe, wwei Fragen:

1.) Hast du das Programm auch ohne ASM Einlagen?

2.) Ich habe den Eindruck du verwendest primitiv und nicht reduzierbar 
synonym. Das wäre aber falsch. Ein primitives Polynom ist immer nicht 
reduzierbar, aber der Umkehrschluss gilt nicht:
Beispiel: 1+x+x^2+x^3+x^4

von Hmm (Gast)


Lesenswert?

>Ich habe den Eindruck du verwendest primitiv und nicht reduzierbar
>synonym.

Könntest Du bitte mal zitieren, woher Du diesen Eindruck hast?

Ich lese da: "primitiv und nicht reduzierbar"

von Hagen R. (hagen)


Lesenswert?

Lattice User schrieb:
> 1.) Hast du das Programm auch ohne ASM Einlagen?

Ist PASCAL und Assembler, dieser steht in DEFINES gekapselt da, also 
immer mit dem dazugehörigen PASCAL Source. Leider mit der Forensoftware 
hier nicht so gut ersichtlich.

Lattice User schrieb:
> Ein primitives Polynom ist immer nicht
> reduzierbar, aber der Umkehrschluss gilt nicht:

Das ist "korrekt" weswegen ich

Hmm schrieb:
> Ich lese da: "primitiv und nicht reduzierbar"

geschrieben habe ;)
Es gibt aber auch primitive Polynome die reduzierbar sind, aber soweit 
ich weiß nicht in GF(p^m). Man müsste also auch das gewählte Field mit 
angeben damit die Aussage "primitiv heist immer auch nicht reduzierbar" 
stimmt, es gibt ja nicht nur Polynome in GF(x).

siehe http://de.wikipedia.org/wiki/Primitives_Polynom
und dann http://de.wikipedia.org/wiki/Inhalt_%28Polynom%29

Gruß hagen

von Lattice User (Gast)


Lesenswert?

Hagen Re schrieb:
> Ist PASCAL und Assembler, dieser steht in DEFINES gekapselt da, also
> immer mit dem dazugehörigen PASCAL Source. Leider mit der Forensoftware
> hier nicht so gut ersichtlich.

Ich meinte pures Pascal, dann wäre es leichter es in eine gängigere 
Sprache zz übersetzen. So ist das mir zuviel Arbeit.

Hagen Re schrieb:
> Es gibt aber auch primitive Polynome die reduzierbar sind,

Hmm, Wolfram ist anderer Meinung, gkeich der erste Satz.
http://mathworld.wolfram.com/PrimitivePolynomial.html

Und in der englischen Wikipedia steht bei Gauss Lemma:

"The notion of primitive polynomial used here (which differs from the 
notion with the same name in the context of finite fields)"

http://en.wikipedia.org/wiki/Gauss%27s_lemma_%28polynomial%29

Steht übrigens auch in deinem ersten Link:
"In der Ringtheorie wird der Begriff primitives Polynom anders 
verwendet."

von Hagen R. (hagen)


Lesenswert?

Lattice User schrieb:
> Hagen Re schrieb:
>> Ist PASCAL und Assembler, dieser steht in DEFINES gekapselt da, also
>> immer mit dem dazugehörigen PASCAL Source. Leider mit der Forensoftware
>> hier nicht so gut ersichtlich.
>
> Ich meinte pures Pascal, dann wäre es leichter es in eine gängigere
> Sprache zz übersetzen. So ist das mir zuviel Arbeit.

Nochmal anders formuliert: es ist pures PASCAL, ignoriere doch einfach 
alls zwischen {$IFDEF ASM} und {$ELSE} dann bleibt das gewünschte pure 
PASCAL übrig. Oder noch anders formuliert: der Source ist je nach 
Compiler Defines reines PASCAL oder gemischt mit Assembler. Oder soll 
ich dir das jetzt noch raus löschen aus dem Source ?

Lattice User schrieb:
> Hmm, Wolfram ist anderer Meinung, gkeich der erste Satz.

Nö sind sie nicht. Ich sagte doch das die Angabe worauf sich die 
Polynomarithmetik bezieht wichtig ist damit diese Aussage stimmt. Auch 
Wolfram bezieht sich auf Polynome in Galois Feldern. Es gibt aber auch 
andere Polynome in anderen Domains, und bei denen muß diese Aussage 
nicht zwangsläufig stimmen. Ich gebe aber zu das es auch ein Tick von 
mir ist aussagenlogisch darauf zu bestehen das das Polynom "nicht 
reduzierbar und primitiv" sein muß. In GF(p^m) heist dies das ein 
primitives Polynom zangsläufig auch nicht reduzierbar sein wird, das muß 
aber für andere Polynomarithmetiken nicht stimmen. Ich habe es eben so 
gelernt es so zu formulieren, mein Lehrer war da auch sehr eigensinnig 
und penibel mit seinen Formulierungen. Letzendlich ist das egal, meine 
Ausage ist ansich richtig und wir fangen über Trivialitäten einen 
Glaubenskrieg an, es sind nur Worte und wir wissen was gemeint war.

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

Lattice User schrieb:
> Ich meinte pures Pascal, dann wäre es leichter es in eine gängigere
> Sprache zz übersetzen.

PASCAL ist eine sehr gängige Sprache, was sonst ;)

von Hagen R. (hagen)


Lesenswert?

Lattice User schrieb:
> Steht übrigens auch in deinem ersten Link:
> "In der Ringtheorie wird der Begriff primitives Polynom anders
> verwendet."

Ich weiß, das war ja auch der Grund warum ich es explizit verlinkt habe 
;)

von Lattice User (Gast)


Lesenswert?

Hagen Re schrieb:
> PASCAL ist eine sehr gängige Sprache, was sonst ;)

Vor 30 Jahren :-)

von Hagen R. (hagen)


Lesenswert?

Lattice User schrieb:
> Hagen Re schrieb:
>> PASCAL ist eine sehr gängige Sprache, was sonst ;)
>
> Vor 30 Jahren :-)

naja, ich arbeite für einige deutsche SW-Buden mit markanten 
Marktanteilen die mit Delphi arbeiten und das ist nichts anderes als 
PASCAL, übrigens ist der Source von mir da oben ebenfalls in 
Wirklichkeit ein Delphi Source.

Gruß hagen

von Detlef _. (detlef_a)


Lesenswert?

Wen's interessiert: Angehängt das korrigierte Programm, auch mit XNOR 
Rückkopplung. Es probiert aus, ob ein gegebenes Polynom die MLS erzeugt. 
Das Polynom, das der TO genannt hatte, produziert eine MLS, also kommt 
auch der gesuchte Wert vor.

Danke an die Beteiligten, wieder was dabeigelernt.

Cheers
Detlef

/*******************************************************************/
int main(int  argc , char ** argv)
/*******************************************************************/
{

   unsigned char *f,c;
   unsigned long k,p;

#define NN (28)

f=(char *)malloc(1<<(NN-3));
if(f==NULL){printf("geht nich \n"); return;}

for(k=0;k<(1<<(NN-3));k++) {
  if((k&((1<<16)-1))==0) printf("%d \n",k);
  f[k]=0;
}

//p=0xffffffff;
p=0x0;

for(k=0;k<(1<<NN);k++) {
  if((k&((1<<21)-1))==0) printf("%d \n",(1<<NN)-k);
  p=p&((1<<NN)-1);
  if(p==0x2b0638b) { printf("yo %d %x %x \n",k,p,f[p>>3]); }
  c=f[p>>3]&(unsigned char)(1<<(p&7));
  if(c) { printf("gibbs schon %d %x %x \n",k,p,f[p>>3]); return;}
  f[p>>3] |= (unsigned char)(1<<(p&7));
  //p = (p<<1)|(((p>>27)&1)^((p>>2)&1));
  p = (p<<1)|((~(((p>>27)&1)^((p>>2)&1)))&1);
}

return 0;





}

von Detlef _. (detlef_a)


Lesenswert?

>>(*) The Great Trinomial Hunt (Richard P. Brent, Paul Zimmermann)

Das liest sich spannend, der Zusammenhang zwischen Trinomials und 
Mersenne Primes ist ja auch erstaunlich (für mich zumindest).

x^43112609+x^4463337+1 ist auch primitiv, das gibt schon ordentliche 
Periodenlängen.

math rulez!
Cheers
Detlef

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.