import Mathlib set_option autoImplicit false open Polynomial namespace WeierstrassCurve variable {R : Type*} [CommRing R] noncomputable def hasseInvariant (q : ℕ) (W : WeierstrassCurve R) : R := (W.twoTorsionPolynomial.toPoly ^ ((q - 1) / 2)).coeff (q - 1) def legendreCurve (t : R) : WeierstrassCurve R := ⟨0, -(1 + t), 0, t, 0⟩ end WeierstrassCurve namespace ModularCurve def ssJSetHasse (q : ℕ) (K : Type*) [Field K] : Set K := {j | ∀ (W : WeierstrassCurve K) [W.IsElliptic], W.j = j → W.hasseInvariant q = 0} end ModularCurve