-- Mathlib/AlgebraicGeometry/EllipticCurve/Jacobian.lean
lemma negAddY_neg {P : Fin 3 → R} (hP : W'.Equation P) :
    W'.negAddY P (W'.neg P) = W'.dblZ P ^ 3

Proof state:
case a.a
R : Type r
inst✝ : CommRing R
W' : Jacobian R
P : Fin 3 → R
hP : W'.Equation P
⊢ -P y * P x ^ 3 * P z ^ 3 + 2 * P y * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) ^ 2 * P z ^ 3 -
                                            3 * P x ^ 2 * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 2 *
                                              P z +
                                          3 * P x * P y * P x ^ 2 * P z * P z ^ 2 +
                                        P x ^ 3 * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 3 -
                                      2 * P y ^ 2 * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 3 +
                                    W'.a₁ * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) ^ 2 * P z ^ 4 +
                                  W'.a₁ * P y * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 3 * P z -
                                W'.a₁ * P x * P y * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z * P z ^ 3 -
                              W'.a₁ * P y ^ 2 * P x * P z ^ 4 -
                            2 * W'.a₂ * P x * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 4 * P z +
                          2 * W'.a₂ * P x * P y * P x * P z * P z ^ 4 +
                        W'.a₃ * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) ^ 2 * P z ^ 6 -
                      W'.a₃ * P y ^ 2 * P z ^ 6 -
                    W'.a₄ * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 6 * P z -
                  W'.a₄ * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 4 * P z ^ 3 +
                W'.a₄ * P y * P x * P z ^ 3 * P z ^ 4 +
              W'.a₄ * P x * P y * P z * P z ^ 6 -
            2 * W'.a₆ * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 6 * P z ^ 3 +
          2 * W'.a₆ * P y * P z ^ 3 * P z ^ 6 +
        -2 * P z ^ 3 * (P y - (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3)) * 0 -
      ((P z * (P y - (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3))) ^ 3 +
        -2 * P z ^ 3 * (P y - (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3)) *
          (P y ^ 2 + W'.a₁ * P x * P y * P z + W'.a₃ * P y * P z ^ 3 -
            (P x ^ 3 + W'.a₂ * P x ^ 2 * P z ^ 2 + W'.a₄ * P x * P z ^ 4 + W'.a₆ * P z ^ 6))) =
    0

Tactic:
ring1

Result:
no goals

Proof state:
case a.a
R : Type r
inst✝ : CommRing R
W' : Jacobian R
P : Fin 3 → R
hP : W'.Equation P
⊢ W'.negAddY P (W'.neg P) + -2 * P z ^ 3 * (P y - W'.negY P) * 0 -
      (W'.dblZ P ^ 3 +
        -2 * P z ^ 3 * (P y - W'.negY P) *
          (P y ^ 2 + W'.a₁ * P x * P y * P z + W'.a₃ * P y * P z ^ 3 -
            (P x ^ 3 + W'.a₂ * P x ^ 2 * P z ^ 2 + W'.a₄ * P x * P z ^ 4 + W'.a₆ * P z ^ 6))) =
    0

Tactic:
rw [negAddY, neg_X, neg_Y, neg_Z, dblZ, negY]

Result:
case a.a
R : Type r
inst✝ : CommRing R
W' : Jacobian R
P : Fin 3 → R
hP : W'.Equation P
⊢ -P y * P x ^ 3 * P z ^ 3 + 2 * P y * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) ^ 2 * P z ^ 3 -
                                            3 * P x ^ 2 * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 2 *
                                              P z +
                                          3 * P x * P y * P x ^ 2 * P z * P z ^ 2 +
                                        P x ^ 3 * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 3 -
                                      2 * P y ^ 2 * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 3 +
                                    W'.a₁ * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) ^ 2 * P z ^ 4 +
                                  W'.a₁ * P y * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 3 * P z -
                                W'.a₁ * P x * P y * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z * P z ^ 3 -
                              W'.a₁ * P y ^ 2 * P x * P z ^ 4 -
                            2 * W'.a₂ * P x * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 4 * P z +
                          2 * W'.a₂ * P x * P y * P x * P z * P z ^ 4 +
                        W'.a₃ * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) ^ 2 * P z ^ 6 -
                      W'.a₃ * P y ^ 2 * P z ^ 6 -
                    W'.a₄ * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 6 * P z -
                  W'.a₄ * P x * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 4 * P z ^ 3 +
                W'.a₄ * P y * P x * P z ^ 3 * P z ^ 4 +
              W'.a₄ * P x * P y * P z * P z ^ 6 -
            2 * W'.a₆ * (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3) * P z ^ 6 * P z ^ 3 +
          2 * W'.a₆ * P y * P z ^ 3 * P z ^ 6 +
        -2 * P z ^ 3 * (P y - (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3)) * 0 -
      ((P z * (P y - (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3))) ^ 3 +
        -2 * P z ^ 3 * (P y - (-P y - W'.a₁ * P x * P z - W'.a₃ * P z ^ 3)) *
          (P y ^ 2 + W'.a₁ * P x * P y * P z + W'.a₃ * P y * P z ^ 3 -
            (P x ^ 3 + W'.a₂ * P x ^ 2 * P z ^ 2 + W'.a₄ * P x * P z ^ 4 + W'.a₆ * P z ^ 6))) =
    0

Proof state:
R : Type r
inst✝ : CommRing R
W' : Jacobian R
P : Fin 3 → R
hP : W'.Equation P
⊢ W'.negAddY P (W'.neg P) = W'.dblZ P ^ 3

Tactic:
linear_combination (norm := (rw [negAddY, neg_X, neg_Y, neg_Z, dblZ, negY]; ring1))
  -2 * P z ^ 3 * (P y - W'.negY P) * (equation_iff _).mp hP

Result:
no goals