point.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. class Point:
  2. def __init__(self, x, y, curve):
  3. self.x = x
  4. self.y = y
  5. self.curve = curve
  6. def isNone(self):
  7. return self.x is None or self.y is None or self.curve is None
  8. def coords(self):
  9. return self.x, self.y
  10. # Вычисление наклона прямой, проходящей через 2 точки эллиптической кривой
  11. def getIncline(self, point):
  12. m = 0
  13. cur = self.curve
  14. x1, y1 = self.coords()
  15. x2, y2 = point.coords()
  16. if self.x == point.x:
  17. # точки равны.
  18. c = self.curve
  19. m = (3 * x1 * x1 + cur.a) * cur.inverseMod(2 * y1, curve.p)
  20. else:
  21. # точки не равны
  22. m = (y1 - y2) * cur.inverseMod(x1 - x2, cur.p)
  23. return m
  24. # Сложение
  25. def __add__(self, point):
  26. #assert is_on_curve(point1)
  27. #assert is_on_curve(point2)
  28. if self.isNone():
  29. return point
  30. if point.isNone():
  31. return self
  32. if self.x == point.x and self.y != point.y:
  33. # p + (-p) = 0, симметричная точка
  34. return Point()
  35. # вычисление наклона прямой, прходящей через 2 точки
  36. m = self.getIncline(point)
  37. # вычисление результирующих координат
  38. rx = m * m - self.x - point.x
  39. ry = self.y + m * (rx - self.x)
  40. return Point(
  41. curve = self.curve,
  42. x = rx % self.curve.p,
  43. y = -ry % self.curve.p,
  44. )
  45. # Унарный -
  46. def __neg__(self):
  47. return Point(
  48. curve = self.curve,
  49. x = self.x,
  50. y = -self.y % curve.p,
  51. )
  52. # Сравнение
  53. def __eq__(self, point):
  54. # Точки считаются равны при совпадении по оси x
  55. return self.x == point.x