我试图用python编写一个椭圆曲线的简单实现。在
所以我有一个简单的椭圆曲线类:class EllipticCurve:
O ="O";
def __init__(self,a,b):
self.a = a
self.b = b
def __eq__(self, other):
if isinstance(other, EllipticCurve):
return self.a == other.a and self.b == other.b
return NotImplemented
def __ne__(self, other):
result = self.__eq__(other)
if result is NotImplemented:
return result
return not result
@property
def discriminant(self):
return 4*a**3+27*b**2
椭圆曲线上点的一类:
^{pr2}$
虽然我想给它们添加一些功能,但是它们可以处理a,b和x,y的实际整型值
然而,我的问题是当我试图用sympy来表示a,b和x,y时。
理想情况下,我的目标是计算证明椭圆曲线上3个点的结合性质,即(P+Q)+R=P+(Q+R)。在
现在,我可以得到p+Q的正确结果:a,b = symbols('a b')
x1,y1 = symbols('x1 y1')
x2,y2 = symbols('x2 y2')
x3,y3 = symbols('x3 y3')
E = EllipticCurve(a,b)
P = Point(E,x1,y1)
Q = Point(E,x2,y2)
R = Point(E,x3,y3)
P+Q
print(simplify((P+Q).x))
哪些输出,正确地说:-x1 - x2 + (y1 - y2)**2/(x1 - x2)**2
此外,如果我这样做:expr = (P+Q)+R
print(simplify(expr.x))
我也(我认为)正确地得到:x1 + x2 - x3 + (y1 + y3 - (y1 - y2)*(2*x1 + x2 - (y1 - y2)**2/(x1 - x2)**2)/(x1 - x2))**2/(x1 + x2 + x3 - (y1 - y2)**2/(x1 - x2)**2)**2 - (y1 - y2)**2/(x1 - x2)**2
但是,如果我这样做:expr = (P+Q)+R
expr2 = P+(Q+R)
print(simplify((expr-expr2).x))
这需要永远,如果我尝试:expr = (P+Q)+R
expr2 = P+(Q+R)
print((expr-expr2).x)
它还返回一个似乎合理的表达式,我认为是正确的。
但我需要简化它并返回0来证明expr和expr2相等。在
对我做错了什么有什么建议吗?在