example-construct-2.sage 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. load("div.sage")
  2. # Initialize an elliptic curve
  3. p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
  4. r = 115792089237316195423570985008687907852837564279074904382605163141518161494337
  5. Fp = GF(p) # Base Field
  6. Fr = GF(r) # Scalar Field
  7. A = 0
  8. B = 7
  9. E = EllipticCurve(GF(p), [A, B])
  10. assert(E.cardinality() == r)
  11. K.<x> = PolynomialRing(Fp, implementation="generic")
  12. L.<y> = PolynomialRing(K, implementation="generic")
  13. M.<z> = L[]
  14. eqn = y^2 - x^3 - A * x - B
  15. P1 = LabelPoint(E.random_element(), {"P₁": 1})
  16. P2 = LabelPoint(E.random_element(), {"P₂": 1})
  17. P3 = LabelPoint(E.random_element(), {"P₃": 1})
  18. P4 = LabelPoint(E.random_element(), {"P₄": 1})
  19. Q = -(P1.P + P2.P + P3.P + P4.P)
  20. Q = LabelPoint(Q, {"Q": 1})
  21. assert P1.P + P2.P + P3.P + P4.P + Q.P == E(0)
  22. # Challenge line
  23. A0 = LabelPoint(E.random_element(), {"A₀": 1})
  24. A1 = LabelPoint(E.random_element(), {"A₁": 1})
  25. X1 = div_line(A0, A1)
  26. # First loop in construct
  27. L1 = div_line(P1, P2)
  28. Q1 = P1 + P2
  29. L2 = div_line(P3, P4)
  30. Q2 = P3 + P4
  31. L3 = div_line(Q, -Q)
  32. Q3 = Q
  33. #print(f"L₁ = {L1}")
  34. #print(f"L₂ = {L2}")
  35. #print(f"L₃ = {L3}")
  36. divs = [L1, L2, L3]
  37. # Now apply reduction algo
  38. # len(divs) == 3
  39. D1 = L1
  40. Q1 = Q1
  41. # i = 0
  42. ℓ = div_line(Q2, Q3)
  43. D2 = ℓ + L2 + L3 - div_line(Q2, -Q2) - div_line(Q3, -Q3)
  44. Q2 = Q2 + Q3
  45. divs = [D1, D2]
  46. # len(divs) == 2
  47. ℓ = div_line(Q1, Q2)
  48. D1 = ℓ + D1 + D2 - div_line(Q1, -Q1) - div_line(Q2, -Q2)
  49. Q1 = Q1 + Q2
  50. divs = [D1]
  51. D = D1
  52. assert D.is_equiv({
  53. "P₁": 1,
  54. "P₂": 1,
  55. "P₃": 1,
  56. "P₄": 1,
  57. "Q": 1,
  58. "∞": -5
  59. })
  60. assert X1.eval(D) == (-1)^D.effective_degree() * D.eval(X1)
  61. # We should get the same result here:
  62. load("construct.sage")
  63. points = [P1, P2, P3, P4, Q]
  64. D = construct(points)
  65. print(f"D = {D}")