summaryrefslogtreecommitdiffstats
path: root/lfsr.py
blob: d40eec4fc59ef9d18cff78a5bf428d4085086ce4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# -*- coding: utf-8 -*-
#
# Linear feedback shift register
# Copyright 2012-2013 Michael Buesch <m@bues.ch>
#
# Licensed under the terms of the GNU General Public License version 2.
#

import random


class LFSR16(object):
	"16-bit Galois linear feedback shift register"

	DEFAULT_INIT	= 0xACE1

	def __init__(self, init=DEFAULT_INIT):
		self.__lfsr = init & 0xFFFF
		assert(self.__lfsr != 0)

	def getBits(self, count):
		ret, lfsr = 0, self.__lfsr
		while count:
			lfsr = (lfsr >> 1) ^ (-(lfsr & 1) & 0xB400)
			ret, count = (ret << 1) | (lfsr & 1), count - 1
		self.__lfsr = lfsr
		return ret

class Simple_PRNG(LFSR16):
	def __init__(self):
		LFSR16.__init__(self, random.randint(1, 0xFFFF))
bues.ch cgit interface