construct.sage 980 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. load("div.sage")
  2. def construct(points):
  3. divs = []
  4. for i in range(0, len(points), 2):
  5. # Odd last remainder element
  6. if i + 1 == len(points):
  7. P = points[i]
  8. L = div_line(P, -P)
  9. Q = points[i]
  10. divs.append((Q, L))
  11. break
  12. P1, P2 = points[i], points[i + 1]
  13. L = div_line(P1, P2)
  14. Q = P1 + P2
  15. divs.append((Q, L))
  16. # Now apply reduction algorithm repeatedly
  17. while len(divs) != 1:
  18. divs2 = []
  19. if len(divs) % 2 == 1:
  20. divs2.append(divs[0])
  21. divs = divs[1:]
  22. for i in range(0, len(divs), 2):
  23. assert i + 1 < len(divs)
  24. Q1, L1 = divs[i]
  25. Q2, L2 = divs[i + 1]
  26. ℓ = div_line(Q1, Q2)
  27. L = ℓ + L1 + L2 - div_line(Q1, -Q1) - div_line(Q2, -Q2)
  28. Q = Q1 + Q2
  29. divs2.append((Q, L))
  30. divs = divs2
  31. assert len(divs) == 1
  32. return divs[0][1]