lfsr 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+ #ifndef LFSR_H
2
+ #define LFSR_H
3
+
4
+ extern const VALUE
5
+
6
+ #endif /* LFSR_H */
@@ -0,0 +1,38 @@
1
+ # encoding: UTF-8
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'lfsr'
5
+ s.version = '1.0.0'
6
+ s.summary = "Generate sequences of pseudo random numbers"
7
+ s.description = <<-EOF
8
+ The generation of random numbers is too important to be left to chance.
9
+ A Linear Feedback Shift Register is an automaton that
10
+ can be used to generate a long sequence of different pseudo-random numbers.
11
+ EOF
12
+ s.email = 'emmanueloga@gmail.com'
13
+ s.homepage = 'http://github.com/EmmanuelOga/lfsr'
14
+ s.authors = ["Emmanuel Oga"]
15
+
16
+ s.files = %w[
17
+ scripts/genc.rb
18
+ scripts/bench
19
+ scripts/genruby.rb
20
+ scripts/taps.rb
21
+ examples/sample.rb
22
+ test/lfsr_test.rb
23
+ LICENSE
24
+ lfsr.gemspec
25
+ ext/lfsr/extconf.rb
26
+ ext/lfsr/lfsr.c
27
+ ext/lfsr/lfsr.h
28
+ Rakefile
29
+ lib/lfsr.rb
30
+ lib/lfsr/fast.rb
31
+ lib/lfsr/pure.rb
32
+ README.markdown
33
+ ]
34
+ s.test_files = ["test/lfsr_test.rb"]
35
+ s.extra_rdoc_files = ["LICENSE"]
36
+ s.extensions = ["ext/lfsr/extconf.rb"]
37
+ s.require_paths = ["lib"]
38
+ end
@@ -0,0 +1,38 @@
1
+ module LFSR
2
+ VERSION = "1.0.0"
3
+
4
+ class Base
5
+ attr_reader :reg
6
+ attr_accessor :max
7
+ attr_reader :seed
8
+
9
+ def initialize(max = nil, seed = nil)
10
+ # The C code depends on this being the first ivar to work properly.
11
+ @reg = 1
12
+
13
+ # This should be the second variable.
14
+ @max = (max || self.class.const_get(:MASK) - 1) + 1
15
+
16
+ reset seed
17
+ end
18
+
19
+ def reset(new_seed)
20
+ @reg = @seed = (new_seed || Time.now.utc.to_i) & self.class.const_get(:MASK)
21
+ raise ArgumentError, "The seed #{new_seed} is unacceptable for this register size" if new_seed && @reg == 0
22
+ @reg = @seed = (new_seed || Time.now.utc.to_i) & self.class.const_get(:MASK) while @reg == 0
23
+ end
24
+
25
+ alias peek reg
26
+ end
27
+
28
+ # Get a LFSR with the appropriate number of bits to reach the maximum needed.
29
+ def self.gen(max, namespace = LFSR)
30
+ bits = Math.log2(max + 2).ceil
31
+ namespace.const_get("Size#{bits < 3 ? 3 : bits}").new(max)
32
+ end
33
+
34
+ def self.default_to(namespace)
35
+ 2.upto(61) { |n| remove_const("Size#{n}")} if defined? LFSR::Size2
36
+ 2.upto(61) { |n| const_set("Size#{n}", namespace.const_get("Size#{n}")) }
37
+ end
38
+ end
@@ -0,0 +1,4 @@
1
+ require 'lfsr'
2
+ require 'lfsr.so'
3
+
4
+ LFSR.default_to(LFSR::Fast)
@@ -0,0 +1,665 @@
1
+ require 'lfsr'
2
+
3
+ module LFSR::Pure
4
+ end
5
+
6
+ class LFSR::Pure::Size2 < LFSR::Base
7
+ MASK = 0x3
8
+
9
+ def next_i
10
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]) << 0x1)
11
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]) << 0x1) while @reg > @max
12
+ @reg - 1
13
+ end
14
+ end
15
+
16
+
17
+ class LFSR::Pure::Size3 < LFSR::Base
18
+ MASK = 0x7
19
+
20
+ def next_i
21
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]) << 0x2)
22
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]) << 0x2) while @reg > @max
23
+ @reg - 1
24
+ end
25
+ end
26
+
27
+
28
+ class LFSR::Pure::Size4 < LFSR::Base
29
+ MASK = 0xf
30
+
31
+ def next_i
32
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]) << 0x3)
33
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]) << 0x3) while @reg > @max
34
+ @reg - 1
35
+ end
36
+ end
37
+
38
+
39
+ class LFSR::Pure::Size5 < LFSR::Base
40
+ MASK = 0x1f
41
+
42
+ def next_i
43
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x4)
44
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x4) while @reg > @max
45
+ @reg - 1
46
+ end
47
+ end
48
+
49
+
50
+ class LFSR::Pure::Size6 < LFSR::Base
51
+ MASK = 0x3f
52
+
53
+ def next_i
54
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0x5)
55
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0x5) while @reg > @max
56
+ @reg - 1
57
+ end
58
+ end
59
+
60
+
61
+ class LFSR::Pure::Size7 < LFSR::Base
62
+ MASK = 0x7f
63
+
64
+ def next_i
65
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x6)
66
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x6) while @reg > @max
67
+ @reg - 1
68
+ end
69
+ end
70
+
71
+
72
+ class LFSR::Pure::Size8 < LFSR::Base
73
+ MASK = 0xff
74
+
75
+ def next_i
76
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[3]^@reg[4]) << 0x7)
77
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[3]^@reg[4]) << 0x7) while @reg > @max
78
+ @reg - 1
79
+ end
80
+ end
81
+
82
+
83
+ class LFSR::Pure::Size9 < LFSR::Base
84
+ MASK = 0x1ff
85
+
86
+ def next_i
87
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0x8)
88
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0x8) while @reg > @max
89
+ @reg - 1
90
+ end
91
+ end
92
+
93
+
94
+ class LFSR::Pure::Size10 < LFSR::Base
95
+ MASK = 0x3ff
96
+
97
+ def next_i
98
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0x9)
99
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0x9) while @reg > @max
100
+ @reg - 1
101
+ end
102
+ end
103
+
104
+
105
+ class LFSR::Pure::Size11 < LFSR::Base
106
+ MASK = 0x7ff
107
+
108
+ def next_i
109
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[4]) << 0xa)
110
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[4]) << 0xa) while @reg > @max
111
+ @reg - 1
112
+ end
113
+ end
114
+
115
+
116
+ class LFSR::Pure::Size12 < LFSR::Base
117
+ MASK = 0xfff
118
+
119
+ def next_i
120
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0xb)
121
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0xb) while @reg > @max
122
+ @reg - 1
123
+ end
124
+ end
125
+
126
+
127
+ class LFSR::Pure::Size13 < LFSR::Base
128
+ MASK = 0x1fff
129
+
130
+ def next_i
131
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0xc)
132
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0xc) while @reg > @max
133
+ @reg - 1
134
+ end
135
+ end
136
+
137
+
138
+ class LFSR::Pure::Size14 < LFSR::Base
139
+ MASK = 0x3fff
140
+
141
+ def next_i
142
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[5]) << 0xd)
143
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[5]) << 0xd) while @reg > @max
144
+ @reg - 1
145
+ end
146
+ end
147
+
148
+
149
+ class LFSR::Pure::Size15 < LFSR::Base
150
+ MASK = 0x7fff
151
+
152
+ def next_i
153
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[4]) << 0xe)
154
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[4]) << 0xe) while @reg > @max
155
+ @reg - 1
156
+ end
157
+ end
158
+
159
+
160
+ class LFSR::Pure::Size16 < LFSR::Base
161
+ MASK = 0xffff
162
+
163
+ def next_i
164
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[3]^@reg[5]) << 0xf)
165
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[3]^@reg[5]) << 0xf) while @reg > @max
166
+ @reg - 1
167
+ end
168
+ end
169
+
170
+
171
+ class LFSR::Pure::Size17 < LFSR::Base
172
+ MASK = 0x1ffff
173
+
174
+ def next_i
175
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x10)
176
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x10) while @reg > @max
177
+ @reg - 1
178
+ end
179
+ end
180
+
181
+
182
+ class LFSR::Pure::Size18 < LFSR::Base
183
+ MASK = 0x3ffff
184
+
185
+ def next_i
186
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[5]) << 0x11)
187
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[5]) << 0x11) while @reg > @max
188
+ @reg - 1
189
+ end
190
+ end
191
+
192
+
193
+ class LFSR::Pure::Size19 < LFSR::Base
194
+ MASK = 0x7ffff
195
+
196
+ def next_i
197
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[5]) << 0x12)
198
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[5]) << 0x12) while @reg > @max
199
+ @reg - 1
200
+ end
201
+ end
202
+
203
+
204
+ class LFSR::Pure::Size20 < LFSR::Base
205
+ MASK = 0xfffff
206
+
207
+ def next_i
208
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0x13)
209
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0x13) while @reg > @max
210
+ @reg - 1
211
+ end
212
+ end
213
+
214
+
215
+ class LFSR::Pure::Size21 < LFSR::Base
216
+ MASK = 0x1fffff
217
+
218
+ def next_i
219
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[5]) << 0x14)
220
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[5]) << 0x14) while @reg > @max
221
+ @reg - 1
222
+ end
223
+ end
224
+
225
+
226
+ class LFSR::Pure::Size22 < LFSR::Base
227
+ MASK = 0x3fffff
228
+
229
+ def next_i
230
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[3]^@reg[4]^@reg[5]) << 0x15)
231
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[3]^@reg[4]^@reg[5]) << 0x15) while @reg > @max
232
+ @reg - 1
233
+ end
234
+ end
235
+
236
+
237
+ class LFSR::Pure::Size23 < LFSR::Base
238
+ MASK = 0x7fffff
239
+
240
+ def next_i
241
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[5]) << 0x16)
242
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[5]) << 0x16) while @reg > @max
243
+ @reg - 1
244
+ end
245
+ end
246
+
247
+
248
+ class LFSR::Pure::Size24 < LFSR::Base
249
+ MASK = 0xffffff
250
+
251
+ def next_i
252
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0x17)
253
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0x17) while @reg > @max
254
+ @reg - 1
255
+ end
256
+ end
257
+
258
+
259
+ class LFSR::Pure::Size25 < LFSR::Base
260
+ MASK = 0x1ffffff
261
+
262
+ def next_i
263
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x18)
264
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x18) while @reg > @max
265
+ @reg - 1
266
+ end
267
+ end
268
+
269
+
270
+ class LFSR::Pure::Size26 < LFSR::Base
271
+ MASK = 0x3ffffff
272
+
273
+ def next_i
274
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[6]) << 0x19)
275
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[6]) << 0x19) while @reg > @max
276
+ @reg - 1
277
+ end
278
+ end
279
+
280
+
281
+ class LFSR::Pure::Size27 < LFSR::Base
282
+ MASK = 0x7ffffff
283
+
284
+ def next_i
285
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[5]) << 0x1a)
286
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[5]) << 0x1a) while @reg > @max
287
+ @reg - 1
288
+ end
289
+ end
290
+
291
+
292
+ class LFSR::Pure::Size28 < LFSR::Base
293
+ MASK = 0xfffffff
294
+
295
+ def next_i
296
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0x1b)
297
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0x1b) while @reg > @max
298
+ @reg - 1
299
+ end
300
+ end
301
+
302
+
303
+ class LFSR::Pure::Size29 < LFSR::Base
304
+ MASK = 0x1fffffff
305
+
306
+ def next_i
307
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[4]) << 0x1c)
308
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[4]) << 0x1c) while @reg > @max
309
+ @reg - 1
310
+ end
311
+ end
312
+
313
+
314
+ class LFSR::Pure::Size30 < LFSR::Base
315
+ MASK = 0x3fffffff
316
+
317
+ def next_i
318
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0x1d)
319
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0x1d) while @reg > @max
320
+ @reg - 1
321
+ end
322
+ end
323
+
324
+
325
+ class LFSR::Pure::Size31 < LFSR::Base
326
+ MASK = 0x7fffffff
327
+
328
+ def next_i
329
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x1e)
330
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x1e) while @reg > @max
331
+ @reg - 1
332
+ end
333
+ end
334
+
335
+
336
+ class LFSR::Pure::Size32 < LFSR::Base
337
+ MASK = 0xffffffff
338
+
339
+ def next_i
340
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[6]^@reg[7]) << 0x1f)
341
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[6]^@reg[7]) << 0x1f) while @reg > @max
342
+ @reg - 1
343
+ end
344
+ end
345
+
346
+
347
+ class LFSR::Pure::Size33 < LFSR::Base
348
+ MASK = 0x1ffffffff
349
+
350
+ def next_i
351
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0x20)
352
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0x20) while @reg > @max
353
+ @reg - 1
354
+ end
355
+ end
356
+
357
+
358
+ class LFSR::Pure::Size34 < LFSR::Base
359
+ MASK = 0x3ffffffff
360
+
361
+ def next_i
362
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[3]^@reg[4]^@reg[8]) << 0x21)
363
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[3]^@reg[4]^@reg[8]) << 0x21) while @reg > @max
364
+ @reg - 1
365
+ end
366
+ end
367
+
368
+
369
+ class LFSR::Pure::Size35 < LFSR::Base
370
+ MASK = 0x7ffffffff
371
+
372
+ def next_i
373
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[7]^@reg[8]) << 0x22)
374
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[7]^@reg[8]) << 0x22) while @reg > @max
375
+ @reg - 1
376
+ end
377
+ end
378
+
379
+
380
+ class LFSR::Pure::Size36 < LFSR::Base
381
+ MASK = 0xfffffffff
382
+
383
+ def next_i
384
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[7]^@reg[8]) << 0x23)
385
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[7]^@reg[8]) << 0x23) while @reg > @max
386
+ @reg - 1
387
+ end
388
+ end
389
+
390
+
391
+ class LFSR::Pure::Size37 < LFSR::Base
392
+ MASK = 0x1fffffffff
393
+
394
+ def next_i
395
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0x24)
396
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[6]) << 0x24) while @reg > @max
397
+ @reg - 1
398
+ end
399
+ end
400
+
401
+
402
+ class LFSR::Pure::Size38 < LFSR::Base
403
+ MASK = 0x3fffffffff
404
+
405
+ def next_i
406
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[5]^@reg[6]) << 0x25)
407
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[5]^@reg[6]) << 0x25) while @reg > @max
408
+ @reg - 1
409
+ end
410
+ end
411
+
412
+
413
+ class LFSR::Pure::Size39 < LFSR::Base
414
+ MASK = 0x7fffffffff
415
+
416
+ def next_i
417
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[7]) << 0x26)
418
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[7]) << 0x26) while @reg > @max
419
+ @reg - 1
420
+ end
421
+ end
422
+
423
+
424
+ class LFSR::Pure::Size40 < LFSR::Base
425
+ MASK = 0xffffffffff
426
+
427
+ def next_i
428
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[3]^@reg[4]^@reg[5]) << 0x27)
429
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[3]^@reg[4]^@reg[5]) << 0x27) while @reg > @max
430
+ @reg - 1
431
+ end
432
+ end
433
+
434
+
435
+ class LFSR::Pure::Size41 < LFSR::Base
436
+ MASK = 0x1ffffffffff
437
+
438
+ def next_i
439
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x28)
440
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[3]) << 0x28) while @reg > @max
441
+ @reg - 1
442
+ end
443
+ end
444
+
445
+
446
+ class LFSR::Pure::Size42 < LFSR::Base
447
+ MASK = 0x3ffffffffff
448
+
449
+ def next_i
450
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[5]^@reg[7]) << 0x29)
451
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[5]^@reg[7]) << 0x29) while @reg > @max
452
+ @reg - 1
453
+ end
454
+ end
455
+
456
+
457
+ class LFSR::Pure::Size43 < LFSR::Base
458
+ MASK = 0x7ffffffffff
459
+
460
+ def next_i
461
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[5]^@reg[6]) << 0x2a)
462
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[5]^@reg[6]) << 0x2a) while @reg > @max
463
+ @reg - 1
464
+ end
465
+ end
466
+
467
+
468
+ class LFSR::Pure::Size44 < LFSR::Base
469
+ MASK = 0xfffffffffff
470
+
471
+ def next_i
472
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[5]^@reg[6]) << 0x2b)
473
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[5]^@reg[6]) << 0x2b) while @reg > @max
474
+ @reg - 1
475
+ end
476
+ end
477
+
478
+
479
+ class LFSR::Pure::Size45 < LFSR::Base
480
+ MASK = 0x1fffffffffff
481
+
482
+ def next_i
483
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0x2c)
484
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[4]) << 0x2c) while @reg > @max
485
+ @reg - 1
486
+ end
487
+ end
488
+
489
+
490
+ class LFSR::Pure::Size46 < LFSR::Base
491
+ MASK = 0x3fffffffffff
492
+
493
+ def next_i
494
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[6]^@reg[7]^@reg[8]) << 0x2d)
495
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[6]^@reg[7]^@reg[8]) << 0x2d) while @reg > @max
496
+ @reg - 1
497
+ end
498
+ end
499
+
500
+
501
+ class LFSR::Pure::Size47 < LFSR::Base
502
+ MASK = 0x7fffffffffff
503
+
504
+ def next_i
505
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[5]) << 0x2e)
506
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[4]^@reg[5]) << 0x2e) while @reg > @max
507
+ @reg - 1
508
+ end
509
+ end
510
+
511
+
512
+ class LFSR::Pure::Size48 < LFSR::Base
513
+ MASK = 0xffffffffffff
514
+
515
+ def next_i
516
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[4]^@reg[7]^@reg[9]) << 0x2f)
517
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[4]^@reg[7]^@reg[9]) << 0x2f) while @reg > @max
518
+ @reg - 1
519
+ end
520
+ end
521
+
522
+
523
+ class LFSR::Pure::Size49 < LFSR::Base
524
+ MASK = 0x1ffffffffffff
525
+
526
+ def next_i
527
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[4]^@reg[5]^@reg[6]) << 0x30)
528
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[4]^@reg[5]^@reg[6]) << 0x30) while @reg > @max
529
+ @reg - 1
530
+ end
531
+ end
532
+
533
+
534
+ class LFSR::Pure::Size50 < LFSR::Base
535
+ MASK = 0x3ffffffffffff
536
+
537
+ def next_i
538
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[3]^@reg[4]) << 0x31)
539
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[3]^@reg[4]) << 0x31) while @reg > @max
540
+ @reg - 1
541
+ end
542
+ end
543
+
544
+
545
+ class LFSR::Pure::Size51 < LFSR::Base
546
+ MASK = 0x7ffffffffffff
547
+
548
+ def next_i
549
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[6]) << 0x32)
550
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[6]) << 0x32) while @reg > @max
551
+ @reg - 1
552
+ end
553
+ end
554
+
555
+
556
+ class LFSR::Pure::Size52 < LFSR::Base
557
+ MASK = 0xfffffffffffff
558
+
559
+ def next_i
560
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[6]) << 0x33)
561
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[3]^@reg[6]) << 0x33) while @reg > @max
562
+ @reg - 1
563
+ end
564
+ end
565
+
566
+
567
+ class LFSR::Pure::Size53 < LFSR::Base
568
+ MASK = 0x1fffffffffffff
569
+
570
+ def next_i
571
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[6]) << 0x34)
572
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[6]) << 0x34) while @reg > @max
573
+ @reg - 1
574
+ end
575
+ end
576
+
577
+
578
+ class LFSR::Pure::Size54 < LFSR::Base
579
+ MASK = 0x3fffffffffffff
580
+
581
+ def next_i
582
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[3]^@reg[6]^@reg[8]) << 0x35)
583
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[3]^@reg[6]^@reg[8]) << 0x35) while @reg > @max
584
+ @reg - 1
585
+ end
586
+ end
587
+
588
+
589
+ class LFSR::Pure::Size55 < LFSR::Base
590
+ MASK = 0x7fffffffffffff
591
+
592
+ def next_i
593
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[6]) << 0x36)
594
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[6]) << 0x36) while @reg > @max
595
+ @reg - 1
596
+ end
597
+ end
598
+
599
+
600
+ class LFSR::Pure::Size56 < LFSR::Base
601
+ MASK = 0xffffffffffffff
602
+
603
+ def next_i
604
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[4]^@reg[7]) << 0x37)
605
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[4]^@reg[7]) << 0x37) while @reg > @max
606
+ @reg - 1
607
+ end
608
+ end
609
+
610
+
611
+ class LFSR::Pure::Size57 < LFSR::Base
612
+ MASK = 0x1ffffffffffffff
613
+
614
+ def next_i
615
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[3]^@reg[5]) << 0x38)
616
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[3]^@reg[5]) << 0x38) while @reg > @max
617
+ @reg - 1
618
+ end
619
+ end
620
+
621
+
622
+ class LFSR::Pure::Size58 < LFSR::Base
623
+ MASK = 0x3ffffffffffffff
624
+
625
+ def next_i
626
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[5]^@reg[6]) << 0x39)
627
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[5]^@reg[6]) << 0x39) while @reg > @max
628
+ @reg - 1
629
+ end
630
+ end
631
+
632
+
633
+ class LFSR::Pure::Size59 < LFSR::Base
634
+ MASK = 0x7ffffffffffffff
635
+
636
+ def next_i
637
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[4]^@reg[7]) << 0x3a)
638
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[4]^@reg[7]) << 0x3a) while @reg > @max
639
+ @reg - 1
640
+ end
641
+ end
642
+
643
+
644
+ class LFSR::Pure::Size60 < LFSR::Base
645
+ MASK = 0xfffffffffffffff
646
+
647
+ def next_i
648
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[4]^@reg[5]) << 0x3b)
649
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[2]^@reg[4]^@reg[5]) << 0x3b) while @reg > @max
650
+ @reg - 1
651
+ end
652
+ end
653
+
654
+
655
+ class LFSR::Pure::Size61 < LFSR::Base
656
+ MASK = 0x1fffffffffffffff
657
+
658
+ def next_i
659
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[5]) << 0x3c)
660
+ @reg = (@reg >> 1) | ((@reg[0]^@reg[1]^@reg[2]^@reg[5]) << 0x3c) while @reg > @max
661
+ @reg - 1
662
+ end
663
+ end
664
+
665
+ LFSR.default_to(LFSR::Pure)