File: Mathlib/AlgebraicGeometry/EllipticCurve/Weierstrass.lean

full_name: tacticMap_simp._@.Mathlib.AlgebraicGeometry.EllipticCurve.Weierstrass._hyg.3
code: macro "map_simp" : tactic =>
  `(tactic| simp only [map_ofNat, map_neg, map_add, map_sub, map_mul, map_pow])
goal: Lean.ParserDescr

full_name: _aux_Mathlib_AlgebraicGeometry_EllipticCurve_Weierstrass___macroRules_tacticMap_simp_1
code: macro "map_simp" : tactic =>
  `(tactic| simp only [map_ofNat, map_neg, map_add, map_sub, map_mul, map_pow])
goal: Lean.Macro

full_name: WeierstrassCurve.a₃
code: /-- A Weierstrass curve $Y^2 + a_1XY + a_3Y = X^3 + a_2X^2 + a_4X + a_6$ with parameters $a_i$. -/
@[ext]
structure WeierstrassCurve (R : Type u) where
  /-- The `a₁` coefficient of a Weierstrass curve. -/
  a₁ : R
  /-- The `a₂` coefficient of a Weierstrass curve. -/
  a₂ : R
  /-- The `a₃` coefficient of a Weierstrass curve. -/
  a₃ : R
  /-- The `a₄` coefficient of a Weierstrass curve. -/
  a₄ : R
  /-- The `a₆` coefficient of a Weierstrass curve. -/
  a₆ : R
goal: R

full_name: WeierstrassCurve.a₄
code: /-- A Weierstrass curve $Y^2 + a_1XY + a_3Y = X^3 + a_2X^2 + a_4X + a_6$ with parameters $a_i$. -/
@[ext]
structure WeierstrassCurve (R : Type u) where
  /-- The `a₁` coefficient of a Weierstrass curve. -/
  a₁ : R
  /-- The `a₂` coefficient of a Weierstrass curve. -/
  a₂ : R
  /-- The `a₃` coefficient of a Weierstrass curve. -/
  a₃ : R
  /-- The `a₄` coefficient of a Weierstrass curve. -/
  a₄ : R
  /-- The `a₆` coefficient of a Weierstrass curve. -/
  a₆ : R
goal: R

full_name: WeierstrassCurve.a₆
code: /-- A Weierstrass curve $Y^2 + a_1XY + a_3Y = X^3 + a_2X^2 + a_4X + a_6$ with parameters $a_i$. -/
@[ext]
structure WeierstrassCurve (R : Type u) where
  /-- The `a₁` coefficient of a Weierstrass curve. -/
  a₁ : R
  /-- The `a₂` coefficient of a Weierstrass curve. -/
  a₂ : R
  /-- The `a₃` coefficient of a Weierstrass curve. -/
  a₃ : R
  /-- The `a₄` coefficient of a Weierstrass curve. -/
  a₄ : R
  /-- The `a₆` coefficient of a Weierstrass curve. -/
  a₆ : R
goal: R

full_name: WeierstrassCurve.a₂
code: /-- A Weierstrass curve $Y^2 + a_1XY + a_3Y = X^3 + a_2X^2 + a_4X + a_6$ with parameters $a_i$. -/
@[ext]
structure WeierstrassCurve (R : Type u) where
  /-- The `a₁` coefficient of a Weierstrass curve. -/
  a₁ : R
  /-- The `a₂` coefficient of a Weierstrass curve. -/
  a₂ : R
  /-- The `a₃` coefficient of a Weierstrass curve. -/
  a₃ : R
  /-- The `a₄` coefficient of a Weierstrass curve. -/
  a₄ : R
  /-- The `a₆` coefficient of a Weierstrass curve. -/
  a₆ : R
goal: R

full_name: WeierstrassCurve.a₁
code: /-- A Weierstrass curve $Y^2 + a_1XY + a_3Y = X^3 + a_2X^2 + a_4X + a_6$ with parameters $a_i$. -/
@[ext]
structure WeierstrassCurve (R : Type u) where
  /-- The `a₁` coefficient of a Weierstrass curve. -/
  a₁ : R
  /-- The `a₂` coefficient of a Weierstrass curve. -/
  a₂ : R
  /-- The `a₃` coefficient of a Weierstrass curve. -/
  a₃ : R
  /-- The `a₄` coefficient of a Weierstrass curve. -/
  a₄ : R
  /-- The `a₆` coefficient of a Weierstrass curve. -/
  a₆ : R
goal: R

full_name: WeierstrassCurve
code: /-- A Weierstrass curve $Y^2 + a_1XY + a_3Y = X^3 + a_2X^2 + a_4X + a_6$ with parameters $a_i$. -/
@[ext]
structure WeierstrassCurve (R : Type u) where
  /-- The `a₁` coefficient of a Weierstrass curve. -/
  a₁ : R
  /-- The `a₂` coefficient of a Weierstrass curve. -/
  a₂ : R
  /-- The `a₃` coefficient of a Weierstrass curve. -/
  a₃ : R
  /-- The `a₄` coefficient of a Weierstrass curve. -/
  a₄ : R
  /-- The `a₆` coefficient of a Weierstrass curve. -/
  a₆ : R
goal: Type u

full_name: WeierstrassCurve.instInhabited
code: instance instInhabited {R : Type u} [Inhabited R] :
    Inhabited <| WeierstrassCurve R 
goal: Inhabited (WeierstrassCurve R)

full_name: WeierstrassCurve.b₂
code: /-- The `b₂` coefficient of a Weierstrass curve. -/
def b₂ : R 
goal: R

full_name: WeierstrassCurve.b₄
code: /-- The `b₄` coefficient of a Weierstrass curve. -/
def b₄ : R 
goal: R

full_name: WeierstrassCurve.b₆
code: /-- The `b₆` coefficient of a Weierstrass curve. -/
def b₆ : R 
goal: R

full_name: WeierstrassCurve.b₈
code: /-- The `b₈` coefficient of a Weierstrass curve. -/
def b₈ : R 
goal: R

full_name: WeierstrassCurve.b_relation
code: lemma b_relation : 4 * W.b₈ = W.b₂ * W.b₆ - W.b₄ ^ 2 
goal: 4 * W.b₈ = W.b₂ * W.b₆ - W.b₄ ^ 2

full_name: WeierstrassCurve.c₄
code: /-- The `c₄` coefficient of a Weierstrass curve. -/
def c₄ : R 
goal: R

full_name: WeierstrassCurve.c₆
code: /-- The `c₆` coefficient of a Weierstrass curve. -/
def c₆ : R 
goal: R

full_name: WeierstrassCurve.Δ
code: /-- The discriminant `Δ` of a Weierstrass curve. If `R` is a field, then this polynomial vanishes
if and only if the cubic curve cut out by this equation is singular. Sometimes only defined up to
sign in the literature; we choose the sign used by the LMFDB. For more discussion, see
[the LMFDB page on discriminants](https://www.lmfdb.org/knowledge/show/ec.discriminant). -/
def Δ : R 
goal: R

full_name: WeierstrassCurve.c_relation
code: lemma c_relation : 1728 * W.Δ = W.c₄ ^ 3 - W.c₆ ^ 2 
goal: 1728 * W.Δ = W.c₄ ^ 3 - W.c₆ ^ 2

full_name: WeierstrassCurve.VariableChange.u
code: /-- An admissible linear change of variables of Weierstrass curves defined over a ring `R` given by
a tuple $(u, r, s, t)$ for some $u \in R^\times$ and some $r, s, t \in R$. As a matrix, it is
$\begin{pmatrix} u^2 & 0 & r \cr u^2s & u^3 & t \cr 0 & 0 & 1 \end{pmatrix}$. -/
@[ext]
structure VariableChange (R : Type u) [CommRing R] where
  /-- The `u` coefficient of an admissible linear change of variables, which must be a unit. -/
  u : Rˣ
  /-- The `r` coefficient of an admissible linear change of variables. -/
  r : R
  /-- The `s` coefficient of an admissible linear change of variables. -/
  s : R
  /-- The `t` coefficient of an admissible linear change of variables. -/
  t : R
goal: Rˣ

full_name: WeierstrassCurve.VariableChange.s
code: /-- An admissible linear change of variables of Weierstrass curves defined over a ring `R` given by
a tuple $(u, r, s, t)$ for some $u \in R^\times$ and some $r, s, t \in R$. As a matrix, it is
$\begin{pmatrix} u^2 & 0 & r \cr u^2s & u^3 & t \cr 0 & 0 & 1 \end{pmatrix}$. -/
@[ext]
structure VariableChange (R : Type u) [CommRing R] where
  /-- The `u` coefficient of an admissible linear change of variables, which must be a unit. -/
  u : Rˣ
  /-- The `r` coefficient of an admissible linear change of variables. -/
  r : R
  /-- The `s` coefficient of an admissible linear change of variables. -/
  s : R
  /-- The `t` coefficient of an admissible linear change of variables. -/
  t : R
goal: R

full_name: WeierstrassCurve.VariableChange.t
code: /-- An admissible linear change of variables of Weierstrass curves defined over a ring `R` given by
a tuple $(u, r, s, t)$ for some $u \in R^\times$ and some $r, s, t \in R$. As a matrix, it is
$\begin{pmatrix} u^2 & 0 & r \cr u^2s & u^3 & t \cr 0 & 0 & 1 \end{pmatrix}$. -/
@[ext]
structure VariableChange (R : Type u) [CommRing R] where
  /-- The `u` coefficient of an admissible linear change of variables, which must be a unit. -/
  u : Rˣ
  /-- The `r` coefficient of an admissible linear change of variables. -/
  r : R
  /-- The `s` coefficient of an admissible linear change of variables. -/
  s : R
  /-- The `t` coefficient of an admissible linear change of variables. -/
  t : R
goal: R

full_name: WeierstrassCurve.VariableChange
code: /-- An admissible linear change of variables of Weierstrass curves defined over a ring `R` given by
a tuple $(u, r, s, t)$ for some $u \in R^\times$ and some $r, s, t \in R$. As a matrix, it is
$\begin{pmatrix} u^2 & 0 & r \cr u^2s & u^3 & t \cr 0 & 0 & 1 \end{pmatrix}$. -/
@[ext]
structure VariableChange (R : Type u) [CommRing R] where
  /-- The `u` coefficient of an admissible linear change of variables, which must be a unit. -/
  u : Rˣ
  /-- The `r` coefficient of an admissible linear change of variables. -/
  r : R
  /-- The `s` coefficient of an admissible linear change of variables. -/
  s : R
  /-- The `t` coefficient of an admissible linear change of variables. -/
  t : R
goal: Type u

full_name: WeierstrassCurve.VariableChange.r
code: /-- An admissible linear change of variables of Weierstrass curves defined over a ring `R` given by
a tuple $(u, r, s, t)$ for some $u \in R^\times$ and some $r, s, t \in R$. As a matrix, it is
$\begin{pmatrix} u^2 & 0 & r \cr u^2s & u^3 & t \cr 0 & 0 & 1 \end{pmatrix}$. -/
@[ext]
structure VariableChange (R : Type u) [CommRing R] where
  /-- The `u` coefficient of an admissible linear change of variables, which must be a unit. -/
  u : Rˣ
  /-- The `r` coefficient of an admissible linear change of variables. -/
  r : R
  /-- The `s` coefficient of an admissible linear change of variables. -/
  s : R
  /-- The `t` coefficient of an admissible linear change of variables. -/
  t : R
goal: R

full_name: WeierstrassCurve.VariableChange.id
code: /-- The identity linear change of variables given by the identity matrix. -/
def id : VariableChange R 
goal: WeierstrassCurve.VariableChange R

full_name: WeierstrassCurve.VariableChange.comp
code: /-- The composition of two linear changes of variables given by matrix multiplication. -/
def comp : VariableChange R 
goal: WeierstrassCurve.VariableChange R

full_name: WeierstrassCurve.VariableChange.inv
code: /-- The inverse of a linear change of variables given by matrix inversion. -/
def inv : VariableChange R 
goal: WeierstrassCurve.VariableChange R

full_name: WeierstrassCurve.VariableChange.id_comp
code: lemma id_comp (C : VariableChange R) : comp id C = C 
goal: WeierstrassCurve.VariableChange.id.comp C = C

full_name: WeierstrassCurve.VariableChange.comp_id
code: lemma comp_id (C : VariableChange R) : comp C id = C 
goal: C.comp WeierstrassCurve.VariableChange.id = C

full_name: WeierstrassCurve.VariableChange.comp_left_inv
code: lemma comp_left_inv (C : VariableChange R) : comp (inv C) C = id 
goal: C.inv.comp C = WeierstrassCurve.VariableChange.id

full_name: WeierstrassCurve.VariableChange.comp_assoc
code: lemma comp_assoc (C C' C'' : VariableChange R) : comp (comp C C') C'' = comp C (comp C' C'') 
goal: (C.comp C').comp C'' = C.comp (C'.comp C'')

full_name: WeierstrassCurve.VariableChange.instGroup
code: instance instGroup : Group (VariableChange R) 
goal: Group (WeierstrassCurve.VariableChange R)

full_name: WeierstrassCurve.variableChange_a₂
code: /-- The Weierstrass curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$. -/
@[simps]
def variableChange : WeierstrassCurve R 
goal: (W.variableChange C).a₂ = ↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2)

full_name: WeierstrassCurve.variableChange_a₃
code: /-- The Weierstrass curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$. -/
@[simps]
def variableChange : WeierstrassCurve R 
goal: (W.variableChange C).a₃ = ↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)

full_name: WeierstrassCurve.variableChange_a₁
code: /-- The Weierstrass curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$. -/
@[simps]
def variableChange : WeierstrassCurve R 
goal: (W.variableChange C).a₁ = ↑C.u⁻¹ * (W.a₁ + 2 * C.s)

full_name: WeierstrassCurve.variableChange_a₄
code: /-- The Weierstrass curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$. -/
@[simps]
def variableChange : WeierstrassCurve R 
goal: (W.variableChange C).a₄ =
  ↑C.u⁻¹ ^ 4 * (W.a₄ - C.s * W.a₃ + 2 * C.r * W.a₂ - (C.t + C.r * C.s) * W.a₁ + 3 * C.r ^ 2 - 2 * C.s * C.t)

full_name: WeierstrassCurve.variableChange
code: /-- The Weierstrass curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$. -/
@[simps]
def variableChange : WeierstrassCurve R 
goal: WeierstrassCurve R

full_name: WeierstrassCurve.variableChange_a₆
code: /-- The Weierstrass curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$. -/
@[simps]
def variableChange : WeierstrassCurve R 
goal: (W.variableChange C).a₆ =
  ↑C.u⁻¹ ^ 6 * (W.a₆ + C.r * W.a₄ + C.r ^ 2 * W.a₂ + C.r ^ 3 - C.t * W.a₃ - C.t ^ 2 - C.r * C.t * W.a₁)

full_name: WeierstrassCurve.variableChange_id
code: lemma variableChange_id : W.variableChange VariableChange.id = W 
goal: W.variableChange WeierstrassCurve.VariableChange.id = W

full_name: WeierstrassCurve.variableChange_comp
code: lemma variableChange_comp (C C' : VariableChange R) (W : WeierstrassCurve R) :
    W.variableChange (C.comp C') = (W.variableChange C').variableChange C 
goal: W.variableChange (C.comp C') = (W.variableChange C').variableChange C

full_name: WeierstrassCurve.instMulActionVariableChange
code: instance instMulActionVariableChange : MulAction (VariableChange R) (WeierstrassCurve R) 
goal: MulAction (WeierstrassCurve.VariableChange R) (WeierstrassCurve R)

full_name: WeierstrassCurve.variableChange_b₂
code: @[simp]
lemma variableChange_b₂ : (W.variableChange C).b₂ = C.u⁻¹ ^ 2 * (W.b₂ + 12 * C.r) 
goal: (W.variableChange C).b₂ = ↑C.u⁻¹ ^ 2 * (W.b₂ + 12 * C.r)

full_name: WeierstrassCurve.variableChange_b₄
code: @[simp]
lemma variableChange_b₄ :
    (W.variableChange C).b₄ = C.u⁻¹ ^ 4 * (W.b₄ + C.r * W.b₂ + 6 * C.r ^ 2) 
goal: (W.variableChange C).b₄ = ↑C.u⁻¹ ^ 4 * (W.b₄ + C.r * W.b₂ + 6 * C.r ^ 2)

full_name: WeierstrassCurve.variableChange_b₆
code: @[simp]
lemma variableChange_b₆ : (W.variableChange C).b₆ =
    C.u⁻¹ ^ 6 * (W.b₆ + 2 * C.r * W.b₄ + C.r ^ 2 * W.b₂ + 4 * C.r ^ 3) 
goal: (W.variableChange C).b₆ = ↑C.u⁻¹ ^ 6 * (W.b₆ + 2 * C.r * W.b₄ + C.r ^ 2 * W.b₂ + 4 * C.r ^ 3)

full_name: WeierstrassCurve.variableChange_b₈
code: @[simp]
lemma variableChange_b₈ : (W.variableChange C).b₈ = C.u⁻¹ ^ 8 *
    (W.b₈ + 3 * C.r * W.b₆ + 3 * C.r ^ 2 * W.b₄ + C.r ^ 3 * W.b₂ + 3 * C.r ^ 4) 
goal: (W.variableChange C).b₈ = ↑C.u⁻¹ ^ 8 * (W.b₈ + 3 * C.r * W.b₆ + 3 * C.r ^ 2 * W.b₄ + C.r ^ 3 * W.b₂ + 3 * C.r ^ 4)

full_name: WeierstrassCurve.variableChange_c₄
code: @[simp]
lemma variableChange_c₄ : (W.variableChange C).c₄ = C.u⁻¹ ^ 4 * W.c₄ 
goal: (W.variableChange C).c₄ = ↑C.u⁻¹ ^ 4 * W.c₄

full_name: WeierstrassCurve.variableChange_c₆
code: @[simp]
lemma variableChange_c₆ : (W.variableChange C).c₆ = C.u⁻¹ ^ 6 * W.c₆ 
goal: (W.variableChange C).c₆ = ↑C.u⁻¹ ^ 6 * W.c₆

full_name: WeierstrassCurve.variableChange_Δ
code: @[simp]
lemma variableChange_Δ : (W.variableChange C).Δ = C.u⁻¹ ^ 12 * W.Δ 
goal: (W.variableChange C).Δ = ↑C.u⁻¹ ^ 12 * W.Δ

full_name: WeierstrassCurve.map_a₃
code: /-- The Weierstrass curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps]
def map : WeierstrassCurve A 
goal: (W.map φ).a₃ = φ W.a₃

full_name: WeierstrassCurve.map_a₆
code: /-- The Weierstrass curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps]
def map : WeierstrassCurve A 
goal: (W.map φ).a₆ = φ W.a₆

full_name: WeierstrassCurve.map_a₄
code: /-- The Weierstrass curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps]
def map : WeierstrassCurve A 
goal: (W.map φ).a₄ = φ W.a₄

full_name: WeierstrassCurve.map_a₁
code: /-- The Weierstrass curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps]
def map : WeierstrassCurve A 
goal: (W.map φ).a₁ = φ W.a₁

full_name: WeierstrassCurve.map
code: /-- The Weierstrass curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps]
def map : WeierstrassCurve A 
goal: WeierstrassCurve A

full_name: WeierstrassCurve.map_a₂
code: /-- The Weierstrass curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps]
def map : WeierstrassCurve A 
goal: (W.map φ).a₂ = φ W.a₂

full_name: WeierstrassCurve.baseChange
code: /-- The Weierstrass curve base changed to an algebra `A` over `R`. -/
abbrev baseChange [Algebra R A] : WeierstrassCurve A 
goal: WeierstrassCurve A

full_name: WeierstrassCurve.map_b₂
code: @[simp]
lemma map_b₂ : (W.map φ).b₂ = φ W.b₂ 
goal: (W.map φ).b₂ = φ W.b₂

full_name: WeierstrassCurve.map_b₄
code: @[simp]
lemma map_b₄ : (W.map φ).b₄ = φ W.b₄ 
goal: (W.map φ).b₄ = φ W.b₄

full_name: WeierstrassCurve.map_b₆
code: @[simp]
lemma map_b₆ : (W.map φ).b₆ = φ W.b₆ 
goal: (W.map φ).b₆ = φ W.b₆

full_name: WeierstrassCurve.map_b₈
code: @[simp]
lemma map_b₈ : (W.map φ).b₈ = φ W.b₈ 
goal: (W.map φ).b₈ = φ W.b₈

full_name: WeierstrassCurve.map_c₄
code: @[simp]
lemma map_c₄ : (W.map φ).c₄ = φ W.c₄ 
goal: (W.map φ).c₄ = φ W.c₄

full_name: WeierstrassCurve.map_c₆
code: @[simp]
lemma map_c₆ : (W.map φ).c₆ = φ W.c₆ 
goal: (W.map φ).c₆ = φ W.c₆

full_name: WeierstrassCurve.map_Δ
code: @[simp]
lemma map_Δ : (W.map φ).Δ = φ W.Δ 
goal: (W.map φ).Δ = φ W.Δ

full_name: WeierstrassCurve.map_id
code: @[simp]
lemma map_id : W.map (RingHom.id R) = W 
goal: W.map (RingHom.id R) = W

full_name: WeierstrassCurve.map_map
code: lemma map_map {B : Type w} [CommRing B] (ψ : A →+* B) : (W.map φ).map ψ = W.map (ψ.comp φ) 
goal: (W.map φ).map ψ = W.map (ψ.comp φ)

full_name: WeierstrassCurve.map_baseChange
code: @[simp]
lemma map_baseChange {S : Type s} [CommRing S] [Algebra R S] {A : Type v} [CommRing A] [Algebra R A]
    [Algebra S A] [IsScalarTower R S A] {B : Type w} [CommRing B] [Algebra R B] [Algebra S B]
    [IsScalarTower R S B] (ψ : A →ₐ[S] B) : (W.baseChange A).map ψ = W.baseChange B 
goal: (W.baseChange A).map ↑ψ = W.baseChange B

full_name: WeierstrassCurve.map_injective
code: lemma map_injective {φ : R →+* A} (hφ : Function.Injective φ) :
    Function.Injective <| map (φ := φ) 
goal: Function.Injective fun W => W.map φ

full_name: WeierstrassCurve.VariableChange.map_t
code: /-- The change of variables mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps]
def map : VariableChange A 
goal: (WeierstrassCurve.VariableChange.map φ C).t = φ C.t

full_name: WeierstrassCurve.VariableChange.map_r
code: /-- The change of variables mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps]
def map : VariableChange A 
goal: (WeierstrassCurve.VariableChange.map φ C).r = φ C.r

full_name: WeierstrassCurve.VariableChange.map_s
code: /-- The change of variables mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps]
def map : VariableChange A 
goal: (WeierstrassCurve.VariableChange.map φ C).s = φ C.s

full_name: WeierstrassCurve.VariableChange.map
code: /-- The change of variables mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps]
def map : VariableChange A 
goal: WeierstrassCurve.VariableChange A

full_name: WeierstrassCurve.VariableChange.map_u
code: /-- The change of variables mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps]
def map : VariableChange A 
goal: (WeierstrassCurve.VariableChange.map φ C).u = (Units.map ↑φ) C.u

full_name: WeierstrassCurve.VariableChange.baseChange
code: /-- The change of variables base changed to an algebra `A` over `R`. -/
abbrev baseChange [Algebra R A] : VariableChange A 
goal: WeierstrassCurve.VariableChange A

full_name: WeierstrassCurve.VariableChange.map_id
code: @[simp]
lemma map_id : C.map (RingHom.id R) = C 
goal: WeierstrassCurve.VariableChange.map (RingHom.id R) C = C

full_name: WeierstrassCurve.VariableChange.map_map
code: lemma map_map {A : Type v} [CommRing A] (φ : R →+* A) {B : Type w} [CommRing B] (ψ : A →+* B) :
    (C.map φ).map ψ = C.map (ψ.comp φ) 
goal: WeierstrassCurve.VariableChange.map ψ (WeierstrassCurve.VariableChange.map φ C) =
  WeierstrassCurve.VariableChange.map (ψ.comp φ) C

full_name: WeierstrassCurve.VariableChange.map_baseChange
code: @[simp]
lemma map_baseChange {S : Type s} [CommRing S] [Algebra R S] {A : Type v} [CommRing A] [Algebra R A]
    [Algebra S A] [IsScalarTower R S A] {B : Type w} [CommRing B] [Algebra R B] [Algebra S B]
    [IsScalarTower R S B] (ψ : A →ₐ[S] B) : (C.baseChange A).map ψ = C.baseChange B 
goal: WeierstrassCurve.VariableChange.map (↑ψ) (WeierstrassCurve.VariableChange.baseChange A C) =
  WeierstrassCurve.VariableChange.baseChange B C

full_name: WeierstrassCurve.VariableChange.map_injective
code: lemma map_injective {φ : R →+* A} (hφ : Function.Injective φ) :
    Function.Injective <| map (φ := φ) 
goal: Function.Injective (WeierstrassCurve.VariableChange.map φ)

full_name: _private.Mathlib.AlgebraicGeometry.EllipticCurve.Weierstrass.0.WeierstrassCurve.VariableChange.id_map
code: private lemma id_map : (id : VariableChange R).map φ = id 
goal: WeierstrassCurve.VariableChange.map φ WeierstrassCurve.VariableChange.id = WeierstrassCurve.VariableChange.id

full_name: _private.Mathlib.AlgebraicGeometry.EllipticCurve.Weierstrass.0.WeierstrassCurve.VariableChange.comp_map
code: private lemma comp_map (C' : VariableChange R) : (C.comp C').map φ = (C.map φ).comp (C'.map φ) 
goal: WeierstrassCurve.VariableChange.map φ (C.comp C') =
  (WeierstrassCurve.VariableChange.map φ C).comp (WeierstrassCurve.VariableChange.map φ C')

full_name: WeierstrassCurve.VariableChange.mapHom
code: /-- The map over a ring homomorphism of a change of variables is a group homomorphism. -/
def mapHom : VariableChange R →* VariableChange A 
goal: WeierstrassCurve.VariableChange R →* WeierstrassCurve.VariableChange A

full_name: WeierstrassCurve.map_variableChange
code: lemma map_variableChange (C : VariableChange R) :
    (W.map φ).variableChange (C.map φ) = (W.variableChange C).map φ 
goal: (W.map φ).variableChange (WeierstrassCurve.VariableChange.map φ C) = (W.variableChange C).map φ

full_name: WeierstrassCurve.twoTorsionPolynomial
code: /-- A cubic polynomial whose discriminant is a multiple of the Weierstrass curve discriminant. If
`W` is an elliptic curve over a field `R` of characteristic different from 2, then its roots over a
splitting field of `R` are precisely the $X$-coordinates of the non-zero 2-torsion points of `W`. -/
def twoTorsionPolynomial : Cubic R 
goal: Cubic R

full_name: WeierstrassCurve.twoTorsionPolynomial_disc
code: lemma twoTorsionPolynomial_disc : W.twoTorsionPolynomial.disc = 16 * W.Δ 
goal: W.twoTorsionPolynomial.disc = 16 * W.Δ

full_name: WeierstrassCurve.twoTorsionPolynomial_disc_isUnit
code: lemma twoTorsionPolynomial_disc_isUnit [Invertible (2 : R)] :
    IsUnit W.twoTorsionPolynomial.disc ↔ IsUnit W.Δ 
goal: IsUnit W.twoTorsionPolynomial.disc ↔ IsUnit W.Δ

full_name: WeierstrassCurve.twoTorsionPolynomial_disc_ne_zero
code: lemma twoTorsionPolynomial_disc_ne_zero [Nontrivial R] [Invertible (2 : R)] (hΔ : IsUnit W.Δ) :
    W.twoTorsionPolynomial.disc ≠ 0 
goal: W.twoTorsionPolynomial.disc ≠ 0

full_name: WeierstrassCurve.ofJ0
code: /-- The Weierstrass curve $Y^2 + Y = X^3$. It is of j-invariant 0 if it is an elliptic curve. -/
def ofJ0 : WeierstrassCurve R 
goal: WeierstrassCurve R

full_name: WeierstrassCurve.ofJ0_c₄
code: lemma ofJ0_c₄ : (ofJ0 R).c₄ = 0 
goal: (WeierstrassCurve.ofJ0 R).c₄ = 0

full_name: WeierstrassCurve.ofJ0_Δ
code: lemma ofJ0_Δ : (ofJ0 R).Δ = -27 
goal: (WeierstrassCurve.ofJ0 R).Δ = -27

full_name: WeierstrassCurve.ofJ1728
code: /-- The Weierstrass curve $Y^2 = X^3 + X$. It is of j-invariant 1728 if it is an elliptic curve. -/
def ofJ1728 : WeierstrassCurve R 
goal: WeierstrassCurve R

full_name: WeierstrassCurve.ofJ1728_c₄
code: lemma ofJ1728_c₄ : (ofJ1728 R).c₄ = -48 
goal: (WeierstrassCurve.ofJ1728 R).c₄ = -48

full_name: WeierstrassCurve.ofJ1728_Δ
code: lemma ofJ1728_Δ : (ofJ1728 R).Δ = -64 
goal: (WeierstrassCurve.ofJ1728 R).Δ = -64

full_name: WeierstrassCurve.ofJ
code: /-- The Weierstrass curve $Y^2 + (j - 1728)XY = X^3 - 36(j - 1728)^3X - (j - 1728)^5$.
It is of j-invariant j if it is an elliptic curve. -/
def ofJ : WeierstrassCurve R 
goal: WeierstrassCurve R

full_name: WeierstrassCurve.ofJ_c₄
code: lemma ofJ_c₄ : (ofJ j).c₄ = j * (j - 1728) ^ 3 
goal: (WeierstrassCurve.ofJ j).c₄ = j * (j - 1728) ^ 3

full_name: WeierstrassCurve.ofJ_Δ
code: lemma ofJ_Δ : (ofJ j).Δ = j ^ 2 * (j - 1728) ^ 9 
goal: (WeierstrassCurve.ofJ j).Δ = j ^ 2 * (j - 1728) ^ 9

full_name: EllipticCurve.Δ'
code: /-- An elliptic curve over a commutative ring. Note that this definition is only mathematically
accurate for certain rings whose Picard group has trivial 12-torsion, such as a field or a PID. -/
@[ext]
structure EllipticCurve (R : Type u) [CommRing R] extends WeierstrassCurve R where
  /-- The discriminant `Δ'` of an elliptic curve over `R`, which is given as a unit in `R`. -/
  Δ' : Rˣ
  /-- The discriminant of `E` is equal to the discriminant of `E` as a Weierstrass curve. -/
  coe_Δ' : Δ' = toWeierstrassCurve.Δ
goal: Rˣ

full_name: EllipticCurve.coe_Δ'
code: /-- An elliptic curve over a commutative ring. Note that this definition is only mathematically
accurate for certain rings whose Picard group has trivial 12-torsion, such as a field or a PID. -/
@[ext]
structure EllipticCurve (R : Type u) [CommRing R] extends WeierstrassCurve R where
  /-- The discriminant `Δ'` of an elliptic curve over `R`, which is given as a unit in `R`. -/
  Δ' : Rˣ
  /-- The discriminant of `E` is equal to the discriminant of `E` as a Weierstrass curve. -/
  coe_Δ' : Δ' = toWeierstrassCurve.Δ
goal: ↑self.Δ' = self.Δ

full_name: EllipticCurve
code: /-- An elliptic curve over a commutative ring. Note that this definition is only mathematically
accurate for certain rings whose Picard group has trivial 12-torsion, such as a field or a PID. -/
@[ext]
structure EllipticCurve (R : Type u) [CommRing R] extends WeierstrassCurve R where
  /-- The discriminant `Δ'` of an elliptic curve over `R`, which is given as a unit in `R`. -/
  Δ' : Rˣ
  /-- The discriminant of `E` is equal to the discriminant of `E` as a Weierstrass curve. -/
  coe_Δ' : Δ' = toWeierstrassCurve.Δ
goal: Type u

full_name: EllipticCurve.j
code: /-- The j-invariant `j` of an elliptic curve, which is invariant under isomorphisms over `R`. -/
def j : R 
goal: R

full_name: EllipticCurve.twoTorsionPolynomial_disc_ne_zero
code: lemma twoTorsionPolynomial_disc_ne_zero [Nontrivial R] [Invertible (2 : R)] :
    E.twoTorsionPolynomial.disc ≠ 0 
goal: E.twoTorsionPolynomial.disc ≠ 0

full_name: EllipticCurve.variableChange_a₄
code: /-- The elliptic curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$.
When `R` is a field, any two Weierstrass equations isomorphic to `E` are related by this. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def variableChange : EllipticCurve R 
goal: (E.variableChange C).a₄ =
  ↑C.u⁻¹ ^ 4 * (E.a₄ - C.s * E.a₃ + 2 * C.r * E.a₂ - (C.t + C.r * C.s) * E.a₁ + 3 * C.r ^ 2 - 2 * C.s * C.t)

full_name: EllipticCurve.variableChange_toWeierstrassCurve
code: /-- The elliptic curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$.
When `R` is a field, any two Weierstrass equations isomorphic to `E` are related by this. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def variableChange : EllipticCurve R 
goal: (E.variableChange C).toWeierstrassCurve = E.variableChange C

full_name: EllipticCurve.variableChange
code: /-- The elliptic curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$.
When `R` is a field, any two Weierstrass equations isomorphic to `E` are related by this. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def variableChange : EllipticCurve R 
goal: EllipticCurve R

full_name: EllipticCurve.variableChange_Δ'
code: /-- The elliptic curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$.
When `R` is a field, any two Weierstrass equations isomorphic to `E` are related by this. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def variableChange : EllipticCurve R 
goal: (E.variableChange C).Δ' = C.u⁻¹ ^ 12 * E.Δ'

full_name: EllipticCurve.variableChange_a₃
code: /-- The elliptic curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$.
When `R` is a field, any two Weierstrass equations isomorphic to `E` are related by this. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def variableChange : EllipticCurve R 
goal: (E.variableChange C).a₃ = ↑C.u⁻¹ ^ 3 * (E.a₃ + C.r * E.a₁ + 2 * C.t)

full_name: EllipticCurve.variableChange_a₁
code: /-- The elliptic curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$.
When `R` is a field, any two Weierstrass equations isomorphic to `E` are related by this. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def variableChange : EllipticCurve R 
goal: (E.variableChange C).a₁ = ↑C.u⁻¹ * (E.a₁ + 2 * C.s)

full_name: EllipticCurve.variableChange_a₂
code: /-- The elliptic curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$.
When `R` is a field, any two Weierstrass equations isomorphic to `E` are related by this. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def variableChange : EllipticCurve R 
goal: (E.variableChange C).a₂ = ↑C.u⁻¹ ^ 2 * (E.a₂ - C.s * E.a₁ + 3 * C.r - C.s ^ 2)

full_name: EllipticCurve.variableChange_a₆
code: /-- The elliptic curve over `R` induced by an admissible linear change of variables
$(X, Y) \mapsto (u^2X + r, u^3Y + u^2sX + t)$ for some $u \in R^\times$ and some $r, s, t \in R$.
When `R` is a field, any two Weierstrass equations isomorphic to `E` are related by this. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def variableChange : EllipticCurve R 
goal: (E.variableChange C).a₆ =
  ↑C.u⁻¹ ^ 6 * (E.a₆ + C.r * E.a₄ + C.r ^ 2 * E.a₂ + C.r ^ 3 - C.t * E.a₃ - C.t ^ 2 - C.r * C.t * E.a₁)

full_name: EllipticCurve.variableChange_id
code: lemma variableChange_id : E.variableChange WeierstrassCurve.VariableChange.id = E 
goal: E.variableChange WeierstrassCurve.VariableChange.id = E

full_name: EllipticCurve.variableChange_comp
code: lemma variableChange_comp (C C' : WeierstrassCurve.VariableChange R) (E : EllipticCurve R) :
    E.variableChange (C.comp C') = (E.variableChange C').variableChange C 
goal: E.variableChange (C.comp C') = (E.variableChange C').variableChange C

full_name: EllipticCurve.instMulActionVariableChange
code: instance instMulActionVariableChange :
    MulAction (WeierstrassCurve.VariableChange R) (EllipticCurve R) 
goal: MulAction (WeierstrassCurve.VariableChange R) (EllipticCurve R)

full_name: EllipticCurve.coe_variableChange_Δ'
code: lemma coe_variableChange_Δ' : (E.variableChange C).Δ' = C.u⁻¹ ^ 12 * E.Δ' 
goal: (E.variableChange C).Δ' = C.u⁻¹ ^ 12 * E.Δ'

full_name: EllipticCurve.coe_inv_variableChange_Δ'
code: lemma coe_inv_variableChange_Δ' : (E.variableChange C).Δ'⁻¹ = C.u ^ 12 * E.Δ'⁻¹ 
goal: (E.variableChange C).Δ'⁻¹ = C.u ^ 12 * E.Δ'⁻¹

full_name: EllipticCurve.variableChange_j
code: @[simp]
lemma variableChange_j : (E.variableChange C).j = E.j 
goal: (E.variableChange C).j = E.j

full_name: EllipticCurve.map_a₆
code: /-- The elliptic curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def map : EllipticCurve A 
goal: (E.map φ).a₆ = φ E.a₆

full_name: EllipticCurve.map_a₄
code: /-- The elliptic curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def map : EllipticCurve A 
goal: (E.map φ).a₄ = φ E.a₄

full_name: EllipticCurve.map_a₂
code: /-- The elliptic curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def map : EllipticCurve A 
goal: (E.map φ).a₂ = φ E.a₂

full_name: EllipticCurve.map_toWeierstrassCurve
code: /-- The elliptic curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def map : EllipticCurve A 
goal: (E.map φ).toWeierstrassCurve = E.map φ

full_name: EllipticCurve.map_Δ'
code: /-- The elliptic curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def map : EllipticCurve A 
goal: (E.map φ).Δ' = (Units.map ↑φ) E.Δ'

full_name: EllipticCurve.map
code: /-- The elliptic curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def map : EllipticCurve A 
goal: EllipticCurve A

full_name: EllipticCurve.map_a₁
code: /-- The elliptic curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def map : EllipticCurve A 
goal: (E.map φ).a₁ = φ E.a₁

full_name: EllipticCurve.map_a₃
code: /-- The elliptic curve mapped over a ring homomorphism `φ : R →+* A`. -/
@[simps (config := { rhsMd := .default }) a₁ a₂ a₃ a₄ a₆ Δ' toWeierstrassCurve]
def map : EllipticCurve A 
goal: (E.map φ).a₃ = φ E.a₃

full_name: EllipticCurve.baseChange
code: /-- The elliptic curve base changed to an algebra `A` over `R`. -/
abbrev baseChange [Algebra R A] : EllipticCurve A 
goal: EllipticCurve A

full_name: EllipticCurve.coe_map_Δ'
code: lemma coe_map_Δ' : (E.map φ).Δ' = φ E.Δ' 
goal: ↑(E.map φ).Δ' = φ ↑E.Δ'

full_name: EllipticCurve.coe_inv_map_Δ'
code: lemma coe_inv_map_Δ' : (E.map φ).Δ'⁻¹ = φ ↑E.Δ'⁻¹ 
goal: ↑(E.map φ).Δ'⁻¹ = φ ↑E.Δ'⁻¹

full_name: EllipticCurve.map_j
code: @[simp]
lemma map_j : (E.map φ).j = φ E.j 
goal: (E.map φ).j = φ E.j

full_name: EllipticCurve.map_injective
code: lemma map_injective {φ : R →+* A} (hφ : Function.Injective φ) :
    Function.Injective <| map (φ := φ) 
goal: Function.Injective fun E => E.map φ

full_name: EllipticCurve.ofJ0
code: /-- When 3 is invertible, $Y^2 + Y = X^3$ is an elliptic curve.
It is of j-invariant 0 (see `EllipticCurve.ofJ0_j`). -/
def ofJ0 [Invertible (3 : R)] : EllipticCurve R 
goal: EllipticCurve R

full_name: EllipticCurve.ofJ0_j
code: lemma ofJ0_j [Invertible (3 : R)] : (ofJ0 R).j = 0 
goal: (EllipticCurve.ofJ0 R).j = 0

full_name: EllipticCurve.ofJ1728
code: /-- When 2 is invertible, $Y^2 = X^3 + X$ is an elliptic curve.
It is of j-invariant 1728 (see `EllipticCurve.ofJ1728_j`). -/
def ofJ1728 [Invertible (2 : R)] : EllipticCurve R 
goal: EllipticCurve R

full_name: EllipticCurve.ofJ1728_j
code: lemma ofJ1728_j [Invertible (2 : R)] : (ofJ1728 R).j = 1728 
goal: (EllipticCurve.ofJ1728 R).j = 1728

full_name: EllipticCurve.ofJ'
code: /-- When j and j - 1728 are both invertible,
$Y^2 + (j - 1728)XY = X^3 - 36(j - 1728)^3X - (j - 1728)^5$ is an elliptic curve.
It is of j-invariant j (see `EllipticCurve.ofJ'_j`). -/
def ofJ' (j : R) [Invertible j] [Invertible (j - 1728)] : EllipticCurve R 
goal: EllipticCurve R

full_name: EllipticCurve.ofJ'_j
code: lemma ofJ'_j (j : R) [Invertible j] [Invertible (j - 1728)] : (ofJ' j).j = j 
goal: (EllipticCurve.ofJ' j).j = j

full_name: _private.Mathlib.AlgebraicGeometry.EllipticCurve.Weierstrass.0.EllipticCurve.two_or_three_ne_zero
code: private lemma two_or_three_ne_zero : (2 : F) ≠ 0 ∨ (3 : F) ≠ 0 
goal: 2 ≠ 0 ∨ 3 ≠ 0

full_name: EllipticCurve.ofJ
code: /-- For any element j of a field $F$, there exists an elliptic curve over $F$
with j-invariant equal to j (see `EllipticCurve.ofJ_j`).
Its coefficients are given explicitly (see `EllipticCurve.ofJ0`, `EllipticCurve.ofJ1728`
and `EllipticCurve.ofJ'`). -/
def ofJ : EllipticCurve F 
goal: EllipticCurve F

full_name: EllipticCurve.ofJ_0_of_three_ne_zero
code: lemma ofJ_0_of_three_ne_zero [h3 : NeZero (3 : F)] :
    ofJ 0 = @ofJ0 _ _ (invertibleOfNonzero h3.out) 
goal: EllipticCurve.ofJ 0 = EllipticCurve.ofJ0 F

full_name: EllipticCurve.ofJ_0_of_three_eq_zero
code: lemma ofJ_0_of_three_eq_zero (h3 : (3 : F) = 0) :
    ofJ 0 = @ofJ1728 _ _ (invertibleOfNonzero <| two_or_three_ne_zero.neg_resolve_right h3) 
goal: EllipticCurve.ofJ 0 = EllipticCurve.ofJ1728 F

full_name: EllipticCurve.ofJ_0_of_two_eq_zero
code: lemma ofJ_0_of_two_eq_zero (h2 : (2 : F) = 0) :
    ofJ 0 = @ofJ0 _ _ (invertibleOfNonzero <| two_or_three_ne_zero.neg_resolve_left h2) 
goal: EllipticCurve.ofJ 0 = EllipticCurve.ofJ0 F

full_name: EllipticCurve.ofJ_1728_of_three_eq_zero
code: lemma ofJ_1728_of_three_eq_zero (h3 : (3 : F) = 0) :
    ofJ 1728 = @ofJ1728 _ _ (invertibleOfNonzero <| two_or_three_ne_zero.neg_resolve_right h3) 
goal: EllipticCurve.ofJ 1728 = EllipticCurve.ofJ1728 F

full_name: EllipticCurve.ofJ_1728_of_two_ne_zero
code: lemma ofJ_1728_of_two_ne_zero [h2 : NeZero (2 : F)] :
    ofJ 1728 = @ofJ1728 _ _ (invertibleOfNonzero h2.out) 
goal: EllipticCurve.ofJ 1728 = EllipticCurve.ofJ1728 F

full_name: EllipticCurve.ofJ_1728_of_two_eq_zero
code: lemma ofJ_1728_of_two_eq_zero (h2 : (2 : F) = 0) :
    ofJ 1728 = @ofJ0 _ _ (invertibleOfNonzero <| two_or_three_ne_zero.neg_resolve_left h2) 
goal: EllipticCurve.ofJ 1728 = EllipticCurve.ofJ0 F

full_name: EllipticCurve.ofJ_ne_0_ne_1728
code: lemma ofJ_ne_0_ne_1728 (h0 : j ≠ 0) (h1728 : j ≠ 1728) : ofJ j =
    @ofJ' _ _ j (invertibleOfNonzero h0) (invertibleOfNonzero <| sub_ne_zero_of_ne h1728) 
goal: EllipticCurve.ofJ j = EllipticCurve.ofJ' j

full_name: EllipticCurve.ofJ_j
code: lemma ofJ_j : (ofJ j).j = j 
goal: (EllipticCurve.ofJ j).j = j

full_name: EllipticCurve.instInhabitedEllipticCurve
code: instance instInhabitedEllipticCurve : Inhabited <| EllipticCurve F 
goal: Inhabited (EllipticCurve F)