Theorem: QuadraticForm.associated_tmul
File: Mathlib/LinearAlgebra/QuadraticForm/TensorProduct.lean

Proof steps:
state_before: R : Type uR
A : Type uA
M₁ : Type uM₁
M₂ : Type uM₂
inst✝¹² : CommRing R
inst✝¹¹ : CommRing A
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : Algebra R A
inst✝⁷ : Module R M₁
inst✝⁶ : Module A M₁
inst✝⁵ : SMulCommClass R A M₁
inst✝⁴ : SMulCommClass A R M₁
inst✝³ : IsScalarTower R A M₁
inst✝² : Module R M₂
inst✝¹ : Invertible 2
inst✝ : Invertible 2
Q₁ : QuadraticForm A M₁
Q₂ : QuadraticForm R M₂
⊢ associated (Q₁.tmul Q₂) = (associated Q₁).tmul (associated Q₂)
state_after: R : Type uR
A : Type uA
M₁ : Type uM₁
M₂ : Type uM₂
inst✝¹² : CommRing R
inst✝¹¹ : CommRing A
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : Algebra R A
inst✝⁷ : Module R M₁
inst✝⁶ : Module A M₁
inst✝⁵ : SMulCommClass R A M₁
inst✝⁴ : SMulCommClass A R M₁
inst✝³ : IsScalarTower R A M₁
inst✝² : Module R M₂
inst✝¹ : Invertible 2
inst✝ : Invertible 2
Q₁ : QuadraticForm A M₁
Q₂ : QuadraticForm R M₂
⊢ associated
      ((let toQ := BilinMap.toQuadraticMapLinearMap A A (M₁ ⊗[R] M₂);
        let tmulB := BilinMap.tensorDistrib R A;
        let toB := AlgebraTensorModule.map associated associated;
        toQ ∘ₗ tmulB ∘ₗ toB)
        (Q₁ ⊗ₜ[R] Q₂)) =
    (BilinMap.tensorDistrib R A) (associated Q₁ ⊗ₜ[R] associated Q₂)
tactic: rw [QuadraticForm.tmul, tensorDistrib, BilinMap.tmul]
state_before: R : Type uR
A : Type uA
M₁ : Type uM₁
M₂ : Type uM₂
inst✝¹² : CommRing R
inst✝¹¹ : CommRing A
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : Algebra R A
inst✝⁷ : Module R M₁
inst✝⁶ : Module A M₁
inst✝⁵ : SMulCommClass R A M₁
inst✝⁴ : SMulCommClass A R M₁
inst✝³ : IsScalarTower R A M₁
inst✝² : Module R M₂
inst✝¹ : Invertible 2
inst✝ : Invertible 2
Q₁ : QuadraticForm A M₁
Q₂ : QuadraticForm R M₂
⊢ associated
      ((let toQ := BilinMap.toQuadraticMapLinearMap A A (M₁ ⊗[R] M₂);
        let tmulB := BilinMap.tensorDistrib R A;
        let toB := AlgebraTensorModule.map associated associated;
        toQ ∘ₗ tmulB ∘ₗ toB)
        (Q₁ ⊗ₜ[R] Q₂)) =
    (BilinMap.tensorDistrib R A) (associated Q₁ ⊗ₜ[R] associated Q₂)
state_after: R : Type uR
A : Type uA
M₁ : Type uM₁
M₂ : Type uM₂
inst✝¹² : CommRing R
inst✝¹¹ : CommRing A
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : Algebra R A
inst✝⁷ : Module R M₁
inst✝⁶ : Module A M₁
inst✝⁵ : SMulCommClass R A M₁
inst✝⁴ : SMulCommClass A R M₁
inst✝³ : IsScalarTower R A M₁
inst✝² : Module R M₂
inst✝¹ : Invertible 2
inst✝ : Invertible 2
Q₁ : QuadraticForm A M₁
Q₂ : QuadraticForm R M₂
⊢ associated
      ((BilinMap.toQuadraticMapLinearMap A A (M₁ ⊗[R] M₂))
        ((BilinMap.tensorDistrib R A) (associated Q₁ ⊗ₜ[R] associated Q₂))) =
    (BilinMap.tensorDistrib R A) (associated Q₁ ⊗ₜ[R] associated Q₂)
tactic: dsimp
state_before: R : Type uR
A : Type uA
M₁ : Type uM₁
M₂ : Type uM₂
inst✝¹² : CommRing R
inst✝¹¹ : CommRing A
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : Algebra R A
inst✝⁷ : Module R M₁
inst✝⁶ : Module A M₁
inst✝⁵ : SMulCommClass R A M₁
inst✝⁴ : SMulCommClass A R M₁
inst✝³ : IsScalarTower R A M₁
inst✝² : Module R M₂
inst✝¹ : Invertible 2
inst✝ : Invertible 2
Q₁ : QuadraticForm A M₁
Q₂ : QuadraticForm R M₂
⊢ associated
      ((BilinMap.toQuadraticMapLinearMap A A (M₁ ⊗[R] M₂))
        ((BilinMap.tensorDistrib R A) (associated Q₁ ⊗ₜ[R] associated Q₂))) =
    (BilinMap.tensorDistrib R A) (associated Q₁ ⊗ₜ[R] associated Q₂)
state_after: R : Type uR
A : Type uA
M₁ : Type uM₁
M₂ : Type uM₂
inst✝¹² : CommRing R
inst✝¹¹ : CommRing A
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : Algebra R A
inst✝⁷ : Module R M₁
inst✝⁶ : Module A M₁
inst✝⁵ : SMulCommClass R A M₁
inst✝⁴ : SMulCommClass A R M₁
inst✝³ : IsScalarTower R A M₁
inst✝² : Module R M₂
inst✝¹ : Invertible 2
inst✝ : Invertible 2
Q₁ : QuadraticForm A M₁
Q₂ : QuadraticForm R M₂
this : Subsingleton (Invertible 2)
⊢ associated
      ((BilinMap.toQuadraticMapLinearMap A A (M₁ ⊗[R] M₂))
        ((BilinMap.tensorDistrib R A) (associated Q₁ ⊗ₜ[R] associated Q₂))) =
    (BilinMap.tensorDistrib R A) (associated Q₁ ⊗ₜ[R] associated Q₂)
tactic: have : Subsingleton (Invertible (2 : A)) := inferInstance
state_before: R : Type uR
A : Type uA
M₁ : Type uM₁
M₂ : Type uM₂
inst✝¹² : CommRing R
inst✝¹¹ : CommRing A
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : Algebra R A
inst✝⁷ : Module R M₁
inst✝⁶ : Module A M₁
inst✝⁵ : SMulCommClass R A M₁
inst✝⁴ : SMulCommClass A R M₁
inst✝³ : IsScalarTower R A M₁
inst✝² : Module R M₂
inst✝¹ : Invertible 2
inst✝ : Invertible 2
Q₁ : QuadraticForm A M₁
Q₂ : QuadraticForm R M₂
this : Subsingleton (Invertible 2)
⊢ associated
      ((BilinMap.toQuadraticMapLinearMap A A (M₁ ⊗[R] M₂))
        ((BilinMap.tensorDistrib R A) (associated Q₁ ⊗ₜ[R] associated Q₂))) =
    (BilinMap.tensorDistrib R A) (associated Q₁ ⊗ₜ[R] associated Q₂)
state_after: no goals
tactic: convert associated_left_inverse A ((associated_isSymm A Q₁).tmul (associated_isSymm R Q₂))