Advertisement
Guest User

Untitled

a guest
Jul 18th, 2019
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. import pyfinite
  2. from pyfinite import ffield
  3.  
  4.  
  5. class FiniteField:
  6.  
  7. def __init__(self, n):
  8. self.n = 2**n
  9. self.F = ffield.FField(n)
  10. print(f"> irreducible polynomial: {self.F.ShowPolynomial(self.F.generator)}")
  11.  
  12. def logarithm(self, alpha, x):
  13. a = alpha
  14. k = 1
  15.  
  16. while a != x:
  17. k += 1
  18. a = self.F.DoMultiply(a, alpha)
  19.  
  20. return k
  21.  
  22. def exponentation(self, x, k):
  23. result = 1
  24. for _ in range(k):
  25. result = self.F.DoMultiply(result, x)
  26.  
  27. return result
  28.  
  29. def calculate_all_generators(self, verbose=False):
  30. generators = []
  31. for alpha in range(2, self.n):
  32. a = alpha
  33. k = 1
  34.  
  35. while a != 1:
  36. k += 1
  37. a = self.F.DoMultiply(a, alpha)
  38.  
  39. if k == self.n - 1:
  40. if verbose:
  41. print(f">> found generator: {self.F.ShowPolynomial(alpha)}")
  42.  
  43. generators.append(alpha)
  44.  
  45. print(f"> found {len(generators)} generators")
  46. return generators
  47.  
  48. def p(self, x):
  49. coefficients = self.F.ShowCoefficients(self.F.generator)
  50. exponents = [k for k, c in enumerate(coefficients[::-1]) if c]
  51.  
  52. result = 0
  53. for k in exponents:
  54. result = self.F.Add(result, self.exponentation(x, k))
  55.  
  56. return result
  57.  
  58. def roots(self, verbose=False):
  59. generators = self.calculate_all_generators()
  60. roots = []
  61. for a in generators:
  62. if self.p(a) == 0:
  63. if verbose:
  64. print(f">> found root of p for a = {self.F.ShowPolynomial(a)}")
  65. roots.append(a)
  66.  
  67. print(f"> found {len(roots)} roots")
  68. return roots
  69.  
  70. def show_polynomial(self, x):
  71. return self.F.ShowPolynomial(x)
  72.  
  73.  
  74. if __name__ == "__main__":
  75. F = FiniteField(8)
  76. roots = F.roots()
  77.  
  78. for x in roots:
  79. print(f">> root: {F.show_polynomial(x)}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement