.
import matplotlib.pyplot as plt
import numpy as np
from collections import namedtuple
# Utility type
Point = namedtuple('Point', ['x', 'y'])
d = -30
def edwards_y(x):
return np.sqrt((x*x - 1)/(d*x*x - 1))
# Draw Edwards curve
x = np.linspace(-1,1,200)
ypos = edwards_y(x)
yneg = -ypos
plt.figure(figsize=[6, 6])
plt.plot(x,ypos, 'b')
plt.plot(x,yneg, 'b')
# Draw neutral point
plt.scatter(0,1)
plt.annotate("O", (0.01, 1.01))
# Draw order 2 point
plt.scatter(0,-1)
plt.annotate("O'", (0.01, -1.05))
# Draw the point P
P=Point(-0.6, edwards_y(-0.6))
plt.scatter(*P)
plt.annotate("P", (P.x-0.05, P.y+0.05))
# Compute and draw 2P
def edwards_sum(x1,y1,x2,y2):
return ( (x1*y2+x2*y1)/(1+d*x1*x2*y1*y2) , (y1*y2 - x1*x2)/(1-d*x1*x2*y1*y2) )
P2 = Point(*edwards_sum(*P, *P))
plt.scatter(*P2)
plt.annotate("2P", (P2.x-0.05, P2.y+0.05))
P2_ = Point(-P2.x, P2.y)
plt.scatter(*P2_)
plt.annotate("-2P", (P2_.x+0.01, P2_.y+0.05))
# Draw the line that connects 2P and -2P
plt.axhline(P2.y, linestyle='--', color="grey")
# Draw the conic that P1, P2 and -(P1+P2) belong to
def conic_coefs(x,y):
"Computes coeffitiens of the quadratic form Axy + Bx + Cx + D"
return (d*x*x*y - 1,
y - x*x,
x*(1-y),
x*(1-y)
)
def conic_y(x, A,B,C,D):
return -(B*x + D)/(A*x + C)
A,B,C,D = conic_coefs(*P)
# Left and right branches of the hyperbole
xleft = np.linspace(-1,-0.3,50)
xright = np.linspace(-0.01, 1, 50)
yleft = conic_y(xleft, A,B,C,D)
yright = conic_y(xright, A,B,C,D)
plt.plot(xleft, yleft,"--", color="green")
plt.plot(xright, yright,"--", color="green")
# Draw axis lines
plt.axhline(0, color='black')
plt.axvline(0, color='black')
# Set same scale on x and y
plt.gca().set_aspect('equal', adjustable='box')
plt.savefig("Double_Point_on_Edwards_Curve.svg")