diff --git a/main.py b/main.py index c810f4e..db3b789 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,6 @@ #!/usr/bin/env python3 +from random import randint +from math import log2 class lfsr(object): def __init__(self, state, taps): @@ -28,12 +30,23 @@ class lfsr(object): return output -key=[0]*16 -key.append(1) -taps = [16-0, 16-14] +def test_lfsr17(): + key = [randint(0, 1) for _ in range(16)] # first 16 bits + key.append(1) # prevent initial state from being {0}^17 + taps = [16-0, 16-14] + lfsr17 = lfsr(key, taps) + states = [lfsr17.state] + for _ in range(2**17-2): + lfsr17.shift() + states.append(lfsr17.state) + sorted_states = sorted(states, key=lambda x: tuple(x)) + for i in range(2**17-2): + if sorted_states[i] == sorted_states[i+1]: # compare each state with the next state in the sorted list, if 2 states are identical they should be next to each other + print(f'state {sorted_states[i]} appears at least 2 times') + return False + n_state = len(sorted_states) + n_state_log = log2(n_state+1) + print(f'all {n_state} = 2^({n_state_log})-1 states are different') + return True -lfsr17 = lfsr(key, taps) - -# Generate 100 bits -for _ in range(100): - print(lfsr17.shift(), end=' ') +test_lfsr17()