mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-04-28 03:00:18 -04:00
105 lines
2.5 KiB
Python
105 lines
2.5 KiB
Python
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)
|
|
|