From 519676afd86e3d6e75e0ee9d5fc620a160999575 Mon Sep 17 00:00:00 2001
From: Sam Hadow <sam.hadow@inbox.lv>
Date: Sun, 21 Apr 2024 15:28:24 +0200
Subject: [PATCH] test lfsr17

---
 main.py | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

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()