3.1.3-divlines.sage 696 B

12345678910111213141516171819202122232425262728293031
  1. q = 47
  2. Fq = GF(q)
  3. E = EllipticCurve(Fq, (0, 5))
  4. R.<x, y> = PolynomialRing(Fq)
  5. def add(P, Q):
  6. Px, Py = P[0], P[1]
  7. Qx, Qy = Q[0], Q[1]
  8. # We don't handle this case yet :p
  9. assert Px != Qx
  10. gradient = (Qy - Py) / (Qx - Px)
  11. intersect = Py - gradient * Px
  12. f = y - gradient * x - intersect
  13. assert f(Px, Py) == 0
  14. assert f(Qx, Qy) == 0
  15. R = P + Q
  16. Rx, Ry = R[0], R[1]
  17. assert f(Rx, -Ry) == 0
  18. g = x - Rx
  19. assert g(Rx, Ry) == g(Rx, -Ry) == 0
  20. return f / g
  21. P = E(33, 9)
  22. Q = E(34, 39)
  23. # div(f) = [P] + [Q] - [P + Q] - [∞] ∈ Pic(E)
  24. # = ([P] + [Q] - 2[∞]) - ([P + Q] - [∞])
  25. # => [P] + [Q] - 2[∞] ~ [P + Q] - [∞]
  26. f = add(P, Q)
  27. print(f)