multipoly.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. class Variable:
  2. def __init__(self, name):
  3. self.name = name
  4. def __pow__(self, n):
  5. expr = MultiplyExpression()
  6. expr.set_symbol(self.name, n)
  7. return expr
  8. def termify(self):
  9. expr = MultiplyExpression()
  10. expr.set_symbol(self.name, 1)
  11. return expr
  12. class MultiplyExpression:
  13. def __init__(self):
  14. self.coeff = None
  15. self.symbols = {}
  16. def set_symbol(self, var_name, power):
  17. self.symbols[var_name] = power
  18. def __mul__(self, expr):
  19. result = MultiplyExpression()
  20. result.coeff = self.coeff
  21. result.symbols = self.symbols.copy()
  22. if hasattr(expr, "field"):
  23. if result.coeff is None:
  24. result.coeff = expr
  25. else:
  26. result.coeff *= expr
  27. return result
  28. if isinstance(expr, Variable):
  29. expr = expr.termify()
  30. for var_name, power in expr.symbols.items():
  31. if var_name in result.symbols:
  32. result.symbols[var_name] += power
  33. else:
  34. result.symbols[var_name] = power
  35. return result
  36. def __add__(self, expr):
  37. return MultivariatePolynomial([self, expr])
  38. def __str__(self):
  39. repr = ""
  40. first = True
  41. if self.coeff is not None:
  42. repr += str(self.coeff)
  43. first = False
  44. for var_name, power in self.symbols.items():
  45. if first:
  46. first = False
  47. else:
  48. repr += " "
  49. if power == 1:
  50. repr += var_name
  51. else:
  52. repr += var_name + "^" + str(power)
  53. return repr
  54. class MultivariatePolynomial:
  55. def __init__(self, terms):
  56. self.terms = terms
  57. def __add__(self, term):
  58. if isinstance(term, Variable):
  59. term = term.termify()
  60. result = MultivariatePolynomial(self.terms[:])
  61. result.terms.append(term)
  62. return result
  63. def __str__(self):
  64. repr = ""
  65. first = True
  66. for term in self.terms:
  67. if first:
  68. first = False
  69. else:
  70. repr += " + "
  71. repr += str(term)
  72. return repr
  73. from finite_fields import finitefield
  74. p = 0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001
  75. fp = finitefield.IntegersModP(p)
  76. x = Variable("X")
  77. y = Variable("Y")
  78. z = Variable("Z")
  79. p = x**3 * y**2 * x**2 * fp(5) * fp(2) + x**3 * y + z + fp(6)
  80. print(p)