|
| 1 | +R.<x,a> = PolynomialRing(QQ, 'x,a') |
| 2 | + |
| 3 | +def psi2(E, n: int): |
| 4 | + return E.division_polynomial(n, x=x, two_torsion_multiplicity=0) \ |
| 5 | + * E.division_polynomial(n, x=x, two_torsion_multiplicity=2) |
| 6 | + |
| 7 | +def phi(E, n: int): |
| 8 | + first = x * psi2(E, n) |
| 9 | + second = E.division_polynomial(n + 1, x=x, two_torsion_multiplicity=0) \ |
| 10 | + * E.division_polynomial(n - 1, x=x, two_torsion_multiplicity=2) |
| 11 | + return first - second |
| 12 | + |
| 13 | + |
| 14 | +if __name__ == "__main__": |
| 15 | + E = EllipticCurve([0, a, 0, 1, 0]) |
| 16 | + for n in range(2, 10): |
| 17 | + print(f'{n = }') |
| 18 | + if n == 2: |
| 19 | + print(' psi_{2*n}^2 =', psi2(E, 2*n)) |
| 20 | + print(f' phi_{2*n} =', phi(E, 2*n)) |
| 21 | + phi_n = phi(E, n) |
| 22 | + psi_n_2 = psi2(E, n) |
| 23 | + if n == 2: |
| 24 | + print(f' psi_{n}^2 =', psi_n_2) |
| 25 | + print(f' phi_{n} =', phi_n) |
| 26 | + dbl_z = 4 * phi_n * (phi_n * phi_n + a * phi_n * psi_n_2 + psi_n_2 ** 2) * psi_n_2 |
| 27 | + if n == 2: |
| 28 | + print(f' DBL_z(phi_{n}, psi_{n}^2) =', dbl_z) |
| 29 | + print(f' {psi2(E, 2*n) == dbl_z = }') |
| 30 | + dbl_x = (phi_n ** 2 - psi_n_2 ** 2) ** 2 |
| 31 | + if n == 2: |
| 32 | + print(f' DBL_x(phi_{n}, psi_{n}^2) =', dbl_x) |
| 33 | + print(f' {phi(E, 2*n) == dbl_x = }') |
0 commit comments