[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ 4 * b₈ W = b₂ W * b₆ W - b₄ W ^ 2
[PROOFSTEP]
simp only [b₂, b₄, b₆, b₈]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ 4 * (W.a₁ ^ 2 * W.a₆ + 4 * W.a₂ * W.a₆ - W.a₁ * W.a₃ * W.a₄ + W.a₂ * W.a₃ ^ 2 - W.a₄ ^ 2) =
    (W.a₁ ^ 2 + 4 * W.a₂) * (W.a₃ ^ 2 + 4 * W.a₆) - (2 * W.a₄ + W.a₁ * W.a₃) ^ 2
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ 1728 * Δ W = c₄ W ^ 3 - c₆ W ^ 2
[PROOFSTEP]
simp only [b₂, b₄, b₆, b₈, c₄, c₆, Δ]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ 1728 *
      (-(W.a₁ ^ 2 + 4 * W.a₂) ^ 2 *
              (W.a₁ ^ 2 * W.a₆ + 4 * W.a₂ * W.a₆ - W.a₁ * W.a₃ * W.a₄ + W.a₂ * W.a₃ ^ 2 - W.a₄ ^ 2) -
            8 * (2 * W.a₄ + W.a₁ * W.a₃) ^ 3 -
          27 * (W.a₃ ^ 2 + 4 * W.a₆) ^ 2 +
        9 * (W.a₁ ^ 2 + 4 * W.a₂) * (2 * W.a₄ + W.a₁ * W.a₃) * (W.a₃ ^ 2 + 4 * W.a₆)) =
    ((W.a₁ ^ 2 + 4 * W.a₂) ^ 2 - 24 * (2 * W.a₄ + W.a₁ * W.a₃)) ^ 3 -
      (-(W.a₁ ^ 2 + 4 * W.a₂) ^ 3 + 36 * (W.a₁ ^ 2 + 4 * W.a₂) * (2 * W.a₄ + W.a₁ * W.a₃) -
          216 * (W.a₃ ^ 2 + 4 * W.a₆)) ^
        2
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ c₄ (ofJ0 R) = 0
[PROOFSTEP]
rw [ofJ0, c₄, b₂, b₄]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ ({ a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₁ ^ 2 + 4 * { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₂) ^
        2 -
      24 *
        (2 * { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₄ +
          { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₁ * { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₃) =
    0
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ Δ (ofJ0 R) = -27
[PROOFSTEP]
rw [ofJ0, Δ, b₂, b₄, b₆, b₈]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ -({ a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₁ ^ 2 + 4 * { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₂) ^
                2 *
            ({ a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₁ ^ 2 *
                      { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₆ +
                    4 * { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₂ *
                      { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₆ -
                  { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₁ *
                      { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₃ *
                    { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₄ +
                { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₂ *
                  { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₃ ^ 2 -
              { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₄ ^ 2) -
          8 *
            (2 * { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₄ +
                { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₁ *
                  { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₃) ^
              3 -
        27 *
          ({ a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₃ ^ 2 +
              4 * { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₆) ^
            2 +
      9 *
            ({ a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₁ ^ 2 +
              4 * { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₂) *
          (2 * { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₄ +
            { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₁ * { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₃) *
        ({ a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₃ ^ 2 +
          4 * { a₁ := 0, a₂ := 0, a₃ := 1, a₄ := 0, a₆ := 0 }.a₆) =
    -27
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ c₄ (ofJ1728 R) = -48
[PROOFSTEP]
rw [ofJ1728, c₄, b₂, b₄]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ ({ a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₁ ^ 2 + 4 * { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₂) ^
        2 -
      24 *
        (2 * { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₄ +
          { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₁ * { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₃) =
    -48
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ Δ (ofJ1728 R) = -64
[PROOFSTEP]
rw [ofJ1728, Δ, b₂, b₄, b₆, b₈]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
⊢ -({ a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₁ ^ 2 + 4 * { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₂) ^
                2 *
            ({ a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₁ ^ 2 *
                      { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₆ +
                    4 * { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₂ *
                      { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₆ -
                  { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₁ *
                      { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₃ *
                    { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₄ +
                { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₂ *
                  { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₃ ^ 2 -
              { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₄ ^ 2) -
          8 *
            (2 * { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₄ +
                { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₁ *
                  { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₃) ^
              3 -
        27 *
          ({ a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₃ ^ 2 +
              4 * { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₆) ^
            2 +
      9 *
            ({ a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₁ ^ 2 +
              4 * { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₂) *
          (2 * { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₄ +
            { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₁ * { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₃) *
        ({ a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₃ ^ 2 +
          4 * { a₁ := 0, a₂ := 0, a₃ := 0, a₄ := 1, a₆ := 0 }.a₆) =
    -64
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
j : R
⊢ c₄ (ofJ j) = j * (j - 1728) ^ 3
[PROOFSTEP]
simp only [ofJ, c₄, b₂, b₄]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
j : R
⊢ ((j - 1728) ^ 2 + 4 * 0) ^ 2 - 24 * (2 * (-36 * (j - 1728) ^ 3) + (j - 1728) * 0) = j * (j - 1728) ^ 3
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
j : R
⊢ Δ (ofJ j) = j ^ 2 * (j - 1728) ^ 9
[PROOFSTEP]
simp only [ofJ, Δ, b₂, b₄, b₆, b₈]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
j : R
⊢ -((j - 1728) ^ 2 + 4 * 0) ^ 2 *
            ((j - 1728) ^ 2 * -(j - 1728) ^ 5 + 4 * 0 * -(j - 1728) ^ 5 - (j - 1728) * 0 * (-36 * (j - 1728) ^ 3) +
                0 * 0 ^ 2 -
              (-36 * (j - 1728) ^ 3) ^ 2) -
          8 * (2 * (-36 * (j - 1728) ^ 3) + (j - 1728) * 0) ^ 3 -
        27 * (0 ^ 2 + 4 * -(j - 1728) ^ 5) ^ 2 +
      9 * ((j - 1728) ^ 2 + 4 * 0) * (2 * (-36 * (j - 1728) ^ 3) + (j - 1728) * 0) * (0 ^ 2 + 4 * -(j - 1728) ^ 5) =
    j ^ 2 * (j - 1728) ^ 9
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ comp id C = C
[PROOFSTEP]
simp only [comp, id, zero_add, zero_mul, mul_zero, one_mul]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ comp C id = C
[PROOFSTEP]
simp only [comp, id, add_zero, mul_zero, one_mul, mul_one, one_pow, Units.val_one]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ comp (inv C) C = id
[PROOFSTEP]
rw [comp, id, inv]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ { u := { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.u * C.u,
      r :=
        { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.r * ↑C.u ^ 2 +
          C.r,
      s :=
        ↑C.u * { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.s + C.s,
      t :=
        { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.t * ↑C.u ^ 3 +
            { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.r * C.s *
              ↑C.u ^ 2 +
          C.t } =
    { u := 1, r := 0, s := 0, t := 0 }
[PROOFSTEP]
ext
[GOAL]
case u.a
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ ↑{ u := { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.u * C.u,
          r :=
            { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.r *
                ↑C.u ^ 2 +
              C.r,
          s :=
            ↑C.u * { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.s +
              C.s,
          t :=
            { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.t *
                  ↑C.u ^ 3 +
                { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.r *
                    C.s *
                  ↑C.u ^ 2 +
              C.t }.u =
    ↑{ u := 1, r := 0, s := 0, t := 0 }.u
[PROOFSTEP]
dsimp only
[GOAL]
case r
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ { u := { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.u * C.u,
        r :=
          { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.r * ↑C.u ^ 2 +
            C.r,
        s :=
          ↑C.u * { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.s +
            C.s,
        t :=
          { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.t * ↑C.u ^ 3 +
              { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.r * C.s *
                ↑C.u ^ 2 +
            C.t }.r =
    { u := 1, r := 0, s := 0, t := 0 }.r
[PROOFSTEP]
dsimp only
[GOAL]
case s
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ { u := { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.u * C.u,
        r :=
          { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.r * ↑C.u ^ 2 +
            C.r,
        s :=
          ↑C.u * { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.s +
            C.s,
        t :=
          { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.t * ↑C.u ^ 3 +
              { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.r * C.s *
                ↑C.u ^ 2 +
            C.t }.s =
    { u := 1, r := 0, s := 0, t := 0 }.s
[PROOFSTEP]
dsimp only
[GOAL]
case t
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ { u := { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.u * C.u,
        r :=
          { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.r * ↑C.u ^ 2 +
            C.r,
        s :=
          ↑C.u * { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.s +
            C.s,
        t :=
          { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.t * ↑C.u ^ 3 +
              { u := C.u⁻¹, r := -C.r * ↑C.u⁻¹ ^ 2, s := -C.s * ↑C.u⁻¹, t := (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 }.r * C.s *
                ↑C.u ^ 2 +
            C.t }.t =
    { u := 1, r := 0, s := 0, t := 0 }.t
[PROOFSTEP]
dsimp only
[GOAL]
case u.a
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ ↑(C.u⁻¹ * C.u) = ↑1
[PROOFSTEP]
exact C.u.inv_mul
[GOAL]
case r
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ -C.r * ↑C.u⁻¹ ^ 2 * ↑C.u ^ 2 + C.r = 0
[PROOFSTEP]
linear_combination (norm := ring1) -C.r * pow_mul_pow_eq_one 2 C.u.inv_mul
[GOAL]
case a
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ -C.r * ↑C.u⁻¹ ^ 2 * ↑C.u ^ 2 + C.r - 0 - (-C.r * (↑C.u⁻¹ ^ 2 * ↑C.u ^ 2) - -C.r * 1) = 0
[PROOFSTEP]
ring1
[GOAL]
case s
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ ↑C.u * (-C.s * ↑C.u⁻¹) + C.s = 0
[PROOFSTEP]
linear_combination (norm := ring1) -C.s * C.u.inv_mul
[GOAL]
case a
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ ↑C.u * (-C.s * ↑C.u⁻¹) + C.s - 0 - (-C.s * (↑C.u⁻¹ * ↑C.u) - -C.s * 1) = 0
[PROOFSTEP]
ring1
[GOAL]
case t
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 * ↑C.u ^ 3 + -C.r * ↑C.u⁻¹ ^ 2 * C.s * ↑C.u ^ 2 + C.t = 0
[PROOFSTEP]
linear_combination (norm := ring1)
  (C.r * C.s - C.t) * pow_mul_pow_eq_one 3 C.u.inv_mul + -C.r * C.s * pow_mul_pow_eq_one 2 C.u.inv_mul
[GOAL]
case a
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C' C'' C : VariableChange R
⊢ (C.r * C.s - C.t) * ↑C.u⁻¹ ^ 3 * ↑C.u ^ 3 + -C.r * ↑C.u⁻¹ ^ 2 * C.s * ↑C.u ^ 2 + C.t - 0 -
      ((C.r * C.s - C.t) * (↑C.u⁻¹ ^ 3 * ↑C.u ^ 3) + -C.r * C.s * (↑C.u⁻¹ ^ 2 * ↑C.u ^ 2) -
        ((C.r * C.s - C.t) * 1 + -C.r * C.s * 1)) =
    0
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C'✝ C''✝ C C' C'' : VariableChange R
⊢ comp (comp C C') C'' = comp C (comp C' C'')
[PROOFSTEP]
ext
[GOAL]
case u.a
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C'✝ C''✝ C C' C'' : VariableChange R
⊢ ↑(comp (comp C C') C'').u = ↑(comp C (comp C' C'')).u
[PROOFSTEP]
simp only [comp, Units.val_mul]
[GOAL]
case r
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C'✝ C''✝ C C' C'' : VariableChange R
⊢ (comp (comp C C') C'').r = (comp C (comp C' C'')).r
[PROOFSTEP]
simp only [comp, Units.val_mul]
[GOAL]
case s
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C'✝ C''✝ C C' C'' : VariableChange R
⊢ (comp (comp C C') C'').s = (comp C (comp C' C'')).s
[PROOFSTEP]
simp only [comp, Units.val_mul]
[GOAL]
case t
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C'✝ C''✝ C C' C'' : VariableChange R
⊢ (comp (comp C C') C'').t = (comp C (comp C' C'')).t
[PROOFSTEP]
simp only [comp, Units.val_mul]
[GOAL]
case u.a
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C'✝ C''✝ C C' C'' : VariableChange R
⊢ ↑C.u * ↑C'.u * ↑C''.u = ↑C.u * (↑C'.u * ↑C''.u)
[PROOFSTEP]
ring1
[GOAL]
case r
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C'✝ C''✝ C C' C'' : VariableChange R
⊢ (C.r * ↑C'.u ^ 2 + C'.r) * ↑C''.u ^ 2 + C''.r = C.r * (↑C'.u * ↑C''.u) ^ 2 + (C'.r * ↑C''.u ^ 2 + C''.r)
[PROOFSTEP]
ring1
[GOAL]
case s
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C'✝ C''✝ C C' C'' : VariableChange R
⊢ ↑C''.u * (↑C'.u * C.s + C'.s) + C''.s = ↑C'.u * ↑C''.u * C.s + (↑C''.u * C'.s + C''.s)
[PROOFSTEP]
ring1
[GOAL]
case t
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C✝ C'✝ C''✝ C C' C'' : VariableChange R
⊢ (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * ↑C''.u ^ 3 + (C.r * ↑C'.u ^ 2 + C'.r) * C''.s * ↑C''.u ^ 2 +
      C''.t =
    C.t * (↑C'.u * ↑C''.u) ^ 3 + C.r * (↑C''.u * C'.s + C''.s) * (↑C'.u * ↑C''.u) ^ 2 +
      (C'.t * ↑C''.u ^ 3 + C'.r * C''.s * ↑C''.u ^ 2 + C''.t)
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ variableChange W VariableChange.id = W
[PROOFSTEP]
rw [VariableChange.id, variableChange, inv_one, Units.val_one]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ { a₁ := 1 * (W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.s),
      a₂ :=
        1 ^ 2 *
          (W.a₂ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₁ + 3 * { u := 1, r := 0, s := 0, t := 0 }.r -
            { u := 1, r := 0, s := 0, t := 0 }.s ^ 2),
      a₃ := 1 ^ 3 * (W.a₃ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.t),
      a₄ :=
        1 ^ 4 *
          (W.a₄ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₃ + 2 * { u := 1, r := 0, s := 0, t := 0 }.r * W.a₂ -
                ({ u := 1, r := 0, s := 0, t := 0 }.t +
                    { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.s) *
                  W.a₁ +
              3 * { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 -
            2 * { u := 1, r := 0, s := 0, t := 0 }.s * { u := 1, r := 0, s := 0, t := 0 }.t),
      a₆ :=
        1 ^ 6 *
          (W.a₆ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₄ + { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 * W.a₂ +
                  { u := 1, r := 0, s := 0, t := 0 }.r ^ 3 -
                { u := 1, r := 0, s := 0, t := 0 }.t * W.a₃ -
              { u := 1, r := 0, s := 0, t := 0 }.t ^ 2 -
            { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.t * W.a₁) } =
    W
[PROOFSTEP]
ext
[GOAL]
case a₁
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ { a₁ := 1 * (W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.s),
        a₂ :=
          1 ^ 2 *
            (W.a₂ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₁ + 3 * { u := 1, r := 0, s := 0, t := 0 }.r -
              { u := 1, r := 0, s := 0, t := 0 }.s ^ 2),
        a₃ := 1 ^ 3 * (W.a₃ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.t),
        a₄ :=
          1 ^ 4 *
            (W.a₄ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₃ + 2 * { u := 1, r := 0, s := 0, t := 0 }.r * W.a₂ -
                  ({ u := 1, r := 0, s := 0, t := 0 }.t +
                      { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.s) *
                    W.a₁ +
                3 * { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 -
              2 * { u := 1, r := 0, s := 0, t := 0 }.s * { u := 1, r := 0, s := 0, t := 0 }.t),
        a₆ :=
          1 ^ 6 *
            (W.a₆ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₄ + { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 * W.a₂ +
                    { u := 1, r := 0, s := 0, t := 0 }.r ^ 3 -
                  { u := 1, r := 0, s := 0, t := 0 }.t * W.a₃ -
                { u := 1, r := 0, s := 0, t := 0 }.t ^ 2 -
              { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.t * W.a₁) }.a₁ =
    W.a₁
[PROOFSTEP]
dsimp only
[GOAL]
case a₁
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ 1 * (W.a₁ + 2 * 0) = W.a₁
[PROOFSTEP]
ring1
[GOAL]
case a₂
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ { a₁ := 1 * (W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.s),
        a₂ :=
          1 ^ 2 *
            (W.a₂ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₁ + 3 * { u := 1, r := 0, s := 0, t := 0 }.r -
              { u := 1, r := 0, s := 0, t := 0 }.s ^ 2),
        a₃ := 1 ^ 3 * (W.a₃ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.t),
        a₄ :=
          1 ^ 4 *
            (W.a₄ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₃ + 2 * { u := 1, r := 0, s := 0, t := 0 }.r * W.a₂ -
                  ({ u := 1, r := 0, s := 0, t := 0 }.t +
                      { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.s) *
                    W.a₁ +
                3 * { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 -
              2 * { u := 1, r := 0, s := 0, t := 0 }.s * { u := 1, r := 0, s := 0, t := 0 }.t),
        a₆ :=
          1 ^ 6 *
            (W.a₆ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₄ + { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 * W.a₂ +
                    { u := 1, r := 0, s := 0, t := 0 }.r ^ 3 -
                  { u := 1, r := 0, s := 0, t := 0 }.t * W.a₃ -
                { u := 1, r := 0, s := 0, t := 0 }.t ^ 2 -
              { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.t * W.a₁) }.a₂ =
    W.a₂
[PROOFSTEP]
dsimp only
[GOAL]
case a₂
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ 1 ^ 2 * (W.a₂ - 0 * W.a₁ + 3 * 0 - 0 ^ 2) = W.a₂
[PROOFSTEP]
ring1
[GOAL]
case a₃
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ { a₁ := 1 * (W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.s),
        a₂ :=
          1 ^ 2 *
            (W.a₂ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₁ + 3 * { u := 1, r := 0, s := 0, t := 0 }.r -
              { u := 1, r := 0, s := 0, t := 0 }.s ^ 2),
        a₃ := 1 ^ 3 * (W.a₃ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.t),
        a₄ :=
          1 ^ 4 *
            (W.a₄ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₃ + 2 * { u := 1, r := 0, s := 0, t := 0 }.r * W.a₂ -
                  ({ u := 1, r := 0, s := 0, t := 0 }.t +
                      { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.s) *
                    W.a₁ +
                3 * { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 -
              2 * { u := 1, r := 0, s := 0, t := 0 }.s * { u := 1, r := 0, s := 0, t := 0 }.t),
        a₆ :=
          1 ^ 6 *
            (W.a₆ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₄ + { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 * W.a₂ +
                    { u := 1, r := 0, s := 0, t := 0 }.r ^ 3 -
                  { u := 1, r := 0, s := 0, t := 0 }.t * W.a₃ -
                { u := 1, r := 0, s := 0, t := 0 }.t ^ 2 -
              { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.t * W.a₁) }.a₃ =
    W.a₃
[PROOFSTEP]
dsimp only
[GOAL]
case a₃
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ 1 ^ 3 * (W.a₃ + 0 * W.a₁ + 2 * 0) = W.a₃
[PROOFSTEP]
ring1
[GOAL]
case a₄
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ { a₁ := 1 * (W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.s),
        a₂ :=
          1 ^ 2 *
            (W.a₂ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₁ + 3 * { u := 1, r := 0, s := 0, t := 0 }.r -
              { u := 1, r := 0, s := 0, t := 0 }.s ^ 2),
        a₃ := 1 ^ 3 * (W.a₃ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.t),
        a₄ :=
          1 ^ 4 *
            (W.a₄ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₃ + 2 * { u := 1, r := 0, s := 0, t := 0 }.r * W.a₂ -
                  ({ u := 1, r := 0, s := 0, t := 0 }.t +
                      { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.s) *
                    W.a₁ +
                3 * { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 -
              2 * { u := 1, r := 0, s := 0, t := 0 }.s * { u := 1, r := 0, s := 0, t := 0 }.t),
        a₆ :=
          1 ^ 6 *
            (W.a₆ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₄ + { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 * W.a₂ +
                    { u := 1, r := 0, s := 0, t := 0 }.r ^ 3 -
                  { u := 1, r := 0, s := 0, t := 0 }.t * W.a₃ -
                { u := 1, r := 0, s := 0, t := 0 }.t ^ 2 -
              { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.t * W.a₁) }.a₄ =
    W.a₄
[PROOFSTEP]
dsimp only
[GOAL]
case a₄
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ 1 ^ 4 * (W.a₄ - 0 * W.a₃ + 2 * 0 * W.a₂ - (0 + 0 * 0) * W.a₁ + 3 * 0 ^ 2 - 2 * 0 * 0) = W.a₄
[PROOFSTEP]
ring1
[GOAL]
case a₆
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ { a₁ := 1 * (W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.s),
        a₂ :=
          1 ^ 2 *
            (W.a₂ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₁ + 3 * { u := 1, r := 0, s := 0, t := 0 }.r -
              { u := 1, r := 0, s := 0, t := 0 }.s ^ 2),
        a₃ := 1 ^ 3 * (W.a₃ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₁ + 2 * { u := 1, r := 0, s := 0, t := 0 }.t),
        a₄ :=
          1 ^ 4 *
            (W.a₄ - { u := 1, r := 0, s := 0, t := 0 }.s * W.a₃ + 2 * { u := 1, r := 0, s := 0, t := 0 }.r * W.a₂ -
                  ({ u := 1, r := 0, s := 0, t := 0 }.t +
                      { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.s) *
                    W.a₁ +
                3 * { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 -
              2 * { u := 1, r := 0, s := 0, t := 0 }.s * { u := 1, r := 0, s := 0, t := 0 }.t),
        a₆ :=
          1 ^ 6 *
            (W.a₆ + { u := 1, r := 0, s := 0, t := 0 }.r * W.a₄ + { u := 1, r := 0, s := 0, t := 0 }.r ^ 2 * W.a₂ +
                    { u := 1, r := 0, s := 0, t := 0 }.r ^ 3 -
                  { u := 1, r := 0, s := 0, t := 0 }.t * W.a₃ -
                { u := 1, r := 0, s := 0, t := 0 }.t ^ 2 -
              { u := 1, r := 0, s := 0, t := 0 }.r * { u := 1, r := 0, s := 0, t := 0 }.t * W.a₁) }.a₆ =
    W.a₆
[PROOFSTEP]
dsimp only
[GOAL]
case a₆
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ 1 ^ 6 * (W.a₆ + 0 * W.a₄ + 0 ^ 2 * W.a₂ + 0 ^ 3 - 0 * W.a₃ - 0 ^ 2 - 0 * 0 * W.a₁) = W.a₆
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ variableChange W (VariableChange.comp C C') = variableChange (variableChange W C') C
[PROOFSTEP]
simp only [VariableChange.comp, variableChange]
[GOAL]
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ { a₁ := ↑(C.u * C'.u)⁻¹ * (W.a₁ + 2 * (↑C'.u * C.s + C'.s)),
      a₂ :=
        ↑(C.u * C'.u)⁻¹ ^ 2 *
          (W.a₂ - (↑C'.u * C.s + C'.s) * W.a₁ + 3 * (C.r * ↑C'.u ^ 2 + C'.r) - (↑C'.u * C.s + C'.s) ^ 2),
      a₃ :=
        ↑(C.u * C'.u)⁻¹ ^ 3 *
          (W.a₃ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₁ + 2 * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
      a₄ :=
        ↑(C.u * C'.u)⁻¹ ^ 4 *
          (W.a₄ - (↑C'.u * C.s + C'.s) * W.a₃ + 2 * (C.r * ↑C'.u ^ 2 + C'.r) * W.a₂ -
                (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t + (C.r * ↑C'.u ^ 2 + C'.r) * (↑C'.u * C.s + C'.s)) *
                  W.a₁ +
              3 * (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 -
            2 * (↑C'.u * C.s + C'.s) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
      a₆ :=
        ↑(C.u * C'.u)⁻¹ ^ 6 *
          (W.a₆ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₄ + (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 * W.a₂ + (C.r * ↑C'.u ^ 2 + C'.r) ^ 3 -
                (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₃ -
              (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) ^ 2 -
            (C.r * ↑C'.u ^ 2 + C'.r) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₁) } =
    { a₁ := ↑C.u⁻¹ * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s) + 2 * C.s),
      a₂ :=
        ↑C.u⁻¹ ^ 2 *
          (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2) - C.s * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 3 * C.r -
            C.s ^ 2),
      a₃ :=
        ↑C.u⁻¹ ^ 3 * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t) + C.r * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 2 * C.t),
      a₄ :=
        ↑C.u⁻¹ ^ 4 *
          (↑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) -
                    C.s * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) +
                  2 * C.r * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) -
                (C.t + C.r * C.s) * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) +
              3 * C.r ^ 2 -
            2 * C.s * C.t),
      a₆ :=
        ↑C.u⁻¹ ^ 6 *
          (↑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₁) +
                      C.r *
                        (↑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)) +
                    C.r ^ 2 * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) +
                  C.r ^ 3 -
                C.t * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) -
              C.t ^ 2 -
            C.r * C.t * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s))) }
[PROOFSTEP]
ext
[GOAL]
case a₁
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ { a₁ := ↑(C.u * C'.u)⁻¹ * (W.a₁ + 2 * (↑C'.u * C.s + C'.s)),
        a₂ :=
          ↑(C.u * C'.u)⁻¹ ^ 2 *
            (W.a₂ - (↑C'.u * C.s + C'.s) * W.a₁ + 3 * (C.r * ↑C'.u ^ 2 + C'.r) - (↑C'.u * C.s + C'.s) ^ 2),
        a₃ :=
          ↑(C.u * C'.u)⁻¹ ^ 3 *
            (W.a₃ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₁ + 2 * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
        a₄ :=
          ↑(C.u * C'.u)⁻¹ ^ 4 *
            (W.a₄ - (↑C'.u * C.s + C'.s) * W.a₃ + 2 * (C.r * ↑C'.u ^ 2 + C'.r) * W.a₂ -
                  (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t + (C.r * ↑C'.u ^ 2 + C'.r) * (↑C'.u * C.s + C'.s)) *
                    W.a₁ +
                3 * (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 -
              2 * (↑C'.u * C.s + C'.s) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
        a₆ :=
          ↑(C.u * C'.u)⁻¹ ^ 6 *
            (W.a₆ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₄ + (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 * W.a₂ +
                    (C.r * ↑C'.u ^ 2 + C'.r) ^ 3 -
                  (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₃ -
                (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) ^ 2 -
              (C.r * ↑C'.u ^ 2 + C'.r) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₁) }.a₁ =
    { a₁ := ↑C.u⁻¹ * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s) + 2 * C.s),
        a₂ :=
          ↑C.u⁻¹ ^ 2 *
            (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2) - C.s * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 3 * C.r -
              C.s ^ 2),
        a₃ :=
          ↑C.u⁻¹ ^ 3 * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t) + C.r * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 2 * C.t),
        a₄ :=
          ↑C.u⁻¹ ^ 4 *
            (↑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) -
                      C.s * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) +
                    2 * C.r * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) -
                  (C.t + C.r * C.s) * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) +
                3 * C.r ^ 2 -
              2 * C.s * C.t),
        a₆ :=
          ↑C.u⁻¹ ^ 6 *
            (↑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₁) +
                        C.r *
                          (↑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)) +
                      C.r ^ 2 * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) +
                    C.r ^ 3 -
                  C.t * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) -
                C.t ^ 2 -
              C.r * C.t * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s))) }.a₁
[PROOFSTEP]
simp only [mul_inv, Units.val_mul]
[GOAL]
case a₂
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ { a₁ := ↑(C.u * C'.u)⁻¹ * (W.a₁ + 2 * (↑C'.u * C.s + C'.s)),
        a₂ :=
          ↑(C.u * C'.u)⁻¹ ^ 2 *
            (W.a₂ - (↑C'.u * C.s + C'.s) * W.a₁ + 3 * (C.r * ↑C'.u ^ 2 + C'.r) - (↑C'.u * C.s + C'.s) ^ 2),
        a₃ :=
          ↑(C.u * C'.u)⁻¹ ^ 3 *
            (W.a₃ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₁ + 2 * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
        a₄ :=
          ↑(C.u * C'.u)⁻¹ ^ 4 *
            (W.a₄ - (↑C'.u * C.s + C'.s) * W.a₃ + 2 * (C.r * ↑C'.u ^ 2 + C'.r) * W.a₂ -
                  (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t + (C.r * ↑C'.u ^ 2 + C'.r) * (↑C'.u * C.s + C'.s)) *
                    W.a₁ +
                3 * (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 -
              2 * (↑C'.u * C.s + C'.s) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
        a₆ :=
          ↑(C.u * C'.u)⁻¹ ^ 6 *
            (W.a₆ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₄ + (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 * W.a₂ +
                    (C.r * ↑C'.u ^ 2 + C'.r) ^ 3 -
                  (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₃ -
                (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) ^ 2 -
              (C.r * ↑C'.u ^ 2 + C'.r) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₁) }.a₂ =
    { a₁ := ↑C.u⁻¹ * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s) + 2 * C.s),
        a₂ :=
          ↑C.u⁻¹ ^ 2 *
            (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2) - C.s * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 3 * C.r -
              C.s ^ 2),
        a₃ :=
          ↑C.u⁻¹ ^ 3 * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t) + C.r * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 2 * C.t),
        a₄ :=
          ↑C.u⁻¹ ^ 4 *
            (↑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) -
                      C.s * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) +
                    2 * C.r * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) -
                  (C.t + C.r * C.s) * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) +
                3 * C.r ^ 2 -
              2 * C.s * C.t),
        a₆ :=
          ↑C.u⁻¹ ^ 6 *
            (↑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₁) +
                        C.r *
                          (↑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)) +
                      C.r ^ 2 * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) +
                    C.r ^ 3 -
                  C.t * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) -
                C.t ^ 2 -
              C.r * C.t * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s))) }.a₂
[PROOFSTEP]
simp only [mul_inv, Units.val_mul]
[GOAL]
case a₃
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ { a₁ := ↑(C.u * C'.u)⁻¹ * (W.a₁ + 2 * (↑C'.u * C.s + C'.s)),
        a₂ :=
          ↑(C.u * C'.u)⁻¹ ^ 2 *
            (W.a₂ - (↑C'.u * C.s + C'.s) * W.a₁ + 3 * (C.r * ↑C'.u ^ 2 + C'.r) - (↑C'.u * C.s + C'.s) ^ 2),
        a₃ :=
          ↑(C.u * C'.u)⁻¹ ^ 3 *
            (W.a₃ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₁ + 2 * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
        a₄ :=
          ↑(C.u * C'.u)⁻¹ ^ 4 *
            (W.a₄ - (↑C'.u * C.s + C'.s) * W.a₃ + 2 * (C.r * ↑C'.u ^ 2 + C'.r) * W.a₂ -
                  (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t + (C.r * ↑C'.u ^ 2 + C'.r) * (↑C'.u * C.s + C'.s)) *
                    W.a₁ +
                3 * (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 -
              2 * (↑C'.u * C.s + C'.s) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
        a₆ :=
          ↑(C.u * C'.u)⁻¹ ^ 6 *
            (W.a₆ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₄ + (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 * W.a₂ +
                    (C.r * ↑C'.u ^ 2 + C'.r) ^ 3 -
                  (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₃ -
                (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) ^ 2 -
              (C.r * ↑C'.u ^ 2 + C'.r) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₁) }.a₃ =
    { a₁ := ↑C.u⁻¹ * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s) + 2 * C.s),
        a₂ :=
          ↑C.u⁻¹ ^ 2 *
            (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2) - C.s * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 3 * C.r -
              C.s ^ 2),
        a₃ :=
          ↑C.u⁻¹ ^ 3 * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t) + C.r * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 2 * C.t),
        a₄ :=
          ↑C.u⁻¹ ^ 4 *
            (↑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) -
                      C.s * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) +
                    2 * C.r * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) -
                  (C.t + C.r * C.s) * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) +
                3 * C.r ^ 2 -
              2 * C.s * C.t),
        a₆ :=
          ↑C.u⁻¹ ^ 6 *
            (↑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₁) +
                        C.r *
                          (↑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)) +
                      C.r ^ 2 * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) +
                    C.r ^ 3 -
                  C.t * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) -
                C.t ^ 2 -
              C.r * C.t * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s))) }.a₃
[PROOFSTEP]
simp only [mul_inv, Units.val_mul]
[GOAL]
case a₄
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ { a₁ := ↑(C.u * C'.u)⁻¹ * (W.a₁ + 2 * (↑C'.u * C.s + C'.s)),
        a₂ :=
          ↑(C.u * C'.u)⁻¹ ^ 2 *
            (W.a₂ - (↑C'.u * C.s + C'.s) * W.a₁ + 3 * (C.r * ↑C'.u ^ 2 + C'.r) - (↑C'.u * C.s + C'.s) ^ 2),
        a₃ :=
          ↑(C.u * C'.u)⁻¹ ^ 3 *
            (W.a₃ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₁ + 2 * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
        a₄ :=
          ↑(C.u * C'.u)⁻¹ ^ 4 *
            (W.a₄ - (↑C'.u * C.s + C'.s) * W.a₃ + 2 * (C.r * ↑C'.u ^ 2 + C'.r) * W.a₂ -
                  (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t + (C.r * ↑C'.u ^ 2 + C'.r) * (↑C'.u * C.s + C'.s)) *
                    W.a₁ +
                3 * (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 -
              2 * (↑C'.u * C.s + C'.s) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
        a₆ :=
          ↑(C.u * C'.u)⁻¹ ^ 6 *
            (W.a₆ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₄ + (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 * W.a₂ +
                    (C.r * ↑C'.u ^ 2 + C'.r) ^ 3 -
                  (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₃ -
                (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) ^ 2 -
              (C.r * ↑C'.u ^ 2 + C'.r) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₁) }.a₄ =
    { a₁ := ↑C.u⁻¹ * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s) + 2 * C.s),
        a₂ :=
          ↑C.u⁻¹ ^ 2 *
            (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2) - C.s * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 3 * C.r -
              C.s ^ 2),
        a₃ :=
          ↑C.u⁻¹ ^ 3 * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t) + C.r * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 2 * C.t),
        a₄ :=
          ↑C.u⁻¹ ^ 4 *
            (↑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) -
                      C.s * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) +
                    2 * C.r * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) -
                  (C.t + C.r * C.s) * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) +
                3 * C.r ^ 2 -
              2 * C.s * C.t),
        a₆ :=
          ↑C.u⁻¹ ^ 6 *
            (↑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₁) +
                        C.r *
                          (↑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)) +
                      C.r ^ 2 * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) +
                    C.r ^ 3 -
                  C.t * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) -
                C.t ^ 2 -
              C.r * C.t * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s))) }.a₄
[PROOFSTEP]
simp only [mul_inv, Units.val_mul]
[GOAL]
case a₆
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ { a₁ := ↑(C.u * C'.u)⁻¹ * (W.a₁ + 2 * (↑C'.u * C.s + C'.s)),
        a₂ :=
          ↑(C.u * C'.u)⁻¹ ^ 2 *
            (W.a₂ - (↑C'.u * C.s + C'.s) * W.a₁ + 3 * (C.r * ↑C'.u ^ 2 + C'.r) - (↑C'.u * C.s + C'.s) ^ 2),
        a₃ :=
          ↑(C.u * C'.u)⁻¹ ^ 3 *
            (W.a₃ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₁ + 2 * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
        a₄ :=
          ↑(C.u * C'.u)⁻¹ ^ 4 *
            (W.a₄ - (↑C'.u * C.s + C'.s) * W.a₃ + 2 * (C.r * ↑C'.u ^ 2 + C'.r) * W.a₂ -
                  (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t + (C.r * ↑C'.u ^ 2 + C'.r) * (↑C'.u * C.s + C'.s)) *
                    W.a₁ +
                3 * (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 -
              2 * (↑C'.u * C.s + C'.s) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)),
        a₆ :=
          ↑(C.u * C'.u)⁻¹ ^ 6 *
            (W.a₆ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₄ + (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 * W.a₂ +
                    (C.r * ↑C'.u ^ 2 + C'.r) ^ 3 -
                  (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₃ -
                (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) ^ 2 -
              (C.r * ↑C'.u ^ 2 + C'.r) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₁) }.a₆ =
    { a₁ := ↑C.u⁻¹ * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s) + 2 * C.s),
        a₂ :=
          ↑C.u⁻¹ ^ 2 *
            (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2) - C.s * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 3 * C.r -
              C.s ^ 2),
        a₃ :=
          ↑C.u⁻¹ ^ 3 * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t) + C.r * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 2 * C.t),
        a₄ :=
          ↑C.u⁻¹ ^ 4 *
            (↑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) -
                      C.s * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) +
                    2 * C.r * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) -
                  (C.t + C.r * C.s) * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) +
                3 * C.r ^ 2 -
              2 * C.s * C.t),
        a₆ :=
          ↑C.u⁻¹ ^ 6 *
            (↑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₁) +
                        C.r *
                          (↑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)) +
                      C.r ^ 2 * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) +
                    C.r ^ 3 -
                  C.t * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) -
                C.t ^ 2 -
              C.r * C.t * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s))) }.a₆
[PROOFSTEP]
simp only [mul_inv, Units.val_mul]
[GOAL]
case a₁
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ ↑C.u⁻¹ * ↑C'.u⁻¹ * (W.a₁ + 2 * (↑C'.u * C.s + C'.s)) = ↑C.u⁻¹ * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s) + 2 * C.s)
[PROOFSTEP]
linear_combination (norm := ring1) ↑C.u⁻¹ * C.s * 2 * C'.u.inv_mul
[GOAL]
case a
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ ↑C.u⁻¹ * ↑C'.u⁻¹ * (W.a₁ + 2 * (↑C'.u * C.s + C'.s)) - ↑C.u⁻¹ * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s) + 2 * C.s) -
      (↑C.u⁻¹ * C.s * 2 * (↑C'.u⁻¹ * ↑C'.u) - ↑C.u⁻¹ * C.s * 2 * 1) =
    0
[PROOFSTEP]
ring1
[GOAL]
case a₂
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ (↑C.u⁻¹ * ↑C'.u⁻¹) ^ 2 *
      (W.a₂ - (↑C'.u * C.s + C'.s) * W.a₁ + 3 * (C.r * ↑C'.u ^ 2 + C'.r) - (↑C'.u * C.s + C'.s) ^ 2) =
    ↑C.u⁻¹ ^ 2 *
      (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2) - C.s * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 3 * C.r -
        C.s ^ 2)
[PROOFSTEP]
linear_combination (norm := ring1)
  C.s * (-C'.s * 2 - W.a₁) * (↑C.u⁻¹ : R) ^ 2 * ↑C'.u⁻¹ * C'.u.inv_mul +
    (C.r * 3 - C.s ^ 2) * (↑C.u⁻¹ : R) ^ 2 * pow_mul_pow_eq_one 2 C'.u.inv_mul
[GOAL]
case a
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ (↑C.u⁻¹ * ↑C'.u⁻¹) ^ 2 *
          (W.a₂ - (↑C'.u * C.s + C'.s) * W.a₁ + 3 * (C.r * ↑C'.u ^ 2 + C'.r) - (↑C'.u * C.s + C'.s) ^ 2) -
        ↑C.u⁻¹ ^ 2 *
          (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2) - C.s * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 3 * C.r -
            C.s ^ 2) -
      (C.s * (-C'.s * 2 - W.a₁) * ↑C.u⁻¹ ^ 2 * ↑C'.u⁻¹ * (↑C'.u⁻¹ * ↑C'.u) +
          (C.r * 3 - C.s ^ 2) * ↑C.u⁻¹ ^ 2 * (↑C'.u⁻¹ ^ 2 * ↑C'.u ^ 2) -
        (C.s * (-C'.s * 2 - W.a₁) * ↑C.u⁻¹ ^ 2 * ↑C'.u⁻¹ * 1 + (C.r * 3 - C.s ^ 2) * ↑C.u⁻¹ ^ 2 * 1)) =
    0
[PROOFSTEP]
ring1
[GOAL]
case a₃
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ (↑C.u⁻¹ * ↑C'.u⁻¹) ^ 3 *
      (W.a₃ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₁ + 2 * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)) =
    ↑C.u⁻¹ ^ 3 * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t) + C.r * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 2 * C.t)
[PROOFSTEP]
linear_combination (norm := ring1)
  C.r * (C'.s * 2 + W.a₁) * (↑C.u⁻¹ : R) ^ 3 * ↑C'.u⁻¹ * pow_mul_pow_eq_one 2 C'.u.inv_mul +
    C.t * 2 * (↑C.u⁻¹ : R) ^ 3 * pow_mul_pow_eq_one 3 C'.u.inv_mul
[GOAL]
case a
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ (↑C.u⁻¹ * ↑C'.u⁻¹) ^ 3 *
          (W.a₃ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₁ + 2 * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)) -
        ↑C.u⁻¹ ^ 3 * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t) + C.r * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) + 2 * C.t) -
      (C.r * (C'.s * 2 + W.a₁) * ↑C.u⁻¹ ^ 3 * ↑C'.u⁻¹ * (↑C'.u⁻¹ ^ 2 * ↑C'.u ^ 2) +
          C.t * 2 * ↑C.u⁻¹ ^ 3 * (↑C'.u⁻¹ ^ 3 * ↑C'.u ^ 3) -
        (C.r * (C'.s * 2 + W.a₁) * ↑C.u⁻¹ ^ 3 * ↑C'.u⁻¹ * 1 + C.t * 2 * ↑C.u⁻¹ ^ 3 * 1)) =
    0
[PROOFSTEP]
ring1
[GOAL]
case a₄
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ (↑C.u⁻¹ * ↑C'.u⁻¹) ^ 4 *
      (W.a₄ - (↑C'.u * C.s + C'.s) * W.a₃ + 2 * (C.r * ↑C'.u ^ 2 + C'.r) * W.a₂ -
            (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t + (C.r * ↑C'.u ^ 2 + C'.r) * (↑C'.u * C.s + C'.s)) * W.a₁ +
          3 * (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 -
        2 * (↑C'.u * C.s + C'.s) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)) =
    ↑C.u⁻¹ ^ 4 *
      (↑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) -
                C.s * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) +
              2 * C.r * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) -
            (C.t + C.r * C.s) * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) +
          3 * C.r ^ 2 -
        2 * C.s * C.t)
[PROOFSTEP]
linear_combination (norm := ring1)
  C.s * (-W.a₃ - C'.r * W.a₁ - C'.t * 2) * (↑C.u⁻¹ : R) ^ 4 * (↑C'.u⁻¹ : R) ^ 3 * C'.u.inv_mul +
        (↑C.u⁻¹ : R) ^ 4 * (↑C'.u⁻¹ : R) ^ 2 *
            (C.r * C'.r * 6 + C.r * W.a₂ * 2 - C'.s * C.r * W.a₁ * 2 - C'.s ^ 2 * C.r * 2) *
          pow_mul_pow_eq_one 2 C'.u.inv_mul +
      -(↑C.u⁻¹ : R) ^ 4 * ↑C'.u⁻¹ * (C.s * C'.s * C.r * 2 + C.s * C.r * W.a₁ + C'.s * C.t * 2 + C.t * W.a₁) *
        pow_mul_pow_eq_one 3 C'.u.inv_mul +
    (↑C.u⁻¹ : R) ^ 4 * (C.r ^ 2 * 3 - C.s * C.t * 2) * pow_mul_pow_eq_one 4 C'.u.inv_mul
[GOAL]
case a
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ (↑C.u⁻¹ * ↑C'.u⁻¹) ^ 4 *
          (W.a₄ - (↑C'.u * C.s + C'.s) * W.a₃ + 2 * (C.r * ↑C'.u ^ 2 + C'.r) * W.a₂ -
                (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t + (C.r * ↑C'.u ^ 2 + C'.r) * (↑C'.u * C.s + C'.s)) *
                  W.a₁ +
              3 * (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 -
            2 * (↑C'.u * C.s + C'.s) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t)) -
        ↑C.u⁻¹ ^ 4 *
          (↑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) -
                    C.s * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) +
                  2 * C.r * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) -
                (C.t + C.r * C.s) * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)) +
              3 * C.r ^ 2 -
            2 * C.s * C.t) -
      (C.s * (-W.a₃ - C'.r * W.a₁ - C'.t * 2) * ↑C.u⁻¹ ^ 4 * ↑C'.u⁻¹ ^ 3 * (↑C'.u⁻¹ * ↑C'.u) +
              ↑C.u⁻¹ ^ 4 * ↑C'.u⁻¹ ^ 2 *
                  (C.r * C'.r * 6 + C.r * W.a₂ * 2 - C'.s * C.r * W.a₁ * 2 - C'.s ^ 2 * C.r * 2) *
                (↑C'.u⁻¹ ^ 2 * ↑C'.u ^ 2) +
            -↑C.u⁻¹ ^ 4 * ↑C'.u⁻¹ * (C.s * C'.s * C.r * 2 + C.s * C.r * W.a₁ + C'.s * C.t * 2 + C.t * W.a₁) *
              (↑C'.u⁻¹ ^ 3 * ↑C'.u ^ 3) +
          ↑C.u⁻¹ ^ 4 * (C.r ^ 2 * 3 - C.s * C.t * 2) * (↑C'.u⁻¹ ^ 4 * ↑C'.u ^ 4) -
        (C.s * (-W.a₃ - C'.r * W.a₁ - C'.t * 2) * ↑C.u⁻¹ ^ 4 * ↑C'.u⁻¹ ^ 3 * 1 +
              ↑C.u⁻¹ ^ 4 * ↑C'.u⁻¹ ^ 2 *
                  (C.r * C'.r * 6 + C.r * W.a₂ * 2 - C'.s * C.r * W.a₁ * 2 - C'.s ^ 2 * C.r * 2) *
                1 +
            -↑C.u⁻¹ ^ 4 * ↑C'.u⁻¹ * (C.s * C'.s * C.r * 2 + C.s * C.r * W.a₁ + C'.s * C.t * 2 + C.t * W.a₁) * 1 +
          ↑C.u⁻¹ ^ 4 * (C.r ^ 2 * 3 - C.s * C.t * 2) * 1)) =
    0
[PROOFSTEP]
ring1
[GOAL]
case a₆
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ (↑C.u⁻¹ * ↑C'.u⁻¹) ^ 6 *
      (W.a₆ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₄ + (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 * W.a₂ + (C.r * ↑C'.u ^ 2 + C'.r) ^ 3 -
            (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₃ -
          (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) ^ 2 -
        (C.r * ↑C'.u ^ 2 + C'.r) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₁) =
    ↑C.u⁻¹ ^ 6 *
      (↑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₁) +
                  C.r *
                    (↑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)) +
                C.r ^ 2 * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) +
              C.r ^ 3 -
            C.t * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) -
          C.t ^ 2 -
        C.r * C.t * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s)))
[PROOFSTEP]
linear_combination (norm := ring1)
  C.r * (↑C.u⁻¹ : R) ^ 6 * (↑C'.u⁻¹ : R) ^ 4 *
              (C'.r * W.a₂ * 2 - C'.r * C'.s * W.a₁ + C'.r ^ 2 * 3 + W.a₄ - C'.s * C'.t * 2 - C'.s * W.a₃ -
                C'.t * W.a₁) *
            pow_mul_pow_eq_one 2 C'.u.inv_mul +
          -(↑C.u⁻¹ : R) ^ 6 * (↑C'.u⁻¹ : R) ^ 3 * C.t * (C'.r * W.a₁ + C'.t * 2 + W.a₃) *
            pow_mul_pow_eq_one 3 C'.u.inv_mul +
        C.r ^ 2 * (↑C.u⁻¹ : R) ^ 6 * (↑C'.u⁻¹ : R) ^ 2 * (C'.r * 3 + W.a₂ - C'.s * W.a₁ - C'.s ^ 2) *
          pow_mul_pow_eq_one 4 C'.u.inv_mul +
      -C.r * C.t * (↑C.u⁻¹ : R) ^ 6 * ↑C'.u⁻¹ * (C'.s * 2 + W.a₁) * pow_mul_pow_eq_one 5 C'.u.inv_mul +
    (↑C.u⁻¹ : R) ^ 6 * (C.r ^ 3 - C.t ^ 2) * pow_mul_pow_eq_one 6 C'.u.inv_mul
[GOAL]
case a
R : Type u
inst✝ : CommRing R
W✝ : WeierstrassCurve R
C✝ C C' : VariableChange R
W : WeierstrassCurve R
⊢ (↑C.u⁻¹ * ↑C'.u⁻¹) ^ 6 *
          (W.a₆ + (C.r * ↑C'.u ^ 2 + C'.r) * W.a₄ + (C.r * ↑C'.u ^ 2 + C'.r) ^ 2 * W.a₂ + (C.r * ↑C'.u ^ 2 + C'.r) ^ 3 -
                (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₃ -
              (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) ^ 2 -
            (C.r * ↑C'.u ^ 2 + C'.r) * (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) * W.a₁) -
        ↑C.u⁻¹ ^ 6 *
          (↑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₁) +
                      C.r *
                        (↑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)) +
                    C.r ^ 2 * (↑C'.u⁻¹ ^ 2 * (W.a₂ - C'.s * W.a₁ + 3 * C'.r - C'.s ^ 2)) +
                  C.r ^ 3 -
                C.t * (↑C'.u⁻¹ ^ 3 * (W.a₃ + C'.r * W.a₁ + 2 * C'.t)) -
              C.t ^ 2 -
            C.r * C.t * (↑C'.u⁻¹ * (W.a₁ + 2 * C'.s))) -
      (C.r * ↑C.u⁻¹ ^ 6 * ↑C'.u⁻¹ ^ 4 *
                    (C'.r * W.a₂ * 2 - C'.r * C'.s * W.a₁ + C'.r ^ 2 * 3 + W.a₄ - C'.s * C'.t * 2 - C'.s * W.a₃ -
                      C'.t * W.a₁) *
                  (↑C'.u⁻¹ ^ 2 * ↑C'.u ^ 2) +
                -↑C.u⁻¹ ^ 6 * ↑C'.u⁻¹ ^ 3 * C.t * (C'.r * W.a₁ + C'.t * 2 + W.a₃) * (↑C'.u⁻¹ ^ 3 * ↑C'.u ^ 3) +
              C.r ^ 2 * ↑C.u⁻¹ ^ 6 * ↑C'.u⁻¹ ^ 2 * (C'.r * 3 + W.a₂ - C'.s * W.a₁ - C'.s ^ 2) *
                (↑C'.u⁻¹ ^ 4 * ↑C'.u ^ 4) +
            -C.r * C.t * ↑C.u⁻¹ ^ 6 * ↑C'.u⁻¹ * (C'.s * 2 + W.a₁) * (↑C'.u⁻¹ ^ 5 * ↑C'.u ^ 5) +
          ↑C.u⁻¹ ^ 6 * (C.r ^ 3 - C.t ^ 2) * (↑C'.u⁻¹ ^ 6 * ↑C'.u ^ 6) -
        (C.r * ↑C.u⁻¹ ^ 6 * ↑C'.u⁻¹ ^ 4 *
                    (C'.r * W.a₂ * 2 - C'.r * C'.s * W.a₁ + C'.r ^ 2 * 3 + W.a₄ - C'.s * C'.t * 2 - C'.s * W.a₃ -
                      C'.t * W.a₁) *
                  1 +
                -↑C.u⁻¹ ^ 6 * ↑C'.u⁻¹ ^ 3 * C.t * (C'.r * W.a₁ + C'.t * 2 + W.a₃) * 1 +
              C.r ^ 2 * ↑C.u⁻¹ ^ 6 * ↑C'.u⁻¹ ^ 2 * (C'.r * 3 + W.a₂ - C'.s * W.a₁ - C'.s ^ 2) * 1 +
            -C.r * C.t * ↑C.u⁻¹ ^ 6 * ↑C'.u⁻¹ * (C'.s * 2 + W.a₁) * 1 +
          ↑C.u⁻¹ ^ 6 * (C.r ^ 3 - C.t ^ 2) * 1)) =
    0
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ b₂ (variableChange W C) = ↑C.u⁻¹ ^ 2 * (b₂ W + 12 * C.r)
[PROOFSTEP]
simp only [b₂, variableChange_a₁, variableChange_a₂]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ (↑C.u⁻¹ * (W.a₁ + 2 * C.s)) ^ 2 + 4 * (↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2)) =
    ↑C.u⁻¹ ^ 2 * (W.a₁ ^ 2 + 4 * W.a₂ + 12 * C.r)
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ b₄ (variableChange W C) = ↑C.u⁻¹ ^ 4 * (b₄ W + C.r * b₂ W + 6 * C.r ^ 2)
[PROOFSTEP]
simp only [b₂, b₄, variableChange_a₁, variableChange_a₃, variableChange_a₄]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ 2 * (↑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)) +
      ↑C.u⁻¹ * (W.a₁ + 2 * C.s) * (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)) =
    ↑C.u⁻¹ ^ 4 * (2 * W.a₄ + W.a₁ * W.a₃ + C.r * (W.a₁ ^ 2 + 4 * W.a₂) + 6 * C.r ^ 2)
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ b₆ (variableChange W C) = ↑C.u⁻¹ ^ 6 * (b₆ W + 2 * C.r * b₄ W + C.r ^ 2 * b₂ W + 4 * C.r ^ 3)
[PROOFSTEP]
simp only [b₂, b₄, b₆, variableChange_a₃, variableChange_a₆]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)) ^ 2 +
      4 * (↑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₁)) =
    ↑C.u⁻¹ ^ 6 *
      (W.a₃ ^ 2 + 4 * W.a₆ + 2 * C.r * (2 * W.a₄ + W.a₁ * W.a₃) + C.r ^ 2 * (W.a₁ ^ 2 + 4 * W.a₂) + 4 * C.r ^ 3)
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ b₈ (variableChange W C) = ↑C.u⁻¹ ^ 8 * (b₈ W + 3 * C.r * b₆ W + 3 * C.r ^ 2 * b₄ W + C.r ^ 3 * b₂ W + 3 * C.r ^ 4)
[PROOFSTEP]
simp only [b₂, b₄, b₆, b₈, variableChange_a₁, variableChange_a₂, variableChange_a₃, variableChange_a₄,
  variableChange_a₆]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ (↑C.u⁻¹ * (W.a₁ + 2 * C.s)) ^ 2 *
              (↑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₁)) +
            4 * (↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2)) *
              (↑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₁)) -
          ↑C.u⁻¹ * (W.a₁ + 2 * C.s) * (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)) *
            (↑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)) +
        ↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2) * (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)) ^ 2 -
      (↑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)) ^ 2 =
    ↑C.u⁻¹ ^ 8 *
      (W.a₁ ^ 2 * W.a₆ + 4 * W.a₂ * W.a₆ - W.a₁ * W.a₃ * W.a₄ + W.a₂ * W.a₃ ^ 2 - W.a₄ ^ 2 +
              3 * C.r * (W.a₃ ^ 2 + 4 * W.a₆) +
            3 * C.r ^ 2 * (2 * W.a₄ + W.a₁ * W.a₃) +
          C.r ^ 3 * (W.a₁ ^ 2 + 4 * W.a₂) +
        3 * C.r ^ 4)
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ c₄ (variableChange W C) = ↑C.u⁻¹ ^ 4 * c₄ W
[PROOFSTEP]
simp only [c₄, variableChange_b₂, variableChange_b₄]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ (↑C.u⁻¹ ^ 2 * (b₂ W + 12 * C.r)) ^ 2 - 24 * (↑C.u⁻¹ ^ 4 * (b₄ W + C.r * b₂ W + 6 * C.r ^ 2)) =
    ↑C.u⁻¹ ^ 4 * (b₂ W ^ 2 - 24 * b₄ W)
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ c₆ (variableChange W C) = ↑C.u⁻¹ ^ 6 * c₆ W
[PROOFSTEP]
simp only [c₆, variableChange_b₂, variableChange_b₄, variableChange_b₆]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ -(↑C.u⁻¹ ^ 2 * (b₂ W + 12 * C.r)) ^ 3 +
        36 * (↑C.u⁻¹ ^ 2 * (b₂ W + 12 * C.r)) * (↑C.u⁻¹ ^ 4 * (b₄ W + C.r * b₂ W + 6 * C.r ^ 2)) -
      216 * (↑C.u⁻¹ ^ 6 * (b₆ W + 2 * C.r * b₄ W + C.r ^ 2 * b₂ W + 4 * C.r ^ 3)) =
    ↑C.u⁻¹ ^ 6 * (-b₂ W ^ 3 + 36 * b₂ W * b₄ W - 216 * b₆ W)
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ Δ (variableChange W C) = ↑C.u⁻¹ ^ 12 * Δ W
[PROOFSTEP]
simp only [b₂, b₄, b₆, b₈, Δ, variableChange_a₁, variableChange_a₂, variableChange_a₃, variableChange_a₄,
  variableChange_a₆]
[GOAL]
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
C : VariableChange R
⊢ -((↑C.u⁻¹ * (W.a₁ + 2 * C.s)) ^ 2 + 4 * (↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2))) ^ 2 *
            ((↑C.u⁻¹ * (W.a₁ + 2 * C.s)) ^ 2 *
                      (↑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₁)) +
                    4 * (↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2)) *
                      (↑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₁)) -
                  ↑C.u⁻¹ * (W.a₁ + 2 * C.s) * (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)) *
                    (↑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)) +
                ↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2) *
                  (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)) ^ 2 -
              (↑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)) ^
                2) -
          8 *
            (2 *
                  (↑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)) +
                ↑C.u⁻¹ * (W.a₁ + 2 * C.s) * (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t))) ^
              3 -
        27 *
          ((↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)) ^ 2 +
              4 *
                (↑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₁))) ^
            2 +
      9 * ((↑C.u⁻¹ * (W.a₁ + 2 * C.s)) ^ 2 + 4 * (↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2))) *
          (2 *
              (↑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)) +
            ↑C.u⁻¹ * (W.a₁ + 2 * C.s) * (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t))) *
        ((↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)) ^ 2 +
          4 * (↑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₁))) =
    ↑C.u⁻¹ ^ 12 *
      (-(W.a₁ ^ 2 + 4 * W.a₂) ^ 2 *
              (W.a₁ ^ 2 * W.a₆ + 4 * W.a₂ * W.a₆ - W.a₁ * W.a₃ * W.a₄ + W.a₂ * W.a₃ ^ 2 - W.a₄ ^ 2) -
            8 * (2 * W.a₄ + W.a₁ * W.a₃) ^ 3 -
          27 * (W.a₃ ^ 2 + 4 * W.a₆) ^ 2 +
        9 * (W.a₁ ^ 2 + 4 * W.a₂) * (2 * W.a₄ + W.a₁ * W.a₃) * (W.a₃ ^ 2 + 4 * W.a₆))
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ b₂ (baseChange W A) = ↑(algebraMap R A) (b₂ W)
[PROOFSTEP]
simp only [b₂, baseChange_a₁, baseChange_a₂]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ ↑(algebraMap R A) W.a₁ ^ 2 + 4 * ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) (W.a₁ ^ 2 + 4 * W.a₂)
[PROOFSTEP]
map_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ b₄ (baseChange W A) = ↑(algebraMap R A) (b₄ W)
[PROOFSTEP]
simp only [b₄, baseChange_a₁, baseChange_a₃, baseChange_a₄]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ 2 * ↑(algebraMap R A) W.a₄ + ↑(algebraMap R A) W.a₁ * ↑(algebraMap R A) W.a₃ =
    ↑(algebraMap R A) (2 * W.a₄ + W.a₁ * W.a₃)
[PROOFSTEP]
map_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ b₆ (baseChange W A) = ↑(algebraMap R A) (b₆ W)
[PROOFSTEP]
simp only [b₆, baseChange_a₃, baseChange_a₆]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ ↑(algebraMap R A) W.a₃ ^ 2 + 4 * ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) (W.a₃ ^ 2 + 4 * W.a₆)
[PROOFSTEP]
map_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ b₈ (baseChange W A) = ↑(algebraMap R A) (b₈ W)
[PROOFSTEP]
simp only [b₈, baseChange_a₁, baseChange_a₂, baseChange_a₃, baseChange_a₄, baseChange_a₆]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ ↑(algebraMap R A) W.a₁ ^ 2 * ↑(algebraMap R A) W.a₆ + 4 * ↑(algebraMap R A) W.a₂ * ↑(algebraMap R A) W.a₆ -
          ↑(algebraMap R A) W.a₁ * ↑(algebraMap R A) W.a₃ * ↑(algebraMap R A) W.a₄ +
        ↑(algebraMap R A) W.a₂ * ↑(algebraMap R A) W.a₃ ^ 2 -
      ↑(algebraMap R A) W.a₄ ^ 2 =
    ↑(algebraMap R A) (W.a₁ ^ 2 * W.a₆ + 4 * W.a₂ * W.a₆ - W.a₁ * W.a₃ * W.a₄ + W.a₂ * W.a₃ ^ 2 - W.a₄ ^ 2)
[PROOFSTEP]
map_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ c₄ (baseChange W A) = ↑(algebraMap R A) (c₄ W)
[PROOFSTEP]
simp only [c₄, baseChange_b₂, baseChange_b₄]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ ↑(algebraMap R A) (b₂ W) ^ 2 - 24 * ↑(algebraMap R A) (b₄ W) = ↑(algebraMap R A) (b₂ W ^ 2 - 24 * b₄ W)
[PROOFSTEP]
map_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ c₆ (baseChange W A) = ↑(algebraMap R A) (c₆ W)
[PROOFSTEP]
simp only [c₆, baseChange_b₂, baseChange_b₄, baseChange_b₆]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ -↑(algebraMap R A) (b₂ W) ^ 3 + 36 * ↑(algebraMap R A) (b₂ W) * ↑(algebraMap R A) (b₄ W) -
      216 * ↑(algebraMap R A) (b₆ W) =
    ↑(algebraMap R A) (-b₂ W ^ 3 + 36 * b₂ W * b₄ W - 216 * b₆ W)
[PROOFSTEP]
map_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ Δ (baseChange W A) = ↑(algebraMap R A) (Δ W)
[PROOFSTEP]
simp only [Δ, baseChange_b₂, baseChange_b₄, baseChange_b₆, baseChange_b₈]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ -↑(algebraMap R A) (b₂ W) ^ 2 * ↑(algebraMap R A) (b₈ W) - 8 * ↑(algebraMap R A) (b₄ W) ^ 3 -
        27 * ↑(algebraMap R A) (b₆ W) ^ 2 +
      9 * ↑(algebraMap R A) (b₂ W) * ↑(algebraMap R A) (b₄ W) * ↑(algebraMap R A) (b₆ W) =
    ↑(algebraMap R A) (-b₂ W ^ 2 * b₈ W - 8 * b₄ W ^ 3 - 27 * b₆ W ^ 2 + 9 * b₂ W * b₄ W * b₆ W)
[PROOFSTEP]
map_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ baseChange W R = W
[PROOFSTEP]
ext
[GOAL]
case a₁
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ (baseChange W R).a₁ = W.a₁
[PROOFSTEP]
rfl
[GOAL]
case a₂
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ (baseChange W R).a₂ = W.a₂
[PROOFSTEP]
rfl
[GOAL]
case a₃
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ (baseChange W R).a₃ = W.a₃
[PROOFSTEP]
rfl
[GOAL]
case a₄
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ (baseChange W R).a₄ = W.a₄
[PROOFSTEP]
rfl
[GOAL]
case a₆
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ (baseChange W R).a₆ = W.a₆
[PROOFSTEP]
rfl
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ baseChange (baseChange W A) B = baseChange W B
[PROOFSTEP]
ext
[GOAL]
case a₁
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ (baseChange (baseChange W A) B).a₁ = (baseChange W B).a₁
[PROOFSTEP]
exact (IsScalarTower.algebraMap_apply R A B _).symm
[GOAL]
case a₂
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ (baseChange (baseChange W A) B).a₂ = (baseChange W B).a₂
[PROOFSTEP]
exact (IsScalarTower.algebraMap_apply R A B _).symm
[GOAL]
case a₃
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ (baseChange (baseChange W A) B).a₃ = (baseChange W B).a₃
[PROOFSTEP]
exact (IsScalarTower.algebraMap_apply R A B _).symm
[GOAL]
case a₄
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ (baseChange (baseChange W A) B).a₄ = (baseChange W B).a₄
[PROOFSTEP]
exact (IsScalarTower.algebraMap_apply R A B _).symm
[GOAL]
case a₆
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ (baseChange (baseChange W A) B).a₆ = (baseChange W B).a₆
[PROOFSTEP]
exact (IsScalarTower.algebraMap_apply R A B _).symm
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
⊢ W = W'
[PROOFSTEP]
rcases mk.inj h1 with ⟨_, _, _, _, _⟩
[GOAL]
case intro.intro.intro.intro
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
left✝³ : ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
left✝² : ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
left✝¹ : ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
left✝ : ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
right✝ : ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
⊢ W = W'
[PROOFSTEP]
ext
[GOAL]
case intro.intro.intro.intro.a₁
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
left✝³ : ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
left✝² : ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
left✝¹ : ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
left✝ : ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
right✝ : ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
⊢ W.a₁ = W'.a₁
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.intro.a₂
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
left✝³ : ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
left✝² : ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
left✝¹ : ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
left✝ : ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
right✝ : ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
⊢ W.a₂ = W'.a₂
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.intro.a₃
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
left✝³ : ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
left✝² : ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
left✝¹ : ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
left✝ : ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
right✝ : ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
⊢ W.a₃ = W'.a₃
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.intro.a₄
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
left✝³ : ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
left✝² : ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
left✝¹ : ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
left✝ : ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
right✝ : ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
⊢ W.a₄ = W'.a₄
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.intro.a₆
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
left✝³ : ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
left✝² : ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
left✝¹ : ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
left✝ : ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
right✝ : ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
⊢ W.a₆ = W'.a₆
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.intro.a₁
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
left✝³ : ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
left✝² : ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
left✝¹ : ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
left✝ : ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
right✝ : ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
⊢ ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.intro.a₂
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
left✝³ : ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
left✝² : ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
left✝¹ : ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
left✝ : ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
right✝ : ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
⊢ ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.intro.a₃
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
left✝³ : ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
left✝² : ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
left✝¹ : ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
left✝ : ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
right✝ : ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
⊢ ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.intro.a₄
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
left✝³ : ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
left✝² : ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
left✝¹ : ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
left✝ : ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
right✝ : ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
⊢ ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.intro.a₆
R : Type u
inst✝⁶ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : Function.Injective ↑(algebraMap R A)
W W' : WeierstrassCurve R
h1 : (fun W => baseChange W A) W = (fun W => baseChange W A) W'
left✝³ : ↑(algebraMap R A) W.a₁ = ↑(algebraMap R A) W'.a₁
left✝² : ↑(algebraMap R A) W.a₂ = ↑(algebraMap R A) W'.a₂
left✝¹ : ↑(algebraMap R A) W.a₃ = ↑(algebraMap R A) W'.a₃
left✝ : ↑(algebraMap R A) W.a₄ = ↑(algebraMap R A) W'.a₄
right✝ : ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
⊢ ↑(algebraMap R A) W.a₆ = ↑(algebraMap R A) W'.a₆
[PROOFSTEP]
assumption
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ baseChange A id = id
[PROOFSTEP]
simp only [id, baseChange]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ { u := ↑(Units.map ↑(algebraMap R A)) 1, r := ↑(algebraMap R A) 0, s := ↑(algebraMap R A) 0,
      t := ↑(algebraMap R A) 0 } =
    { u := 1, r := 0, s := 0, t := 0 }
[PROOFSTEP]
ext
[GOAL]
case u.a
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ ↑{ u := ↑(Units.map ↑(algebraMap R A)) 1, r := ↑(algebraMap R A) 0, s := ↑(algebraMap R A) 0,
          t := ↑(algebraMap R A) 0 }.u =
    ↑{ u := 1, r := 0, s := 0, t := 0 }.u
[PROOFSTEP]
simp only [map_one, Units.val_one, map_zero]
[GOAL]
case r
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ { u := ↑(Units.map ↑(algebraMap R A)) 1, r := ↑(algebraMap R A) 0, s := ↑(algebraMap R A) 0,
        t := ↑(algebraMap R A) 0 }.r =
    { u := 1, r := 0, s := 0, t := 0 }.r
[PROOFSTEP]
simp only [map_one, Units.val_one, map_zero]
[GOAL]
case s
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ { u := ↑(Units.map ↑(algebraMap R A)) 1, r := ↑(algebraMap R A) 0, s := ↑(algebraMap R A) 0,
        t := ↑(algebraMap R A) 0 }.s =
    { u := 1, r := 0, s := 0, t := 0 }.s
[PROOFSTEP]
simp only [map_one, Units.val_one, map_zero]
[GOAL]
case t
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ { u := ↑(Units.map ↑(algebraMap R A)) 1, r := ↑(algebraMap R A) 0, s := ↑(algebraMap R A) 0,
        t := ↑(algebraMap R A) 0 }.t =
    { u := 1, r := 0, s := 0, t := 0 }.t
[PROOFSTEP]
simp only [map_one, Units.val_one, map_zero]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C C' : VariableChange R
⊢ baseChange A (comp C C') = comp (baseChange A C) (baseChange A C')
[PROOFSTEP]
simp only [comp, baseChange]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C C' : VariableChange R
⊢ { u := ↑(Units.map ↑(algebraMap R A)) (C.u * C'.u), r := ↑(algebraMap R A) (C.r * ↑C'.u ^ 2 + C'.r),
      s := ↑(algebraMap R A) (↑C'.u * C.s + C'.s),
      t := ↑(algebraMap R A) (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) } =
    { u := ↑(Units.map ↑(algebraMap R A)) C.u * ↑(Units.map ↑(algebraMap R A)) C'.u,
      r := ↑(algebraMap R A) C.r * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 2 + ↑(algebraMap R A) C'.r,
      s := ↑(↑(Units.map ↑(algebraMap R A)) C'.u) * ↑(algebraMap R A) C.s + ↑(algebraMap R A) C'.s,
      t :=
        ↑(algebraMap R A) C.t * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 3 +
            ↑(algebraMap R A) C.r * ↑(algebraMap R A) C'.s * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 2 +
          ↑(algebraMap R A) C'.t }
[PROOFSTEP]
ext
[GOAL]
case u.a
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C C' : VariableChange R
⊢ ↑{ u := ↑(Units.map ↑(algebraMap R A)) (C.u * C'.u), r := ↑(algebraMap R A) (C.r * ↑C'.u ^ 2 + C'.r),
          s := ↑(algebraMap R A) (↑C'.u * C.s + C'.s),
          t := ↑(algebraMap R A) (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) }.u =
    ↑{ u := ↑(Units.map ↑(algebraMap R A)) C.u * ↑(Units.map ↑(algebraMap R A)) C'.u,
          r := ↑(algebraMap R A) C.r * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 2 + ↑(algebraMap R A) C'.r,
          s := ↑(↑(Units.map ↑(algebraMap R A)) C'.u) * ↑(algebraMap R A) C.s + ↑(algebraMap R A) C'.s,
          t :=
            ↑(algebraMap R A) C.t * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 3 +
                ↑(algebraMap R A) C.r * ↑(algebraMap R A) C'.s * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 2 +
              ↑(algebraMap R A) C'.t }.u
[PROOFSTEP]
simp only [Units.coe_map, Units.coe_map_inv, MonoidHom.coe_coe, map_ofNat, map_neg, map_add, map_sub, map_mul, map_pow]
[GOAL]
case r
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C C' : VariableChange R
⊢ { u := ↑(Units.map ↑(algebraMap R A)) (C.u * C'.u), r := ↑(algebraMap R A) (C.r * ↑C'.u ^ 2 + C'.r),
        s := ↑(algebraMap R A) (↑C'.u * C.s + C'.s),
        t := ↑(algebraMap R A) (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) }.r =
    { u := ↑(Units.map ↑(algebraMap R A)) C.u * ↑(Units.map ↑(algebraMap R A)) C'.u,
        r := ↑(algebraMap R A) C.r * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 2 + ↑(algebraMap R A) C'.r,
        s := ↑(↑(Units.map ↑(algebraMap R A)) C'.u) * ↑(algebraMap R A) C.s + ↑(algebraMap R A) C'.s,
        t :=
          ↑(algebraMap R A) C.t * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 3 +
              ↑(algebraMap R A) C.r * ↑(algebraMap R A) C'.s * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 2 +
            ↑(algebraMap R A) C'.t }.r
[PROOFSTEP]
simp only [Units.coe_map, Units.coe_map_inv, MonoidHom.coe_coe, map_ofNat, map_neg, map_add, map_sub, map_mul, map_pow]
[GOAL]
case s
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C C' : VariableChange R
⊢ { u := ↑(Units.map ↑(algebraMap R A)) (C.u * C'.u), r := ↑(algebraMap R A) (C.r * ↑C'.u ^ 2 + C'.r),
        s := ↑(algebraMap R A) (↑C'.u * C.s + C'.s),
        t := ↑(algebraMap R A) (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) }.s =
    { u := ↑(Units.map ↑(algebraMap R A)) C.u * ↑(Units.map ↑(algebraMap R A)) C'.u,
        r := ↑(algebraMap R A) C.r * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 2 + ↑(algebraMap R A) C'.r,
        s := ↑(↑(Units.map ↑(algebraMap R A)) C'.u) * ↑(algebraMap R A) C.s + ↑(algebraMap R A) C'.s,
        t :=
          ↑(algebraMap R A) C.t * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 3 +
              ↑(algebraMap R A) C.r * ↑(algebraMap R A) C'.s * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 2 +
            ↑(algebraMap R A) C'.t }.s
[PROOFSTEP]
simp only [Units.coe_map, Units.coe_map_inv, MonoidHom.coe_coe, map_ofNat, map_neg, map_add, map_sub, map_mul, map_pow]
[GOAL]
case t
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C C' : VariableChange R
⊢ { u := ↑(Units.map ↑(algebraMap R A)) (C.u * C'.u), r := ↑(algebraMap R A) (C.r * ↑C'.u ^ 2 + C'.r),
        s := ↑(algebraMap R A) (↑C'.u * C.s + C'.s),
        t := ↑(algebraMap R A) (C.t * ↑C'.u ^ 3 + C.r * C'.s * ↑C'.u ^ 2 + C'.t) }.t =
    { u := ↑(Units.map ↑(algebraMap R A)) C.u * ↑(Units.map ↑(algebraMap R A)) C'.u,
        r := ↑(algebraMap R A) C.r * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 2 + ↑(algebraMap R A) C'.r,
        s := ↑(↑(Units.map ↑(algebraMap R A)) C'.u) * ↑(algebraMap R A) C.s + ↑(algebraMap R A) C'.s,
        t :=
          ↑(algebraMap R A) C.t * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 3 +
              ↑(algebraMap R A) C.r * ↑(algebraMap R A) C'.s * ↑(↑(Units.map ↑(algebraMap R A)) C'.u) ^ 2 +
            ↑(algebraMap R A) C'.t }.t
[PROOFSTEP]
simp only [Units.coe_map, Units.coe_map_inv, MonoidHom.coe_coe, map_ofNat, map_neg, map_add, map_sub, map_mul, map_pow]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ baseChange B (baseChange A C) = baseChange B C
[PROOFSTEP]
ext
[GOAL]
case u.a
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ ↑(baseChange B (baseChange A C)).u = ↑(baseChange B C).u
[PROOFSTEP]
exact (IsScalarTower.algebraMap_apply R A B _).symm
[GOAL]
case r
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ (baseChange B (baseChange A C)).r = (baseChange B C).r
[PROOFSTEP]
exact (IsScalarTower.algebraMap_apply R A B _).symm
[GOAL]
case s
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ (baseChange B (baseChange A C)).s = (baseChange B C).s
[PROOFSTEP]
exact (IsScalarTower.algebraMap_apply R A B _).symm
[GOAL]
case t
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ (baseChange B (baseChange A C)).t = (baseChange B C).t
[PROOFSTEP]
exact (IsScalarTower.algebraMap_apply R A B _).symm
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C✝ : VariableChange R
h : Function.Injective ↑(algebraMap R A)
C C' : VariableChange R
h1 : baseChange A C = baseChange A C'
⊢ C = C'
[PROOFSTEP]
rcases mk.inj h1 with ⟨h1, _, _, _⟩
[GOAL]
case intro.intro.intro
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C✝ : VariableChange R
h : Function.Injective ↑(algebraMap R A)
C C' : VariableChange R
h1✝ : baseChange A C = baseChange A C'
h1 : ↑(Units.map ↑(algebraMap R A)) C.u = ↑(Units.map ↑(algebraMap R A)) C'.u
left✝¹ : ↑(algebraMap R A) C.r = ↑(algebraMap R A) C'.r
left✝ : ↑(algebraMap R A) C.s = ↑(algebraMap R A) C'.s
right✝ : ↑(algebraMap R A) C.t = ↑(algebraMap R A) C'.t
⊢ C = C'
[PROOFSTEP]
replace h1 := (Units.mk.inj h1).left
[GOAL]
case intro.intro.intro
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C✝ : VariableChange R
h : Function.Injective ↑(algebraMap R A)
C C' : VariableChange R
h1✝ : baseChange A C = baseChange A C'
left✝¹ : ↑(algebraMap R A) C.r = ↑(algebraMap R A) C'.r
left✝ : ↑(algebraMap R A) C.s = ↑(algebraMap R A) C'.s
right✝ : ↑(algebraMap R A) C.t = ↑(algebraMap R A) C'.t
h1 : ↑↑(algebraMap R A) ↑C.u = ↑↑(algebraMap R A) ↑C'.u
⊢ C = C'
[PROOFSTEP]
ext
[GOAL]
case intro.intro.intro.u.a
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C✝ : VariableChange R
h : Function.Injective ↑(algebraMap R A)
C C' : VariableChange R
h1✝ : baseChange A C = baseChange A C'
left✝¹ : ↑(algebraMap R A) C.r = ↑(algebraMap R A) C'.r
left✝ : ↑(algebraMap R A) C.s = ↑(algebraMap R A) C'.s
right✝ : ↑(algebraMap R A) C.t = ↑(algebraMap R A) C'.t
h1 : ↑↑(algebraMap R A) ↑C.u = ↑↑(algebraMap R A) ↑C'.u
⊢ ↑C.u = ↑C'.u
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.r
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C✝ : VariableChange R
h : Function.Injective ↑(algebraMap R A)
C C' : VariableChange R
h1✝ : baseChange A C = baseChange A C'
left✝¹ : ↑(algebraMap R A) C.r = ↑(algebraMap R A) C'.r
left✝ : ↑(algebraMap R A) C.s = ↑(algebraMap R A) C'.s
right✝ : ↑(algebraMap R A) C.t = ↑(algebraMap R A) C'.t
h1 : ↑↑(algebraMap R A) ↑C.u = ↑↑(algebraMap R A) ↑C'.u
⊢ C.r = C'.r
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.s
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C✝ : VariableChange R
h : Function.Injective ↑(algebraMap R A)
C C' : VariableChange R
h1✝ : baseChange A C = baseChange A C'
left✝¹ : ↑(algebraMap R A) C.r = ↑(algebraMap R A) C'.r
left✝ : ↑(algebraMap R A) C.s = ↑(algebraMap R A) C'.s
right✝ : ↑(algebraMap R A) C.t = ↑(algebraMap R A) C'.t
h1 : ↑↑(algebraMap R A) ↑C.u = ↑↑(algebraMap R A) ↑C'.u
⊢ C.s = C'.s
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.t
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C✝ : VariableChange R
h : Function.Injective ↑(algebraMap R A)
C C' : VariableChange R
h1✝ : baseChange A C = baseChange A C'
left✝¹ : ↑(algebraMap R A) C.r = ↑(algebraMap R A) C'.r
left✝ : ↑(algebraMap R A) C.s = ↑(algebraMap R A) C'.s
right✝ : ↑(algebraMap R A) C.t = ↑(algebraMap R A) C'.t
h1 : ↑↑(algebraMap R A) ↑C.u = ↑↑(algebraMap R A) ↑C'.u
⊢ C.t = C'.t
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.u.a
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C✝ : VariableChange R
h : Function.Injective ↑(algebraMap R A)
C C' : VariableChange R
h1✝ : baseChange A C = baseChange A C'
left✝¹ : ↑(algebraMap R A) C.r = ↑(algebraMap R A) C'.r
left✝ : ↑(algebraMap R A) C.s = ↑(algebraMap R A) C'.s
right✝ : ↑(algebraMap R A) C.t = ↑(algebraMap R A) C'.t
h1 : ↑↑(algebraMap R A) ↑C.u = ↑↑(algebraMap R A) ↑C'.u
⊢ ↑(algebraMap R A) ↑C.u = ↑(algebraMap R A) ↑C'.u
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.r
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C✝ : VariableChange R
h : Function.Injective ↑(algebraMap R A)
C C' : VariableChange R
h1✝ : baseChange A C = baseChange A C'
left✝¹ : ↑(algebraMap R A) C.r = ↑(algebraMap R A) C'.r
left✝ : ↑(algebraMap R A) C.s = ↑(algebraMap R A) C'.s
right✝ : ↑(algebraMap R A) C.t = ↑(algebraMap R A) C'.t
h1 : ↑↑(algebraMap R A) ↑C.u = ↑↑(algebraMap R A) ↑C'.u
⊢ ↑(algebraMap R A) C.r = ↑(algebraMap R A) C'.r
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.s
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C✝ : VariableChange R
h : Function.Injective ↑(algebraMap R A)
C C' : VariableChange R
h1✝ : baseChange A C = baseChange A C'
left✝¹ : ↑(algebraMap R A) C.r = ↑(algebraMap R A) C'.r
left✝ : ↑(algebraMap R A) C.s = ↑(algebraMap R A) C'.s
right✝ : ↑(algebraMap R A) C.t = ↑(algebraMap R A) C'.t
h1 : ↑↑(algebraMap R A) ↑C.u = ↑↑(algebraMap R A) ↑C'.u
⊢ ↑(algebraMap R A) C.s = ↑(algebraMap R A) C'.s
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.t
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C✝ : VariableChange R
h : Function.Injective ↑(algebraMap R A)
C C' : VariableChange R
h1✝ : baseChange A C = baseChange A C'
left✝¹ : ↑(algebraMap R A) C.r = ↑(algebraMap R A) C'.r
left✝ : ↑(algebraMap R A) C.s = ↑(algebraMap R A) C'.s
right✝ : ↑(algebraMap R A) C.t = ↑(algebraMap R A) C'.t
h1 : ↑↑(algebraMap R A) ↑C.u = ↑↑(algebraMap R A) ↑C'.u
⊢ ↑(algebraMap R A) C.t = ↑(algebraMap R A) C'.t
[PROOFSTEP]
assumption
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ variableChange (baseChange W A) (VariableChange.baseChange A C) = baseChange (variableChange W C) A
[PROOFSTEP]
simp only [baseChange, variableChange, VariableChange.baseChange]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ { a₁ := ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ * (↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.s),
      a₂ :=
        ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 2 *
          (↑(algebraMap R A) W.a₂ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₁ + 3 * ↑(algebraMap R A) C.r -
            ↑(algebraMap R A) C.s ^ 2),
      a₃ :=
        ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 3 *
          (↑(algebraMap R A) W.a₃ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.t),
      a₄ :=
        ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 4 *
          (↑(algebraMap R A) W.a₄ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₃ +
                  2 * ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₂ -
                (↑(algebraMap R A) C.t + ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.s) * ↑(algebraMap R A) W.a₁ +
              3 * ↑(algebraMap R A) C.r ^ 2 -
            2 * ↑(algebraMap R A) C.s * ↑(algebraMap R A) C.t),
      a₆ :=
        ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 6 *
          (↑(algebraMap R A) W.a₆ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₄ +
                    ↑(algebraMap R A) C.r ^ 2 * ↑(algebraMap R A) W.a₂ +
                  ↑(algebraMap R A) C.r ^ 3 -
                ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₃ -
              ↑(algebraMap R A) C.t ^ 2 -
            ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₁) } =
    { a₁ := ↑(algebraMap R A) (↑C.u⁻¹ * (W.a₁ + 2 * C.s)),
      a₂ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2)),
      a₃ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)),
      a₄ :=
        ↑(algebraMap R 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)),
      a₆ :=
        ↑(algebraMap R 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₁)) }
[PROOFSTEP]
ext
[GOAL]
case a₁
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ { a₁ := ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ * (↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.s),
        a₂ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 2 *
            (↑(algebraMap R A) W.a₂ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₁ + 3 * ↑(algebraMap R A) C.r -
              ↑(algebraMap R A) C.s ^ 2),
        a₃ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 3 *
            (↑(algebraMap R A) W.a₃ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.t),
        a₄ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 4 *
            (↑(algebraMap R A) W.a₄ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₃ +
                    2 * ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₂ -
                  (↑(algebraMap R A) C.t + ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.s) * ↑(algebraMap R A) W.a₁ +
                3 * ↑(algebraMap R A) C.r ^ 2 -
              2 * ↑(algebraMap R A) C.s * ↑(algebraMap R A) C.t),
        a₆ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 6 *
            (↑(algebraMap R A) W.a₆ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₄ +
                      ↑(algebraMap R A) C.r ^ 2 * ↑(algebraMap R A) W.a₂ +
                    ↑(algebraMap R A) C.r ^ 3 -
                  ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₃ -
                ↑(algebraMap R A) C.t ^ 2 -
              ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₁) }.a₁ =
    { a₁ := ↑(algebraMap R A) (↑C.u⁻¹ * (W.a₁ + 2 * C.s)),
        a₂ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2)),
        a₃ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)),
        a₄ :=
          ↑(algebraMap R 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)),
        a₆ :=
          ↑(algebraMap R 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₁)) }.a₁
[PROOFSTEP]
simp only [Units.coe_map, Units.coe_map_inv, MonoidHom.coe_coe, map_ofNat, map_neg, map_add, map_sub, map_mul, map_pow]
[GOAL]
case a₂
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ { a₁ := ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ * (↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.s),
        a₂ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 2 *
            (↑(algebraMap R A) W.a₂ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₁ + 3 * ↑(algebraMap R A) C.r -
              ↑(algebraMap R A) C.s ^ 2),
        a₃ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 3 *
            (↑(algebraMap R A) W.a₃ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.t),
        a₄ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 4 *
            (↑(algebraMap R A) W.a₄ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₃ +
                    2 * ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₂ -
                  (↑(algebraMap R A) C.t + ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.s) * ↑(algebraMap R A) W.a₁ +
                3 * ↑(algebraMap R A) C.r ^ 2 -
              2 * ↑(algebraMap R A) C.s * ↑(algebraMap R A) C.t),
        a₆ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 6 *
            (↑(algebraMap R A) W.a₆ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₄ +
                      ↑(algebraMap R A) C.r ^ 2 * ↑(algebraMap R A) W.a₂ +
                    ↑(algebraMap R A) C.r ^ 3 -
                  ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₃ -
                ↑(algebraMap R A) C.t ^ 2 -
              ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₁) }.a₂ =
    { a₁ := ↑(algebraMap R A) (↑C.u⁻¹ * (W.a₁ + 2 * C.s)),
        a₂ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2)),
        a₃ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)),
        a₄ :=
          ↑(algebraMap R 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)),
        a₆ :=
          ↑(algebraMap R 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₁)) }.a₂
[PROOFSTEP]
simp only [Units.coe_map, Units.coe_map_inv, MonoidHom.coe_coe, map_ofNat, map_neg, map_add, map_sub, map_mul, map_pow]
[GOAL]
case a₃
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ { a₁ := ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ * (↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.s),
        a₂ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 2 *
            (↑(algebraMap R A) W.a₂ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₁ + 3 * ↑(algebraMap R A) C.r -
              ↑(algebraMap R A) C.s ^ 2),
        a₃ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 3 *
            (↑(algebraMap R A) W.a₃ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.t),
        a₄ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 4 *
            (↑(algebraMap R A) W.a₄ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₃ +
                    2 * ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₂ -
                  (↑(algebraMap R A) C.t + ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.s) * ↑(algebraMap R A) W.a₁ +
                3 * ↑(algebraMap R A) C.r ^ 2 -
              2 * ↑(algebraMap R A) C.s * ↑(algebraMap R A) C.t),
        a₆ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 6 *
            (↑(algebraMap R A) W.a₆ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₄ +
                      ↑(algebraMap R A) C.r ^ 2 * ↑(algebraMap R A) W.a₂ +
                    ↑(algebraMap R A) C.r ^ 3 -
                  ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₃ -
                ↑(algebraMap R A) C.t ^ 2 -
              ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₁) }.a₃ =
    { a₁ := ↑(algebraMap R A) (↑C.u⁻¹ * (W.a₁ + 2 * C.s)),
        a₂ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2)),
        a₃ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)),
        a₄ :=
          ↑(algebraMap R 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)),
        a₆ :=
          ↑(algebraMap R 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₁)) }.a₃
[PROOFSTEP]
simp only [Units.coe_map, Units.coe_map_inv, MonoidHom.coe_coe, map_ofNat, map_neg, map_add, map_sub, map_mul, map_pow]
[GOAL]
case a₄
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ { a₁ := ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ * (↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.s),
        a₂ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 2 *
            (↑(algebraMap R A) W.a₂ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₁ + 3 * ↑(algebraMap R A) C.r -
              ↑(algebraMap R A) C.s ^ 2),
        a₃ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 3 *
            (↑(algebraMap R A) W.a₃ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.t),
        a₄ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 4 *
            (↑(algebraMap R A) W.a₄ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₃ +
                    2 * ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₂ -
                  (↑(algebraMap R A) C.t + ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.s) * ↑(algebraMap R A) W.a₁ +
                3 * ↑(algebraMap R A) C.r ^ 2 -
              2 * ↑(algebraMap R A) C.s * ↑(algebraMap R A) C.t),
        a₆ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 6 *
            (↑(algebraMap R A) W.a₆ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₄ +
                      ↑(algebraMap R A) C.r ^ 2 * ↑(algebraMap R A) W.a₂ +
                    ↑(algebraMap R A) C.r ^ 3 -
                  ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₃ -
                ↑(algebraMap R A) C.t ^ 2 -
              ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₁) }.a₄ =
    { a₁ := ↑(algebraMap R A) (↑C.u⁻¹ * (W.a₁ + 2 * C.s)),
        a₂ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2)),
        a₃ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)),
        a₄ :=
          ↑(algebraMap R 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)),
        a₆ :=
          ↑(algebraMap R 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₁)) }.a₄
[PROOFSTEP]
simp only [Units.coe_map, Units.coe_map_inv, MonoidHom.coe_coe, map_ofNat, map_neg, map_add, map_sub, map_mul, map_pow]
[GOAL]
case a₆
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
C : VariableChange R
⊢ { a₁ := ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ * (↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.s),
        a₂ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 2 *
            (↑(algebraMap R A) W.a₂ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₁ + 3 * ↑(algebraMap R A) C.r -
              ↑(algebraMap R A) C.s ^ 2),
        a₃ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 3 *
            (↑(algebraMap R A) W.a₃ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₁ + 2 * ↑(algebraMap R A) C.t),
        a₄ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 4 *
            (↑(algebraMap R A) W.a₄ - ↑(algebraMap R A) C.s * ↑(algebraMap R A) W.a₃ +
                    2 * ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₂ -
                  (↑(algebraMap R A) C.t + ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.s) * ↑(algebraMap R A) W.a₁ +
                3 * ↑(algebraMap R A) C.r ^ 2 -
              2 * ↑(algebraMap R A) C.s * ↑(algebraMap R A) C.t),
        a₆ :=
          ↑(↑(Units.map ↑(algebraMap R A)) C.u)⁻¹ ^ 6 *
            (↑(algebraMap R A) W.a₆ + ↑(algebraMap R A) C.r * ↑(algebraMap R A) W.a₄ +
                      ↑(algebraMap R A) C.r ^ 2 * ↑(algebraMap R A) W.a₂ +
                    ↑(algebraMap R A) C.r ^ 3 -
                  ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₃ -
                ↑(algebraMap R A) C.t ^ 2 -
              ↑(algebraMap R A) C.r * ↑(algebraMap R A) C.t * ↑(algebraMap R A) W.a₁) }.a₆ =
    { a₁ := ↑(algebraMap R A) (↑C.u⁻¹ * (W.a₁ + 2 * C.s)),
        a₂ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 2 * (W.a₂ - C.s * W.a₁ + 3 * C.r - C.s ^ 2)),
        a₃ := ↑(algebraMap R A) (↑C.u⁻¹ ^ 3 * (W.a₃ + C.r * W.a₁ + 2 * C.t)),
        a₄ :=
          ↑(algebraMap R 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)),
        a₆ :=
          ↑(algebraMap R 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₁)) }.a₆
[PROOFSTEP]
simp only [Units.coe_map, Units.coe_map_inv, MonoidHom.coe_coe, map_ofNat, map_neg, map_add, map_sub, map_mul, map_pow]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ Cubic.disc (twoTorsionPolynomial W) = 16 * Δ W
[PROOFSTEP]
simp only [b₂, b₄, b₆, b₈, Δ, twoTorsionPolynomial, Cubic.disc]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ (W.a₁ ^ 2 + 4 * W.a₂) ^ 2 * (2 * (2 * W.a₄ + W.a₁ * W.a₃)) ^ 2 - 4 * 4 * (2 * (2 * W.a₄ + W.a₁ * W.a₃)) ^ 3 -
          4 * (W.a₁ ^ 2 + 4 * W.a₂) ^ 3 * (W.a₃ ^ 2 + 4 * W.a₆) -
        27 * 4 ^ 2 * (W.a₃ ^ 2 + 4 * W.a₆) ^ 2 +
      18 * 4 * (W.a₁ ^ 2 + 4 * W.a₂) * (2 * (2 * W.a₄ + W.a₁ * W.a₃)) * (W.a₃ ^ 2 + 4 * W.a₆) =
    16 *
      (-(W.a₁ ^ 2 + 4 * W.a₂) ^ 2 *
              (W.a₁ ^ 2 * W.a₆ + 4 * W.a₂ * W.a₆ - W.a₁ * W.a₃ * W.a₄ + W.a₂ * W.a₃ ^ 2 - W.a₄ ^ 2) -
            8 * (2 * W.a₄ + W.a₁ * W.a₃) ^ 3 -
          27 * (W.a₃ ^ 2 + 4 * W.a₆) ^ 2 +
        9 * (W.a₁ ^ 2 + 4 * W.a₂) * (2 * W.a₄ + W.a₁ * W.a₃) * (W.a₃ ^ 2 + 4 * W.a₆))
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : Invertible 2
⊢ IsUnit (Cubic.disc (twoTorsionPolynomial W)) ↔ IsUnit (Δ W)
[PROOFSTEP]
rw [twoTorsionPolynomial_disc, IsUnit.mul_iff, show (16 : R) = 2 ^ 4 by norm_num1]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : Invertible 2
⊢ 16 = 2 ^ 4
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : Invertible 2
⊢ IsUnit (2 ^ 4) ∧ IsUnit (Δ W) ↔ IsUnit (Δ W)
[PROOFSTEP]
exact and_iff_right <| isUnit_of_invertible <| 2 ^ 4
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ WeierstrassCurve.polynomial W =
    Cubic.toPoly
      { a := 0, b := 1, c := Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ },
        d := Cubic.toPoly { a := -1, b := -W.a₂, c := -W.a₄, d := -W.a₆ } }
[PROOFSTEP]
simp only [WeierstrassCurve.polynomial, Cubic.toPoly]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ Y ^ 2 + ↑C (↑C W.a₁ * Y + ↑C W.a₃) * Y - ↑C (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆) =
    ↑C 0 * Y ^ 3 + ↑C 1 * Y ^ 2 + ↑C (↑C 0 * Y ^ 3 + ↑C 0 * Y ^ 2 + ↑C W.a₁ * Y + ↑C W.a₃) * Y +
      ↑C (↑C (-1) * Y ^ 3 + ↑C (-W.a₂) * Y ^ 2 + ↑C (-W.a₄) * Y + ↑C (-W.a₆))
[PROOFSTEP]
C_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ Y ^ 2 + (↑C (↑C W.a₁) * ↑C Y + ↑C (↑C W.a₃)) * Y -
      (↑C Y ^ 3 + ↑C (↑C W.a₂) * ↑C Y ^ 2 + ↑C (↑C W.a₄) * ↑C Y + ↑C (↑C W.a₆)) =
    0 * Y ^ 3 + 1 * Y ^ 2 + (0 * ↑C Y ^ 3 + 0 * ↑C Y ^ 2 + ↑C (↑C W.a₁) * ↑C Y + ↑C (↑C W.a₃)) * Y +
      (-1 * ↑C Y ^ 3 + -↑C (↑C W.a₂) * ↑C Y ^ 2 + -↑C (↑C W.a₄) * ↑C Y + -↑C (↑C W.a₆))
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : Nontrivial R
⊢ WeierstrassCurve.polynomial W ≠ 0
[PROOFSTEP]
rw [polynomial_eq]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : Nontrivial R
⊢ Cubic.toPoly
      { a := 0, b := 1, c := Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ },
        d := Cubic.toPoly { a := -1, b := -W.a₂, c := -W.a₄, d := -W.a₆ } } ≠
    0
[PROOFSTEP]
exact Cubic.ne_zero_of_b_ne_zero one_ne_zero
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : Nontrivial R
⊢ degree (WeierstrassCurve.polynomial W) = 2
[PROOFSTEP]
rw [polynomial_eq]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : Nontrivial R
⊢ degree
      (Cubic.toPoly
        { a := 0, b := 1, c := Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ },
          d := Cubic.toPoly { a := -1, b := -W.a₂, c := -W.a₄, d := -W.a₆ } }) =
    2
[PROOFSTEP]
exact Cubic.degree_of_b_ne_zero' one_ne_zero
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : Nontrivial R
⊢ natDegree (WeierstrassCurve.polynomial W) = 2
[PROOFSTEP]
rw [polynomial_eq]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : Nontrivial R
⊢ natDegree
      (Cubic.toPoly
        { a := 0, b := 1, c := Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ },
          d := Cubic.toPoly { a := -1, b := -W.a₂, c := -W.a₄, d := -W.a₆ } }) =
    2
[PROOFSTEP]
exact Cubic.natDegree_of_b_ne_zero' one_ne_zero
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ Monic (WeierstrassCurve.polynomial W)
[PROOFSTEP]
nontriviality R
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
✝ : Nontrivial R
⊢ Monic (WeierstrassCurve.polynomial W)
[PROOFSTEP]
simpa only [polynomial_eq] using Cubic.monic_of_b_eq_one'
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
⊢ Irreducible (WeierstrassCurve.polynomial W)
[PROOFSTEP]
by_contra h
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h : ¬Irreducible (WeierstrassCurve.polynomial W)
⊢ False
[PROOFSTEP]
rcases(W.monic_polynomial.not_irreducible_iff_exists_add_mul_eq_coeff W.natDegree_polynomial).mp h with ⟨f, g, h0, h1⟩
[GOAL]
case intro.intro.intro
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : coeff (WeierstrassCurve.polynomial W) 0 = f * g
h1 : coeff (WeierstrassCurve.polynomial W) 1 = f + g
⊢ False
[PROOFSTEP]
simp only [polynomial_eq, Cubic.coeff_eq_c, Cubic.coeff_eq_d] at h0 h1 
[GOAL]
case intro.intro.intro
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : Cubic.toPoly { a := -1, b := -W.a₂, c := -W.a₄, d := -W.a₆ } = f * g
h1 : Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ } = f + g
⊢ False
[PROOFSTEP]
apply_fun degree at h0 h1 
[GOAL]
case intro.intro.intro
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : degree (Cubic.toPoly { a := -1, b := -W.a₂, c := -W.a₄, d := -W.a₆ }) = degree (f * g)
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
⊢ False
[PROOFSTEP]
rw [Cubic.degree_of_a_ne_zero' <| neg_ne_zero.mpr <| one_ne_zero' R, degree_mul] at h0 
[GOAL]
case intro.intro.intro
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
⊢ False
[PROOFSTEP]
apply (h1.symm.le.trans Cubic.degree_of_b_eq_zero').not_lt
[GOAL]
case intro.intro.intro
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
⊢ 1 < degree (f + g)
[PROOFSTEP]
rcases Nat.WithBot.add_eq_three_iff.mp h0.symm with h | h | h | h
[GOAL]
case intro.intro.intro.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 0 ∧ degree g = 3
⊢ 1 < degree (f + g)
case intro.intro.intro.inr.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 1 ∧ degree g = 2
⊢ 1 < degree (f + g)
case intro.intro.intro.inr.inr.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 2 ∧ degree g = 1
⊢ 1 < degree (f + g)
case intro.intro.intro.inr.inr.inr
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 3 ∧ degree g = 0
⊢ 1 < degree (f + g)
[PROOFSTEP]
iterate 2 rw [degree_add_eq_right_of_degree_lt] <;> simp only [h]
[GOAL]
case intro.intro.intro.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 0 ∧ degree g = 3
⊢ 1 < degree (f + g)
[PROOFSTEP]
rw [degree_add_eq_right_of_degree_lt]
[GOAL]
case intro.intro.intro.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 0 ∧ degree g = 3
⊢ 1 < degree g
[PROOFSTEP]
simp only [h]
[GOAL]
case intro.intro.intro.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 0 ∧ degree g = 3
⊢ degree f < degree g
[PROOFSTEP]
simp only [h]
[GOAL]
case intro.intro.intro.inr.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 1 ∧ degree g = 2
⊢ 1 < degree (f + g)
[PROOFSTEP]
rw [degree_add_eq_right_of_degree_lt]
[GOAL]
case intro.intro.intro.inr.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 1 ∧ degree g = 2
⊢ 1 < degree g
[PROOFSTEP]
simp only [h]
[GOAL]
case intro.intro.intro.inr.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 1 ∧ degree g = 2
⊢ degree f < degree g
[PROOFSTEP]
simp only [h]
[GOAL]
case intro.intro.intro.inr.inr.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 2 ∧ degree g = 1
⊢ 1 < degree (f + g)
case intro.intro.intro.inr.inr.inr
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 3 ∧ degree g = 0
⊢ 1 < degree (f + g)
[PROOFSTEP]
iterate 2 rw [degree_add_eq_left_of_degree_lt] <;> simp only [h]
[GOAL]
case intro.intro.intro.inr.inr.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 2 ∧ degree g = 1
⊢ 1 < degree (f + g)
[PROOFSTEP]
rw [degree_add_eq_left_of_degree_lt]
[GOAL]
case intro.intro.intro.inr.inr.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 2 ∧ degree g = 1
⊢ 1 < degree f
[PROOFSTEP]
simp only [h]
[GOAL]
case intro.intro.intro.inr.inr.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 2 ∧ degree g = 1
⊢ degree g < degree f
[PROOFSTEP]
simp only [h]
[GOAL]
case intro.intro.intro.inr.inr.inr
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 3 ∧ degree g = 0
⊢ 1 < degree (f + g)
[PROOFSTEP]
rw [degree_add_eq_left_of_degree_lt]
[GOAL]
case intro.intro.intro.inr.inr.inr
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 3 ∧ degree g = 0
⊢ 1 < degree f
[PROOFSTEP]
simp only [h]
[GOAL]
case intro.intro.intro.inr.inr.inr
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
inst✝ : IsDomain R
h✝ : ¬Irreducible (WeierstrassCurve.polynomial W)
f g : R[X]
h0 : 3 = degree f + degree g
h1 : degree (Cubic.toPoly { a := 0, b := 0, c := W.a₁, d := W.a₃ }) = degree (f + g)
h : degree f = 3 ∧ degree g = 0
⊢ degree g < degree f
[PROOFSTEP]
simp only [h]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ eval x (eval (↑C y) (WeierstrassCurve.polynomial W)) =
    y ^ 2 + W.a₁ * x * y + W.a₃ * y - (x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆)
[PROOFSTEP]
simp only [WeierstrassCurve.polynomial]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ eval x (eval (↑C y) (Y ^ 2 + ↑C (↑C W.a₁ * Y + ↑C W.a₃) * Y - ↑C (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆))) =
    y ^ 2 + W.a₁ * x * y + W.a₃ * y - (x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆)
[PROOFSTEP]
eval_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ y ^ 2 + (W.a₁ * x + W.a₃) * y - (x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆) =
    y ^ 2 + W.a₁ * x * y + W.a₃ * y - (x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆)
[PROOFSTEP]
rw [add_mul, ← add_assoc]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ eval 0 (eval 0 (WeierstrassCurve.polynomial W)) = -W.a₆
[PROOFSTEP]
simp only [← C_0, eval_polynomial, zero_add, zero_sub, mul_zero, zero_pow <| Nat.zero_lt_succ _]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ WeierstrassCurve.equation W x y ↔ y ^ 2 + W.a₁ * x * y + W.a₃ * y - (x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆) = 0
[PROOFSTEP]
rw [WeierstrassCurve.equation, eval_polynomial]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ WeierstrassCurve.equation W x y ↔ y ^ 2 + W.a₁ * x * y + W.a₃ * y = x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆
[PROOFSTEP]
rw [equation_iff', sub_eq_zero]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ WeierstrassCurve.equation W 0 0 ↔ W.a₆ = 0
[PROOFSTEP]
rw [WeierstrassCurve.equation, C_0, eval_polynomial_zero, neg_eq_zero]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ WeierstrassCurve.equation W x y ↔ WeierstrassCurve.equation (variableChange W { u := 1, r := x, s := 0, t := y }) 0 0
[PROOFSTEP]
rw [equation_iff', ← neg_eq_zero, equation_zero, variableChange_a₆, inv_one, Units.val_one]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ -(y ^ 2 + W.a₁ * x * y + W.a₃ * y - (x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆)) = 0 ↔
    1 ^ 6 *
        (W.a₆ + { u := 1, r := x, s := 0, t := y }.r * W.a₄ + { u := 1, r := x, s := 0, t := y }.r ^ 2 * W.a₂ +
                { u := 1, r := x, s := 0, t := y }.r ^ 3 -
              { u := 1, r := x, s := 0, t := y }.t * W.a₃ -
            { u := 1, r := x, s := 0, t := y }.t ^ 2 -
          { u := 1, r := x, s := 0, t := y }.r * { u := 1, r := x, s := 0, t := y }.t * W.a₁) =
      0
[PROOFSTEP]
congr! 1
[GOAL]
case a.h.e'_2
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ -(y ^ 2 + W.a₁ * x * y + W.a₃ * y - (x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆)) =
    1 ^ 6 *
      (W.a₆ + { u := 1, r := x, s := 0, t := y }.r * W.a₄ + { u := 1, r := x, s := 0, t := y }.r ^ 2 * W.a₂ +
              { u := 1, r := x, s := 0, t := y }.r ^ 3 -
            { u := 1, r := x, s := 0, t := y }.t * W.a₃ -
          { u := 1, r := x, s := 0, t := y }.t ^ 2 -
        { u := 1, r := x, s := 0, t := y }.r * { u := 1, r := x, s := 0, t := y }.t * W.a₁)
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
⊢ WeierstrassCurve.equation W x y ↔
    WeierstrassCurve.equation (baseChange W A) (↑(algebraMap R A) x) (↑(algebraMap R A) y)
[PROOFSTEP]
simp only [equation_iff]
[GOAL]
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
⊢ y ^ 2 + W.a₁ * x * y + W.a₃ * y = x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆ ↔
    ↑(algebraMap R A) y ^ 2 + (baseChange W A).a₁ * ↑(algebraMap R A) x * ↑(algebraMap R A) y +
        (baseChange W A).a₃ * ↑(algebraMap R A) y =
      ↑(algebraMap R A) x ^ 3 + (baseChange W A).a₂ * ↑(algebraMap R A) x ^ 2 +
          (baseChange W A).a₄ * ↑(algebraMap R A) x +
        (baseChange W A).a₆
[PROOFSTEP]
exact
  ⟨fun h => by convert congr_arg (algebraMap R A) h <;> map_simp <;> rfl, fun h => by
    apply NoZeroSMulDivisors.algebraMap_injective R A; map_simp; exact h⟩
[GOAL]
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : y ^ 2 + W.a₁ * x * y + W.a₃ * y = x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆
⊢ ↑(algebraMap R A) y ^ 2 + (baseChange W A).a₁ * ↑(algebraMap R A) x * ↑(algebraMap R A) y +
      (baseChange W A).a₃ * ↑(algebraMap R A) y =
    ↑(algebraMap R A) x ^ 3 + (baseChange W A).a₂ * ↑(algebraMap R A) x ^ 2 +
        (baseChange W A).a₄ * ↑(algebraMap R A) x +
      (baseChange W A).a₆
[PROOFSTEP]
convert congr_arg (algebraMap R A) h
[GOAL]
case h.e'_2
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : y ^ 2 + W.a₁ * x * y + W.a₃ * y = x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆
⊢ ↑(algebraMap R A) y ^ 2 + (baseChange W A).a₁ * ↑(algebraMap R A) x * ↑(algebraMap R A) y +
      (baseChange W A).a₃ * ↑(algebraMap R A) y =
    ↑(algebraMap R A) (y ^ 2 + W.a₁ * x * y + W.a₃ * y)
[PROOFSTEP]
map_simp
[GOAL]
case h.e'_3
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : y ^ 2 + W.a₁ * x * y + W.a₃ * y = x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆
⊢ ↑(algebraMap R A) x ^ 3 + (baseChange W A).a₂ * ↑(algebraMap R A) x ^ 2 + (baseChange W A).a₄ * ↑(algebraMap R A) x +
      (baseChange W A).a₆ =
    ↑(algebraMap R A) (x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆)
[PROOFSTEP]
map_simp
[GOAL]
case h.e'_2
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : y ^ 2 + W.a₁ * x * y + W.a₃ * y = x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆
⊢ ↑(algebraMap R A) y ^ 2 + (baseChange W A).a₁ * ↑(algebraMap R A) x * ↑(algebraMap R A) y +
      (baseChange W A).a₃ * ↑(algebraMap R A) y =
    ↑(algebraMap R A) y ^ 2 + ↑(algebraMap R A) W.a₁ * ↑(algebraMap R A) x * ↑(algebraMap R A) y +
      ↑(algebraMap R A) W.a₃ * ↑(algebraMap R A) y
[PROOFSTEP]
rfl
[GOAL]
case h.e'_3
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : y ^ 2 + W.a₁ * x * y + W.a₃ * y = x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆
⊢ ↑(algebraMap R A) x ^ 3 + (baseChange W A).a₂ * ↑(algebraMap R A) x ^ 2 + (baseChange W A).a₄ * ↑(algebraMap R A) x +
      (baseChange W A).a₆ =
    ↑(algebraMap R A) x ^ 3 + ↑(algebraMap R A) W.a₂ * ↑(algebraMap R A) x ^ 2 +
        ↑(algebraMap R A) W.a₄ * ↑(algebraMap R A) x +
      ↑(algebraMap R A) W.a₆
[PROOFSTEP]
rfl
[GOAL]
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h :
  ↑(algebraMap R A) y ^ 2 + (baseChange W A).a₁ * ↑(algebraMap R A) x * ↑(algebraMap R A) y +
      (baseChange W A).a₃ * ↑(algebraMap R A) y =
    ↑(algebraMap R A) x ^ 3 + (baseChange W A).a₂ * ↑(algebraMap R A) x ^ 2 +
        (baseChange W A).a₄ * ↑(algebraMap R A) x +
      (baseChange W A).a₆
⊢ y ^ 2 + W.a₁ * x * y + W.a₃ * y = x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆
[PROOFSTEP]
apply NoZeroSMulDivisors.algebraMap_injective R A
[GOAL]
case a
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h :
  ↑(algebraMap R A) y ^ 2 + (baseChange W A).a₁ * ↑(algebraMap R A) x * ↑(algebraMap R A) y +
      (baseChange W A).a₃ * ↑(algebraMap R A) y =
    ↑(algebraMap R A) x ^ 3 + (baseChange W A).a₂ * ↑(algebraMap R A) x ^ 2 +
        (baseChange W A).a₄ * ↑(algebraMap R A) x +
      (baseChange W A).a₆
⊢ ↑(algebraMap R A) (y ^ 2 + W.a₁ * x * y + W.a₃ * y) = ↑(algebraMap R A) (x ^ 3 + W.a₂ * x ^ 2 + W.a₄ * x + W.a₆)
[PROOFSTEP]
map_simp
[GOAL]
case a
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h :
  ↑(algebraMap R A) y ^ 2 + (baseChange W A).a₁ * ↑(algebraMap R A) x * ↑(algebraMap R A) y +
      (baseChange W A).a₃ * ↑(algebraMap R A) y =
    ↑(algebraMap R A) x ^ 3 + (baseChange W A).a₂ * ↑(algebraMap R A) x ^ 2 +
        (baseChange W A).a₄ * ↑(algebraMap R A) x +
      (baseChange W A).a₆
⊢ ↑(algebraMap R A) y ^ 2 + ↑(algebraMap R A) W.a₁ * ↑(algebraMap R A) x * ↑(algebraMap R A) y +
      ↑(algebraMap R A) W.a₃ * ↑(algebraMap R A) y =
    ↑(algebraMap R A) x ^ 3 + ↑(algebraMap R A) W.a₂ * ↑(algebraMap R A) x ^ 2 +
        ↑(algebraMap R A) W.a₄ * ↑(algebraMap R A) x +
      ↑(algebraMap R A) W.a₆
[PROOFSTEP]
exact h
[GOAL]
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial B
inst✝ : NoZeroSMulDivisors A B
x y : A
⊢ WeierstrassCurve.equation (baseChange W A) x y ↔
    WeierstrassCurve.equation (baseChange W B) (↑(algebraMap A B) x) (↑(algebraMap A B) y)
[PROOFSTEP]
rw [equation_iff_baseChange (W.baseChange A) B, baseChange_baseChange]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ eval x (eval (↑C y) (WeierstrassCurve.polynomialX W)) = W.a₁ * y - (3 * x ^ 2 + 2 * W.a₂ * x + W.a₄)
[PROOFSTEP]
simp only [WeierstrassCurve.polynomialX]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ eval x (eval (↑C y) (↑C (↑C W.a₁) * Y - ↑C (↑C 3 * Y ^ 2 + ↑C (2 * W.a₂) * Y + ↑C W.a₄))) =
    W.a₁ * y - (3 * x ^ 2 + 2 * W.a₂ * x + W.a₄)
[PROOFSTEP]
eval_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ eval 0 (eval 0 (WeierstrassCurve.polynomialX W)) = -W.a₄
[PROOFSTEP]
simp only [← C_0, eval_polynomialX, zero_add, zero_sub, mul_zero, zero_pow zero_lt_two]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ eval x (eval (↑C y) (WeierstrassCurve.polynomialY W)) = 2 * y + W.a₁ * x + W.a₃
[PROOFSTEP]
simp only [WeierstrassCurve.polynomialY]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ eval x (eval (↑C y) (↑C (↑C 2) * Y + ↑C (↑C W.a₁ * Y + ↑C W.a₃))) = 2 * y + W.a₁ * x + W.a₃
[PROOFSTEP]
eval_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ 2 * y + (W.a₁ * x + W.a₃) = 2 * y + W.a₁ * x + W.a₃
[PROOFSTEP]
rw [← add_assoc]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ eval 0 (eval 0 (WeierstrassCurve.polynomialY W)) = W.a₃
[PROOFSTEP]
simp only [← C_0, eval_polynomialY, zero_add, mul_zero]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ WeierstrassCurve.nonsingular W x y ↔
    WeierstrassCurve.equation W x y ∧ (W.a₁ * y - (3 * x ^ 2 + 2 * W.a₂ * x + W.a₄) ≠ 0 ∨ 2 * y + W.a₁ * x + W.a₃ ≠ 0)
[PROOFSTEP]
rw [WeierstrassCurve.nonsingular, equation_iff', eval_polynomialX, eval_polynomialY]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ WeierstrassCurve.nonsingular W x y ↔
    WeierstrassCurve.equation W x y ∧ (W.a₁ * y ≠ 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄ ∨ y ≠ -y - W.a₁ * x - W.a₃)
[PROOFSTEP]
rw [nonsingular_iff', sub_ne_zero, ← @sub_ne_zero _ _ y]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ WeierstrassCurve.equation W x y ∧ (W.a₁ * y ≠ 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄ ∨ 2 * y + W.a₁ * x + W.a₃ ≠ 0) ↔
    WeierstrassCurve.equation W x y ∧ (W.a₁ * y ≠ 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄ ∨ y - (-y - W.a₁ * x - W.a₃) ≠ 0)
[PROOFSTEP]
congr! 3
[GOAL]
case a.h.e'_2.h.e'_2.h.e'_2
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ 2 * y + W.a₁ * x + W.a₃ = y - (-y - W.a₁ * x - W.a₃)
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
⊢ WeierstrassCurve.nonsingular W 0 0 ↔ W.a₆ = 0 ∧ (W.a₃ ≠ 0 ∨ W.a₄ ≠ 0)
[PROOFSTEP]
rw [WeierstrassCurve.nonsingular, equation_zero, C_0, eval_polynomialX_zero, neg_ne_zero, eval_polynomialY_zero,
  or_comm]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ WeierstrassCurve.nonsingular W x y ↔
    WeierstrassCurve.nonsingular (variableChange W { u := 1, r := x, s := 0, t := y }) 0 0
[PROOFSTEP]
rw [nonsingular_iff', equation_iff_variableChange, equation_zero, ← neg_ne_zero, or_comm, nonsingular_zero,
  variableChange_a₃, variableChange_a₄, inv_one, Units.val_one]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ (variableChange W { u := 1, r := x, s := 0, t := y }).a₆ = 0 ∧
      (2 * y + W.a₁ * x + W.a₃ ≠ 0 ∨ -(W.a₁ * y - (3 * x ^ 2 + 2 * W.a₂ * x + W.a₄)) ≠ 0) ↔
    (variableChange W { u := 1, r := x, s := 0, t := y }).a₆ = 0 ∧
      (1 ^ 3 * (W.a₃ + { u := 1, r := x, s := 0, t := y }.r * W.a₁ + 2 * { u := 1, r := x, s := 0, t := y }.t) ≠ 0 ∨
        1 ^ 4 *
            (W.a₄ - { u := 1, r := x, s := 0, t := y }.s * W.a₃ + 2 * { u := 1, r := x, s := 0, t := y }.r * W.a₂ -
                  ({ u := 1, r := x, s := 0, t := y }.t +
                      { u := 1, r := x, s := 0, t := y }.r * { u := 1, r := x, s := 0, t := y }.s) *
                    W.a₁ +
                3 * { u := 1, r := x, s := 0, t := y }.r ^ 2 -
              2 * { u := 1, r := x, s := 0, t := y }.s * { u := 1, r := x, s := 0, t := y }.t) ≠
          0)
[PROOFSTEP]
simp only [variableChange]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ ↑1⁻¹ ^ 6 * (W.a₆ + x * W.a₄ + x ^ 2 * W.a₂ + x ^ 3 - y * W.a₃ - y ^ 2 - x * y * W.a₁) = 0 ∧
      (2 * y + W.a₁ * x + W.a₃ ≠ 0 ∨ -(W.a₁ * y - (3 * x ^ 2 + 2 * W.a₂ * x + W.a₄)) ≠ 0) ↔
    ↑1⁻¹ ^ 6 * (W.a₆ + x * W.a₄ + x ^ 2 * W.a₂ + x ^ 3 - y * W.a₃ - y ^ 2 - x * y * W.a₁) = 0 ∧
      (1 ^ 3 * (W.a₃ + x * W.a₁ + 2 * y) ≠ 0 ∨
        1 ^ 4 * (W.a₄ - 0 * W.a₃ + 2 * x * W.a₂ - (y + x * 0) * W.a₁ + 3 * x ^ 2 - 2 * 0 * y) ≠ 0)
[PROOFSTEP]
congr! 3
[GOAL]
case a.h.e'_2.h.e'_1.h.e'_2
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ 2 * y + W.a₁ * x + W.a₃ = 1 ^ 3 * (W.a₃ + x * W.a₁ + 2 * y)
[PROOFSTEP]
ring1
[GOAL]
case a.h.e'_2.h.e'_2.h.e'_2
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
⊢ -(W.a₁ * y - (3 * x ^ 2 + 2 * W.a₂ * x + W.a₄)) =
    1 ^ 4 * (W.a₄ - 0 * W.a₃ + 2 * x * W.a₂ - (y + x * 0) * W.a₁ + 3 * x ^ 2 - 2 * 0 * y)
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
⊢ WeierstrassCurve.nonsingular W x y ↔
    WeierstrassCurve.nonsingular (baseChange W A) (↑(algebraMap R A) x) (↑(algebraMap R A) y)
[PROOFSTEP]
rw [nonsingular_iff, nonsingular_iff, and_congr <| W.equation_iff_baseChange A x y]
[GOAL]
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
⊢ W.a₁ * y ≠ 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄ ∨ y ≠ -y - W.a₁ * x - W.a₃ ↔
    (baseChange W A).a₁ * ↑(algebraMap R A) y ≠
        3 * ↑(algebraMap R A) x ^ 2 + 2 * (baseChange W A).a₂ * ↑(algebraMap R A) x + (baseChange W A).a₄ ∨
      ↑(algebraMap R A) y ≠ -↑(algebraMap R A) y - (baseChange W A).a₁ * ↑(algebraMap R A) x - (baseChange W A).a₃
[PROOFSTEP]
refine
  ⟨Or.imp (not_imp_not.mpr fun h => ?_) (not_imp_not.mpr fun h => ?_),
    Or.imp (not_imp_not.mpr fun h => ?_) (not_imp_not.mpr fun h => ?_)⟩
[GOAL]
case refine_1
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h :
  (baseChange W A).a₁ * ↑(algebraMap R A) y =
    3 * ↑(algebraMap R A) x ^ 2 + 2 * (baseChange W A).a₂ * ↑(algebraMap R A) x + (baseChange W A).a₄
⊢ W.a₁ * y = 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄
case refine_2
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : ↑(algebraMap R A) y = -↑(algebraMap R A) y - (baseChange W A).a₁ * ↑(algebraMap R A) x - (baseChange W A).a₃
⊢ y = -y - W.a₁ * x - W.a₃
case refine_3
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : W.a₁ * y = 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄
⊢ (baseChange W A).a₁ * ↑(algebraMap R A) y =
    3 * ↑(algebraMap R A) x ^ 2 + 2 * (baseChange W A).a₂ * ↑(algebraMap R A) x + (baseChange W A).a₄
case refine_4
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : y = -y - W.a₁ * x - W.a₃
⊢ ↑(algebraMap R A) y = -↑(algebraMap R A) y - (baseChange W A).a₁ * ↑(algebraMap R A) x - (baseChange W A).a₃
[PROOFSTEP]
any_goals apply NoZeroSMulDivisors.algebraMap_injective R A; map_simp; exact h
[GOAL]
case refine_1
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h :
  (baseChange W A).a₁ * ↑(algebraMap R A) y =
    3 * ↑(algebraMap R A) x ^ 2 + 2 * (baseChange W A).a₂ * ↑(algebraMap R A) x + (baseChange W A).a₄
⊢ W.a₁ * y = 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄
[PROOFSTEP]
apply NoZeroSMulDivisors.algebraMap_injective R A
[GOAL]
case refine_1.a
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h :
  (baseChange W A).a₁ * ↑(algebraMap R A) y =
    3 * ↑(algebraMap R A) x ^ 2 + 2 * (baseChange W A).a₂ * ↑(algebraMap R A) x + (baseChange W A).a₄
⊢ ↑(algebraMap R A) (W.a₁ * y) = ↑(algebraMap R A) (3 * x ^ 2 + 2 * W.a₂ * x + W.a₄)
[PROOFSTEP]
map_simp
[GOAL]
case refine_1.a
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h :
  (baseChange W A).a₁ * ↑(algebraMap R A) y =
    3 * ↑(algebraMap R A) x ^ 2 + 2 * (baseChange W A).a₂ * ↑(algebraMap R A) x + (baseChange W A).a₄
⊢ ↑(algebraMap R A) W.a₁ * ↑(algebraMap R A) y =
    3 * ↑(algebraMap R A) x ^ 2 + 2 * ↑(algebraMap R A) W.a₂ * ↑(algebraMap R A) x + ↑(algebraMap R A) W.a₄
[PROOFSTEP]
exact h
[GOAL]
case refine_2
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : ↑(algebraMap R A) y = -↑(algebraMap R A) y - (baseChange W A).a₁ * ↑(algebraMap R A) x - (baseChange W A).a₃
⊢ y = -y - W.a₁ * x - W.a₃
[PROOFSTEP]
apply NoZeroSMulDivisors.algebraMap_injective R A
[GOAL]
case refine_2.a
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : ↑(algebraMap R A) y = -↑(algebraMap R A) y - (baseChange W A).a₁ * ↑(algebraMap R A) x - (baseChange W A).a₃
⊢ ↑(algebraMap R A) y = ↑(algebraMap R A) (-y - W.a₁ * x - W.a₃)
[PROOFSTEP]
map_simp
[GOAL]
case refine_2.a
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : ↑(algebraMap R A) y = -↑(algebraMap R A) y - (baseChange W A).a₁ * ↑(algebraMap R A) x - (baseChange W A).a₃
⊢ ↑(algebraMap R A) y = -↑(algebraMap R A) y - ↑(algebraMap R A) W.a₁ * ↑(algebraMap R A) x - ↑(algebraMap R A) W.a₃
[PROOFSTEP]
exact h
[GOAL]
case refine_3
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : W.a₁ * y = 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄
⊢ (baseChange W A).a₁ * ↑(algebraMap R A) y =
    3 * ↑(algebraMap R A) x ^ 2 + 2 * (baseChange W A).a₂ * ↑(algebraMap R A) x + (baseChange W A).a₄
[PROOFSTEP]
apply NoZeroSMulDivisors.algebraMap_injective R A
[GOAL]
case refine_4
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : y = -y - W.a₁ * x - W.a₃
⊢ ↑(algebraMap R A) y = -↑(algebraMap R A) y - (baseChange W A).a₁ * ↑(algebraMap R A) x - (baseChange W A).a₃
[PROOFSTEP]
apply NoZeroSMulDivisors.algebraMap_injective R A
[GOAL]
case refine_3
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : W.a₁ * y = 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄
⊢ (baseChange W A).a₁ * ↑(algebraMap R A) y =
    3 * ↑(algebraMap R A) x ^ 2 + 2 * (baseChange W A).a₂ * ↑(algebraMap R A) x + (baseChange W A).a₄
case refine_4
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : y = -y - W.a₁ * x - W.a₃
⊢ ↑(algebraMap R A) y = -↑(algebraMap R A) y - (baseChange W A).a₁ * ↑(algebraMap R A) x - (baseChange W A).a₃
[PROOFSTEP]
any_goals convert congr_arg (algebraMap R A) h <;> map_simp <;> rfl
[GOAL]
case refine_3
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : W.a₁ * y = 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄
⊢ (baseChange W A).a₁ * ↑(algebraMap R A) y =
    3 * ↑(algebraMap R A) x ^ 2 + 2 * (baseChange W A).a₂ * ↑(algebraMap R A) x + (baseChange W A).a₄
[PROOFSTEP]
convert congr_arg (algebraMap R A) h
[GOAL]
case h.e'_2
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : W.a₁ * y = 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄
⊢ (baseChange W A).a₁ * ↑(algebraMap R A) y = ↑(algebraMap R A) (W.a₁ * y)
[PROOFSTEP]
map_simp
[GOAL]
case h.e'_3
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : W.a₁ * y = 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄
⊢ 3 * ↑(algebraMap R A) x ^ 2 + 2 * (baseChange W A).a₂ * ↑(algebraMap R A) x + (baseChange W A).a₄ =
    ↑(algebraMap R A) (3 * x ^ 2 + 2 * W.a₂ * x + W.a₄)
[PROOFSTEP]
map_simp
[GOAL]
case h.e'_2
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : W.a₁ * y = 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄
⊢ (baseChange W A).a₁ * ↑(algebraMap R A) y = ↑(algebraMap R A) W.a₁ * ↑(algebraMap R A) y
[PROOFSTEP]
rfl
[GOAL]
case h.e'_3
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : W.a₁ * y = 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄
⊢ 3 * ↑(algebraMap R A) x ^ 2 + 2 * (baseChange W A).a₂ * ↑(algebraMap R A) x + (baseChange W A).a₄ =
    3 * ↑(algebraMap R A) x ^ 2 + 2 * ↑(algebraMap R A) W.a₂ * ↑(algebraMap R A) x + ↑(algebraMap R A) W.a₄
[PROOFSTEP]
rfl
[GOAL]
case refine_4
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : y = -y - W.a₁ * x - W.a₃
⊢ ↑(algebraMap R A) y = -↑(algebraMap R A) y - (baseChange W A).a₁ * ↑(algebraMap R A) x - (baseChange W A).a₃
[PROOFSTEP]
convert congr_arg (algebraMap R A) h
[GOAL]
case h.e'_3
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : y = -y - W.a₁ * x - W.a₃
⊢ -↑(algebraMap R A) y - (baseChange W A).a₁ * ↑(algebraMap R A) x - (baseChange W A).a₃ =
    ↑(algebraMap R A) (-y - W.a₁ * x - W.a₃)
[PROOFSTEP]
map_simp
[GOAL]
case h.e'_3
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial A
inst✝ : NoZeroSMulDivisors R A
x y : R
h : y = -y - W.a₁ * x - W.a₃
⊢ -↑(algebraMap R A) y - (baseChange W A).a₁ * ↑(algebraMap R A) x - (baseChange W A).a₃ =
    -↑(algebraMap R A) y - ↑(algebraMap R A) W.a₁ * ↑(algebraMap R A) x - ↑(algebraMap R A) W.a₃
[PROOFSTEP]
rfl
[GOAL]
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : Nontrivial B
inst✝ : NoZeroSMulDivisors A B
x y : A
⊢ WeierstrassCurve.nonsingular (baseChange W A) x y ↔
    WeierstrassCurve.nonsingular (baseChange W B) (↑(algebraMap A B) x) (↑(algebraMap A B) y)
[PROOFSTEP]
rw [nonsingular_iff_baseChange (W.baseChange A) B, baseChange_baseChange]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : WeierstrassCurve.equation W 0 0
hΔ : Δ W ≠ 0
⊢ WeierstrassCurve.nonsingular W 0 0
[PROOFSTEP]
simp only [equation_zero, nonsingular_zero] at *
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
hΔ : Δ W ≠ 0
h : W.a₆ = 0
⊢ W.a₆ = 0 ∧ (W.a₃ ≠ 0 ∨ W.a₄ ≠ 0)
[PROOFSTEP]
contrapose! hΔ
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : W.a₆ = 0
hΔ : W.a₆ = 0 → W.a₃ = 0 ∧ W.a₄ = 0
⊢ Δ W = 0
[PROOFSTEP]
simp only [b₂, b₄, b₆, b₈, Δ, h, hΔ]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
h : W.a₆ = 0
hΔ : W.a₆ = 0 → W.a₃ = 0 ∧ W.a₄ = 0
⊢ -(W.a₁ ^ 2 + 4 * W.a₂) ^ 2 * (W.a₁ ^ 2 * 0 + 4 * W.a₂ * 0 - W.a₁ * 0 * 0 + W.a₂ * 0 ^ 2 - 0 ^ 2) -
          8 * (2 * 0 + W.a₁ * 0) ^ 3 -
        27 * (0 ^ 2 + 4 * 0) ^ 2 +
      9 * (W.a₁ ^ 2 + 4 * W.a₂) * (2 * 0 + W.a₁ * 0) * (0 ^ 2 + 4 * 0) =
    0
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x y : R
h : WeierstrassCurve.equation W x y
hΔ : Δ W ≠ 0
⊢ Δ (variableChange W { u := 1, r := x, s := 0, t := y }) ≠ 0
[PROOFSTEP]
rwa [variableChange_Δ, inv_one, Units.val_one, one_pow, one_mul]
[GOAL]
R : Type u
inst✝⁸ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
B : Type w
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : Algebra A B
inst✝² : IsScalarTower R A B
inst✝¹ : IsDomain R
inst✝ : NormalizedGCDMonoid R
⊢ IsPrime (span {WeierstrassCurve.polynomial W})
[PROOFSTEP]
simpa only [span_singleton_prime W.polynomial_ne_zero, ← GCDMonoid.irreducible_iff_prime] using W.irreducible_polynomial
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
F : Type u
inst✝ : Field F
W : WeierstrassCurve F
⊢ IsDomain (CoordinateRing W)
[PROOFSTEP]
classical exact instIsDomainCoordinateRing W
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W✝ : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
F : Type u
inst✝ : Field F
W : WeierstrassCurve F
⊢ IsDomain (CoordinateRing W)
[PROOFSTEP]
exact instIsDomainCoordinateRing W
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : Nontrivial R
⊢ natDegree (↑C (Y - ↑C x)) < natDegree (WeierstrassCurve.polynomial W)
[PROOFSTEP]
rw [natDegree_polynomial, natDegree_C]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : Nontrivial R
⊢ 0 < 2
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : Nontrivial R
⊢ natDegree (Y - ↑C y) < natDegree (WeierstrassCurve.polynomial W)
[PROOFSTEP]
rw [natDegree_polynomial, natDegree_X_sub_C]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : Nontrivial R
⊢ 1 < 2
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x✝ : R
y✝ : R[X]
x : R
y : R[X]
h : eval x (eval y (WeierstrassCurve.polynomial W)) = 0
⊢ XYIdeal W x y = Ideal.map (Quotient.mkₐ R (span {WeierstrassCurve.polynomial W})) (span {↑C (Y - ↑C x), Y - ↑C y})
[PROOFSTEP]
simp only [XYIdeal, XClass, YClass, ← Set.image_pair, ← map_span]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x✝ : R
y✝ : R[X]
x : R
y : R[X]
h : eval x (eval y (WeierstrassCurve.polynomial W)) = 0
⊢ Ideal.map (mk W) (span {↑C (Y - ↑C x), Y - ↑C y}) =
    Ideal.map (Quotient.mkₐ R (span {WeierstrassCurve.polynomial W})) (span {↑C (Y - ↑C x), Y - ↑C y})
[PROOFSTEP]
rfl
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
⊢ Basis (Fin 2) R[X] (CoordinateRing W)
[PROOFSTEP]
classical exact
  (subsingleton_or_nontrivial R).by_cases (fun _ => default) fun _ =>
    (AdjoinRoot.powerBasis' W.monic_polynomial).basis.reindex <| finCongr W.natDegree_polynomial
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
⊢ Basis (Fin 2) R[X] (CoordinateRing W)
[PROOFSTEP]
exact
  (subsingleton_or_nontrivial R).by_cases (fun _ => default) fun _ =>
    (AdjoinRoot.powerBasis' W.monic_polynomial).basis.reindex <| finCongr W.natDegree_polynomial
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
n : Fin 2
⊢ ↑(CoordinateRing.basis W) n = (AdjoinRoot.powerBasis' (_ : Monic (WeierstrassCurve.polynomial W))).gen ^ ↑n
[PROOFSTEP]
classical
nontriviality R
rw [CoordinateRing.basis, Or.by_cases, dif_neg <| not_subsingleton R, Basis.reindex_apply, PowerBasis.basis_eq_pow]
rfl
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
n : Fin 2
⊢ ↑(CoordinateRing.basis W) n = (AdjoinRoot.powerBasis' (_ : Monic (WeierstrassCurve.polynomial W))).gen ^ ↑n
[PROOFSTEP]
nontriviality R
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
n : Fin 2
✝ : Nontrivial R
⊢ ↑(CoordinateRing.basis W) n = (AdjoinRoot.powerBasis' (_ : Monic (WeierstrassCurve.polynomial W))).gen ^ ↑n
[PROOFSTEP]
rw [CoordinateRing.basis, Or.by_cases, dif_neg <| not_subsingleton R, Basis.reindex_apply, PowerBasis.basis_eq_pow]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
n : Fin 2
✝ : Nontrivial R
⊢ (AdjoinRoot.powerBasis' (_ : Monic (WeierstrassCurve.polynomial W))).gen ^
      ↑(↑(finCongr (_ : natDegree (WeierstrassCurve.polynomial W) = 2)).symm n) =
    (AdjoinRoot.powerBasis' (_ : Monic (WeierstrassCurve.polynomial W))).gen ^ ↑n
[PROOFSTEP]
rfl
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
⊢ ↑(CoordinateRing.basis W) 0 = 1
[PROOFSTEP]
simpa only [basis_apply] using pow_zero _
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
⊢ ↑(CoordinateRing.basis W) 1 = ↑(mk W) Y
[PROOFSTEP]
simpa only [basis_apply] using pow_one _
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
⊢ ↑(CoordinateRing.basis W) = ![1, ↑(mk W) Y]
[PROOFSTEP]
ext n
[GOAL]
case h
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
n : Fin 2
⊢ ↑(CoordinateRing.basis W) n = Matrix.vecCons 1 ![↑(mk W) Y] n
[PROOFSTEP]
fin_cases n
[GOAL]
case h.head
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
⊢ ↑(CoordinateRing.basis W) { val := 0, isLt := (_ : 0 < 2) } =
    Matrix.vecCons 1 ![↑(mk W) Y] { val := 0, isLt := (_ : 0 < 2) }
case h.tail.head
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y : R[X]
⊢ ↑(CoordinateRing.basis W) { val := 1, isLt := (_ : (fun a => a < 2) 1) } =
    Matrix.vecCons 1 ![↑(mk W) Y] { val := 1, isLt := (_ : (fun a => a < 2) 1) }
[PROOFSTEP]
exacts [basis_zero W, basis_one W]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
hpq : p • 1 + q • ↑(mk W) Y = 0
⊢ p = 0 ∧ q = 0
[PROOFSTEP]
have h := Fintype.linearIndependent_iff.mp (CoordinateRing.basis W).linearIndependent ![p, q]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
hpq : p • 1 + q • ↑(mk W) Y = 0
h :
  (Finset.sum Finset.univ fun i => Matrix.vecCons p ![q] i • ↑(CoordinateRing.basis W) i) = 0 →
    ∀ (i : Fin 2), Matrix.vecCons p ![q] i = 0
⊢ p = 0 ∧ q = 0
[PROOFSTEP]
erw [Fin.sum_univ_succ, basis_zero, Fin.sum_univ_one, basis_one] at h 
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
hpq : p • 1 + q • ↑(mk W) Y = 0
h :
  Matrix.vecCons p ![q] 0 • 1 + Matrix.vecCons p ![q] (Fin.succ 0) • ↑(mk W) Y = 0 →
    ∀ (i : Fin 2), Matrix.vecCons p ![q] i = 0
⊢ p = 0 ∧ q = 0
[PROOFSTEP]
exact ⟨h hpq 0, h hpq 1⟩
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x✝ : R
y : R[X]
x : CoordinateRing W
⊢ ∃ p q, p • 1 + q • ↑(mk W) Y = x
[PROOFSTEP]
have h := (CoordinateRing.basis W).sum_equivFun x
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x✝ : R
y : R[X]
x : CoordinateRing W
h : (Finset.sum Finset.univ fun i => ↑(Basis.equivFun (CoordinateRing.basis W)) x i • ↑(CoordinateRing.basis W) i) = x
⊢ ∃ p q, p • 1 + q • ↑(mk W) Y = x
[PROOFSTEP]
erw [Fin.sum_univ_succ, Fin.sum_univ_one, basis_zero, basis_one] at h 
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x✝ : R
y : R[X]
x : CoordinateRing W
h :
  ↑(Basis.equivFun (CoordinateRing.basis W)) x 0 • 1 +
      ↑(Basis.equivFun (CoordinateRing.basis W)) x (Fin.succ 0) • ↑(mk W) Y =
    x
⊢ ∃ p q, p • 1 + q • ↑(mk W) Y = x
[PROOFSTEP]
exact ⟨_, _, h⟩
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
⊢ (p • 1 + q • ↑(mk W) Y) * ↑(mk W) (↑C y) = (p * y) • 1 + (q * y) • ↑(mk W) Y
[PROOFSTEP]
simp only [smul, _root_.map_mul]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
⊢ (↑(mk W) (↑C p) * 1 + ↑(mk W) (↑C q) * ↑(mk W) Y) * ↑(mk W) (↑C y) =
    ↑(mk W) (↑C p) * ↑(mk W) (↑C y) * 1 + ↑(mk W) (↑C q) * ↑(mk W) (↑C y) * ↑(mk W) Y
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
⊢ (p • 1 + q • ↑(mk W) Y) * ↑(mk W) Y =
    (q * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) • 1 + (p - q * (↑C W.a₁ * Y + ↑C W.a₃)) • ↑(mk W) Y
[PROOFSTEP]
have Y_sq : mk W Y ^ 2 = mk W (C (X ^ 3 + C W.a₂ * X ^ 2 + C W.a₄ * X + C W.a₆) - C (C W.a₁ * X + C W.a₃) * Y) := by
  exact AdjoinRoot.mk_eq_mk.mpr ⟨1, by rw [WeierstrassCurve.polynomial]; ring1⟩
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
⊢ ↑(mk W) Y ^ 2 = ↑(mk W) (↑C (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆) - ↑C (↑C W.a₁ * Y + ↑C W.a₃) * Y)
[PROOFSTEP]
exact AdjoinRoot.mk_eq_mk.mpr ⟨1, by rw [WeierstrassCurve.polynomial]; ring1⟩
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
⊢ (fun x => x ^ 2) Y - (↑C (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆) - ↑C (↑C W.a₁ * Y + ↑C W.a₃) * Y) =
    WeierstrassCurve.polynomial W * 1
[PROOFSTEP]
rw [WeierstrassCurve.polynomial]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
⊢ (fun x => x ^ 2) Y - (↑C (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆) - ↑C (↑C W.a₁ * Y + ↑C W.a₃) * Y) =
    (Y ^ 2 + ↑C (↑C W.a₁ * Y + ↑C W.a₃) * Y - ↑C (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) * 1
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
Y_sq : ↑(mk W) Y ^ 2 = ↑(mk W) (↑C (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆) - ↑C (↑C W.a₁ * Y + ↑C W.a₃) * Y)
⊢ (p • 1 + q • ↑(mk W) Y) * ↑(mk W) Y =
    (q * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) • 1 + (p - q * (↑C W.a₁ * Y + ↑C W.a₃)) • ↑(mk W) Y
[PROOFSTEP]
simp_rw [smul, add_mul, mul_assoc, ← sq, Y_sq, C_sub, map_sub, C_mul, _root_.map_mul]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
Y_sq : ↑(mk W) Y ^ 2 = ↑(mk W) (↑C (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆) - ↑C (↑C W.a₁ * Y + ↑C W.a₃) * Y)
⊢ ↑(mk W) (↑C p) * (1 * ↑(mk W) Y) +
      ↑(mk W) (↑C q) *
        (↑(mk W) (↑C (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) -
          ↑(mk W) (↑C (↑C W.a₁ * Y + ↑C W.a₃)) * ↑(mk W) Y) =
    ↑(mk W) (↑C q) * ↑(mk W) (↑C (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) * 1 +
      (↑(mk W) (↑C p) - ↑(mk W) (↑C q) * ↑(mk W) (↑C (↑C W.a₁ * Y + ↑C W.a₃))) * ↑(mk W) Y
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
⊢ ↑(Algebra.norm R[X]) (p • 1 + q • ↑(mk W) Y) =
    p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)
[PROOFSTEP]
simp_rw [Algebra.norm_eq_matrix_det <| CoordinateRing.basis W, Matrix.det_fin_two, Algebra.leftMulMatrix_eq_repr_mul,
  basis_zero, mul_one, basis_one, smul_basis_mul_Y, map_add, Finsupp.add_apply, map_smul, Finsupp.smul_apply, ←
  basis_zero, ← basis_one, Basis.repr_self_apply, if_pos, if_neg, smul_eq_mul]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
⊢ (p * 1 + q * 0) *
        (q * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆) * 0 + (p - q * (↑C W.a₁ * Y + ↑C W.a₃)) * 1) -
      (q * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆) * 1 + (p - q * (↑C W.a₁ * Y + ↑C W.a₃)) * 0) *
        (p * 0 + q * 1) =
    p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
⊢ ↑C (↑(Algebra.norm R[X]) (p • 1 + q • ↑(mk W) Y)) -
      (↑C p + ↑C q * Y) * (↑C p + ↑C q * (-Y - ↑C (↑C W.a₁ * Y + ↑C W.a₃))) =
    WeierstrassCurve.polynomial W * ↑C q ^ 2
[PROOFSTEP]
simp only [norm_smul_basis, WeierstrassCurve.polynomial]
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
⊢ ↑C (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) -
      (↑C p + ↑C q * Y) * (↑C p + ↑C q * (-Y - ↑C (↑C W.a₁ * Y + ↑C W.a₃))) =
    (Y ^ 2 + ↑C (↑C W.a₁ * Y + ↑C W.a₃) * Y - ↑C (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) * ↑C q ^ 2
[PROOFSTEP]
C_simp
[GOAL]
R : Type u
inst✝⁶ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁵ : CommRing A
inst✝⁴ : Algebra R A
B : Type w
inst✝³ : CommRing B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
x : R
y p q : R[X]
⊢ ↑C p ^ 2 - ↑C p * ↑C q * (↑C (↑C W.a₁) * ↑C Y + ↑C (↑C W.a₃)) -
        ↑C q ^ 2 * (↑C Y ^ 3 + ↑C (↑C W.a₂) * ↑C Y ^ 2 + ↑C (↑C W.a₄) * ↑C Y + ↑C (↑C W.a₆)) -
      (↑C p + ↑C q * Y) * (↑C p + ↑C q * (-Y - (↑C (↑C W.a₁) * ↑C Y + ↑C (↑C W.a₃)))) =
    (Y ^ 2 + (↑C (↑C W.a₁) * ↑C Y + ↑C (↑C W.a₃)) * Y -
        (↑C Y ^ 3 + ↑C (↑C W.a₂) * ↑C Y ^ 2 + ↑C (↑C W.a₄) * ↑C Y + ↑C (↑C W.a₆))) *
      ↑C q ^ 2
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ degree (↑(Algebra.norm R[X]) (p • 1 + q • ↑(mk W) Y)) = max (2 • degree p) (2 • degree q + 3)
[PROOFSTEP]
have hdp : (p ^ 2).degree = 2 • p.degree := degree_pow p 2
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
⊢ degree (↑(Algebra.norm R[X]) (p • 1 + q • ↑(mk W) Y)) = max (2 • degree p) (2 • degree q + 3)
[PROOFSTEP]
have hdpq : (p * q * (C W.a₁ * X + C W.a₃)).degree ≤ p.degree + q.degree + 1 := by
  simpa only [degree_mul] using add_le_add_left degree_linear_le (p.degree + q.degree)
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
⊢ degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
[PROOFSTEP]
simpa only [degree_mul] using add_le_add_left degree_linear_le (p.degree + q.degree)
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
⊢ degree (↑(Algebra.norm R[X]) (p • 1 + q • ↑(mk W) Y)) = max (2 • degree p) (2 • degree q + 3)
[PROOFSTEP]
have hdq : (q ^ 2 * (X ^ 3 + C W.a₂ * X ^ 2 + C W.a₄ * X + C W.a₆)).degree = 2 • q.degree + 3 := by
  rw [degree_mul, degree_pow, ← one_mul <| X ^ 3, ← C_1, degree_cubic <| one_ne_zero' R]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
⊢ degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
[PROOFSTEP]
rw [degree_mul, degree_pow, ← one_mul <| X ^ 3, ← C_1, degree_cubic <| one_ne_zero' R]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
⊢ degree (↑(Algebra.norm R[X]) (p • 1 + q • ↑(mk W) Y)) = max (2 • degree p) (2 • degree q + 3)
[PROOFSTEP]
rw [norm_smul_basis]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • degree p) (2 • degree q + 3)
[PROOFSTEP]
by_cases hp : p = 0
[GOAL]
case pos
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
hp : p = 0
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • degree p) (2 • degree q + 3)
[PROOFSTEP]
simpa only [hp, hdq, neg_zero, zero_sub, zero_mul, zero_pow zero_lt_two, degree_neg] using (max_bot_left _).symm
[GOAL]
case neg
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
hp : ¬p = 0
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • degree p) (2 • degree q + 3)
[PROOFSTEP]
by_cases hq : q = 0
[GOAL]
case pos
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
hp : ¬p = 0
hq : q = 0
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • degree p) (2 • degree q + 3)
[PROOFSTEP]
simpa only [hq, hdp, sub_zero, zero_mul, mul_zero, zero_pow zero_lt_two] using (max_bot_right _).symm
[GOAL]
case neg
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
hp : ¬p = 0
hq : ¬q = 0
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • degree p) (2 • degree q + 3)
[PROOFSTEP]
rw [← not_congr degree_eq_bot] at hp hq 
[GOAL]
case neg
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • degree p) (2 • degree q + 3)
[PROOFSTEP]
rcases hp' : p.degree with _ | dp
[GOAL]
case neg.none
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
hp' : degree p = none
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • none) (2 • degree q + 3)
[PROOFSTEP]
exact (hp hp').elim
[GOAL]
case neg.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdp : degree (p ^ 2) = 2 • degree p
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ degree p + degree q + 1
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hp' : degree p = some dp
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • some dp) (2 • degree q + 3)
[PROOFSTEP]
rw [hp'] at hdp hdpq 
[GOAL]
case neg.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + degree q + 1
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • some dp) (2 • degree q + 3)
[PROOFSTEP]
rcases hq' : q.degree with _ | dq
[GOAL]
case neg.some.none
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + degree q + 1
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
hq' : degree q = none
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • some dp) (2 • none + 3)
[PROOFSTEP]
exact (hq hq').elim
[GOAL]
case neg.some.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • degree q + 3
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + degree q + 1
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hq' : degree q = some dq
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • some dp) (2 • some dq + 3)
[PROOFSTEP]
rw [hq'] at hdpq hdq 
[GOAL]
case neg.some.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • some dp) (2 • some dq + 3)
[PROOFSTEP]
rcases le_or_lt dp (dq + 1) with hpq | hpq
[GOAL]
case neg.some.some.inl
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dp ≤ dq + 1
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • some dp) (2 • some dq + 3)
[PROOFSTEP]
convert
  (degree_sub_eq_right_of_degree_lt <|
        (degree_sub_le _ _).trans_lt <| max_lt_iff.mpr ⟨hdp.trans_lt _, hdpq.trans_lt _⟩).trans
    (max_eq_right_of_lt _).symm
[GOAL]
case h.e'_3.h.e'_4
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dp ≤ dq + 1
⊢ 2 • some dq + 3 = degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆))
[PROOFSTEP]
rw [hdq]
[GOAL]
case neg.some.some.inl.convert_2
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dp ≤ dq + 1
⊢ 2 • some dp < degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆))
[PROOFSTEP]
rw [hdq]
[GOAL]
case neg.some.some.inl.convert_3
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dp ≤ dq + 1
⊢ some dp + some dq + 1 < degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆))
[PROOFSTEP]
rw [hdq]
[GOAL]
case neg.some.some.inl.convert_5
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dp ≤ dq + 1
⊢ 2 • some dp < degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆))
[PROOFSTEP]
rw [hdq]
[GOAL]
case neg.some.some.inl.convert_2
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dp ≤ dq + 1
⊢ 2 • some dp < 2 • some dq + 3
[PROOFSTEP]
exact WithBot.coe_lt_coe.mpr <| by linarith only [hpq]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dp ≤ dq + 1
⊢ (fun x x_1 => x + x_1) dp ((fun x x_1 => x + x_1) dp 0) <
    (fun x x_1 => x + x_1) ((fun x x_1 => x + x_1) dq ((fun x x_1 => x + x_1) dq 0)) ↑3
[PROOFSTEP]
linarith only [hpq]
[GOAL]
case neg.some.some.inl.convert_3
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dp ≤ dq + 1
⊢ some dp + some dq + 1 < 2 • some dq + 3
[PROOFSTEP]
exact WithBot.coe_lt_coe.mpr <| by linarith only [hpq]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dp ≤ dq + 1
⊢ (fun x x_1 => x + x_1) ((fun x x_1 => x + x_1) dp dq) 1 <
    (fun x x_1 => x + x_1) ((fun x x_1 => x + x_1) dq ((fun x x_1 => x + x_1) dq 0)) ↑3
[PROOFSTEP]
linarith only [hpq]
[GOAL]
case neg.some.some.inl.convert_5
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dp ≤ dq + 1
⊢ 2 • some dp < 2 • some dq + 3
[PROOFSTEP]
exact WithBot.coe_lt_coe.mpr <| by linarith only [hpq]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dp ≤ dq + 1
⊢ (fun x x_1 => x + x_1) dp ((fun x x_1 => x + x_1) dp 0) <
    (fun x x_1 => x + x_1) ((fun x x_1 => x + x_1) dq ((fun x x_1 => x + x_1) dq 0)) ↑3
[PROOFSTEP]
linarith only [hpq]
[GOAL]
case neg.some.some.inr
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ degree (p ^ 2 - p * q * (↑C W.a₁ * Y + ↑C W.a₃) - q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) =
    max (2 • some dp) (2 • some dq + 3)
[PROOFSTEP]
rw [sub_sub]
[GOAL]
case neg.some.some.inr
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ degree (p ^ 2 - (p * q * (↑C W.a₁ * Y + ↑C W.a₃) + q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆))) =
    max (2 • some dp) (2 • some dq + 3)
[PROOFSTEP]
convert
  (degree_sub_eq_left_of_degree_lt <|
        (degree_add_le _ _).trans_lt <| max_lt_iff.mpr ⟨hdpq.trans_lt _, hdq.trans_lt _⟩).trans
    (max_eq_left_of_lt _).symm
[GOAL]
case h.e'_3.h.e'_3
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ 2 • some dp = degree (p ^ 2)
[PROOFSTEP]
rw [hdp]
[GOAL]
case neg.some.some.inr.convert_2
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ some dp + some dq + 1 < degree (p ^ 2)
[PROOFSTEP]
rw [hdp]
[GOAL]
case neg.some.some.inr.convert_3
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ 2 • some dq + 3 < degree (p ^ 2)
[PROOFSTEP]
rw [hdp]
[GOAL]
case neg.some.some.inr.convert_5
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ 2 • some dq + 3 < degree (p ^ 2)
[PROOFSTEP]
rw [hdp]
[GOAL]
case neg.some.some.inr.convert_2
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ some dp + some dq + 1 < 2 • some dp
[PROOFSTEP]
exact WithBot.coe_lt_coe.mpr <| by linarith only [hpq]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ (fun x x_1 => x + x_1) ((fun x x_1 => x + x_1) dp dq) 1 < (fun x x_1 => x + x_1) dp ((fun x x_1 => x + x_1) dp 0)
[PROOFSTEP]
linarith only [hpq]
[GOAL]
case neg.some.some.inr.convert_3
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ 2 • some dq + 3 < 2 • some dp
[PROOFSTEP]
exact WithBot.coe_lt_coe.mpr <| by linarith only [hpq]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ (fun x x_1 => x + x_1) ((fun x x_1 => x + x_1) dq ((fun x x_1 => x + x_1) dq 0)) ↑3 <
    (fun x x_1 => x + x_1) dp ((fun x x_1 => x + x_1) dp 0)
[PROOFSTEP]
linarith only [hpq]
[GOAL]
case neg.some.some.inr.convert_5
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ 2 • some dq + 3 < 2 • some dp
[PROOFSTEP]
exact WithBot.coe_lt_coe.mpr <| by linarith only [hpq]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
hp : ¬degree p = ⊥
hq : ¬degree q = ⊥
dp : ℕ
hdp : degree (p ^ 2) = 2 • some dp
hp' : degree p = some dp
dq : ℕ
hdq : degree (q ^ 2 * (Y ^ 3 + ↑C W.a₂ * Y ^ 2 + ↑C W.a₄ * Y + ↑C W.a₆)) = 2 • some dq + 3
hdpq : degree (p * q * (↑C W.a₁ * Y + ↑C W.a₃)) ≤ some dp + some dq + 1
hq' : degree q = some dq
hpq : dq + 1 < dp
⊢ (fun x x_1 => x + x_1) ((fun x x_1 => x + x_1) dq ((fun x x_1 => x + x_1) dq 0)) ↑3 <
    (fun x x_1 => x + x_1) dp ((fun x x_1 => x + x_1) dp 0)
[PROOFSTEP]
linarith only [hpq]
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x✝ : R
y : R[X]
inst✝ : IsDomain R
x : CoordinateRing W
⊢ degree (↑(Algebra.norm R[X]) x) ≠ 1
[PROOFSTEP]
rcases exists_smul_basis_eq x with ⟨p, q, rfl⟩
[GOAL]
case intro.intro
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ degree (↑(Algebra.norm R[X]) (p • 1 + q • ↑(mk W) Y)) ≠ 1
[PROOFSTEP]
rw [degree_norm_smul_basis]
[GOAL]
case intro.intro
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ max (2 • degree p) (2 • degree q + 3) ≠ 1
[PROOFSTEP]
rcases p.degree with (_ | _ | _ | _)
[GOAL]
case intro.intro.none
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ max (2 • none) (2 • degree q + 3) ≠ 1
[PROOFSTEP]
cases q.degree
[GOAL]
case intro.intro.some.zero
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ max (2 • some Nat.zero) (2 • degree q + 3) ≠ 1
[PROOFSTEP]
cases q.degree
[GOAL]
case intro.intro.some.succ.zero
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ max (2 • some (Nat.succ Nat.zero)) (2 • degree q + 3) ≠ 1
[PROOFSTEP]
cases q.degree
[GOAL]
case intro.intro.some.succ.succ
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
n✝ : ℕ
⊢ max (2 • some (Nat.succ (Nat.succ n✝))) (2 • degree q + 3) ≠ 1
[PROOFSTEP]
cases q.degree
[GOAL]
case intro.intro.none.none
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ max (2 • none) (2 • none + 3) ≠ 1
case intro.intro.none.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
val✝ : ℕ
⊢ max (2 • none) (2 • some val✝ + 3) ≠ 1
case intro.intro.some.zero.none
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ max (2 • some Nat.zero) (2 • none + 3) ≠ 1
case intro.intro.some.zero.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
val✝ : ℕ
⊢ max (2 • some Nat.zero) (2 • some val✝ + 3) ≠ 1
case intro.intro.some.succ.zero.none
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ max (2 • some (Nat.succ Nat.zero)) (2 • none + 3) ≠ 1
case intro.intro.some.succ.zero.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
val✝ : ℕ
⊢ max (2 • some (Nat.succ Nat.zero)) (2 • some val✝ + 3) ≠ 1
case intro.intro.some.succ.succ.none
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
n✝ : ℕ
⊢ max (2 • some (Nat.succ (Nat.succ n✝))) (2 • none + 3) ≠ 1
case intro.intro.some.succ.succ.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
n✝ val✝ : ℕ
⊢ max (2 • some (Nat.succ (Nat.succ n✝))) (2 • some val✝ + 3) ≠ 1
[PROOFSTEP]
any_goals
  rintro
    (_ | _)
        -- porting note: replaced `dec_trivial` with `(cmp_eq_lt_iff _ _).mp rfl` but cannot be inlined
[GOAL]
case intro.intro.none.none
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ max (2 • none) (2 • none + 3) ≠ 1
[PROOFSTEP]
rintro
  (_ | _)
      -- porting note: replaced `dec_trivial` with `(cmp_eq_lt_iff _ _).mp rfl` but cannot be inlined
[GOAL]
case intro.intro.none.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
val✝ : ℕ
⊢ max (2 • none) (2 • some val✝ + 3) ≠ 1
[PROOFSTEP]
rintro
  (_ | _)
      -- porting note: replaced `dec_trivial` with `(cmp_eq_lt_iff _ _).mp rfl` but cannot be inlined
[GOAL]
case intro.intro.some.zero.none
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ max (2 • some Nat.zero) (2 • none + 3) ≠ 1
[PROOFSTEP]
rintro
  (_ | _)
      -- porting note: replaced `dec_trivial` with `(cmp_eq_lt_iff _ _).mp rfl` but cannot be inlined
[GOAL]
case intro.intro.some.zero.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
val✝ : ℕ
⊢ max (2 • some Nat.zero) (2 • some val✝ + 3) ≠ 1
[PROOFSTEP]
rintro
  (_ | _)
      -- porting note: replaced `dec_trivial` with `(cmp_eq_lt_iff _ _).mp rfl` but cannot be inlined
[GOAL]
case intro.intro.some.succ.zero.none
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
⊢ max (2 • some (Nat.succ Nat.zero)) (2 • none + 3) ≠ 1
[PROOFSTEP]
rintro
  (_ | _)
      -- porting note: replaced `dec_trivial` with `(cmp_eq_lt_iff _ _).mp rfl` but cannot be inlined
[GOAL]
case intro.intro.some.succ.zero.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
val✝ : ℕ
⊢ max (2 • some (Nat.succ Nat.zero)) (2 • some val✝ + 3) ≠ 1
[PROOFSTEP]
rintro
  (_ | _)
      -- porting note: replaced `dec_trivial` with `(cmp_eq_lt_iff _ _).mp rfl` but cannot be inlined
[GOAL]
case intro.intro.some.succ.succ.none
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
n✝ : ℕ
⊢ max (2 • some (Nat.succ (Nat.succ n✝))) (2 • none + 3) ≠ 1
[PROOFSTEP]
rintro
  (_ | _)
      -- porting note: replaced `dec_trivial` with `(cmp_eq_lt_iff _ _).mp rfl` but cannot be inlined
[GOAL]
case intro.intro.some.succ.succ.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
n✝ val✝ : ℕ
⊢ max (2 • some (Nat.succ (Nat.succ n✝))) (2 • some val✝ + 3) ≠ 1
[PROOFSTEP]
rintro
  (_ | _)
      -- porting note: replaced `dec_trivial` with `(cmp_eq_lt_iff _ _).mp rfl` but cannot be inlined
[GOAL]
case intro.intro.some.succ.succ.some
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
n✝ val✝ : ℕ
⊢ max (2 • some (Nat.succ (Nat.succ n✝))) (2 • some val✝ + 3) ≠ 1
[PROOFSTEP]
apply (lt_max_of_lt_right _).ne'
[GOAL]
R : Type u
inst✝⁷ : CommRing R
W : WeierstrassCurve R
A : Type v
inst✝⁶ : CommRing A
inst✝⁵ : Algebra R A
B : Type w
inst✝⁴ : CommRing B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R A B
x : R
y : R[X]
inst✝ : IsDomain R
p q : R[X]
n✝ val✝ : ℕ
⊢ 1 < 2 • some val✝ + 3
[PROOFSTEP]
exact (cmp_eq_lt_iff _ _).mp rfl
[GOAL]
R : Type u
inst✝¹ : CommRing R
E : EllipticCurve R
inst✝ : Invertible 3
this : Invertible (-3 ^ 3)
⊢ ↑(unitOfInvertible (-3 ^ 3)) = WeierstrassCurve.Δ (WeierstrassCurve.ofJ0 R)
[PROOFSTEP]
rw [unitOfInvertible_val, WeierstrassCurve.ofJ0_Δ R]
[GOAL]
R : Type u
inst✝¹ : CommRing R
E : EllipticCurve R
inst✝ : Invertible 3
this : Invertible (-3 ^ 3)
⊢ -3 ^ 3 = -27
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝¹ : CommRing R
E : EllipticCurve R
inst✝ : Invertible 3
⊢ j (ofJ0 R) = 0
[PROOFSTEP]
simp only [j, ofJ0, WeierstrassCurve.ofJ0_c₄]
[GOAL]
R : Type u
inst✝¹ : CommRing R
E : EllipticCurve R
inst✝ : Invertible 3
⊢ ↑(unitOfInvertible (-3 ^ 3))⁻¹ * 0 ^ 3 = 0
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝¹ : CommRing R
E : EllipticCurve R
inst✝ : Invertible 2
this : Invertible (-2 ^ 6)
⊢ ↑(unitOfInvertible (-2 ^ 6)) = WeierstrassCurve.Δ (WeierstrassCurve.ofJ1728 R)
[PROOFSTEP]
rw [unitOfInvertible_val, WeierstrassCurve.ofJ1728_Δ R]
[GOAL]
R : Type u
inst✝¹ : CommRing R
E : EllipticCurve R
inst✝ : Invertible 2
this : Invertible (-2 ^ 6)
⊢ -2 ^ 6 = -64
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝¹ : CommRing R
E : EllipticCurve R
inst✝ : Invertible 2
⊢ j (ofJ1728 R) = 1728
[PROOFSTEP]
field_simp [j, ofJ1728, @unitOfInvertible_val _ _ _ <| invertibleNeg _, WeierstrassCurve.ofJ1728_c₄]
[GOAL]
R : Type u
inst✝¹ : CommRing R
E : EllipticCurve R
inst✝ : Invertible 2
⊢ -(1728 * 2 ^ 6) = (-48) ^ 3
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
j : R
inst✝¹ : Invertible j
inst✝ : Invertible (j - 1728)
⊢ EllipticCurve.j (ofJ' j) = j
[PROOFSTEP]
field_simp [EllipticCurve.j, ofJ', @unitOfInvertible_val _ _ _ <| invertibleMul _ _, WeierstrassCurve.ofJ_c₄]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
j : R
inst✝¹ : Invertible j
inst✝ : Invertible (j - 1728)
⊢ j * (j ^ 2 * (j - 1728) ^ 9) = (j * (j - 1728) ^ 3) ^ 3
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝¹ : CommRing R
E : EllipticCurve R
F : Type u
inst✝ : Field F
j : F
⊢ Nat.coprime 2 3
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : ¬j = 0
h1728 : j = 1728
h : 2 = 0
⊢ j = 0
[PROOFSTEP]
rw [h1728, show (1728 : F) = 2 * 864 by norm_num1, h, zero_mul]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : ¬j = 0
h1728 : j = 1728
h : 2 = 0
⊢ 1728 = 2 * 864
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h3 : NeZero 3
⊢ ofJ 0 = ofJ0 F
[PROOFSTEP]
rw [ofJ, dif_pos rfl, dif_neg h3.out]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h3 : 3 = 0
⊢ ofJ 0 = ofJ1728 F
[PROOFSTEP]
rw [ofJ, dif_pos rfl, dif_pos h3]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h3 : 3 = 0
⊢ ofJ 1728 = ofJ1728 F
[PROOFSTEP]
rw [ofJ, dif_pos <| by rw [show (1728 : F) = 3 * 576 by norm_num1, h3, zero_mul], dif_pos h3]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h3 : 3 = 0
⊢ 1728 = 0
[PROOFSTEP]
rw [show (1728 : F) = 3 * 576 by norm_num1, h3, zero_mul]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h3 : 3 = 0
⊢ 1728 = 3 * 576
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h2 : NeZero 2
⊢ ofJ 1728 = ofJ1728 F
[PROOFSTEP]
by_cases h3 : (3 : F) = 0
[GOAL]
case pos
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h2 : NeZero 2
h3 : 3 = 0
⊢ ofJ 1728 = ofJ1728 F
[PROOFSTEP]
exact ofJ_1728_of_three_eq_zero h3
[GOAL]
case neg
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h2 : NeZero 2
h3 : ¬3 = 0
⊢ ofJ 1728 = ofJ1728 F
[PROOFSTEP]
have h : (1728 : F) ≠ 0 := fun h =>
  or_iff_not_and_not.mp (mul_eq_zero.mp <| by rwa [show 2 ^ 6 * 3 ^ 3 = (1728 : F) by norm_num1])
    ⟨pow_ne_zero 6 h2.out, pow_ne_zero 3 h3⟩
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h2 : NeZero 2
h3 : ¬3 = 0
h : 1728 = 0
⊢ 2 ^ 6 * 3 ^ 3 = 0
[PROOFSTEP]
rwa [show 2 ^ 6 * 3 ^ 3 = (1728 : F) by norm_num1]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h2 : NeZero 2
h3 : ¬3 = 0
h : 1728 = 0
⊢ 2 ^ 6 * 3 ^ 3 = 1728
[PROOFSTEP]
norm_num1
[GOAL]
case neg
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h2 : NeZero 2
h3 : ¬3 = 0
h : 1728 ≠ 0
⊢ ofJ 1728 = ofJ1728 F
[PROOFSTEP]
rw [ofJ, dif_neg h, dif_pos rfl]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h2 : 2 = 0
⊢ ofJ 1728 = ofJ0 F
[PROOFSTEP]
rw [ofJ, dif_pos <| by rw [show (1728 : F) = 2 * 864 by norm_num1, h2, zero_mul], dif_neg]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h2 : 2 = 0
⊢ 1728 = 0
[PROOFSTEP]
rw [show (1728 : F) = 2 * 864 by norm_num1, h2, zero_mul]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h2 : 2 = 0
⊢ 1728 = 2 * 864
[PROOFSTEP]
norm_num1
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : j ≠ 0
h1728 : j ≠ 1728
⊢ ofJ j = ofJ' j
[PROOFSTEP]
rw [ofJ, dif_neg h0, dif_neg h1728]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
⊢ EllipticCurve.j (ofJ j) = j
[PROOFSTEP]
by_cases h0 : j = 0
[GOAL]
case pos
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : j = 0
⊢ EllipticCurve.j (ofJ j) = j
[PROOFSTEP]
by_cases h3 : (3 : F) = 0
[GOAL]
case pos
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : j = 0
h3 : 3 = 0
⊢ EllipticCurve.j (ofJ j) = j
[PROOFSTEP]
rw [h0, ofJ_0_of_three_eq_zero h3, @ofJ1728_j _ _ <| invertibleOfNonzero <| two_or_three_ne_zero.neg_resolve_right h3,
  show (1728 : F) = 3 * 576 by norm_num1, h3, zero_mul]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : j = 0
h3 : 3 = 0
⊢ 1728 = 3 * 576
[PROOFSTEP]
norm_num1
[GOAL]
case neg
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : j = 0
h3 : ¬3 = 0
⊢ EllipticCurve.j (ofJ j) = j
[PROOFSTEP]
rw [h0, ofJ_0_of_three_ne_zero (h3 := neZero_iff.2 h3), @ofJ0_j _ _ <| invertibleOfNonzero h3]
[GOAL]
case neg
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : ¬j = 0
⊢ EllipticCurve.j (ofJ j) = j
[PROOFSTEP]
by_cases h1728 : j = 1728
[GOAL]
case pos
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : ¬j = 0
h1728 : j = 1728
⊢ EllipticCurve.j (ofJ j) = j
[PROOFSTEP]
have h2 : (2 : F) ≠ 0 := fun h => h0 <| by rw [h1728, show (1728 : F) = 2 * 864 by norm_num1, h, zero_mul]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : ¬j = 0
h1728 : j = 1728
h : 2 = 0
⊢ j = 0
[PROOFSTEP]
rw [h1728, show (1728 : F) = 2 * 864 by norm_num1, h, zero_mul]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : ¬j = 0
h1728 : j = 1728
h : 2 = 0
⊢ 1728 = 2 * 864
[PROOFSTEP]
norm_num1
[GOAL]
case pos
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : ¬j = 0
h1728 : j = 1728
h2 : 2 ≠ 0
⊢ EllipticCurve.j (ofJ j) = j
[PROOFSTEP]
rw [h1728, ofJ_1728_of_two_ne_zero (h2 := neZero_iff.2 h2), @ofJ1728_j _ _ <| invertibleOfNonzero h2]
[GOAL]
case neg
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
F : Type u
inst✝¹ : Field F
j : F
inst✝ : DecidableEq F
h0 : ¬j = 0
h1728 : ¬j = 1728
⊢ EllipticCurve.j (ofJ j) = j
[PROOFSTEP]
rw [ofJ_ne_0_ne_1728 j h0 h1728,
  @ofJ'_j _ _ _ (invertibleOfNonzero h0) (invertibleOfNonzero <| sub_ne_zero_of_ne h1728)]
[GOAL]
R : Type u
inst✝ : CommRing R
E : EllipticCurve R
C : WeierstrassCurve.VariableChange R
⊢ ↑(C.u⁻¹ ^ 12 * E.Δ') = WeierstrassCurve.Δ (WeierstrassCurve.variableChange E.toWeierstrassCurve C)
[PROOFSTEP]
rw [Units.val_mul, Units.val_pow_eq_pow_val, coe_Δ', E.variableChange_Δ]
[GOAL]
R : Type u
inst✝ : CommRing R
E : EllipticCurve R
C : WeierstrassCurve.VariableChange R
⊢ variableChange E WeierstrassCurve.VariableChange.id = E
[PROOFSTEP]
simp only [variableChange, WeierstrassCurve.variableChange_id]
[GOAL]
R : Type u
inst✝ : CommRing R
E : EllipticCurve R
C : WeierstrassCurve.VariableChange R
⊢ { toWeierstrassCurve := E.toWeierstrassCurve, Δ' := WeierstrassCurve.VariableChange.id.u⁻¹ ^ 12 * E.Δ',
      coe_Δ' :=
        (_ : ↑(WeierstrassCurve.VariableChange.id.u⁻¹ ^ 12 * E.Δ') = WeierstrassCurve.Δ E.toWeierstrassCurve) } =
    E
[PROOFSTEP]
simp only [WeierstrassCurve.VariableChange.id, inv_one, one_pow, one_mul]
[GOAL]
R : Type u
inst✝ : CommRing R
E✝ : EllipticCurve R
C✝ C C' : WeierstrassCurve.VariableChange R
E : EllipticCurve R
⊢ variableChange E (WeierstrassCurve.VariableChange.comp C C') = variableChange (variableChange E C') C
[PROOFSTEP]
simp only [variableChange, WeierstrassCurve.variableChange_comp]
[GOAL]
R : Type u
inst✝ : CommRing R
E✝ : EllipticCurve R
C✝ C C' : WeierstrassCurve.VariableChange R
E : EllipticCurve R
⊢ { toWeierstrassCurve := WeierstrassCurve.variableChange (WeierstrassCurve.variableChange E.toWeierstrassCurve C') C,
      Δ' := (WeierstrassCurve.VariableChange.comp C C').u⁻¹ ^ 12 * E.Δ',
      coe_Δ' :=
        (_ :
          ↑((WeierstrassCurve.VariableChange.comp C C').u⁻¹ ^ 12 * E.Δ') =
            WeierstrassCurve.Δ
              (WeierstrassCurve.variableChange (WeierstrassCurve.variableChange E.toWeierstrassCurve C') C)) } =
    { toWeierstrassCurve := WeierstrassCurve.variableChange (WeierstrassCurve.variableChange E.toWeierstrassCurve C') C,
      Δ' := C.u⁻¹ ^ 12 * (C'.u⁻¹ ^ 12 * E.Δ'),
      coe_Δ' :=
        (_ :
          ↑(C.u⁻¹ ^ 12 * (C'.u⁻¹ ^ 12 * E.Δ')) =
            WeierstrassCurve.Δ
              (WeierstrassCurve.variableChange (WeierstrassCurve.variableChange E.toWeierstrassCurve C') C)) }
[PROOFSTEP]
simp only [WeierstrassCurve.VariableChange.comp, mul_inv, mul_pow, ← mul_assoc]
[GOAL]
R : Type u
inst✝ : CommRing R
E : EllipticCurve R
C : WeierstrassCurve.VariableChange R
⊢ ↑(variableChange E C).Δ' = ↑C.u⁻¹ ^ 12 * ↑E.Δ'
[PROOFSTEP]
rw [variableChange_Δ', Units.val_mul, Units.val_pow_eq_pow_val]
[GOAL]
R : Type u
inst✝ : CommRing R
E : EllipticCurve R
C : WeierstrassCurve.VariableChange R
⊢ ↑(variableChange E C).Δ'⁻¹ = ↑C.u ^ 12 * ↑E.Δ'⁻¹
[PROOFSTEP]
rw [variableChange_Δ', mul_inv, inv_pow, inv_inv, Units.val_mul, Units.val_pow_eq_pow_val]
[GOAL]
R : Type u
inst✝ : CommRing R
E : EllipticCurve R
C : WeierstrassCurve.VariableChange R
⊢ j (variableChange E C) = j E
[PROOFSTEP]
rw [j, coe_inv_variableChange_Δ']
[GOAL]
R : Type u
inst✝ : CommRing R
E : EllipticCurve R
C : WeierstrassCurve.VariableChange R
⊢ ↑C.u ^ 12 * ↑E.Δ'⁻¹ * WeierstrassCurve.c₄ (variableChange E C).toWeierstrassCurve ^ 3 = j E
[PROOFSTEP]
have hu : (C.u * ↑C.u⁻¹ : R) ^ 12 = 1 := by rw [C.u.mul_inv, one_pow]
[GOAL]
R : Type u
inst✝ : CommRing R
E : EllipticCurve R
C : WeierstrassCurve.VariableChange R
⊢ (↑C.u * ↑C.u⁻¹) ^ 12 = 1
[PROOFSTEP]
rw [C.u.mul_inv, one_pow]
[GOAL]
R : Type u
inst✝ : CommRing R
E : EllipticCurve R
C : WeierstrassCurve.VariableChange R
hu : (↑C.u * ↑C.u⁻¹) ^ 12 = 1
⊢ ↑C.u ^ 12 * ↑E.Δ'⁻¹ * WeierstrassCurve.c₄ (variableChange E C).toWeierstrassCurve ^ 3 = j E
[PROOFSTEP]
linear_combination (norm := (rw [variableChange_toWeierstrassCurve, WeierstrassCurve.variableChange_c₄, j]; ring1))
  E.j * hu
[GOAL]
case a
R : Type u
inst✝ : CommRing R
E : EllipticCurve R
C : WeierstrassCurve.VariableChange R
hu : (↑C.u * ↑C.u⁻¹) ^ 12 = 1
⊢ ↑C.u ^ 12 * ↑E.Δ'⁻¹ * WeierstrassCurve.c₄ (variableChange E C).toWeierstrassCurve ^ 3 - j E -
      (j E * (↑C.u * ↑C.u⁻¹) ^ 12 - j E * 1) =
    0
[PROOFSTEP]
rw [variableChange_toWeierstrassCurve, WeierstrassCurve.variableChange_c₄, j]
[GOAL]
case a
R : Type u
inst✝ : CommRing R
E : EllipticCurve R
C : WeierstrassCurve.VariableChange R
hu : (↑C.u * ↑C.u⁻¹) ^ 12 = 1
⊢ ↑C.u ^ 12 * ↑E.Δ'⁻¹ * (↑C.u⁻¹ ^ 4 * WeierstrassCurve.c₄ E.toWeierstrassCurve) ^ 3 -
        ↑E.Δ'⁻¹ * WeierstrassCurve.c₄ E.toWeierstrassCurve ^ 3 -
      (↑E.Δ'⁻¹ * WeierstrassCurve.c₄ E.toWeierstrassCurve ^ 3 * (↑C.u * ↑C.u⁻¹) ^ 12 -
        ↑E.Δ'⁻¹ * WeierstrassCurve.c₄ E.toWeierstrassCurve ^ 3 * 1) =
    0
[PROOFSTEP]
ring1
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
⊢ ↑(↑(Units.map ↑(algebraMap R A)) E.Δ') = WeierstrassCurve.Δ (WeierstrassCurve.baseChange E.toWeierstrassCurve A)
[PROOFSTEP]
simp only [Units.coe_map, coe_Δ', E.baseChange_Δ]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
⊢ ↑↑(algebraMap R A) (WeierstrassCurve.Δ E.toWeierstrassCurve) =
    ↑(algebraMap R A) (WeierstrassCurve.Δ E.toWeierstrassCurve)
[PROOFSTEP]
rfl
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
⊢ j (baseChange E A) = ↑(algebraMap R A) (j E)
[PROOFSTEP]
simp only [j, baseChange, E.baseChange_c₄]
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
⊢ ↑(↑(Units.map ↑(algebraMap R A)) E.Δ')⁻¹ * ↑(algebraMap R A) (WeierstrassCurve.c₄ E.toWeierstrassCurve) ^ 3 =
    ↑(algebraMap R A) (↑E.Δ'⁻¹ * WeierstrassCurve.c₄ E.toWeierstrassCurve ^ 3)
[PROOFSTEP]
map_simp
[GOAL]
R : Type u
inst✝² : CommRing R
E : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
⊢ ↑(↑(Units.map ↑(algebraMap R A)) E.Δ')⁻¹ * ↑(algebraMap R A) (WeierstrassCurve.c₄ E.toWeierstrassCurve) ^ 3 =
    ↑(algebraMap R A) ↑E.Δ'⁻¹ * ↑(algebraMap R A) (WeierstrassCurve.c₄ E.toWeierstrassCurve) ^ 3
[PROOFSTEP]
rfl
[GOAL]
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1 : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
⊢ E = E'
[PROOFSTEP]
rcases mk.inj h1 with ⟨h1, h2⟩
[GOAL]
case intro
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑(Units.map ↑(algebraMap R A)) E.Δ' = ↑(Units.map ↑(algebraMap R A)) E'.Δ'
⊢ E = E'
[PROOFSTEP]
replace h2 := (Units.mk.inj h2).left
[GOAL]
case intro
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
⊢ E = E'
[PROOFSTEP]
rcases WeierstrassCurve.mk.inj h1 with ⟨_, _, _, _, _⟩
[GOAL]
case intro.intro.intro.intro.intro
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ E = E'
[PROOFSTEP]
ext
[GOAL]
case intro.intro.intro.intro.intro.a₁
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ E.a₁ = E'.a₁
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.intro.intro.a₂
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ E.a₂ = E'.a₂
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.intro.intro.a₃
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ E.a₃ = E'.a₃
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.intro.intro.a₄
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ E.a₄ = E'.a₄
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.intro.intro.a₆
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ E.a₆ = E'.a₆
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.intro.intro.Δ'.a
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ ↑E.Δ' = ↑E'.Δ'
[PROOFSTEP]
apply_fun _ using h
[GOAL]
case intro.intro.intro.intro.intro.a₁
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.intro.intro.a₂
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.intro.intro.a₃
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.intro.intro.a₄
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.intro.intro.a₆
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.intro.intro.intro.Δ'.a
R : Type u
inst✝² : CommRing R
E✝ : EllipticCurve R
A : Type v
inst✝¹ : CommRing A
inst✝ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
E E' : EllipticCurve R
h1✝ : (fun E => baseChange E A) E = (fun E => baseChange E A) E'
h1 : WeierstrassCurve.baseChange E.toWeierstrassCurve A = WeierstrassCurve.baseChange E'.toWeierstrassCurve A
h2 : ↑↑(algebraMap R A) ↑E.Δ' = ↑↑(algebraMap R A) ↑E'.Δ'
left✝³ : ↑(algebraMap R A) E.a₁ = ↑(algebraMap R A) E'.a₁
left✝² : ↑(algebraMap R A) E.a₂ = ↑(algebraMap R A) E'.a₂
left✝¹ : ↑(algebraMap R A) E.a₃ = ↑(algebraMap R A) E'.a₃
left✝ : ↑(algebraMap R A) E.a₄ = ↑(algebraMap R A) E'.a₄
right✝ : ↑(algebraMap R A) E.a₆ = ↑(algebraMap R A) E'.a₆
⊢ ↑(algebraMap R A) ↑E.Δ' = ↑(algebraMap R A) ↑E'.Δ'
[PROOFSTEP]
assumption
