Advertisement
Guest User

Untitled

a guest
Jun 8th, 2025
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.66 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. # AS-IS.
  4. # Work in progress.  debug code still here.
  5.  
  6. import copy
  7. dbg = 0
  8. class Matrix(object):
  9.     def __init__(self, n):
  10.         self.data = []
  11.         for i in range(n):
  12.             self.data.append([])
  13.             for j in range(n):
  14.                 self.data[-1].append(False)
  15.         global dbg
  16.         dbg = dbg + n*n
  17.     @classmethod
  18.     def fromTaps(self, taps):
  19.         n = max(taps) + 1
  20.         result = Matrix(n)
  21.         for i in range(n-1):
  22.             result.data[i][i+1] = True
  23.         for i in taps:
  24.             result.data[-1][n-1-i] = True
  25.         global dbg
  26.         dbg = dbg + n + len(taps)
  27.         return result
  28.  
  29.     def print(self):
  30.         s = ""
  31.         for row in self.data:
  32.             for element in row:
  33.                 s += "%d "%(1 if element else 0)
  34.             s += "\n"
  35.         print(s)
  36.  
  37.     def mul(self, other):
  38.         element = False
  39.         n = len(self.data)
  40.         result = Matrix(n)
  41.         for r in range(n):
  42.             for c in range(n):
  43.                 element = False
  44.                 for i in range(n):
  45.                     element = (element != (self.data[r][i] and other.data[i][c]))
  46.                 result.data[r][c] = element
  47.         global dbg
  48.         dbg = dbg + n*n*n
  49.         return result
  50.  
  51.     def isIdentity(self):
  52.         n = len(self.data)
  53.         global dbg
  54.         dbg = dbg + n*n
  55.         for r in range(n):
  56.             for c in range(n):
  57.                 if ((r == c) != self.data[r][c]):
  58.                     return False
  59.         return True
  60.  
  61.  
  62. # factors of 2**N - 1
  63. factors = [[1], [3], [7], [3, 5], [31], [3, 7], [127], [3, 5, 17], [7, 73], [3, 11, 31],
  64.     [23, 89], [3, 5, 7, 13], [8191], [3, 43, 127], [7, 31, 151], [3, 5, 17, 257], [131071],
  65.     [3, 7, 19, 73], [524287], [3, 5, 11, 31, 41], [7, 127, 337], [3, 23, 89, 683], [47, 178481],
  66.     [3, 5, 7, 13, 17, 241], [31, 601, 1801], [3, 2731, 8191], [7, 73, 262657],
  67.     [3, 5, 29, 43, 113, 127], [233, 1103, 2089], [3, 7, 11, 31, 151, 331], [2147483647],
  68.     [3, 5, 17, 257, 65537], [7, 23, 89, 599479], [3, 43691, 131071], [31, 71, 127, 122921],
  69.     [3, 5, 7, 13, 19, 37, 73, 109], [223, 616318177], [3, 174763, 524287], [7, 79, 8191, 121369],
  70.     [3, 5, 11, 17, 31, 41, 61681], [13367, 164511353], [3, 7, 43, 127, 337, 5419],
  71.     [431, 9719, 2099863], [3, 5, 23, 89, 397, 683, 2113], [7, 31, 73, 151, 631, 23311],
  72.     [3, 47, 178481, 2796203], [2351, 4513, 13264529], [3, 5, 7, 13, 17, 97, 241, 257, 673],
  73.     [127, 4432676798593], [3, 11, 31, 251, 601, 1801, 4051], [7, 103, 2143, 11119, 131071],
  74.     [3, 5, 53, 157, 1613, 2731, 8191], [6361, 69431, 20394401], [3, 7, 19, 73, 87211, 262657],
  75.     [23, 31, 89, 881, 3191, 201961], [3, 5, 17, 29, 43, 113, 127, 15790321], [7, 32377, 524287, 1212847],
  76.     [3, 59, 233, 1103, 2089, 3033169], [179951, 3203431780337],
  77.     [3, 5, 7, 11, 13, 31, 41, 61, 151, 331, 1321], [2305843009213693951], [3, 715827883, 2147483647],
  78.     [7, 73, 127, 337, 92737, 649657], [3, 5, 17, 257, 641, 65537, 6700417]]
  79.  
  80. cycleTable = [[0]] # 0 indexing, but prefer to use degree.  init a 0th degree element
  81. for i in range(len(factors)):
  82.     v = [2**(i+1) - 1]
  83.     if len(factors[i]) > 1:
  84.         for j in range(len(factors[i])):
  85.             v.append(v[0]//factors[i][j])
  86.     cycleTable.append(v)
  87.  
  88.        
  89.                
  90. def checkTaps(x):
  91.     taps = []
  92.     if type(x) == type([]):
  93.         taps = copy.copy(x)
  94.     else:
  95.         v = x
  96.         i = 0
  97.         while v > 0:
  98.             if (v % 2) == 1:
  99.                 taps.append(i)
  100.             v = v // 2
  101.             i = i + 1
  102.  
  103.     deg = max(taps)+1
  104.     cycles = copy.copy(cycleTable[deg])
  105.  
  106.     x = Matrix.fromTaps(taps)
  107.     mtxs = []
  108.     for i in range(len(cycles)):
  109.         mtxs.append(copy.copy(x))
  110.    
  111.     xval = 1
  112.     for exp in range(max(taps)+1):
  113.         x = x.mul(x)
  114.         xval = xval * 2
  115.         for i in range(len(cycles)):
  116.             cycles[i] = cycles[i] // 2
  117.             if cycles[i] % 2 == 1:
  118.                 mtxs[i] = mtxs[i].mul(x)
  119.  
  120.     if not mtxs[0].isIdentity():
  121.         return -1
  122.  
  123.     for i in range(1, len(cycles)):
  124.         if mtxs[i].isIdentity():
  125.             return -2
  126.     return 1
  127.  
  128.  
  129. maxlen = []
  130. factorlen = []
  131. weirdlen = []
  132. if __name__ == "__main__":
  133.     for t in range(62):
  134.         result = checkTaps([62, t])
  135.         if result > 0:
  136.             print("%d, 62 maximal"%(t))
  137.             maxlen.append("%02x"%t)
  138.         elif result == -2:
  139.             print("%d, 62 factors"%(t))
  140.             factorlen.append("%02x"%t)
  141.         elif result == -1:
  142.             print("%d, 62 nothing"%(t))
  143.             weirdlen.append("%02x"%t)
  144.  
  145. print(maxlen)
  146. print(factorlen)
  147. print(weirdlen)
  148. print(dbg)
  149.        
  150.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement