-- Mathlib/AlgebraicGeometry/EllipticCurve/Jacobian.lean
lemma addX_eq' {P Q : Fin 3 → R} (hP : W'.Equation P) (hQ : W'.Equation Q) :
    W'.addX P Q * (P z * Q z) ^ 2 =
      (P y * Q z ^ 3 - Q y * P z ^ 3) ^ 2
        + W'.a₁ * (P y * Q z ^ 3 - Q y * P z ^ 3) * P z * Q z * addZ P Q
        - W'.a₂ * P z ^ 2 * Q z ^ 2 * addZ P Q ^ 2 - P x * Q z ^ 2 * addZ P Q ^ 2
        - Q x * P z ^ 2 * addZ P Q ^ 2

Proof state:
R : Type r
inst✝ : CommRing R
W' : Jacobian R
P Q : Fin 3 → R
hP : W'.Equation P
hQ : W'.Equation Q
⊢ W'.addX P Q * (P z * Q z) ^ 2 =
    (P y * Q z ^ 3 - Q y * P z ^ 3) ^ 2 + W'.a₁ * (P y * Q z ^ 3 - Q y * P z ^ 3) * P z * Q z * addZ P Q -
          W'.a₂ * P z ^ 2 * Q z ^ 2 * addZ P Q ^ 2 -
        P x * Q z ^ 2 * addZ P Q ^ 2 -
      Q x * P z ^ 2 * addZ P Q ^ 2

Tactic:
linear_combination (norm := (rw [addX, addZ]; ring1)) -Q z ^ 6 * (equation_iff P).mp hP
  - P z ^ 6 * (equation_iff Q).mp hQ

Result:
no goals

Proof state:
case a.a
R : Type r
inst✝ : CommRing R
W' : Jacobian R
P Q : Fin 3 → R
hP : W'.Equation P
hQ : W'.Equation Q
⊢ W'.addX P Q * (P z * Q z) ^ 2 +
        (-Q z ^ 6 * 0 +
          P z ^ 6 *
            (Q y ^ 2 + W'.a₁ * Q x * Q y * Q z + W'.a₃ * Q y * Q z ^ 3 -
              (Q x ^ 3 + W'.a₂ * Q x ^ 2 * Q z ^ 2 + W'.a₄ * Q x * Q z ^ 4 + W'.a₆ * Q z ^ 6))) -
      ((P y * Q z ^ 3 - Q y * P z ^ 3) ^ 2 + W'.a₁ * (P y * Q z ^ 3 - Q y * P z ^ 3) * P z * Q z * addZ P Q -
              W'.a₂ * P z ^ 2 * Q z ^ 2 * addZ P Q ^ 2 -
            P x * Q z ^ 2 * addZ P Q ^ 2 -
          Q x * P z ^ 2 * addZ P Q ^ 2 +
        (-Q z ^ 6 *
            (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)) +
          P z ^ 6 * 0)) =
    0

Tactic:
rw [addX, addZ]

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

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

Tactic:
ring1

Result:
no goals