Theorem: WeierstrassCurve.Projective.nonsingular_some
File: Mathlib/AlgebraicGeometry/EllipticCurve/Projective.lean

Proof steps:
state_before: R : Type u
inst✝ : CommRing R
W : Projective R
X Y : R
⊢ W.Nonsingular ![X, Y, 1] ↔ W.toAffine.Nonsingular X Y
state_after: R : Type u
inst✝ : CommRing R
W : Projective R
X Y : R
⊢ W.Equation ![X, Y, 1] ∧
      (W.a₁ * ![X, Y, 1] 1 * ![X, Y, 1] 2 ≠
          3 * ![X, Y, 1] 0 ^ 2 + 2 * W.a₂ * ![X, Y, 1] 0 * ![X, Y, 1] 2 + W.a₄ * ![X, Y, 1] 2 ^ 2 ∨
        ![X, Y, 1] 1 * ![X, Y, 1] 2 ≠
            -![X, Y, 1] 1 * ![X, Y, 1] 2 - W.a₁ * ![X, Y, 1] 0 * ![X, Y, 1] 2 - W.a₃ * ![X, Y, 1] 2 ^ 2 ∨
          ![X, Y, 1] 1 ^ 2 + W.a₁ * ![X, Y, 1] 0 * ![X, Y, 1] 1 + 2 * W.a₃ * ![X, Y, 1] 1 * ![X, Y, 1] 2 ≠
            W.a₂ * ![X, Y, 1] 0 ^ 2 + 2 * W.a₄ * ![X, Y, 1] 0 * ![X, Y, 1] 2 + 3 * W.a₆ * ![X, Y, 1] 2 ^ 2) ↔
    W.toAffine.Nonsingular X Y
tactic: rw [nonsingular_iff]
state_before: R : Type u
inst✝ : CommRing R
W : Projective R
X Y : R
⊢ W.Equation ![X, Y, 1] ∧
      (W.a₁ * ![X, Y, 1] 1 * ![X, Y, 1] 2 ≠
          3 * ![X, Y, 1] 0 ^ 2 + 2 * W.a₂ * ![X, Y, 1] 0 * ![X, Y, 1] 2 + W.a₄ * ![X, Y, 1] 2 ^ 2 ∨
        ![X, Y, 1] 1 * ![X, Y, 1] 2 ≠
            -![X, Y, 1] 1 * ![X, Y, 1] 2 - W.a₁ * ![X, Y, 1] 0 * ![X, Y, 1] 2 - W.a₃ * ![X, Y, 1] 2 ^ 2 ∨
          ![X, Y, 1] 1 ^ 2 + W.a₁ * ![X, Y, 1] 0 * ![X, Y, 1] 1 + 2 * W.a₃ * ![X, Y, 1] 1 * ![X, Y, 1] 2 ≠
            W.a₂ * ![X, Y, 1] 0 ^ 2 + 2 * W.a₄ * ![X, Y, 1] 0 * ![X, Y, 1] 2 + 3 * W.a₆ * ![X, Y, 1] 2 ^ 2) ↔
    W.toAffine.Nonsingular X Y
state_after: R : Type u
inst✝ : CommRing R
W : Projective R
X Y : R
⊢ W.Equation ![X, Y, 1] ∧
      (W.a₁ * Y * 1 ≠ 3 * X ^ 2 + 2 * W.a₂ * X * 1 + W.a₄ * 1 ^ 2 ∨
        Y * 1 ≠ -Y * 1 - W.a₁ * X * 1 - W.a₃ * 1 ^ 2 ∨
          Y ^ 2 + W.a₁ * X * Y + 2 * W.a₃ * Y * 1 ≠ W.a₂ * X ^ 2 + 2 * W.a₄ * X * 1 + 3 * W.a₆ * 1 ^ 2) ↔
    W.toAffine.Nonsingular X Y
tactic: matrix_simp
state_before: R : Type u
inst✝ : CommRing R
W : Projective R
X Y : R
⊢ W.Equation ![X, Y, 1] ∧
      (W.a₁ * Y * 1 ≠ 3 * X ^ 2 + 2 * W.a₂ * X * 1 + W.a₄ * 1 ^ 2 ∨
        Y * 1 ≠ -Y * 1 - W.a₁ * X * 1 - W.a₃ * 1 ^ 2 ∨
          Y ^ 2 + W.a₁ * X * Y + 2 * W.a₃ * Y * 1 ≠ W.a₂ * X ^ 2 + 2 * W.a₄ * X * 1 + 3 * W.a₆ * 1 ^ 2) ↔
    W.toAffine.Nonsingular X Y
state_after: R : Type u
inst✝ : CommRing R
W : Projective R
X Y : R
⊢ Y ^ 2 + W.toAffine.a₁ * X * Y + W.toAffine.a₃ * Y =
      X ^ 3 + W.toAffine.a₂ * X ^ 2 + W.toAffine.a₄ * X + W.toAffine.a₆ →
    W.toAffine.a₁ * Y = 3 * X ^ 2 + 2 * W.toAffine.a₂ * X + W.toAffine.a₄ →
      Y = -Y - W.toAffine.a₁ * X - W.toAffine.a₃ →
        Y ^ 2 + W.a₁ * X * Y + 2 * W.a₃ * Y = W.a₂ * X ^ 2 + 2 * W.a₄ * X + 3 * W.a₆
tactic: simp only [W.toAffine.nonsingular_iff, equation_some, and_congr_right_iff,
    W.toAffine.equation_iff, ← not_and_or, not_iff_not, one_pow, mul_one, Iff.comm, iff_self_and]
state_before: R : Type u
inst✝ : CommRing R
W : Projective R
X Y : R
⊢ Y ^ 2 + W.toAffine.a₁ * X * Y + W.toAffine.a₃ * Y =
      X ^ 3 + W.toAffine.a₂ * X ^ 2 + W.toAffine.a₄ * X + W.toAffine.a₆ →
    W.toAffine.a₁ * Y = 3 * X ^ 2 + 2 * W.toAffine.a₂ * X + W.toAffine.a₄ →
      Y = -Y - W.toAffine.a₁ * X - W.toAffine.a₃ →
        Y ^ 2 + W.a₁ * X * Y + 2 * W.a₃ * Y = W.a₂ * X ^ 2 + 2 * W.a₄ * X + 3 * W.a₆
state_after: R : Type u
inst✝ : CommRing R
W : Projective R
X Y : R
h :
  Y ^ 2 + W.toAffine.a₁ * X * Y + W.toAffine.a₃ * Y = X ^ 3 + W.toAffine.a₂ * X ^ 2 + W.toAffine.a₄ * X + W.toAffine.a₆
hX : W.toAffine.a₁ * Y = 3 * X ^ 2 + 2 * W.toAffine.a₂ * X + W.toAffine.a₄
hY : Y = -Y - W.toAffine.a₁ * X - W.toAffine.a₃
⊢ Y ^ 2 + W.a₁ * X * Y + 2 * W.a₃ * Y = W.a₂ * X ^ 2 + 2 * W.a₄ * X + 3 * W.a₆
tactic: intro h hX hY
state_before: R : Type u
inst✝ : CommRing R
W : Projective R
X Y : R
h :
  Y ^ 2 + W.toAffine.a₁ * X * Y + W.toAffine.a₃ * Y = X ^ 3 + W.toAffine.a₂ * X ^ 2 + W.toAffine.a₄ * X + W.toAffine.a₆
hX : W.toAffine.a₁ * Y = 3 * X ^ 2 + 2 * W.toAffine.a₂ * X + W.toAffine.a₄
hY : Y = -Y - W.toAffine.a₁ * X - W.toAffine.a₃
⊢ Y ^ 2 + W.a₁ * X * Y + 2 * W.a₃ * Y = W.a₂ * X ^ 2 + 2 * W.a₄ * X + 3 * W.a₆
state_after: no goals
tactic: linear_combination (norm := ring1) 3 * h - X * hX - Y * hY