example-construct-1.sage 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. P0 = LabelPoint(E.random_element(), {"P₀": 1})
  16. P1 = LabelPoint(E.random_element(), {"P₁": 1})
  17. P2 = LabelPoint(E.random_element(), {"P₂": 1})
  18. Q = -int(Fr(5)^-1) * (P0.P + 2*P1.P + 3*P2.P)
  19. Q = LabelPoint(Q, {"Q": 1})
  20. A0 = LabelPoint(E.random_element(), {"A₀": 1})
  21. A1 = LabelPoint(E.random_element(), {"A₁": 1})
  22. X1 = div_line(A0, A1)
  23. # i = 0
  24. L0 = div_line(P0, -P0)
  25. L1 = div_line(P1, -P1)
  26. L2 = div_line(P2, -P2)
  27. L3 = div_line(Q, -Q)
  28. # P₀ + 2P₁ + 3P₂ + 5Q
  29. # i = 1
  30. D1 = div_line(P1, P1)
  31. R1 = P1 + P1
  32. D2 = div_line(P2, P2)
  33. R2 = P2 + P2
  34. D3 = div_line(P2, Q)
  35. R3 = P2 + Q
  36. D4 = div_line(Q, Q)
  37. R4 = Q + Q
  38. D5 = D4
  39. R5 = R4
  40. D6 = L0
  41. R6 = P0
  42. # i = 2
  43. D1 = D1 + D2 + div_line(R1, R2) - (div_line(R1, -R1) + div_line(R2, -R2))
  44. R1 = R1 + R2
  45. D2 = D3 + D4 + div_line(R3, R4) - (div_line(R3, -R3) + div_line(R4, -R4))
  46. R2 = R3 + R4
  47. D3 = D5 + D6 + div_line(R5, R6) - (div_line(R5, -R5) + div_line(R6, -R6))
  48. R3 = R5 + R6
  49. # i = 3
  50. Dx = D1
  51. Rx = R1
  52. D1 = D2 + D3 + div_line(R2, R3) - (div_line(R2, -R2) + div_line(R3, -R3))
  53. R1 = R2 + R3
  54. D2, R2 = Dx, Rx
  55. # i = 4
  56. D = D1 + D2 + div_line(R1, R2) - (div_line(R1, -R1) + div_line(R2, -R2))
  57. assert D.is_equiv({
  58. "P₀": 1,
  59. "P₁": 2,
  60. "P₂": 3,
  61. "Q": 5,
  62. "∞": -11
  63. })
  64. assert X1.eval(D) == (-1)^D.effective_degree() * D.eval(X1)
  65. f_numer = D.func.numerator().mod(eqn)
  66. f_denom = D.func.denominator().mod(eqn)
  67. f = f_numer / f_denom
  68. assert f.denominator() == 1
  69. f = f.numerator()
  70. print(f)
  71. save([P0.P, P1.P, P2.P, Q.P, f], "div.sobj")
  72. print("Saved (P₀, P₁, P₂, Q, f)")