Zulip Chat Archive

Stream: Is there code for X?

Topic: more linear algebra


Alex Kontorovich (Aug 09 2022 at 14:15):

What's the easiest way to prove a bunch of vectors are linearly independent? Say I have an n-dimensional vector space E with a bilinear form Q, and a collection of n vectors vs so that the gram matrix G=vs Q vs of Q-inner products is invertible. (As a human, this means the matrix of vs is invertible too, and hence linearly independent, in fact a basis. Actually, showing that they span will be my next annoying question...) Any help would be much appreciated! Thanks!

import analysis.inner_product_space.basic
import data.real.basic

example (E : Type*) {n : } [inner_product_space  E] [finite_dimensional  E]
  [fact (finite_dimensional.finrank  E = n)] [fact (n  0)] (vs : fin n  E) (Q : E →ₗ[] E →ₗ[]  )
  (G : matrix (fin n) (fin n) ) (hG : invertible G) (h :  i j, Q (vs i) (vs j) = G i j) :
  linear_independent  vs
:= begin
  sorry,
end

Eric Wieser (Aug 09 2022 at 14:21):

I suspect docs#matrix.to_linear_equiv' will be useful here

Junyan Xu (Aug 09 2022 at 18:11):

Here's a proof; the simple lemma matrix.range_to_lin' is apparently missing from mathlib.

import analysis.inner_product_space.basic
import data.real.basic
import data.matrix.rank

lemma matrix.range_to_lin' {R} [comm_semiring R] {m n} [fintype n] [decidable_eq n]
  (G : matrix m n R) : G.to_lin'.range = submodule.span R (set.range G.transpose) :=
begin
  rw [linear_map.range_eq_map,  linear_map.supr_range_std_basis],
  simp_rw [submodule.map_supr, linear_map.range_eq_map,  ideal.span_one, ideal.span,
    submodule.map_span, set.image_image],
  dsimp only [set.has_one, has_one.one],
  simp_rw set.image_singleton,
  apply le_antisymm,
  { refine supr_le (λ i, submodule.span_mono _),
    rintro _ _, rfl⟩,
    exact i, (G.mul_vec_std_basis_apply i).symm },
  { rw submodule.span_le,
    rintro _ i, rfl⟩,
    apply submodule.mem_supr_of_mem i,
    exact submodule.subset_span (G.mul_vec_std_basis_apply i).symm },
end

example (E : Type*) {n : } [inner_product_space  E] [finite_dimensional  E]
  (hr : finite_dimensional.finrank  E = n) (vs : fin n  E) (Q : E →ₗ[] E →ₗ[] )
  (G : matrix (fin n) (fin n) ) (hG : invertible G) (h :  i j, Q (vs i) (vs j) = G i j) :
  linear_independent  vs :=
begin
  apply linear_independent.of_comp Q.flip,
  rw linear_independent_iff_card_eq_finrank_span,
  apply le_antisymm,
  { rw  G.rank_of_is_unit (is_unit_of_invertible G),
    unfold set.finrank matrix.rank,
    rw G.range_to_lin',
    let f : (E →ₗ[] ) →ₗ[] fin n   := linear_map.pi (λ i, linear_map.applyₗ $ vs i),
    rw (by { ext j i, exact (h i j).symm } : G.transpose = f  (Q.flip  vs)),
    rw [set.range_comp,  submodule.map_span],
    apply finite_dimensional.finrank_map_le },
  { apply (finrank_span_le_card _).trans,
    { classical, rw set.to_finset_range, exact finset.card_image_le },
    { apply set.fintype_range } },
end

Junyan Xu (Aug 09 2022 at 18:14):

To show it spans, it should be easy from linear independence + docs#span_eq_top_of_linear_independent_of_card_eq_finrank.

Alex Kontorovich (Aug 10 2022 at 14:34):

That's fantastic, thanks!


Last updated: Dec 20 2023 at 11:08 UTC