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

tactic: linear_combination (norm := (rw [Affine.negAddY, toAffine_addX_of_ne hPz hQz hd]; ring1))
  n * P x / (P z ^ 3 * Q z * d) * div_self (pow_ne_zero 2 <| mul_ne_zero hQz hd)
    - P y / P z ^ 3 * div_self (pow_ne_zero 3 <| mul_ne_zero hQz hd)
state_before: R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P Q : Fin 3 → F
n d : F
hPz : P z ≠ 0
hQz : Q z ≠ 0
hd : d ≠ 0
⊢ W.toAffine.negAddY (P x / P z ^ 2) (Q x / Q z ^ 2) (P y / P z ^ 3) (n / (P z * Q z * d)) =
    (n *
          (n ^ 2 + W.a₁ * n * P z * Q z * d - W.a₂ * P z ^ 2 * Q z ^ 2 * d ^ 2 - P x * Q z ^ 2 * d ^ 2 -
              Q x * P z ^ 2 * d ^ 2 -
            P x * Q z ^ 2 * d ^ 2) +
        P y * Q z ^ 3 * d ^ 3) /
      (P z * Q z * d) ^ 3
state_after: no goals

tactic: rw [Affine.negAddY, toAffine_addX_of_ne hPz hQz hd]
state_before: case a
R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P Q : Fin 3 → F
n d : F
hPz : P z ≠ 0
hQz : Q z ≠ 0
hd : d ≠ 0
⊢ W.toAffine.negAddY (P x / P z ^ 2) (Q x / Q z ^ 2) (P y / P z ^ 3) (n / (P z * Q z * d)) -
        (n *
              (n ^ 2 + W.a₁ * n * P z * Q z * d - W.a₂ * P z ^ 2 * Q z ^ 2 * d ^ 2 - P x * Q z ^ 2 * d ^ 2 -
                  Q x * P z ^ 2 * d ^ 2 -
                P x * Q z ^ 2 * d ^ 2) +
            P y * Q z ^ 3 * d ^ 3) /
          (P z * Q z * d) ^ 3 -
      (n * P x / (P z ^ 3 * Q z * d) * ((Q z * d) ^ 2 / (Q z * d) ^ 2) -
          P y / P z ^ 3 * ((Q z * d) ^ 3 / (Q z * d) ^ 3) -
        (n * P x / (P z ^ 3 * Q z * d) * 1 - P y / P z ^ 3 * 1)) =
    0
state_after: case a
R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P Q : Fin 3 → F
n d : F
hPz : P z ≠ 0
hQz : Q z ≠ 0
hd : d ≠ 0
⊢ n / (P z * Q z * d) *
            ((n ^ 2 + W.a₁ * n * P z * Q z * d - W.a₂ * P z ^ 2 * Q z ^ 2 * d ^ 2 - P x * Q z ^ 2 * d ^ 2 -
                  Q x * P z ^ 2 * d ^ 2) /
                (P z * Q z * d) ^ 2 -
              P x / P z ^ 2) +
          P y / P z ^ 3 -
        (n *
              (n ^ 2 + W.a₁ * n * P z * Q z * d - W.a₂ * P z ^ 2 * Q z ^ 2 * d ^ 2 - P x * Q z ^ 2 * d ^ 2 -
                  Q x * P z ^ 2 * d ^ 2 -
                P x * Q z ^ 2 * d ^ 2) +
            P y * Q z ^ 3 * d ^ 3) /
          (P z * Q z * d) ^ 3 -
      (n * P x / (P z ^ 3 * Q z * d) * ((Q z * d) ^ 2 / (Q z * d) ^ 2) -
          P y / P z ^ 3 * ((Q z * d) ^ 3 / (Q z * d) ^ 3) -
        (n * P x / (P z ^ 3 * Q z * d) * 1 - P y / P z ^ 3 * 1)) =
    0

tactic: ring1
state_before: case a
R : Type u
inst✝¹ : CommRing R
W' : Jacobian R
F : Type v
inst✝ : Field F
W : Jacobian F
P Q : Fin 3 → F
n d : F
hPz : P z ≠ 0
hQz : Q z ≠ 0
hd : d ≠ 0
⊢ n / (P z * Q z * d) *
            ((n ^ 2 + W.a₁ * n * P z * Q z * d - W.a₂ * P z ^ 2 * Q z ^ 2 * d ^ 2 - P x * Q z ^ 2 * d ^ 2 -
                  Q x * P z ^ 2 * d ^ 2) /
                (P z * Q z * d) ^ 2 -
              P x / P z ^ 2) +
          P y / P z ^ 3 -
        (n *
              (n ^ 2 + W.a₁ * n * P z * Q z * d - W.a₂ * P z ^ 2 * Q z ^ 2 * d ^ 2 - P x * Q z ^ 2 * d ^ 2 -
                  Q x * P z ^ 2 * d ^ 2 -
                P x * Q z ^ 2 * d ^ 2) +
            P y * Q z ^ 3 * d ^ 3) /
          (P z * Q z * d) ^ 3 -
      (n * P x / (P z ^ 3 * Q z * d) * ((Q z * d) ^ 2 / (Q z * d) ^ 2) -
          P y / P z ^ 3 * ((Q z * d) ^ 3 / (Q z * d) ^ 3) -
        (n * P x / (P z ^ 3 * Q z * d) * 1 - P y / P z ^ 3 * 1)) =
    0
state_after: no goals