ruc-ai4math/mathlib_handler_benchmark_410 huggingface dataset:
-- Matrix.TransvectionStruct.inv_mul
theorem inv_mul (t : TransvectionStruct n R) : t.inv.toMatrix * t.toMatrix = 1 
Arguments: {n : Type u_1} {R : Type u₂} [DecidableEq n] [CommRing R] [Fintype n] (t : Matrix.TransvectionStruct n R)
Goal: t.inv.toMatrix * t.toMatrix = 1
-- Matrix.TransvectionStruct.mul_inv
theorem mul_inv (t : TransvectionStruct n R) : t.toMatrix * t.inv.toMatrix = 1 
Arguments: {n : Type u_1} {R : Type u₂} [DecidableEq n] [CommRing R] [Fintype n] (t : Matrix.TransvectionStruct n R)
Goal: t.toMatrix * t.inv.toMatrix = 1
-- Matrix.TransvectionStruct.reverse_inv_prod_mul_prod
theorem reverse_inv_prod_mul_prod (L : List (TransvectionStruct n R)) :
    (L.reverse.map (toMatrix ∘ TransvectionStruct.inv)).prod * (L.map toMatrix).prod = 1 
Arguments: {n : Type u_1} {R : Type u₂} [DecidableEq n] [CommRing R] [Fintype n] (L : List (Matrix.TransvectionStruct n R))
Goal: (List.map (Matrix.TransvectionStruct.toMatrix ∘ Matrix.TransvectionStruct.inv) L.reverse).prod *
    (List.map Matrix.TransvectionStruct.toMatrix L).prod =
  1
-- Matrix.TransvectionStruct.prod_mul_reverse_inv_prod
theorem prod_mul_reverse_inv_prod (L : List (TransvectionStruct n R)) :
    (L.map toMatrix).prod * (L.reverse.map (toMatrix ∘ TransvectionStruct.inv)).prod = 1 
Arguments: {n : Type u_1} {R : Type u₂} [DecidableEq n] [CommRing R] [Fintype n] (L : List (Matrix.TransvectionStruct n R))
Goal: (List.map Matrix.TransvectionStruct.toMatrix L).prod *
    (List.map (Matrix.TransvectionStruct.toMatrix ∘ Matrix.TransvectionStruct.inv) L.reverse).prod =
  1
-- Matrix.mem_range_scalar_of_commute_transvectionStruct
theorem _root_.Matrix.mem_range_scalar_of_commute_transvectionStruct {M : Matrix n n R}
    (hM : ∀ t : TransvectionStruct n R, Commute t.toMatrix M) :
    M ∈ Set.range (Matrix.scalar n) 
Arguments: {n : Type u_1} {R : Type u₂} [DecidableEq n] [CommRing R] [Fintype n] {M : Matrix n n R} (hM : ∀ (t : Matrix.TransvectionStruct n R), Commute t.toMatrix M)
Goal: M ∈ Set.range ⇑(Matrix.scalar n)
-- Matrix.mem_range_scalar_iff_commute_transvectionStruct
theorem _root_.Matrix.mem_range_scalar_iff_commute_transvectionStruct {M : Matrix n n R} :
    M ∈ Set.range (Matrix.scalar n) ↔ ∀ t : TransvectionStruct n R, Commute t.toMatrix M 
Arguments: {n : Type u_1} {R : Type u₂} [DecidableEq n] [CommRing R] [Fintype n] {M : Matrix n n R}
Goal: M ∈ Set.range ⇑(Matrix.scalar n) ↔ ∀ (t : Matrix.TransvectionStruct n R), Commute t.toMatrix M
-- Matrix.TransvectionStruct.toMatrix_sumInl
theorem toMatrix_sumInl (t : TransvectionStruct n R) :
    (t.sumInl p).toMatrix = fromBlocks t.toMatrix 0 0 1 
Arguments: {n : Type u_1} (p : Type u_2) {R : Type u₂} [DecidableEq n] [DecidableEq p] [CommRing R] (t : Matrix.TransvectionStruct n R)
Goal: (Matrix.TransvectionStruct.sumInl p t).toMatrix = Matrix.fromBlocks t.toMatrix 0 0 1
-- Matrix.TransvectionStruct.sumInl_toMatrix_prod_mul
@[simp]
theorem sumInl_toMatrix_prod_mul [Fintype n] [Fintype p] (M : Matrix n n R)
    (L : List (TransvectionStruct n R)) (N : Matrix p p R) :
    (L.map (toMatrix ∘ sumInl p)).prod * fromBlocks M 0 0 N =
      fromBlocks ((L.map toMatrix).prod * M) 0 0 N 
Arguments: {n : Type u_1} (p : Type u_2) {R : Type u₂} [DecidableEq n] [DecidableEq p] [CommRing R] [Fintype n] [Fintype p] (M : Matrix n n R) (L : List (Matrix.TransvectionStruct n R)) (N : Matrix p p R)
Goal: (List.map (Matrix.TransvectionStruct.toMatrix ∘ Matrix.TransvectionStruct.sumInl p) L).prod *
    Matrix.fromBlocks M 0 0 N =
  Matrix.fromBlocks ((List.map Matrix.TransvectionStruct.toMatrix L).prod * M) 0 0 N
-- Matrix.TransvectionStruct.mul_sumInl_toMatrix_prod
@[simp]
theorem mul_sumInl_toMatrix_prod [Fintype n] [Fintype p] (M : Matrix n n R)
    (L : List (TransvectionStruct n R)) (N : Matrix p p R) :
    fromBlocks M 0 0 N * (L.map (toMatrix ∘ sumInl p)).prod =
      fromBlocks (M * (L.map toMatrix).prod) 0 0 N 
Arguments: {n : Type u_1} (p : Type u_2) {R : Type u₂} [DecidableEq n] [DecidableEq p] [CommRing R] [Fintype n] [Fintype p] (M : Matrix n n R) (L : List (Matrix.TransvectionStruct n R)) (N : Matrix p p R)
Goal: Matrix.fromBlocks M 0 0 N *
    (List.map (Matrix.TransvectionStruct.toMatrix ∘ Matrix.TransvectionStruct.sumInl p) L).prod =
  Matrix.fromBlocks (M * (List.map Matrix.TransvectionStruct.toMatrix L).prod) 0 0 N
-- Matrix.TransvectionStruct.toMatrix_reindexEquiv
theorem toMatrix_reindexEquiv (e : n ≃ p) (t : TransvectionStruct n R) :
    (t.reindexEquiv e).toMatrix = reindexAlgEquiv R _ e t.toMatrix 
Arguments: {n : Type u_1} {p : Type u_2} {R : Type u₂} [DecidableEq n] [DecidableEq p] [CommRing R] [Fintype n] [Fintype p] (e : n ≃ p) (t : Matrix.TransvectionStruct n R)
Goal: (Matrix.TransvectionStruct.reindexEquiv e t).toMatrix = (Matrix.reindexAlgEquiv R R e) t.toMatrix
-- Matrix.TransvectionStruct.toMatrix_reindexEquiv_prod
theorem toMatrix_reindexEquiv_prod (e : n ≃ p) (L : List (TransvectionStruct n R)) :
    (L.map (toMatrix ∘ reindexEquiv e)).prod = reindexAlgEquiv R _ e (L.map toMatrix).prod 
Arguments: {n : Type u_1} {p : Type u_2} {R : Type u₂} [DecidableEq n] [DecidableEq p] [CommRing R] [Fintype n] [Fintype p] (e : n ≃ p) (L : List (Matrix.TransvectionStruct n R))
Goal: (List.map (Matrix.TransvectionStruct.toMatrix ∘ Matrix.TransvectionStruct.reindexEquiv e) L).prod =
  (Matrix.reindexAlgEquiv R R e) (List.map Matrix.TransvectionStruct.toMatrix L).prod
-- Matrix.Pivot.length_listTransvecCol
@[simp]
theorem length_listTransvecCol : (listTransvecCol M).length = r 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜)
Goal: (Matrix.Pivot.listTransvecCol M).length = r
-- Matrix.Pivot.listTransvecCol_get
theorem listTransvecCol_get (i : Fin (listTransvecCol M).length) :
    (listTransvecCol M).get i =
      letI i' := Fin.cast (length_listTransvecCol M) i
      transvection (inl i') (inr unit) <| -M (inl i') (inr unit) / M (inr unit) (inr unit) 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (i : Fin (Matrix.Pivot.listTransvecCol M).length)
Goal: (Matrix.Pivot.listTransvecCol M).get i =
  Matrix.transvection (Sum.inl (Fin.cast ⋯ i)) (Sum.inr ())
    (-M (Sum.inl (Fin.cast ⋯ i)) (Sum.inr ()) / M (Sum.inr ()) (Sum.inr ()))
-- Matrix.Pivot.length_listTransvecRow
@[simp]
theorem length_listTransvecRow : (listTransvecRow M).length = r 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜)
Goal: (Matrix.Pivot.listTransvecRow M).length = r
-- Matrix.Pivot.listTransvecRow_get
theorem listTransvecRow_get (i : Fin (listTransvecRow M).length) :
    (listTransvecRow M).get i =
      letI i' := Fin.cast (length_listTransvecRow M) i
      transvection (inr unit) (inl i') <| -M (inr unit) (inl i') / M (inr unit) (inr unit) 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (i : Fin (Matrix.Pivot.listTransvecRow M).length)
Goal: (Matrix.Pivot.listTransvecRow M).get i =
  Matrix.transvection (Sum.inr ()) (Sum.inl (Fin.cast ⋯ i))
    (-M (Sum.inr ()) (Sum.inl (Fin.cast ⋯ i)) / M (Sum.inr ()) (Sum.inr ()))
-- Matrix.Pivot.listTransvecCol_mul_last_row_drop
theorem listTransvecCol_mul_last_row_drop (i : Fin r ⊕ Unit) {k : ℕ} (hk : k ≤ r) :
    (((listTransvecCol M).drop k).prod * M) (inr unit) i = M (inr unit) i 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (i : Fin r ⊕ Unit) {k : ℕ} (hk : k ≤ r)
Goal: ((List.drop k (Matrix.Pivot.listTransvecCol M)).prod * M) (Sum.inr ()) i = M (Sum.inr ()) i
-- Matrix.Pivot.listTransvecCol_mul_last_row
theorem listTransvecCol_mul_last_row (i : Fin r ⊕ Unit) :
    ((listTransvecCol M).prod * M) (inr unit) i = M (inr unit) i 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (i : Fin r ⊕ Unit)
Goal: ((Matrix.Pivot.listTransvecCol M).prod * M) (Sum.inr ()) i = M (Sum.inr ()) i
-- Matrix.Pivot.listTransvecCol_mul_last_col
theorem listTransvecCol_mul_last_col (hM : M (inr unit) (inr unit) ≠ 0) (i : Fin r) :
    ((listTransvecCol M).prod * M) (inl i) (inr unit) = 0 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (hM : M (Sum.inr ()) (Sum.inr ()) ≠ 0) (i : Fin r)
Goal: ((Matrix.Pivot.listTransvecCol M).prod * M) (Sum.inl i) (Sum.inr ()) = 0
-- Matrix.Pivot.mul_listTransvecRow_last_col_take
theorem mul_listTransvecRow_last_col_take (i : Fin r ⊕ Unit) {k : ℕ} (hk : k ≤ r) :
    (M * ((listTransvecRow M).take k).prod) i (inr unit) = M i (inr unit) 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (i : Fin r ⊕ Unit) {k : ℕ} (hk : k ≤ r)
Goal: (M * (List.take k (Matrix.Pivot.listTransvecRow M)).prod) i (Sum.inr ()) = M i (Sum.inr ())
-- Matrix.Pivot.mul_listTransvecRow_last_col
theorem mul_listTransvecRow_last_col (i : Fin r ⊕ Unit) :
    (M * (listTransvecRow M).prod) i (inr unit) = M i (inr unit) 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (i : Fin r ⊕ Unit)
Goal: (M * (Matrix.Pivot.listTransvecRow M).prod) i (Sum.inr ()) = M i (Sum.inr ())
-- Matrix.Pivot.mul_listTransvecRow_last_row
theorem mul_listTransvecRow_last_row (hM : M (inr unit) (inr unit) ≠ 0) (i : Fin r) :
    (M * (listTransvecRow M).prod) (inr unit) (inl i) = 0 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (hM : M (Sum.inr ()) (Sum.inr ()) ≠ 0) (i : Fin r)
Goal: (M * (Matrix.Pivot.listTransvecRow M).prod) (Sum.inr ()) (Sum.inl i) = 0
-- Matrix.Pivot.listTransvecCol_mul_mul_listTransvecRow_last_col
theorem listTransvecCol_mul_mul_listTransvecRow_last_col (hM : M (inr unit) (inr unit) ≠ 0)
    (i : Fin r) :
    ((listTransvecCol M).prod * M * (listTransvecRow M).prod) (inr unit) (inl i) = 0 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (hM : M (Sum.inr ()) (Sum.inr ()) ≠ 0) (i : Fin r)
Goal: ((Matrix.Pivot.listTransvecCol M).prod * M * (Matrix.Pivot.listTransvecRow M).prod) (Sum.inr ()) (Sum.inl i) = 0
-- Matrix.Pivot.listTransvecCol_mul_mul_listTransvecRow_last_row
theorem listTransvecCol_mul_mul_listTransvecRow_last_row (hM : M (inr unit) (inr unit) ≠ 0)
    (i : Fin r) :
    ((listTransvecCol M).prod * M * (listTransvecRow M).prod) (inl i) (inr unit) = 0 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (hM : M (Sum.inr ()) (Sum.inr ()) ≠ 0) (i : Fin r)
Goal: ((Matrix.Pivot.listTransvecCol M).prod * M * (Matrix.Pivot.listTransvecRow M).prod) (Sum.inl i) (Sum.inr ()) = 0
-- Matrix.Pivot.isTwoBlockDiagonal_listTransvecCol_mul_mul_listTransvecRow
theorem isTwoBlockDiagonal_listTransvecCol_mul_mul_listTransvecRow
    (hM : M (inr unit) (inr unit) ≠ 0) :
    IsTwoBlockDiagonal ((listTransvecCol M).prod * M * (listTransvecRow M).prod) 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (hM : M (Sum.inr ()) (Sum.inr ()) ≠ 0)
Goal: ((Matrix.Pivot.listTransvecCol M).prod * M * (Matrix.Pivot.listTransvecRow M).prod).IsTwoBlockDiagonal
-- Matrix.Pivot.exists_isTwoBlockDiagonal_of_ne_zero
theorem exists_isTwoBlockDiagonal_of_ne_zero (hM : M (inr unit) (inr unit) ≠ 0) :
    ∃ L L' : List (TransvectionStruct (Fin r ⊕ Unit) 𝕜),
      IsTwoBlockDiagonal ((L.map toMatrix).prod * M * (L'.map toMatrix).prod) 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) (hM : M (Sum.inr ()) (Sum.inr ()) ≠ 0)
Goal: ∃ L L',
  ((List.map Matrix.TransvectionStruct.toMatrix L).prod * M *
      (List.map Matrix.TransvectionStruct.toMatrix L').prod).IsTwoBlockDiagonal
-- Matrix.Pivot.exists_isTwoBlockDiagonal_list_transvec_mul_mul_list_transvec
theorem exists_isTwoBlockDiagonal_list_transvec_mul_mul_list_transvec
    (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) :
    ∃ L L' : List (TransvectionStruct (Fin r ⊕ Unit) 𝕜),
      IsTwoBlockDiagonal ((L.map toMatrix).prod * M * (L'.map toMatrix).prod) 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜)
Goal: ∃ L L',
  ((List.map Matrix.TransvectionStruct.toMatrix L).prod * M *
      (List.map Matrix.TransvectionStruct.toMatrix L').prod).IsTwoBlockDiagonal
-- Matrix.Pivot.exists_list_transvec_mul_mul_list_transvec_eq_diagonal_induction
theorem exists_list_transvec_mul_mul_list_transvec_eq_diagonal_induction
    (IH :
      ∀ M : Matrix (Fin r) (Fin r) 𝕜,
        ∃ (L₀ L₀' : List (TransvectionStruct (Fin r) 𝕜)) (D₀ : Fin r → 𝕜),
          (L₀.map toMatrix).prod * M * (L₀'.map toMatrix).prod = diagonal D₀)
    (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜) :
    ∃ (L L' : List (TransvectionStruct (Fin r ⊕ Unit) 𝕜)) (D : Fin r ⊕ Unit → 𝕜),
      (L.map toMatrix).prod * M * (L'.map toMatrix).prod = diagonal D 
Arguments: {𝕜 : Type u_3} [Field 𝕜] {r : ℕ} (IH :
  ∀ (M : Matrix (Fin r) (Fin r) 𝕜),
    ∃ L₀ L₀' D₀,
      (List.map Matrix.TransvectionStruct.toMatrix L₀).prod * M *
          (List.map Matrix.TransvectionStruct.toMatrix L₀').prod =
        Matrix.diagonal D₀) (M : Matrix (Fin r ⊕ Unit) (Fin r ⊕ Unit) 𝕜)
Goal: ∃ L L' D,
  (List.map Matrix.TransvectionStruct.toMatrix L).prod * M * (List.map Matrix.TransvectionStruct.toMatrix L').prod =
    Matrix.diagonal D
-- Matrix.Pivot.reindex_exists_list_transvec_mul_mul_list_transvec_eq_diagonal
theorem reindex_exists_list_transvec_mul_mul_list_transvec_eq_diagonal (M : Matrix p p 𝕜)
    (e : p ≃ n)
    (H :
      ∃ (L L' : List (TransvectionStruct n 𝕜)) (D : n → 𝕜),
        (L.map toMatrix).prod * Matrix.reindexAlgEquiv 𝕜 _ e M * (L'.map toMatrix).prod =
          diagonal D) :
    ∃ (L L' : List (TransvectionStruct p 𝕜)) (D : p → 𝕜),
      (L.map toMatrix).prod * M * (L'.map toMatrix).prod = diagonal D 
Arguments: {n : Type u_1} {p : Type u_2} {𝕜 : Type u_3} [Field 𝕜] [DecidableEq n] [DecidableEq p] [Fintype n] [Fintype p] (M : Matrix p p 𝕜) (e : p ≃ n) (H :
  ∃ L L' D,
    (List.map Matrix.TransvectionStruct.toMatrix L).prod * (Matrix.reindexAlgEquiv 𝕜 𝕜 e) M *
        (List.map Matrix.TransvectionStruct.toMatrix L').prod =
      Matrix.diagonal D)
Goal: ∃ L L' D,
  (List.map Matrix.TransvectionStruct.toMatrix L).prod * M * (List.map Matrix.TransvectionStruct.toMatrix L').prod =
    Matrix.diagonal D
-- Matrix.Pivot.exists_list_transvec_mul_mul_list_transvec_eq_diagonal_aux
theorem exists_list_transvec_mul_mul_list_transvec_eq_diagonal_aux (n : Type) [Fintype n]
    [DecidableEq n] (M : Matrix n n 𝕜) :
    ∃ (L L' : List (TransvectionStruct n 𝕜)) (D : n → 𝕜),
      (L.map toMatrix).prod * M * (L'.map toMatrix).prod = diagonal D 
Arguments: {𝕜 : Type u_3} [Field 𝕜] (n : Type) [Fintype n] [DecidableEq n] (M : Matrix n n 𝕜)
Goal: ∃ L L' D,
  (List.map Matrix.TransvectionStruct.toMatrix L).prod * M * (List.map Matrix.TransvectionStruct.toMatrix L').prod =
    Matrix.diagonal D
-- Matrix.Pivot.exists_list_transvec_mul_mul_list_transvec_eq_diagonal
theorem exists_list_transvec_mul_mul_list_transvec_eq_diagonal (M : Matrix n n 𝕜) :
    ∃ (L L' : List (TransvectionStruct n 𝕜)) (D : n → 𝕜),
      (L.map toMatrix).prod * M * (L'.map toMatrix).prod = diagonal D 
Arguments: {n : Type u_1} {𝕜 : Type u_3} [Field 𝕜] [DecidableEq n] [Fintype n] (M : Matrix n n 𝕜)
Goal: ∃ L L' D,
  (List.map Matrix.TransvectionStruct.toMatrix L).prod * M * (List.map Matrix.TransvectionStruct.toMatrix L').prod =
    Matrix.diagonal D
-- Matrix.Pivot.exists_list_transvec_mul_diagonal_mul_list_transvec
theorem exists_list_transvec_mul_diagonal_mul_list_transvec (M : Matrix n n 𝕜) :
    ∃ (L L' : List (TransvectionStruct n 𝕜)) (D : n → 𝕜),
      M = (L.map toMatrix).prod * diagonal D * (L'.map toMatrix).prod 
Arguments: {n : Type u_1} {𝕜 : Type u_3} [Field 𝕜] [DecidableEq n] [Fintype n] (M : Matrix n n 𝕜)
Goal: ∃ L L' D,
  M =
    (List.map Matrix.TransvectionStruct.toMatrix L).prod * Matrix.diagonal D *
      (List.map Matrix.TransvectionStruct.toMatrix L').prod
-- Matrix.diagonal_transvection_induction
theorem diagonal_transvection_induction (P : Matrix n n 𝕜 → Prop) (M : Matrix n n 𝕜)
    (hdiag : ∀ D : n → 𝕜, det (diagonal D) = det M → P (diagonal D))
    (htransvec : ∀ t : TransvectionStruct n 𝕜, P t.toMatrix) (hmul : ∀ A B, P A → P B → P (A * B)) :
    P M 
Arguments: {n : Type u_1} {𝕜 : Type u_3} [Field 𝕜] [DecidableEq n] [Fintype n] (P : Matrix n n 𝕜 → Prop) (M : Matrix n n 𝕜) (hdiag : ∀ (D : n → 𝕜), (Matrix.diagonal D).det = M.det → P (Matrix.diagonal D)) (htransvec : ∀ (t : Matrix.TransvectionStruct n 𝕜), P t.toMatrix) (hmul : ∀ (A B : Matrix n n 𝕜), P A → P B → P (A * B))
Goal: P M
-- Matrix.diagonal_transvection_induction_of_det_ne_zero
theorem diagonal_transvection_induction_of_det_ne_zero (P : Matrix n n 𝕜 → Prop) (M : Matrix n n 𝕜)
    (hMdet : det M ≠ 0) (hdiag : ∀ D : n → 𝕜, det (diagonal D) ≠ 0 → P (diagonal D))
    (htransvec : ∀ t : TransvectionStruct n 𝕜, P t.toMatrix)
    (hmul : ∀ A B, det A ≠ 0 → det B ≠ 0 → P A → P B → P (A * B)) : P M 
Arguments: {n : Type u_1} {𝕜 : Type u_3} [Field 𝕜] [DecidableEq n] [Fintype n] (P : Matrix n n 𝕜 → Prop) (M : Matrix n n 𝕜) (hMdet : M.det ≠ 0) (hdiag : ∀ (D : n → 𝕜), (Matrix.diagonal D).det ≠ 0 → P (Matrix.diagonal D)) (htransvec : ∀ (t : Matrix.TransvectionStruct n 𝕜), P t.toMatrix) (hmul : ∀ (A B : Matrix n n 𝕜), A.det ≠ 0 → B.det ≠ 0 → P A → P B → P (A * B))
Goal: P M
-- PerfectPairing.bijectiveLeft
structure PerfectPairing :=
  toLin : M →ₗ[R] N →ₗ[R] R
  bijectiveLeft : Bijective toLin
  bijectiveRight : Bijective toLin.flip
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (self : PerfectPairing R M N)
Goal: Function.Bijective ⇑self.toLin
-- PerfectPairing.bijectiveRight
structure PerfectPairing :=
  toLin : M →ₗ[R] N →ₗ[R] R
  bijectiveLeft : Bijective toLin
  bijectiveRight : Bijective toLin.flip
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (self : PerfectPairing R M N)
Goal: Function.Bijective ⇑self.toLin.flip
-- PerfectPairing.flip_flip
@[simp] lemma flip_flip : p.flip.flip = p 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (p : PerfectPairing R M N)
Goal: p.flip.flip = p
-- PerfectPairing.toDualLeft_apply
@[simp]
theorem toDualLeft_apply (a : M) : p.toDualLeft a = p a 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (p : PerfectPairing R M N) (a : M)
Goal: p.toDualLeft a = p a
-- PerfectPairing.apply_toDualLeft_symm_apply
@[simp]
theorem apply_toDualLeft_symm_apply (f : Dual R N) (x : N) : p (p.toDualLeft.symm f) x = f x 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (p : PerfectPairing R M N) (f : Module.Dual R N) (x : N)
Goal: (p (p.toDualLeft.symm f)) x = f x
-- PerfectPairing.toDualRight_apply
@[simp]
theorem toDualRight_apply (a : N) : p.toDualRight a = p.flip a 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (p : PerfectPairing R M N) (a : N)
Goal: p.toDualRight a = p.flip a
-- PerfectPairing.apply_apply_toDualRight_symm
@[simp]
theorem apply_apply_toDualRight_symm (x : M) (f : Dual R M) :
    (p x) (p.toDualRight.symm f) = f x 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (p : PerfectPairing R M N) (x : M) (f : Module.Dual R M)
Goal: (p x) (p.toDualRight.symm f) = f x
-- PerfectPairing.toDualLeft_of_toDualRight_symm
theorem toDualLeft_of_toDualRight_symm (x : M) (f : Dual R M) :
    (p.toDualLeft x) (p.toDualRight.symm f) = f x 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (p : PerfectPairing R M N) (x : M) (f : Module.Dual R M)
Goal: (p.toDualLeft x) (p.toDualRight.symm f) = f x
-- PerfectPairing.toDualRight_symm_toDualLeft
theorem toDualRight_symm_toDualLeft (x : M) :
    p.toDualRight.symm.dualMap (p.toDualLeft x) = Dual.eval R M x 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (p : PerfectPairing R M N) (x : M)
Goal: p.toDualRight.symm.dualMap (p.toDualLeft x) = (Module.Dual.eval R M) x
-- PerfectPairing.toDualRight_symm_comp_toDualLeft
theorem toDualRight_symm_comp_toDualLeft :
    p.toDualRight.symm.dualMap ∘ₗ (p.toDualLeft : M →ₗ[R] Dual R N) = Dual.eval R M 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (p : PerfectPairing R M N)
Goal: ↑p.toDualRight.symm.dualMap ∘ₗ ↑p.toDualLeft = Module.Dual.eval R M
-- PerfectPairing.bijective_toDualRight_symm_toDualLeft
theorem bijective_toDualRight_symm_toDualLeft :
    Bijective (fun x => p.toDualRight.symm.dualMap (p.toDualLeft x)) 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (p : PerfectPairing R M N)
Goal: Function.Bijective fun x => p.toDualRight.symm.dualMap (p.toDualLeft x)
-- PerfectPairing.reflexive_left
theorem reflexive_left : IsReflexive R M 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (p : PerfectPairing R M N)
Goal: Module.IsReflexive R M
-- PerfectPairing.reflexive_right
theorem reflexive_right : IsReflexive R N 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] (p : PerfectPairing R M N)
Goal: Module.IsReflexive R N
-- IsReflexive.toPerfectPairingDual_toLin
@[simps]
def IsReflexive.toPerfectPairingDual : PerfectPairing R (Dual R M) M 
Arguments: {R : Type u_1} {M : Type u_2} [CommRing R] [AddCommGroup M] [Module R M] [Module.IsReflexive R M]
Goal: IsReflexive.toPerfectPairingDual.toLin = LinearMap.id
-- LinearEquiv.coe_toLinearMap_flip
@[simp] lemma coe_toLinearMap_flip : e.flip = (↑e : N →ₗ[R] Dual R M).flip 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] [Module.IsReflexive R M] (e : N ≃ₗ[R] Module.Dual R M)
Goal: ↑e.flip = (↑e).flip
-- LinearEquiv.flip_apply
@[simp] lemma flip_apply (m : M) (n : N) : e.flip m n = e n m 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] [Module.IsReflexive R M] (e : N ≃ₗ[R] Module.Dual R M) (m : M) (n : N)
Goal: (e.flip m) n = (e n) m
-- LinearEquiv.symm_flip
lemma symm_flip : e.flip.symm = e.symm.dualMap.trans (evalEquiv R M).symm 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] [Module.IsReflexive R M] (e : N ≃ₗ[R] Module.Dual R M)
Goal: e.flip.symm = e.symm.dualMap ≪≫ₗ (Module.evalEquiv R M).symm
-- LinearEquiv.trans_dualMap_symm_flip
lemma trans_dualMap_symm_flip : e.trans e.flip.symm.dualMap = Dual.eval R N 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] [Module.IsReflexive R M] (e : N ≃ₗ[R] Module.Dual R M)
Goal: ↑(e ≪≫ₗ e.flip.symm.dualMap) = Module.Dual.eval R N
-- LinearEquiv.isReflexive_of_equiv_dual_of_isReflexive
lemma isReflexive_of_equiv_dual_of_isReflexive : IsReflexive R N 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] [Module.IsReflexive R M] (e : N ≃ₗ[R] Module.Dual R M)
Goal: Module.IsReflexive R N
-- LinearEquiv.flip_flip
@[simp] lemma flip_flip (h : IsReflexive R N := isReflexive_of_equiv_dual_of_isReflexive e) :
    e.flip.flip = e 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] [Module.IsReflexive R M] (e : N ≃ₗ[R] Module.Dual R M) (h : Module.IsReflexive R N := ⋯)
Goal: e.flip.flip = e
-- LinearEquiv.toPerfectPairing_toLin
@[simps]
noncomputable def toPerfectPairing : PerfectPairing R N M 
Arguments: {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N] [Module.IsReflexive R M] (e : N ≃ₗ[R] Module.Dual R M)
Goal: e.toPerfectPairing.toLin = ↑e