[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁵ : Semiring R
inst✝¹⁴ : AddCommMonoid M✝
inst✝¹³ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹² : Ring R₁
inst✝¹¹ : AddCommGroup M₁
inst✝¹⁰ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝⁹ : CommSemiring R₂
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁶ : CommRing R₃
inst✝⁵ : AddCommGroup M₃
inst✝⁴ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝ : Fintype n
M : Matrix n n R₂
x y z : n → R₂
⊢ (fun v w => ∑ i : n, ∑ j : n, v i * M i j * w j) (x + y) z =
    (fun v w => ∑ i : n, ∑ j : n, v i * M i j * w j) x z + (fun v w => ∑ i : n, ∑ j : n, v i * M i j * w j) y z
[PROOFSTEP]
simp only [Pi.add_apply, add_mul, sum_add_distrib]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁵ : Semiring R
inst✝¹⁴ : AddCommMonoid M✝
inst✝¹³ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹² : Ring R₁
inst✝¹¹ : AddCommGroup M₁
inst✝¹⁰ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝⁹ : CommSemiring R₂
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁶ : CommRing R₃
inst✝⁵ : AddCommGroup M₃
inst✝⁴ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝ : Fintype n
M : Matrix n n R₂
a : R₂
x y : n → R₂
⊢ (fun v w => ∑ i : n, ∑ j : n, v i * M i j * w j) (a • x) y = a * (fun v w => ∑ i : n, ∑ j : n, v i * M i j * w j) x y
[PROOFSTEP]
simp only [Pi.smul_apply, smul_eq_mul, mul_assoc, mul_sum]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁵ : Semiring R
inst✝¹⁴ : AddCommMonoid M✝
inst✝¹³ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹² : Ring R₁
inst✝¹¹ : AddCommGroup M₁
inst✝¹⁰ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝⁹ : CommSemiring R₂
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁶ : CommRing R₃
inst✝⁵ : AddCommGroup M₃
inst✝⁴ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝ : Fintype n
M : Matrix n n R₂
x y z : n → R₂
⊢ (fun v w => ∑ i : n, ∑ j : n, v i * M i j * w j) x (y + z) =
    (fun v w => ∑ i : n, ∑ j : n, v i * M i j * w j) x y + (fun v w => ∑ i : n, ∑ j : n, v i * M i j * w j) x z
[PROOFSTEP]
simp only [Pi.add_apply, mul_add, sum_add_distrib]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁵ : Semiring R
inst✝¹⁴ : AddCommMonoid M✝
inst✝¹³ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹² : Ring R₁
inst✝¹¹ : AddCommGroup M₁
inst✝¹⁰ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝⁹ : CommSemiring R₂
inst✝⁸ : AddCommMonoid M₂
inst✝⁷ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁶ : CommRing R₃
inst✝⁵ : AddCommGroup M₃
inst✝⁴ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝ : Fintype n
M : Matrix n n R₂
a : R₂
x y : n → R₂
⊢ (fun v w => ∑ i : n, ∑ j : n, v i * M i j * w j) x (a • y) = a * (fun v w => ∑ i : n, ∑ j : n, v i * M i j * w j) x y
[PROOFSTEP]
simp only [Pi.smul_apply, smul_eq_mul, mul_assoc, mul_left_comm, mul_sum]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
⊢ bilin (toBilin'Aux M) (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1) (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) =
    M i j
[PROOFSTEP]
rw [Matrix.toBilin'Aux]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
⊢ bilin
      { bilin := fun v w => ∑ i : n, ∑ j : n, v i * M i j * w j,
        bilin_add_left :=
          (_ :
            ∀ (x y z : n → R₂),
              ∑ i : n, ∑ j : n, (x + y) i * M i j * z j =
                ∑ x_1 : n, ∑ x_2 : n, x x_1 * M x_1 x_2 * z x_2 + ∑ x : n, ∑ x_1 : n, y x * M x x_1 * z x_1),
        bilin_smul_left :=
          (_ :
            ∀ (a : R₂) (x y : n → R₂),
              ∑ i : n, ∑ j : n, (a • x) i * M i j * y j = a * ∑ i : n, ∑ j : n, x i * M i j * y j),
        bilin_add_right :=
          (_ :
            ∀ (x y z : n → R₂),
              ∑ i : n, ∑ j : n, x i * M i j * (y + z) j =
                ∑ x_1 : n, ∑ x_2 : n, x x_1 * M x_1 x_2 * y x_2 + ∑ x_1 : n, ∑ x_2 : n, x x_1 * M x_1 x_2 * z x_2),
        bilin_smul_right :=
          (_ :
            ∀ (a : R₂) (x y : n → R₂),
              ∑ i : n, ∑ j : n, x i * M i j * (a • y) j = a * ∑ i : n, ∑ j : n, x i * M i j * y j) }
      (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1) (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) =
    M i j
[PROOFSTEP]
dsimp only
  -- Porting note: had to add `dsimp only` to get rid of the projections
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
⊢ ∑ i_1 : n,
      ∑ j_1 : n,
        ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i_1 * M i_1 j_1 * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j_1 =
    M i j
[PROOFSTEP]
rw [sum_eq_single i, sum_eq_single j]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
⊢ ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i * M i j * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j = M i j
[PROOFSTEP]
simp only [stdBasis_same, stdBasis_same, one_mul, mul_one]
[GOAL]
case h₀
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
⊢ ∀ (b : n),
    b ∈ univ →
      b ≠ j → ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i * M i b * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 b = 0
[PROOFSTEP]
rintro j' - hj'
[GOAL]
case h₀
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j j' : n
hj' : j' ≠ j
⊢ ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i * M i j' * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j' = 0
[PROOFSTEP]
apply mul_eq_zero_of_right
[GOAL]
case h₀.h
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j j' : n
hj' : j' ≠ j
⊢ ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j' = 0
[PROOFSTEP]
exact stdBasis_ne R₂ (fun _ => R₂) _ _ hj' 1
[GOAL]
case h₁
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
⊢ ¬j ∈ univ → ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i * M i j * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j = 0
[PROOFSTEP]
intros
[GOAL]
case h₁
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
a✝ : ¬j ∈ univ
⊢ ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i * M i j * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j = 0
[PROOFSTEP]
have := Finset.mem_univ j
[GOAL]
case h₁
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
a✝ : ¬j ∈ univ
this : j ∈ univ
⊢ ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i * M i j * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j = 0
[PROOFSTEP]
contradiction
[GOAL]
case h₀
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
⊢ ∀ (b : n),
    b ∈ univ →
      b ≠ i →
        ∑ j_1 : n,
            ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 b * M b j_1 * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j_1 =
          0
[PROOFSTEP]
rintro i' - hi'
[GOAL]
case h₀
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j i' : n
hi' : i' ≠ i
⊢ ∑ j_1 : n, ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i' * M i' j_1 * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j_1 =
    0
[PROOFSTEP]
refine' Finset.sum_eq_zero fun j _ => _
[GOAL]
case h₀
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j✝ i' : n
hi' : i' ≠ i
j : n
x✝ : j ∈ univ
⊢ ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i' * M i' j * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j✝) 1 j = 0
[PROOFSTEP]
apply mul_eq_zero_of_left
[GOAL]
case h₀.h
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j✝ i' : n
hi' : i' ≠ i
j : n
x✝ : j ∈ univ
⊢ ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i' * M i' j = 0
[PROOFSTEP]
apply mul_eq_zero_of_left
[GOAL]
case h₀.h.h
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j✝ i' : n
hi' : i' ≠ i
j : n
x✝ : j ∈ univ
⊢ ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i' = 0
[PROOFSTEP]
exact stdBasis_ne R₂ (fun _ => R₂) _ _ hi' 1
[GOAL]
case h₁
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
⊢ ¬i ∈ univ →
    ∑ j_1 : n, ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i * M i j_1 * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j_1 =
      0
[PROOFSTEP]
intros
[GOAL]
case h₁
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
a✝ : ¬i ∈ univ
⊢ ∑ j_1 : n, ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i * M i j_1 * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j_1 = 0
[PROOFSTEP]
have := Finset.mem_univ i
[GOAL]
case h₁
R : Type u_1
M✝ : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M✝
inst✝¹⁴ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝¹ : Fintype n
inst✝ : DecidableEq n
M : Matrix n n R₂
i j : n
a✝ : ¬i ∈ univ
this : i ∈ univ
⊢ ∑ j_1 : n, ↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1 i * M i j_1 * ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1 j_1 = 0
[PROOFSTEP]
contradiction
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂✝ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝² : Fintype n
inst✝¹ : Fintype o
inst✝ : DecidableEq n
B₂ : BilinForm R₂ (n → R₂)
⊢ toBilin'Aux (↑(toMatrixAux fun j => ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) B₂) = B₂
[PROOFSTEP]
refine' ext_basis (Pi.basisFun R₂ n) fun i j => _
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂✝ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝² : Fintype n
inst✝¹ : Fintype o
inst✝ : DecidableEq n
B₂ : BilinForm R₂ (n → R₂)
i j : n
⊢ bilin (toBilin'Aux (↑(toMatrixAux fun j => ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) B₂)) (↑(Pi.basisFun R₂ n) i)
      (↑(Pi.basisFun R₂ n) j) =
    bilin B₂ (↑(Pi.basisFun R₂ n) i) (↑(Pi.basisFun R₂ n) j)
[PROOFSTEP]
rw [Pi.basisFun_apply, Pi.basisFun_apply, Matrix.toBilin'Aux_stdBasis, BilinForm.toMatrixAux_apply]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
src✝ : BilinForm R₂ ((fun x => n → R₂) 1) →ₗ[R₂] Matrix n n R₂ :=
  toMatrixAux fun j => ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1
B : BilinForm R₂ (n → R₂)
⊢ toBilin'Aux
      (AddHom.toFun
        { toAddHom := src✝.toAddHom,
            map_smul' :=
              (_ :
                ∀ (r : R₂) (x : BilinForm R₂ ((fun x => n → R₂) 1)),
                  AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id R₂) r • AddHom.toFun src✝.toAddHom x) }.toAddHom
        B) =
    B
[PROOFSTEP]
convert toBilin'Aux_toMatrixAux B
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M✝
inst✝¹⁶ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
src✝ : BilinForm R₂ ((fun x => n → R₂) 1) →ₗ[R₂] Matrix n n R₂ :=
  toMatrixAux fun j => ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1
M : Matrix n n R₂
⊢ AddHom.toFun
      { toAddHom := src✝.toAddHom,
          map_smul' :=
            (_ :
              ∀ (r : R₂) (x : BilinForm R₂ ((fun x => n → R₂) 1)),
                AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id R₂) r • AddHom.toFun src✝.toAddHom x) }.toAddHom
      (toBilin'Aux M) =
    M
[PROOFSTEP]
ext i j
[GOAL]
case a.h
R : Type u_1
M✝ : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M✝
inst✝¹⁶ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
src✝ : BilinForm R₂ ((fun x => n → R₂) 1) →ₗ[R₂] Matrix n n R₂ :=
  toMatrixAux fun j => ↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1
M : Matrix n n R₂
i j : n
⊢ AddHom.toFun
      { toAddHom := src✝.toAddHom,
          map_smul' :=
            (_ :
              ∀ (r : R₂) (x : BilinForm R₂ ((fun x => n → R₂) 1)),
                AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id R₂) r • AddHom.toFun src✝.toAddHom x) }.toAddHom
      (toBilin'Aux M) i j =
    M i j
[PROOFSTEP]
simp only [toFun_eq_coe, BilinForm.toMatrixAux_apply, Matrix.toBilin'Aux_stdBasis]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M✝
inst✝¹⁶ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
M : Matrix n n R₂
v w : n → R₂
⊢ bilin (↑toBilin' M) v w = v ⬝ᵥ mulVec M w
[PROOFSTEP]
simp_rw [Matrix.toBilin'_apply, Matrix.dotProduct, Matrix.mulVec, Matrix.dotProduct]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M✝
inst✝¹⁶ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
M : Matrix n n R₂
v w : n → R₂
⊢ ∑ i : n, ∑ j : n, v i * M i j * w j = ∑ x : n, v x * ∑ x_1 : n, M x x_1 * w x_1
[PROOFSTEP]
refine' Finset.sum_congr rfl fun _ _ => _
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M✝
inst✝¹⁶ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
M : Matrix n n R₂
v w : n → R₂
x✝¹ : n
x✝ : x✝¹ ∈ univ
⊢ ∑ j : n, v x✝¹ * M x✝¹ j * w j = v x✝¹ * ∑ x : n, M x✝¹ x * w x
[PROOFSTEP]
rw [Finset.mul_sum]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M✝
inst✝¹⁶ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
M : Matrix n n R₂
v w : n → R₂
x✝¹ : n
x✝ : x✝¹ ∈ univ
⊢ ∑ j : n, v x✝¹ * M x✝¹ j * w j = ∑ x : n, v x✝¹ * (M x✝¹ x * w x)
[PROOFSTEP]
refine' Finset.sum_congr rfl fun _ _ => _
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M✝
inst✝¹⁶ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
M : Matrix n n R₂
v w : n → R₂
x✝³ : n
x✝² : x✝³ ∈ univ
x✝¹ : n
x✝ : x✝¹ ∈ univ
⊢ v x✝³ * M x✝³ x✝¹ * w x✝¹ = v x✝³ * (M x✝³ x✝¹ * w x✝¹)
[PROOFSTEP]
rw [← mul_assoc]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
⊢ ↑toMatrix' (comp B l r) = (↑LinearMap.toMatrix' l)ᵀ * ↑toMatrix' B * ↑LinearMap.toMatrix' r
[PROOFSTEP]
ext i j
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
⊢ ↑toMatrix' (comp B l r) i j = ((↑LinearMap.toMatrix' l)ᵀ * ↑toMatrix' B * ↑LinearMap.toMatrix' r) i j
[PROOFSTEP]
simp only [BilinForm.toMatrix'_apply, BilinForm.comp_apply, transpose_apply, Matrix.mul_apply, LinearMap.toMatrix',
  LinearEquiv.coe_mk, sum_mul]
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
⊢ bilin B (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1)) (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1)) =
    ∑ x : n,
      ∑ x_1 : n,
        ↑of (fun i j => ↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) x_1 i *
            bilin B (↑(LinearMap.stdBasis R₂ (fun x => R₂) x_1) 1) (↑(LinearMap.stdBasis R₂ (fun x => R₂) x) 1) *
          ↑of (fun i j => ↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) x j
[PROOFSTEP]
rw [sum_comm]
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
⊢ bilin B (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1)) (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1)) =
    ∑ y : n,
      ∑ x : n,
        ↑of (fun i j => ↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) y i *
            bilin B (↑(LinearMap.stdBasis R₂ (fun x => R₂) y) 1) (↑(LinearMap.stdBasis R₂ (fun x => R₂) x) 1) *
          ↑of (fun i j => ↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) x j
[PROOFSTEP]
conv_lhs => rw [← BilinForm.sum_repr_mul_repr_mul (Pi.basisFun R₂ n) (l _) (r _)]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
| bilin B (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1)) (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))
[PROOFSTEP]
rw [← BilinForm.sum_repr_mul_repr_mul (Pi.basisFun R₂ n) (l _) (r _)]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
| bilin B (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1)) (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))
[PROOFSTEP]
rw [← BilinForm.sum_repr_mul_repr_mul (Pi.basisFun R₂ n) (l _) (r _)]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
| bilin B (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1)) (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))
[PROOFSTEP]
rw [← BilinForm.sum_repr_mul_repr_mul (Pi.basisFun R₂ n) (l _) (r _)]
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
⊢ (Finsupp.sum (↑(Pi.basisFun R₂ n).repr (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1))) fun i xi =>
      Finsupp.sum (↑(Pi.basisFun R₂ n).repr (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))) fun j yj =>
        xi • yj • bilin B (↑(Pi.basisFun R₂ n) i) (↑(Pi.basisFun R₂ n) j)) =
    ∑ y : n,
      ∑ x : n,
        ↑of (fun i j => ↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) y i *
            bilin B (↑(LinearMap.stdBasis R₂ (fun x => R₂) y) 1) (↑(LinearMap.stdBasis R₂ (fun x => R₂) x) 1) *
          ↑of (fun i j => ↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) x j
[PROOFSTEP]
rw [Finsupp.sum_fintype]
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
⊢ (∑ i_1 : n,
      Finsupp.sum (↑(Pi.basisFun R₂ n).repr (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))) fun j yj =>
        ↑(↑(Pi.basisFun R₂ n).repr (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1))) i_1 •
          yj • bilin B (↑(Pi.basisFun R₂ n) i_1) (↑(Pi.basisFun R₂ n) j)) =
    ∑ y : n,
      ∑ x : n,
        ↑of (fun i j => ↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) y i *
            bilin B (↑(LinearMap.stdBasis R₂ (fun x => R₂) y) 1) (↑(LinearMap.stdBasis R₂ (fun x => R₂) x) 1) *
          ↑of (fun i j => ↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) x j
[PROOFSTEP]
apply sum_congr rfl
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
⊢ ∀ (x : n),
    x ∈ univ →
      (Finsupp.sum (↑(Pi.basisFun R₂ n).repr (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))) fun j yj =>
          ↑(↑(Pi.basisFun R₂ n).repr (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1))) x •
            yj • bilin B (↑(Pi.basisFun R₂ n) x) (↑(Pi.basisFun R₂ n) j)) =
        ∑ x_1 : n,
          ↑of (fun i j => ↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) x i *
              bilin B (↑(LinearMap.stdBasis R₂ (fun x => R₂) x) 1) (↑(LinearMap.stdBasis R₂ (fun x => R₂) x_1) 1) *
            ↑of (fun i j => ↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) x_1 j
[PROOFSTEP]
rintro i' -
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
i' : n
⊢ (Finsupp.sum (↑(Pi.basisFun R₂ n).repr (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))) fun j yj =>
      ↑(↑(Pi.basisFun R₂ n).repr (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1))) i' •
        yj • bilin B (↑(Pi.basisFun R₂ n) i') (↑(Pi.basisFun R₂ n) j)) =
    ∑ x : n,
      ↑of (fun i j => ↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) i' i *
          bilin B (↑(LinearMap.stdBasis R₂ (fun x => R₂) i') 1) (↑(LinearMap.stdBasis R₂ (fun x => R₂) x) 1) *
        ↑of (fun i j => ↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) x j
[PROOFSTEP]
rw [Finsupp.sum_fintype]
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
i' : n
⊢ ∑ i_1 : n,
      ↑(↑(Pi.basisFun R₂ n).repr (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1))) i' •
        ↑(↑(Pi.basisFun R₂ n).repr (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))) i_1 •
          bilin B (↑(Pi.basisFun R₂ n) i') (↑(Pi.basisFun R₂ n) i_1) =
    ∑ x : n,
      ↑of (fun i j => ↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) i' i *
          bilin B (↑(LinearMap.stdBasis R₂ (fun x => R₂) i') 1) (↑(LinearMap.stdBasis R₂ (fun x => R₂) x) 1) *
        ↑of (fun i j => ↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) x j
[PROOFSTEP]
apply sum_congr rfl
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
i' : n
⊢ ∀ (x : n),
    x ∈ univ →
      ↑(↑(Pi.basisFun R₂ n).repr (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1))) i' •
          ↑(↑(Pi.basisFun R₂ n).repr (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))) x •
            bilin B (↑(Pi.basisFun R₂ n) i') (↑(Pi.basisFun R₂ n) x) =
        ↑of (fun i j => ↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) i' i *
            bilin B (↑(LinearMap.stdBasis R₂ (fun x => R₂) i') 1) (↑(LinearMap.stdBasis R₂ (fun x => R₂) x) 1) *
          ↑of (fun i j => ↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) x j
[PROOFSTEP]
rintro j' -
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
i' j' : n
⊢ ↑(↑(Pi.basisFun R₂ n).repr (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1))) i' •
      ↑(↑(Pi.basisFun R₂ n).repr (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))) j' •
        bilin B (↑(Pi.basisFun R₂ n) i') (↑(Pi.basisFun R₂ n) j') =
    ↑of (fun i j => ↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) i' i *
        bilin B (↑(LinearMap.stdBasis R₂ (fun x => R₂) i') 1) (↑(LinearMap.stdBasis R₂ (fun x => R₂) j') 1) *
      ↑of (fun i j => ↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1) i) j' j
[PROOFSTEP]
simp only [smul_eq_mul, Pi.basisFun_repr, mul_assoc, mul_comm, mul_left_comm, Pi.basisFun_apply, of_apply]
[GOAL]
case a.h.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
i' : n
⊢ ∀ (i_1 : n),
    ↑(↑(Pi.basisFun R₂ n).repr (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1))) i' •
        0 • bilin B (↑(Pi.basisFun R₂ n) i') (↑(Pi.basisFun R₂ n) i_1) =
      0
[PROOFSTEP]
intros
[GOAL]
case a.h.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
i' i✝ : n
⊢ ↑(↑(Pi.basisFun R₂ n).repr (↑l (↑(LinearMap.stdBasis R₂ (fun x => R₂) i) 1))) i' •
      0 • bilin B (↑(Pi.basisFun R₂ n) i') (↑(Pi.basisFun R₂ n) i✝) =
    0
[PROOFSTEP]
simp only [zero_smul, smul_zero]
[GOAL]
case a.h.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
⊢ ∀ (i : n),
    (Finsupp.sum (↑(Pi.basisFun R₂ n).repr (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))) fun j yj =>
        0 • yj • bilin B (↑(Pi.basisFun R₂ n) i) (↑(Pi.basisFun R₂ n) j)) =
      0
[PROOFSTEP]
intros
[GOAL]
case a.h.h
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
l r : (o → R₂) →ₗ[R₂] n → R₂
i j : o
i✝ : n
⊢ (Finsupp.sum (↑(Pi.basisFun R₂ n).repr (↑r (↑(LinearMap.stdBasis R₂ (fun x => R₂) j) 1))) fun j yj =>
      0 • yj • bilin B (↑(Pi.basisFun R₂ n) i✝) (↑(Pi.basisFun R₂ n) j)) =
    0
[PROOFSTEP]
simp only [zero_smul, Finsupp.sum_zero]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
f : (n → R₂) →ₗ[R₂] n → R₂
⊢ ↑toMatrix' (compLeft B f) = (↑LinearMap.toMatrix' f)ᵀ * ↑toMatrix' B
[PROOFSTEP]
simp only [BilinForm.compLeft, BilinForm.toMatrix'_comp, toMatrix'_id, Matrix.mul_one]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M
inst✝¹⁶ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
f : (n → R₂) →ₗ[R₂] n → R₂
⊢ ↑toMatrix' (compRight B f) = ↑toMatrix' B * ↑LinearMap.toMatrix' f
[PROOFSTEP]
simp only [BilinForm.compRight, BilinForm.toMatrix'_comp, toMatrix'_id, transpose_one, Matrix.one_mul]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M✝
inst✝¹⁶ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
M : Matrix o n R₂
N : Matrix n o R₂
⊢ M * ↑toMatrix' B * N = ↑toMatrix' (comp B (↑Matrix.toLin' Mᵀ) (↑Matrix.toLin' N))
[PROOFSTEP]
simp only [B.toMatrix'_comp, transpose_transpose, toMatrix'_toLin']
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M✝
inst✝¹⁶ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
M : Matrix n n R₂
⊢ M * ↑toMatrix' B = ↑toMatrix' (compLeft B (↑Matrix.toLin' Mᵀ))
[PROOFSTEP]
simp only [toMatrix'_compLeft, transpose_transpose, toMatrix'_toLin']
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M✝
inst✝¹⁶ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B✝ : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
B : BilinForm R₂ (n → R₂)
M : Matrix n n R₂
⊢ ↑toMatrix' B * M = ↑toMatrix' (compRight B (↑Matrix.toLin' M))
[PROOFSTEP]
simp only [toMatrix'_compRight, toMatrix'_toLin']
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁸ : Semiring R
inst✝¹⁷ : AddCommMonoid M✝
inst✝¹⁶ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁵ : Ring R₁
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹² : CommSemiring R₂
inst✝¹¹ : AddCommMonoid M₂
inst✝¹⁰ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁹ : CommRing R₃
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁶ : Field K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝³ : Fintype n
inst✝² : Fintype o
inst✝¹ : DecidableEq n
inst✝ : DecidableEq o
M : Matrix n n R₂
P Q : Matrix n o R₂
⊢ ↑BilinForm.toMatrix' (BilinForm.comp (↑toBilin' M) (↑toLin' P) (↑toLin' Q)) =
    ↑BilinForm.toMatrix' (↑toBilin' (Pᵀ * M * Q))
[PROOFSTEP]
simp only [BilinForm.toMatrix'_comp, BilinForm.toMatrix'_toBilin', toMatrix'_toLin']
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝² : Fintype n
inst✝¹ : Fintype o
inst✝ : DecidableEq n
b : Basis n R₂ M₂
B : BilinForm R₂ M₂
i j : n
⊢ ↑(toMatrix b) B i j = bilin B (↑b i) (↑b j)
[PROOFSTEP]
rw [BilinForm.toMatrix, LinearEquiv.trans_apply, BilinForm.toMatrix'_apply, congr_apply, b.equivFun_symm_stdBasis,
  b.equivFun_symm_stdBasis]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M✝
inst✝¹⁵ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝² : Fintype n
inst✝¹ : Fintype o
inst✝ : DecidableEq n
b : Basis n R₂ M₂
M : Matrix n n R₂
x y : M₂
⊢ bilin (↑(toBilin b) M) x y = ∑ i : n, ∑ j : n, ↑(↑b.repr x) i * M i j * ↑(↑b.repr y) j
[PROOFSTEP]
rw [Matrix.toBilin, BilinForm.toMatrix, LinearEquiv.symm_trans_apply, ← Matrix.toBilin']
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M✝
inst✝¹⁵ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝² : Fintype n
inst✝¹ : Fintype o
inst✝ : DecidableEq n
b : Basis n R₂ M₂
M : Matrix n n R₂
x y : M₂
⊢ bilin (↑(LinearEquiv.symm (BilinForm.congr (Basis.equivFun b))) (↑toBilin' M)) x y =
    ∑ i : n, ∑ j : n, ↑(↑b.repr x) i * M i j * ↑(↑b.repr y) j
[PROOFSTEP]
simp only [congr_symm, congr_apply, LinearEquiv.symm_symm, Matrix.toBilin'_apply, Basis.equivFun_apply]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝² : Fintype n
inst✝¹ : Fintype o
inst✝ : DecidableEq n
b : Basis n R₂ M₂
B : BilinForm R₂ M₂
i j : n
⊢ ↑(toMatrixAux ↑b) B i j = ↑(BilinForm.toMatrix b) B i j
[PROOFSTEP]
rw [BilinForm.toMatrix_apply, BilinForm.toMatrixAux_apply]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝² : Fintype n
inst✝¹ : Fintype o
inst✝ : DecidableEq n
b : Basis n R₂ M₂
⊢ toBilin (Pi.basisFun R₂ n) = toBilin'
[PROOFSTEP]
ext M
[GOAL]
case h.H
R : Type u_1
M✝ : Type u_2
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M✝
inst✝¹⁵ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝² : Fintype n
inst✝¹ : Fintype o
inst✝ : DecidableEq n
b : Basis n R₂ M₂
M : Matrix n n R₂
x✝ y✝ : n → R₂
⊢ bilin (↑(toBilin (Pi.basisFun R₂ n)) M) x✝ y✝ = bilin (↑toBilin' M) x✝ y✝
[PROOFSTEP]
simp only [Matrix.toBilin_apply, Matrix.toBilin'_apply, Pi.basisFun_repr]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝² : Fintype n
inst✝¹ : Fintype o
inst✝ : DecidableEq n
b : Basis n R₂ M₂
⊢ toMatrix (Pi.basisFun R₂ n) = toMatrix'
[PROOFSTEP]
ext B
[GOAL]
case h.a.h
R : Type u_1
M : Type u_2
inst✝¹⁷ : Semiring R
inst✝¹⁶ : AddCommMonoid M
inst✝¹⁵ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁴ : Ring R₁
inst✝¹³ : AddCommGroup M₁
inst✝¹² : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹¹ : CommSemiring R₂
inst✝¹⁰ : AddCommMonoid M₂
inst✝⁹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁸ : CommRing R₃
inst✝⁷ : AddCommGroup M₃
inst✝⁶ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁵ : Field K
inst✝⁴ : AddCommGroup V
inst✝³ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝² : Fintype n
inst✝¹ : Fintype o
inst✝ : DecidableEq n
b : Basis n R₂ M₂
B : BilinForm R₂ (n → R₂)
i✝ x✝ : n
⊢ ↑(toMatrix (Pi.basisFun R₂ n)) B i✝ x✝ = ↑toMatrix' B i✝ x✝
[PROOFSTEP]
rw [BilinForm.toMatrix_apply, BilinForm.toMatrix'_apply, Pi.basisFun_apply, Pi.basisFun_apply]
[GOAL]
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
⊢ ↑(toMatrix c) (comp B l r) = (↑(LinearMap.toMatrix c b) l)ᵀ * ↑(toMatrix b) B * ↑(LinearMap.toMatrix c b) r
[PROOFSTEP]
ext i j
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
⊢ ↑(toMatrix c) (comp B l r) i j = ((↑(LinearMap.toMatrix c b) l)ᵀ * ↑(toMatrix b) B * ↑(LinearMap.toMatrix c b) r) i j
[PROOFSTEP]
simp only [BilinForm.toMatrix_apply, BilinForm.comp_apply, transpose_apply, Matrix.mul_apply, LinearMap.toMatrix',
  LinearEquiv.coe_mk, sum_mul]
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
⊢ bilin B (↑l (↑c i)) (↑r (↑c j)) =
    ∑ x : n, ∑ x_1 : n, ↑(LinearMap.toMatrix c b) l x_1 i * bilin B (↑b x_1) (↑b x) * ↑(LinearMap.toMatrix c b) r x j
[PROOFSTEP]
rw [sum_comm]
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
⊢ bilin B (↑l (↑c i)) (↑r (↑c j)) =
    ∑ y : n, ∑ x : n, ↑(LinearMap.toMatrix c b) l y i * bilin B (↑b y) (↑b x) * ↑(LinearMap.toMatrix c b) r x j
[PROOFSTEP]
conv_lhs => rw [← BilinForm.sum_repr_mul_repr_mul b]
[GOAL]
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
| bilin B (↑l (↑c i)) (↑r (↑c j))
[PROOFSTEP]
rw [← BilinForm.sum_repr_mul_repr_mul b]
[GOAL]
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
| bilin B (↑l (↑c i)) (↑r (↑c j))
[PROOFSTEP]
rw [← BilinForm.sum_repr_mul_repr_mul b]
[GOAL]
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
| bilin B (↑l (↑c i)) (↑r (↑c j))
[PROOFSTEP]
rw [← BilinForm.sum_repr_mul_repr_mul b]
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
⊢ (Finsupp.sum (↑b.repr (↑l (↑c i))) fun i xi =>
      Finsupp.sum (↑b.repr (↑r (↑c j))) fun j yj => xi • yj • bilin B (↑b i) (↑b j)) =
    ∑ y : n, ∑ x : n, ↑(LinearMap.toMatrix c b) l y i * bilin B (↑b y) (↑b x) * ↑(LinearMap.toMatrix c b) r x j
[PROOFSTEP]
rw [Finsupp.sum_fintype]
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
⊢ (∑ i_1 : n, Finsupp.sum (↑b.repr (↑r (↑c j))) fun j yj => ↑(↑b.repr (↑l (↑c i))) i_1 • yj • bilin B (↑b i_1) (↑b j)) =
    ∑ y : n, ∑ x : n, ↑(LinearMap.toMatrix c b) l y i * bilin B (↑b y) (↑b x) * ↑(LinearMap.toMatrix c b) r x j
[PROOFSTEP]
apply sum_congr rfl
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
⊢ ∀ (x : n),
    x ∈ univ →
      (Finsupp.sum (↑b.repr (↑r (↑c j))) fun j yj => ↑(↑b.repr (↑l (↑c i))) x • yj • bilin B (↑b x) (↑b j)) =
        ∑ x_1 : n, ↑(LinearMap.toMatrix c b) l x i * bilin B (↑b x) (↑b x_1) * ↑(LinearMap.toMatrix c b) r x_1 j
[PROOFSTEP]
rintro i' -
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
i' : n
⊢ (Finsupp.sum (↑b.repr (↑r (↑c j))) fun j yj => ↑(↑b.repr (↑l (↑c i))) i' • yj • bilin B (↑b i') (↑b j)) =
    ∑ x : n, ↑(LinearMap.toMatrix c b) l i' i * bilin B (↑b i') (↑b x) * ↑(LinearMap.toMatrix c b) r x j
[PROOFSTEP]
rw [Finsupp.sum_fintype]
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
i' : n
⊢ ∑ i_1 : n, ↑(↑b.repr (↑l (↑c i))) i' • ↑(↑b.repr (↑r (↑c j))) i_1 • bilin B (↑b i') (↑b i_1) =
    ∑ x : n, ↑(LinearMap.toMatrix c b) l i' i * bilin B (↑b i') (↑b x) * ↑(LinearMap.toMatrix c b) r x j
[PROOFSTEP]
apply sum_congr rfl
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
i' : n
⊢ ∀ (x : n),
    x ∈ univ →
      ↑(↑b.repr (↑l (↑c i))) i' • ↑(↑b.repr (↑r (↑c j))) x • bilin B (↑b i') (↑b x) =
        ↑(LinearMap.toMatrix c b) l i' i * bilin B (↑b i') (↑b x) * ↑(LinearMap.toMatrix c b) r x j
[PROOFSTEP]
rintro j' -
[GOAL]
case a.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
i' j' : n
⊢ ↑(↑b.repr (↑l (↑c i))) i' • ↑(↑b.repr (↑r (↑c j))) j' • bilin B (↑b i') (↑b j') =
    ↑(LinearMap.toMatrix c b) l i' i * bilin B (↑b i') (↑b j') * ↑(LinearMap.toMatrix c b) r j' j
[PROOFSTEP]
simp only [smul_eq_mul, LinearMap.toMatrix_apply, Basis.equivFun_apply, mul_assoc, mul_comm, mul_left_comm]
[GOAL]
case a.h.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
i' : n
⊢ ∀ (i_1 : n), ↑(↑b.repr (↑l (↑c i))) i' • 0 • bilin B (↑b i') (↑b i_1) = 0
[PROOFSTEP]
intros
[GOAL]
case a.h.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
i' i✝ : n
⊢ ↑(↑b.repr (↑l (↑c i))) i' • 0 • bilin B (↑b i') (↑b i✝) = 0
[PROOFSTEP]
simp only [zero_smul, smul_zero]
[GOAL]
case a.h.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
⊢ ∀ (i : n), (Finsupp.sum (↑b.repr (↑r (↑c j))) fun j yj => 0 • yj • bilin B (↑b i) (↑b j)) = 0
[PROOFSTEP]
intros
[GOAL]
case a.h.h
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
l r : M₂' →ₗ[R₂] M₂
i j : o
i✝ : n
⊢ (Finsupp.sum (↑b.repr (↑r (↑c j))) fun j yj => 0 • yj • bilin B (↑b i✝) (↑b j)) = 0
[PROOFSTEP]
simp only [zero_smul, Finsupp.sum_zero]
[GOAL]
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
f : M₂ →ₗ[R₂] M₂
⊢ ↑(toMatrix b) (compLeft B f) = (↑(LinearMap.toMatrix b b) f)ᵀ * ↑(toMatrix b) B
[PROOFSTEP]
simp only [compLeft, BilinForm.toMatrix_comp b b, toMatrix_id, Matrix.mul_one]
[GOAL]
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
f : M₂ →ₗ[R₂] M₂
⊢ ↑(toMatrix b) (compRight B f) = ↑(toMatrix b) B * ↑(LinearMap.toMatrix b b) f
[PROOFSTEP]
simp only [BilinForm.compRight, BilinForm.toMatrix_comp b b, toMatrix_id, transpose_one, Matrix.one_mul]
[GOAL]
R : Type u_1
M : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M
inst✝¹⁸ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c✝ : Basis o R₂ M₂'
inst✝ : DecidableEq o
c : Basis o R₂ M₂
B : BilinForm R₂ M₂
⊢ (Basis.toMatrix b ↑c)ᵀ * ↑(toMatrix b) B * Basis.toMatrix b ↑c = ↑(toMatrix c) B
[PROOFSTEP]
rw [← LinearMap.toMatrix_id_eq_basis_toMatrix, ← BilinForm.toMatrix_comp, BilinForm.comp_id_id]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
M : Matrix o n R₂
N : Matrix n o R₂
⊢ M * ↑(toMatrix b) B * N = ↑(toMatrix c) (comp B (↑(Matrix.toLin c b) Mᵀ) (↑(Matrix.toLin c b) N))
[PROOFSTEP]
simp only [B.toMatrix_comp b c, toMatrix_toLin, transpose_transpose]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
M : Matrix n n R₂
⊢ M * ↑(toMatrix b) B = ↑(toMatrix b) (compLeft B (↑(Matrix.toLin b b) Mᵀ))
[PROOFSTEP]
rw [B.toMatrix_compLeft b, toMatrix_toLin, transpose_transpose]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B✝ : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
B : BilinForm R₂ M₂
M : Matrix n n R₂
⊢ ↑(toMatrix b) B * M = ↑(toMatrix b) (compRight B (↑(Matrix.toLin b b) M))
[PROOFSTEP]
rw [B.toMatrix_compRight b, toMatrix_toLin]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝²⁰ : Semiring R
inst✝¹⁹ : AddCommMonoid M✝
inst✝¹⁸ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁷ : Ring R₁
inst✝¹⁶ : AddCommGroup M₁
inst✝¹⁵ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁴ : CommSemiring R₂
inst✝¹³ : AddCommMonoid M₂
inst✝¹² : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹¹ : CommRing R₃
inst✝¹⁰ : AddCommGroup M₃
inst✝⁹ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁸ : Field K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
o : Type u_12
inst✝⁵ : Fintype n
inst✝⁴ : Fintype o
inst✝³ : DecidableEq n
b : Basis n R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
c : Basis o R₂ M₂'
inst✝ : DecidableEq o
M : Matrix n n R₂
P Q : Matrix n o R₂
⊢ ↑(BilinForm.toMatrix c) (BilinForm.comp (↑(toBilin b) M) (↑(toLin c b) P) (↑(toLin c b) Q)) =
    ↑(BilinForm.toMatrix c) (↑(toBilin c) (Pᵀ * M * Q))
[PROOFSTEP]
simp only [BilinForm.toMatrix_comp b c, BilinForm.toMatrix_toBilin, toMatrix_toLin]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
⊢ BilinForm.IsAdjointPair (↑toBilin' J) (↑toBilin' J₃) (↑toLin' A) (↑toLin' A') ↔ IsAdjointPair J J₃ A A'
[PROOFSTEP]
rw [BilinForm.isAdjointPair_iff_compLeft_eq_compRight]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
⊢ BilinForm.compLeft (↑toBilin' J₃) (↑toLin' A) = BilinForm.compRight (↑toBilin' J) (↑toLin' A') ↔
    IsAdjointPair J J₃ A A'
[PROOFSTEP]
have h : ∀ B B' : BilinForm R₃ (n → R₃), B = B' ↔ BilinForm.toMatrix' B = BilinForm.toMatrix' B' :=
  by
  intro B B'
  constructor <;> intro h
  · rw [h]
  · exact BilinForm.toMatrix'.injective h
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
⊢ ∀ (B B' : BilinForm R₃ (n → R₃)), B = B' ↔ ↑BilinForm.toMatrix' B = ↑BilinForm.toMatrix' B'
[PROOFSTEP]
intro B B'
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
B B' : BilinForm R₃ (n → R₃)
⊢ B = B' ↔ ↑BilinForm.toMatrix' B = ↑BilinForm.toMatrix' B'
[PROOFSTEP]
constructor
[GOAL]
case mp
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
B B' : BilinForm R₃ (n → R₃)
⊢ B = B' → ↑BilinForm.toMatrix' B = ↑BilinForm.toMatrix' B'
[PROOFSTEP]
intro h
[GOAL]
case mpr
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
B B' : BilinForm R₃ (n → R₃)
⊢ ↑BilinForm.toMatrix' B = ↑BilinForm.toMatrix' B' → B = B'
[PROOFSTEP]
intro h
[GOAL]
case mp
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
B B' : BilinForm R₃ (n → R₃)
h : B = B'
⊢ ↑BilinForm.toMatrix' B = ↑BilinForm.toMatrix' B'
[PROOFSTEP]
rw [h]
[GOAL]
case mpr
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
B B' : BilinForm R₃ (n → R₃)
h : ↑BilinForm.toMatrix' B = ↑BilinForm.toMatrix' B'
⊢ B = B'
[PROOFSTEP]
exact BilinForm.toMatrix'.injective h
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
h : ∀ (B B' : BilinForm R₃ (n → R₃)), B = B' ↔ ↑BilinForm.toMatrix' B = ↑BilinForm.toMatrix' B'
⊢ BilinForm.compLeft (↑toBilin' J₃) (↑toLin' A) = BilinForm.compRight (↑toBilin' J) (↑toLin' A') ↔
    IsAdjointPair J J₃ A A'
[PROOFSTEP]
rw [h, BilinForm.toMatrix'_compLeft, BilinForm.toMatrix'_compRight, LinearMap.toMatrix'_toLin',
  LinearMap.toMatrix'_toLin', BilinForm.toMatrix'_toBilin', BilinForm.toMatrix'_toBilin']
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
h : ∀ (B B' : BilinForm R₃ (n → R₃)), B = B' ↔ ↑BilinForm.toMatrix' B = ↑BilinForm.toMatrix' B'
⊢ Aᵀ * J₃ = J * A' ↔ IsAdjointPair J J₃ A A'
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
⊢ BilinForm.IsAdjointPair (↑(toBilin b) J) (↑(toBilin b) J₃) (↑(toLin b b) A) (↑(toLin b b) A') ↔
    IsAdjointPair J J₃ A A'
[PROOFSTEP]
rw [BilinForm.isAdjointPair_iff_compLeft_eq_compRight]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
⊢ BilinForm.compLeft (↑(toBilin b) J₃) (↑(toLin b b) A) = BilinForm.compRight (↑(toBilin b) J) (↑(toLin b b) A') ↔
    IsAdjointPair J J₃ A A'
[PROOFSTEP]
have h : ∀ B B' : BilinForm R₃ M₃, B = B' ↔ BilinForm.toMatrix b B = BilinForm.toMatrix b B' :=
  by
  intro B B'
  constructor <;> intro h
  · rw [h]
  · exact (BilinForm.toMatrix b).injective h
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
⊢ ∀ (B B' : BilinForm R₃ M₃), B = B' ↔ ↑(BilinForm.toMatrix b) B = ↑(BilinForm.toMatrix b) B'
[PROOFSTEP]
intro B B'
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
B B' : BilinForm R₃ M₃
⊢ B = B' ↔ ↑(BilinForm.toMatrix b) B = ↑(BilinForm.toMatrix b) B'
[PROOFSTEP]
constructor
[GOAL]
case mp
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
B B' : BilinForm R₃ M₃
⊢ B = B' → ↑(BilinForm.toMatrix b) B = ↑(BilinForm.toMatrix b) B'
[PROOFSTEP]
intro h
[GOAL]
case mpr
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
B B' : BilinForm R₃ M₃
⊢ ↑(BilinForm.toMatrix b) B = ↑(BilinForm.toMatrix b) B' → B = B'
[PROOFSTEP]
intro h
[GOAL]
case mp
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
B B' : BilinForm R₃ M₃
h : B = B'
⊢ ↑(BilinForm.toMatrix b) B = ↑(BilinForm.toMatrix b) B'
[PROOFSTEP]
rw [h]
[GOAL]
case mpr
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
B B' : BilinForm R₃ M₃
h : ↑(BilinForm.toMatrix b) B = ↑(BilinForm.toMatrix b) B'
⊢ B = B'
[PROOFSTEP]
exact (BilinForm.toMatrix b).injective h
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
h : ∀ (B B' : BilinForm R₃ M₃), B = B' ↔ ↑(BilinForm.toMatrix b) B = ↑(BilinForm.toMatrix b) B'
⊢ BilinForm.compLeft (↑(toBilin b) J₃) (↑(toLin b b) A) = BilinForm.compRight (↑(toBilin b) J) (↑(toLin b b) A') ↔
    IsAdjointPair J J₃ A A'
[PROOFSTEP]
rw [h, BilinForm.toMatrix_compLeft, BilinForm.toMatrix_compRight, LinearMap.toMatrix_toLin, LinearMap.toMatrix_toLin,
  BilinForm.toMatrix_toBilin, BilinForm.toMatrix_toBilin]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
h : ∀ (B B' : BilinForm R₃ M₃), B = B' ↔ ↑(BilinForm.toMatrix b) B = ↑(BilinForm.toMatrix b) B'
⊢ Aᵀ * J₃ = J * A' ↔ IsAdjointPair J J₃ A A'
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
⊢ IsAdjointPair (Pᵀ * J * P) (Pᵀ * J * P) A A' ↔ IsAdjointPair J J (P * A * P⁻¹) (P * A' * P⁻¹)
[PROOFSTEP]
have h' : IsUnit P.det := P.isUnit_iff_isUnit_det.mp h
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
⊢ IsAdjointPair (Pᵀ * J * P) (Pᵀ * J * P) A A' ↔ IsAdjointPair J J (P * A * P⁻¹) (P * A' * P⁻¹)
[PROOFSTEP]
let u := P.nonsingInvUnit h'
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
⊢ IsAdjointPair (Pᵀ * J * P) (Pᵀ * J * P) A A' ↔ IsAdjointPair J J (P * A * P⁻¹) (P * A' * P⁻¹)
[PROOFSTEP]
have coe_u : (u : Matrix n n R₃) = P := rfl
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
⊢ IsAdjointPair (Pᵀ * J * P) (Pᵀ * J * P) A A' ↔ IsAdjointPair J J (P * A * P⁻¹) (P * A' * P⁻¹)
[PROOFSTEP]
have coe_u_inv : (↑u⁻¹ : Matrix n n R₃) = P⁻¹ := rfl
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
coe_u_inv : ↑u⁻¹ = P⁻¹
⊢ IsAdjointPair (Pᵀ * J * P) (Pᵀ * J * P) A A' ↔ IsAdjointPair J J (P * A * P⁻¹) (P * A' * P⁻¹)
[PROOFSTEP]
let v := Pᵀ.nonsingInvUnit (P.isUnit_det_transpose h')
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
coe_u_inv : ↑u⁻¹ = P⁻¹
v : (Matrix n n R₃)ˣ := nonsingInvUnit Pᵀ (_ : IsUnit (det Pᵀ))
⊢ IsAdjointPair (Pᵀ * J * P) (Pᵀ * J * P) A A' ↔ IsAdjointPair J J (P * A * P⁻¹) (P * A' * P⁻¹)
[PROOFSTEP]
have coe_v : (v : Matrix n n R₃) = Pᵀ := rfl
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
coe_u_inv : ↑u⁻¹ = P⁻¹
v : (Matrix n n R₃)ˣ := nonsingInvUnit Pᵀ (_ : IsUnit (det Pᵀ))
coe_v : ↑v = Pᵀ
⊢ IsAdjointPair (Pᵀ * J * P) (Pᵀ * J * P) A A' ↔ IsAdjointPair J J (P * A * P⁻¹) (P * A' * P⁻¹)
[PROOFSTEP]
have coe_v_inv : (↑v⁻¹ : Matrix n n R₃) = P⁻¹ᵀ := P.transpose_nonsing_inv.symm
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
coe_u_inv : ↑u⁻¹ = P⁻¹
v : (Matrix n n R₃)ˣ := nonsingInvUnit Pᵀ (_ : IsUnit (det Pᵀ))
coe_v : ↑v = Pᵀ
coe_v_inv : ↑v⁻¹ = P⁻¹ᵀ
⊢ IsAdjointPair (Pᵀ * J * P) (Pᵀ * J * P) A A' ↔ IsAdjointPair J J (P * A * P⁻¹) (P * A' * P⁻¹)
[PROOFSTEP]
set x := Aᵀ * Pᵀ * J with x_def
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
coe_u_inv : ↑u⁻¹ = P⁻¹
v : (Matrix n n R₃)ˣ := nonsingInvUnit Pᵀ (_ : IsUnit (det Pᵀ))
coe_v : ↑v = Pᵀ
coe_v_inv : ↑v⁻¹ = P⁻¹ᵀ
x : Matrix n n R₃ := Aᵀ * Pᵀ * J
x_def : x = Aᵀ * Pᵀ * J
⊢ IsAdjointPair (Pᵀ * J * P) (Pᵀ * J * P) A A' ↔ IsAdjointPair J J (P * A * P⁻¹) (P * A' * P⁻¹)
[PROOFSTEP]
set y := J * P * A' with y_def
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
coe_u_inv : ↑u⁻¹ = P⁻¹
v : (Matrix n n R₃)ˣ := nonsingInvUnit Pᵀ (_ : IsUnit (det Pᵀ))
coe_v : ↑v = Pᵀ
coe_v_inv : ↑v⁻¹ = P⁻¹ᵀ
x : Matrix n n R₃ := Aᵀ * Pᵀ * J
x_def : x = Aᵀ * Pᵀ * J
y : Matrix n n R₃ := J * P * A'
y_def : y = J * P * A'
⊢ IsAdjointPair (Pᵀ * J * P) (Pᵀ * J * P) A A' ↔ IsAdjointPair J J (P * A * P⁻¹) (P * A' * P⁻¹)
[PROOFSTEP]
simp only [Matrix.IsAdjointPair]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
coe_u_inv : ↑u⁻¹ = P⁻¹
v : (Matrix n n R₃)ˣ := nonsingInvUnit Pᵀ (_ : IsUnit (det Pᵀ))
coe_v : ↑v = Pᵀ
coe_v_inv : ↑v⁻¹ = P⁻¹ᵀ
x : Matrix n n R₃ := Aᵀ * Pᵀ * J
x_def : x = Aᵀ * Pᵀ * J
y : Matrix n n R₃ := J * P * A'
y_def : y = J * P * A'
⊢ Aᵀ * (Pᵀ * J * P) = Pᵀ * J * P * A' ↔ (P * A * P⁻¹)ᵀ * J = J * (P * A' * P⁻¹)
[PROOFSTEP]
calc
  (Aᵀ * (Pᵀ * J * P) = Pᵀ * J * P * A') ↔ (x * ↑u = ↑v * y) := ?_
  _ ↔ (↑v⁻¹ * x = y * ↑u⁻¹) := ?_
  _ ↔ ((P * A * P⁻¹)ᵀ * J = J * (P * A' * P⁻¹)) := ?_
[GOAL]
case calc_1
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
coe_u_inv : ↑u⁻¹ = P⁻¹
v : (Matrix n n R₃)ˣ := nonsingInvUnit Pᵀ (_ : IsUnit (det Pᵀ))
coe_v : ↑v = Pᵀ
coe_v_inv : ↑v⁻¹ = P⁻¹ᵀ
x : Matrix n n R₃ := Aᵀ * Pᵀ * J
x_def : x = Aᵀ * Pᵀ * J
y : Matrix n n R₃ := J * P * A'
y_def : y = J * P * A'
⊢ Aᵀ * (Pᵀ * J * P) = Pᵀ * J * P * A' ↔ x * ↑u = ↑v * y
[PROOFSTEP]
simp only [mul_assoc, x_def, y_def, coe_u, coe_v]
[GOAL]
case calc_2
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
coe_u_inv : ↑u⁻¹ = P⁻¹
v : (Matrix n n R₃)ˣ := nonsingInvUnit Pᵀ (_ : IsUnit (det Pᵀ))
coe_v : ↑v = Pᵀ
coe_v_inv : ↑v⁻¹ = P⁻¹ᵀ
x : Matrix n n R₃ := Aᵀ * Pᵀ * J
x_def : x = Aᵀ * Pᵀ * J
y : Matrix n n R₃ := J * P * A'
y_def : y = J * P * A'
⊢ x * ↑u = ↑v * y ↔ ↑v⁻¹ * x = y * ↑u⁻¹
[PROOFSTEP]
rw [Units.eq_mul_inv_iff_mul_eq, mul_assoc (↑v⁻¹) x, Units.inv_mul_eq_iff_eq_mul]
[GOAL]
case calc_3
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
coe_u_inv : ↑u⁻¹ = P⁻¹
v : (Matrix n n R₃)ˣ := nonsingInvUnit Pᵀ (_ : IsUnit (det Pᵀ))
coe_v : ↑v = Pᵀ
coe_v_inv : ↑v⁻¹ = P⁻¹ᵀ
x : Matrix n n R₃ := Aᵀ * Pᵀ * J
x_def : x = Aᵀ * Pᵀ * J
y : Matrix n n R₃ := J * P * A'
y_def : y = J * P * A'
⊢ ↑v⁻¹ * x = y * ↑u⁻¹ ↔ (P * A * P⁻¹)ᵀ * J = J * (P * A' * P⁻¹)
[PROOFSTEP]
rw [x_def, y_def, coe_u_inv, coe_v_inv]
[GOAL]
case calc_3
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
P : Matrix n n R₃
h : IsUnit P
h' : IsUnit (det P)
u : (Matrix n n R₃)ˣ := nonsingInvUnit P h'
coe_u : ↑u = P
coe_u_inv : ↑u⁻¹ = P⁻¹
v : (Matrix n n R₃)ˣ := nonsingInvUnit Pᵀ (_ : IsUnit (det Pᵀ))
coe_v : ↑v = Pᵀ
coe_v_inv : ↑v⁻¹ = P⁻¹ᵀ
x : Matrix n n R₃ := Aᵀ * Pᵀ * J
x_def : x = Aᵀ * Pᵀ * J
y : Matrix n n R₃ := J * P * A'
y_def : y = J * P * A'
⊢ P⁻¹ᵀ * (Aᵀ * Pᵀ * J) = J * P * A' * P⁻¹ ↔ (P * A * P⁻¹)ᵀ * J = J * (P * A' * P⁻¹)
[PROOFSTEP]
simp only [Matrix.mul_assoc, Matrix.transpose_mul]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
⊢ A ∈ pairSelfAdjointMatricesSubmodule J J₃ ↔ IsAdjointPair J J₃ A A
[PROOFSTEP]
simp only [mem_pairSelfAdjointMatricesSubmodule]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
⊢ A ∈ selfAdjointMatricesSubmodule J ↔ Matrix.IsSelfAdjoint J A
[PROOFSTEP]
simp only [mem_selfAdjointMatricesSubmodule]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁶ : Semiring R
inst✝¹⁵ : AddCommMonoid M
inst✝¹⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹³ : Ring R₁
inst✝¹² : AddCommGroup M₁
inst✝¹¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁰ : CommSemiring R₂
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝⁷ : CommRing R₃
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁴ : Field K
inst✝³ : AddCommGroup V
inst✝² : Module K V
B : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
n : Type u_11
inst✝¹ : Fintype n
b : Basis n R₃ M₃
J J₃ A A' : Matrix n n R₃
inst✝ : DecidableEq n
⊢ A ∈ skewAdjointMatricesSubmodule J ↔ IsSkewAdjoint J A
[PROOFSTEP]
simp only [mem_skewAdjointMatricesSubmodule]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁹ : Semiring R
inst✝¹⁸ : AddCommMonoid M✝
inst✝¹⁷ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁶ : Ring R₁
inst✝¹⁵ : AddCommGroup M₁
inst✝¹⁴ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹³ : CommSemiring R₂
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁰ : CommRing R₃
inst✝⁹ : AddCommGroup M₃
inst✝⁸ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup V
inst✝⁵ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
A : Type u_11
inst✝⁴ : CommRing A
inst✝³ : IsDomain A
inst✝² : Module A M₃
B₃ : BilinForm A M₃
ι : Type u_12
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
M : Matrix ι ι R₃
h : Matrix.Nondegenerate M
x : ι → R₃
hx : ∀ (n : ι → R₃), bilin (↑Matrix.toBilin' M) x n = 0
y : ι → R₃
⊢ x ⬝ᵥ mulVec M y = 0
[PROOFSTEP]
simpa only [toBilin'_apply'] using hx y
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁹ : Semiring R
inst✝¹⁸ : AddCommMonoid M✝
inst✝¹⁷ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁶ : Ring R₁
inst✝¹⁵ : AddCommGroup M₁
inst✝¹⁴ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹³ : CommSemiring R₂
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁰ : CommRing R₃
inst✝⁹ : AddCommGroup M₃
inst✝⁸ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup V
inst✝⁵ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
A : Type u_11
inst✝⁴ : CommRing A
inst✝³ : IsDomain A
inst✝² : Module A M₃
B₃ : BilinForm A M₃
ι : Type u_12
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
M : Matrix ι ι R₃
b : Basis ι R₃ M₃
⊢ Nondegenerate (↑(toBilin b) M) ↔ Matrix.Nondegenerate M
[PROOFSTEP]
rw [← Matrix.nondegenerate_toBilin'_iff_nondegenerate_toBilin, Matrix.nondegenerate_toBilin'_iff]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝¹⁹ : Semiring R
inst✝¹⁸ : AddCommMonoid M✝
inst✝¹⁷ : Module R M✝
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁶ : Ring R₁
inst✝¹⁵ : AddCommGroup M₁
inst✝¹⁴ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹³ : CommSemiring R₂
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁰ : CommRing R₃
inst✝⁹ : AddCommGroup M₃
inst✝⁸ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup V
inst✝⁵ : Module K V
B : BilinForm R M✝
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
A : Type u_11
inst✝⁴ : CommRing A
inst✝³ : IsDomain A
inst✝² : Module A M₃
B₃ : BilinForm A M₃
ι : Type u_12
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
M : Matrix ι ι A
⊢ Nondegenerate (↑toBilin' M) ↔ det M ≠ 0
[PROOFSTEP]
rw [Matrix.nondegenerate_toBilin'_iff, Matrix.nondegenerate_iff_det_ne_zero]
[GOAL]
R : Type u_1
M : Type u_2
inst✝¹⁹ : Semiring R
inst✝¹⁸ : AddCommMonoid M
inst✝¹⁷ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁶ : Ring R₁
inst✝¹⁵ : AddCommGroup M₁
inst✝¹⁴ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹³ : CommSemiring R₂
inst✝¹² : AddCommMonoid M₂
inst✝¹¹ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁰ : CommRing R₃
inst✝⁹ : AddCommGroup M₃
inst✝⁸ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁷ : Field K
inst✝⁶ : AddCommGroup V
inst✝⁵ : Module K V
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
A : Type u_11
inst✝⁴ : CommRing A
inst✝³ : IsDomain A
inst✝² : Module A M₃
B₃ : BilinForm A M₃
ι : Type u_12
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
B : BilinForm A M₃
b : Basis ι A M₃
⊢ Nondegenerate B ↔ det (↑(toMatrix b) B) ≠ 0
[PROOFSTEP]
rw [← Matrix.nondegenerate_iff_det_ne_zero, nondegenerate_toMatrix_iff]