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

Proof steps:
state_before: R : Type u
inst✝¹ : CommRing R
W✝ : Projective R
F : Type u
inst✝ : Field F
W : Projective F
P Q : Fin 3 → F
hP : W.Nonsingular P
hQ : W.Nonsingular Q
hPz : P 2 = 0
hQz : Q 2 = 0
⊢ P ≈ Q
state_after: R : Type u
inst✝¹ : CommRing R
W✝ : Projective R
F : Type u
inst✝ : Field F
W : Projective F
P Q : Fin 3 → F
hP : W.Nonsingular ![P 0, P 1, 0]
hQ : W.Nonsingular Q
hPz : P 2 = 0
hQz : Q 2 = 0
⊢ ![P 0, P 1, 0] ≈ Q
tactic: rw [fin3_def P, hPz] at hP ⊢
state_before: R : Type u
inst✝¹ : CommRing R
W✝ : Projective R
F : Type u
inst✝ : Field F
W : Projective F
P Q : Fin 3 → F
hP : W.Nonsingular ![P 0, P 1, 0]
hQ : W.Nonsingular Q
hPz : P 2 = 0
hQz : Q 2 = 0
⊢ ![P 0, P 1, 0] ≈ Q
state_after: R : Type u
inst✝¹ : CommRing R
W✝ : Projective R
F : Type u
inst✝ : Field F
W : Projective F
P Q : Fin 3 → F
hP : W.Nonsingular ![P 0, P 1, 0]
hQ : W.Nonsingular ![Q 0, Q 1, 0]
hPz : P 2 = 0
hQz : Q 2 = 0
⊢ ![P 0, P 1, 0] ≈ ![Q 0, Q 1, 0]
tactic: rw [fin3_def Q, hQz] at hQ ⊢
state_before: R : Type u
inst✝¹ : CommRing R
W✝ : Projective R
F : Type u
inst✝ : Field F
W : Projective F
P Q : Fin 3 → F
hP : W.Nonsingular ![P 0, P 1, 0]
hQ : W.Nonsingular ![Q 0, Q 1, 0]
hPz : P 2 = 0
hQz : Q 2 = 0
⊢ ![P 0, P 1, 0] ≈ ![Q 0, Q 1, 0]
state_after: R : Type u
inst✝¹ : CommRing R
W✝ : Projective R
F : Type u
inst✝ : Field F
W : Projective F
P Q : Fin 3 → F
hPz : P 2 = 0
hQz : Q 2 = 0
hP : 0 = P 0 ^ 3 ∧ (¬3 = 0 ∧ ¬P 0 = 0 ∨ ¬P 1 ^ 2 + W.a₁ * P 0 * P 1 = W.a₂ * P 0 ^ 2)
hQ : 0 = Q 0 ^ 3 ∧ (¬3 = 0 ∧ ¬Q 0 = 0 ∨ ¬Q 1 ^ 2 + W.a₁ * Q 0 * Q 1 = W.a₂ * Q 0 ^ 2)
⊢ ![P 0, P 1, 0] ≈ ![Q 0, Q 1, 0]
tactic: simp? [nonsingular_iff, equation_iff] at hP hQ says
    simp only [Nat.succ_eq_add_one, Nat.reduceAdd, Fin.isValue, nonsingular_iff,
      equation_iff, Matrix.cons_val_one, Matrix.head_cons, Matrix.cons_val_two, Matrix.tail_cons,
      mul_zero, Matrix.cons_val_zero, add_zero, ne_eq, OfNat.ofNat_ne_zero, not_false_eq_true,
      zero_pow, zero_eq_mul, pow_eq_zero_iff, not_or, sub_self, not_true_eq_false, false_or]
    at hP hQ
state_before: R : Type u
inst✝¹ : CommRing R
W✝ : Projective R
F : Type u
inst✝ : Field F
W : Projective F
P Q : Fin 3 → F
hPz : P 2 = 0
hQz : Q 2 = 0
hP : 0 = P 0 ^ 3 ∧ (¬3 = 0 ∧ ¬P 0 = 0 ∨ ¬P 1 ^ 2 + W.a₁ * P 0 * P 1 = W.a₂ * P 0 ^ 2)
hQ : 0 = Q 0 ^ 3 ∧ (¬3 = 0 ∧ ¬Q 0 = 0 ∨ ¬Q 1 ^ 2 + W.a₁ * Q 0 * Q 1 = W.a₂ * Q 0 ^ 2)
⊢ ![P 0, P 1, 0] ≈ ![Q 0, Q 1, 0]
state_after: R : Type u
inst✝¹ : CommRing R
W✝ : Projective R
F : Type u
inst✝ : Field F
W : Projective F
P Q : Fin 3 → F
hPz : P 2 = 0
hQz : Q 2 = 0
hP : ¬P 1 = 0
hQ : ¬Q 1 = 0
⊢ ![0, P 1, 0] ≈ ![0, Q 1, 0]
tactic: simp? [pow_eq_zero hP.left.symm, pow_eq_zero hQ.left.symm] at * says
    simp only [Fin.isValue, pow_eq_zero hP.left.symm, ne_eq, OfNat.ofNat_ne_zero,
      not_false_eq_true, zero_pow, not_true_eq_false, and_false, mul_zero, zero_mul, add_zero,
      pow_eq_zero_iff, false_or, true_and, pow_eq_zero hQ.left.symm, Nat.succ_eq_add_one,
      Nat.reduceAdd] at *
state_before: R : Type u
inst✝¹ : CommRing R
W✝ : Projective R
F : Type u
inst✝ : Field F
W : Projective F
P Q : Fin 3 → F
hPz : P 2 = 0
hQz : Q 2 = 0
hP : ¬P 1 = 0
hQ : ¬Q 1 = 0
⊢ ![0, P 1, 0] ≈ ![0, Q 1, 0]
state_after: no goals
tactic: exact ⟨Units.mk0 (P y / Q y) <| div_ne_zero hP hQ, by simp [div_mul_cancel₀ _ hQ]⟩