| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- class Variable:
- def __init__(self, name):
- self.name = name
- def __pow__(self, n):
- expr = MultiplyExpression()
- expr.set_symbol(self.name, n)
- return expr
- def termify(self):
- expr = MultiplyExpression()
- expr.set_symbol(self.name, 1)
- return expr
- class MultiplyExpression:
- def __init__(self):
- self.coeff = None
- self.symbols = {}
- def set_symbol(self, var_name, power):
- self.symbols[var_name] = power
- def __mul__(self, expr):
- result = MultiplyExpression()
- result.coeff = self.coeff
- result.symbols = self.symbols.copy()
- if hasattr(expr, "field"):
- if result.coeff is None:
- result.coeff = expr
- else:
- result.coeff *= expr
- return result
- if isinstance(expr, Variable):
- expr = expr.termify()
- for var_name, power in expr.symbols.items():
- if var_name in result.symbols:
- result.symbols[var_name] += power
- else:
- result.symbols[var_name] = power
- return result
- def __add__(self, expr):
- return MultivariatePolynomial([self, expr])
- def __str__(self):
- repr = ""
- first = True
- if self.coeff is not None:
- repr += str(self.coeff)
- first = False
- for var_name, power in self.symbols.items():
- if first:
- first = False
- else:
- repr += " "
- if power == 1:
- repr += var_name
- else:
- repr += var_name + "^" + str(power)
- return repr
- class MultivariatePolynomial:
- def __init__(self, terms):
- self.terms = terms
- def __add__(self, term):
- if isinstance(term, Variable):
- term = term.termify()
- result = MultivariatePolynomial(self.terms[:])
- result.terms.append(term)
- return result
- def __str__(self):
- repr = ""
- first = True
- for term in self.terms:
- if first:
- first = False
- else:
- repr += " + "
- repr += str(term)
- return repr
- from finite_fields import finitefield
- p = 0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001
- fp = finitefield.IntegersModP(p)
- x = Variable("X")
- y = Variable("Y")
- z = Variable("Z")
- p = x**3 * y**2 * x**2 * fp(5) * fp(2) + x**3 * y + z + fp(6)
- print(p)
|