Theorem: WeierstrassCurve.Jacobian.nonsingular_smul
File: Mathlib/AlgebraicGeometry/EllipticCurve/Jacobian.lean

Proof steps:
state_before: R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P✝ : Fin 3 → R
u✝ : R
hu✝ : IsUnit u✝
u : R
hu : IsUnit u
P : Fin 3 → R
hP : W'.Nonsingular (u • P)
⊢ W'.Nonsingular P
state_after: case intro
R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P✝ : Fin 3 → R
u✝ : R
hu✝ : IsUnit u✝
u : R
hu : IsUnit u
P : Fin 3 → R
hP✝ : W'.Nonsingular (u • P)
hP : W'.Equation (u • P)
hP' :
  W'.a₁ * (u • P) y * (u • P) z - (3 * (u • P) x ^ 2 + 2 * W'.a₂ * (u • P) x * (u • P) z ^ 2 + W'.a₄ * (u • P) z ^ 4) ≠
      0 ∨
    2 * (u • P) y + W'.a₁ * (u • P) x * (u • P) z + W'.a₃ * (u • P) z ^ 3 ≠ 0 ∨
      W'.a₁ * (u • P) x * (u • P) y + 3 * W'.a₃ * (u • P) y * (u • P) z ^ 2 -
          (2 * W'.a₂ * (u • P) x ^ 2 * (u • P) z + 4 * W'.a₄ * (u • P) x * (u • P) z ^ 3 + 6 * W'.a₆ * (u • P) z ^ 5) ≠
        0
⊢ W'.Nonsingular P
tactic: rcases (nonsingular_iff _).mp hP with ⟨hP, hP'⟩
state_before: case intro
R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P✝ : Fin 3 → R
u✝ : R
hu✝ : IsUnit u✝
u : R
hu : IsUnit u
P : Fin 3 → R
hP✝ : W'.Nonsingular (u • P)
hP : W'.Equation (u • P)
hP' :
  W'.a₁ * (u • P) y * (u • P) z - (3 * (u • P) x ^ 2 + 2 * W'.a₂ * (u • P) x * (u • P) z ^ 2 + W'.a₄ * (u • P) z ^ 4) ≠
      0 ∨
    2 * (u • P) y + W'.a₁ * (u • P) x * (u • P) z + W'.a₃ * (u • P) z ^ 3 ≠ 0 ∨
      W'.a₁ * (u • P) x * (u • P) y + 3 * W'.a₃ * (u • P) y * (u • P) z ^ 2 -
          (2 * W'.a₂ * (u • P) x ^ 2 * (u • P) z + 4 * W'.a₄ * (u • P) x * (u • P) z ^ 3 + 6 * W'.a₆ * (u • P) z ^ 5) ≠
        0
⊢ W'.Nonsingular P
state_after: case intro
R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P✝ : Fin 3 → R
u✝ : R
hu✝ : IsUnit u✝
u : R
hu : IsUnit u
P : Fin 3 → R
hP✝ : W'.Nonsingular (u • P)
hP : W'.Equation (u • P)
hP' :
  W'.a₁ * (u • P) y * (u • P) z - (3 * (u • P) x ^ 2 + 2 * W'.a₂ * (u • P) x * (u • P) z ^ 2 + W'.a₄ * (u • P) z ^ 4) ≠
      0 ∨
    2 * (u • P) y + W'.a₁ * (u • P) x * (u • P) z + W'.a₃ * (u • P) z ^ 3 ≠ 0 ∨
      W'.a₁ * (u • P) x * (u • P) y + 3 * W'.a₃ * (u • P) y * (u • P) z ^ 2 -
          (2 * W'.a₂ * (u • P) x ^ 2 * (u • P) z + 4 * W'.a₄ * (u • P) x * (u • P) z ^ 3 + 6 * W'.a₆ * (u • P) z ^ 5) ≠
        0
⊢ W'.a₁ * P y * P z - (3 * P x ^ 2 + 2 * W'.a₂ * P x * P z ^ 2 + W'.a₄ * P z ^ 4) ≠ 0 ∨
    2 * P y + W'.a₁ * P x * P z + W'.a₃ * P z ^ 3 ≠ 0 ∨
      W'.a₁ * P x * P y + 3 * W'.a₃ * P y * P z ^ 2 -
          (2 * W'.a₂ * P x ^ 2 * P z + 4 * W'.a₄ * P x * P z ^ 3 + 6 * W'.a₆ * P z ^ 5) ≠
        0
tactic: refine (nonsingular_iff P).mpr ⟨(equation_smul P hu).mp hP, ?_⟩
state_before: case intro
R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P✝ : Fin 3 → R
u✝ : R
hu✝ : IsUnit u✝
u : R
hu : IsUnit u
P : Fin 3 → R
hP✝ : W'.Nonsingular (u • P)
hP : W'.Equation (u • P)
hP' :
  W'.a₁ * (u • P) y * (u • P) z - (3 * (u • P) x ^ 2 + 2 * W'.a₂ * (u • P) x * (u • P) z ^ 2 + W'.a₄ * (u • P) z ^ 4) ≠
      0 ∨
    2 * (u • P) y + W'.a₁ * (u • P) x * (u • P) z + W'.a₃ * (u • P) z ^ 3 ≠ 0 ∨
      W'.a₁ * (u • P) x * (u • P) y + 3 * W'.a₃ * (u • P) y * (u • P) z ^ 2 -
          (2 * W'.a₂ * (u • P) x ^ 2 * (u • P) z + 4 * W'.a₄ * (u • P) x * (u • P) z ^ 3 + 6 * W'.a₆ * (u • P) z ^ 5) ≠
        0
⊢ W'.a₁ * P y * P z - (3 * P x ^ 2 + 2 * W'.a₂ * P x * P z ^ 2 + W'.a₄ * P z ^ 4) ≠ 0 ∨
    2 * P y + W'.a₁ * P x * P z + W'.a₃ * P z ^ 3 ≠ 0 ∨
      W'.a₁ * P x * P y + 3 * W'.a₃ * P y * P z ^ 2 -
          (2 * W'.a₂ * P x ^ 2 * P z + 4 * W'.a₄ * P x * P z ^ 3 + 6 * W'.a₆ * P z ^ 5) ≠
        0
state_after: case intro
R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P✝ : Fin 3 → R
u✝ : R
hu✝ : IsUnit u✝
u : R
hu : IsUnit u
P : Fin 3 → R
hP✝ : W'.Nonsingular (u • P)
hP : W'.Equation (u • P)
hP' :
  W'.a₁ * P y * P z - (3 * P x ^ 2 + 2 * W'.a₂ * P x * P z ^ 2 + W'.a₄ * P z ^ 4) = 0 ∧
    2 * P y + W'.a₁ * P x * P z + W'.a₃ * P z ^ 3 = 0 ∧
      W'.a₁ * P x * P y + 3 * W'.a₃ * P y * P z ^ 2 -
          (2 * W'.a₂ * P x ^ 2 * P z + 4 * W'.a₄ * P x * P z ^ 3 + 6 * W'.a₆ * P z ^ 5) =
        0
⊢ W'.a₁ * (u • P) y * (u • P) z - (3 * (u • P) x ^ 2 + 2 * W'.a₂ * (u • P) x * (u • P) z ^ 2 + W'.a₄ * (u • P) z ^ 4) =
      0 ∧
    2 * (u • P) y + W'.a₁ * (u • P) x * (u • P) z + W'.a₃ * (u • P) z ^ 3 = 0 ∧
      W'.a₁ * (u • P) x * (u • P) y + 3 * W'.a₃ * (u • P) y * (u • P) z ^ 2 -
          (2 * W'.a₂ * (u • P) x ^ 2 * (u • P) z + 4 * W'.a₄ * (u • P) x * (u • P) z ^ 3 + 6 * W'.a₆ * (u • P) z ^ 5) =
        0
tactic: contrapose! hP'
state_before: case intro
R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P✝ : Fin 3 → R
u✝ : R
hu✝ : IsUnit u✝
u : R
hu : IsUnit u
P : Fin 3 → R
hP✝ : W'.Nonsingular (u • P)
hP : W'.Equation (u • P)
hP' :
  W'.a₁ * P y * P z - (3 * P x ^ 2 + 2 * W'.a₂ * P x * P z ^ 2 + W'.a₄ * P z ^ 4) = 0 ∧
    2 * P y + W'.a₁ * P x * P z + W'.a₃ * P z ^ 3 = 0 ∧
      W'.a₁ * P x * P y + 3 * W'.a₃ * P y * P z ^ 2 -
          (2 * W'.a₂ * P x ^ 2 * P z + 4 * W'.a₄ * P x * P z ^ 3 + 6 * W'.a₆ * P z ^ 5) =
        0
⊢ W'.a₁ * (u • P) y * (u • P) z - (3 * (u • P) x ^ 2 + 2 * W'.a₂ * (u • P) x * (u • P) z ^ 2 + W'.a₄ * (u • P) z ^ 4) =
      0 ∧
    2 * (u • P) y + W'.a₁ * (u • P) x * (u • P) z + W'.a₃ * (u • P) z ^ 3 = 0 ∧
      W'.a₁ * (u • P) x * (u • P) y + 3 * W'.a₃ * (u • P) y * (u • P) z ^ 2 -
          (2 * W'.a₂ * (u • P) x ^ 2 * (u • P) z + 4 * W'.a₄ * (u • P) x * (u • P) z ^ 3 + 6 * W'.a₆ * (u • P) z ^ 5) =
        0
state_after: case intro
R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P✝ : Fin 3 → R
u✝ : R
hu✝ : IsUnit u✝
u : R
hu : IsUnit u
P : Fin 3 → R
hP✝ : W'.Nonsingular (u • P)
hP : W'.Equation (u • P)
hP' :
  W'.a₁ * P y * P z - (3 * P x ^ 2 + 2 * W'.a₂ * P x * P z ^ 2 + W'.a₄ * P z ^ 4) = 0 ∧
    2 * P y + W'.a₁ * P x * P z + W'.a₃ * P z ^ 3 = 0 ∧
      W'.a₁ * P x * P y + 3 * W'.a₃ * P y * P z ^ 2 -
          (2 * W'.a₂ * P x ^ 2 * P z + 4 * W'.a₄ * P x * P z ^ 3 + 6 * W'.a₆ * P z ^ 5) =
        0
⊢ W'.a₁ * (u ^ 3 * P y) * (u * P z) -
        (3 * (u ^ 2 * P x) ^ 2 + 2 * W'.a₂ * (u ^ 2 * P x) * (u * P z) ^ 2 + W'.a₄ * (u * P z) ^ 4) =
      0 ∧
    2 * (u ^ 3 * P y) + W'.a₁ * (u ^ 2 * P x) * (u * P z) + W'.a₃ * (u * P z) ^ 3 = 0 ∧
      W'.a₁ * (u ^ 2 * P x) * (u ^ 3 * P y) + 3 * W'.a₃ * (u ^ 3 * P y) * (u * P z) ^ 2 -
          (2 * W'.a₂ * (u ^ 2 * P x) ^ 2 * (u * P z) + 4 * W'.a₄ * (u ^ 2 * P x) * (u * P z) ^ 3 +
            6 * W'.a₆ * (u * P z) ^ 5) =
        0
tactic: simp only [smul_fin3_ext]
state_before: case intro
R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P✝ : Fin 3 → R
u✝ : R
hu✝ : IsUnit u✝
u : R
hu : IsUnit u
P : Fin 3 → R
hP✝ : W'.Nonsingular (u • P)
hP : W'.Equation (u • P)
hP' :
  W'.a₁ * P y * P z - (3 * P x ^ 2 + 2 * W'.a₂ * P x * P z ^ 2 + W'.a₄ * P z ^ 4) = 0 ∧
    2 * P y + W'.a₁ * P x * P z + W'.a₃ * P z ^ 3 = 0 ∧
      W'.a₁ * P x * P y + 3 * W'.a₃ * P y * P z ^ 2 -
          (2 * W'.a₂ * P x ^ 2 * P z + 4 * W'.a₄ * P x * P z ^ 3 + 6 * W'.a₆ * P z ^ 5) =
        0
⊢ W'.a₁ * (u ^ 3 * P y) * (u * P z) -
        (3 * (u ^ 2 * P x) ^ 2 + 2 * W'.a₂ * (u ^ 2 * P x) * (u * P z) ^ 2 + W'.a₄ * (u * P z) ^ 4) =
      0 ∧
    2 * (u ^ 3 * P y) + W'.a₁ * (u ^ 2 * P x) * (u * P z) + W'.a₃ * (u * P z) ^ 3 = 0 ∧
      W'.a₁ * (u ^ 2 * P x) * (u ^ 3 * P y) + 3 * W'.a₃ * (u ^ 3 * P y) * (u * P z) ^ 2 -
          (2 * W'.a₂ * (u ^ 2 * P x) ^ 2 * (u * P z) + 4 * W'.a₄ * (u ^ 2 * P x) * (u * P z) ^ 3 +
            6 * W'.a₆ * (u * P z) ^ 5) =
        0
state_after: no goals
tactic: exact ⟨by linear_combination (norm := ring1) u ^ 4 * hP'.left,
      by linear_combination (norm := ring1) u ^ 3 * hP'.right.left,
      by linear_combination (norm := ring1) u ^ 5 * hP'.right.right⟩
state_before: R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P : Fin 3 → R
u : R
hu : IsUnit u
this : ∀ {u : R}, IsUnit u → ∀ {P : Fin 3 → R}, W'.Nonsingular (u • P) → W'.Nonsingular P
h : W'.Nonsingular P
⊢ W'.Nonsingular (↑hu.unit⁻¹ • u • P)
state_after: no goals
tactic: rwa [smul_smul, hu.val_inv_mul, one_smul]