+
+
+def uv2xy(curve, u, v):
+ """Convert twisted Edwards curve U,V coordinates to Weierstrass X,Y
+ """
+ s, t = curve.st()
+ k1 = (s * (1 + v)) % curve.p
+ k2 = curve.pos(1 - v)
+ x = t + k1 * modinvert(k2, curve.p)
+ y = k1 * modinvert(u * k2, curve.p)
+ return x % curve.p, y % curve.p
+
+
+def xy2uv(curve, x, y):
+ """Convert Weierstrass X,Y coordinates to twisted Edwards curve U,V
+ """
+ s, t = curve.st()
+ xmt = curve.pos(x - t)
+ u = xmt * modinvert(y, curve.p)
+ v = curve.pos(xmt - s) * modinvert(xmt + s, curve.p)
+ return u % curve.p, v % curve.p