Zulip Chat Archive

Stream: Is there code for X?

Topic: Proper subspace contained in maximal subspace?


Kevin Buzzard (Mar 02 2024 at 14:53):

import Mathlib

-- let k be a field
variable {k : Type*} [Field k]
-- let V be a fdvs over k
variable {V : Type*} [AddCommGroup V] [Module k V] [FiniteDimensional k V]
-- let W be a proper subspace of V
variable (W : Submodule k V) (hW : W  )


-- Then W is contained in a hyperplane
-- I don't care how to say this, I could work with anything
open Submodule in
example :  (X : Submodule k V) (z : V),
    W  X  z  0  Disjoint W (span k {z})  W  span k {z} =  := sorry

open FiniteDimensional in
example :  X : Submodule k V, W  X  finrank k X + 1 = finrank k V := sorry

-- attempt to apply some fancy Zorn thing
#synth IsCoatomic (Submodule k V) -- fails :-(

Antoine Chambert-Loir (Mar 02 2024 at 15:40):

what if you add that V is nontrivial ?

Antoine Chambert-Loir (Mar 02 2024 at 15:56):

import Mathlib

-- let k be a field
variable {k : Type*} [Field k]
-- let V be a vector space over k
variable {V : Type*} [AddCommGroup V] [Module k V]

example : IsCoatomic (Submodule k V) :=
  isCoatomic_of_isAtomic_of_complementedLattice_of_isModular

Antoine Chambert-Loir (Mar 02 2024 at 15:57):

The proof does not use finite dimensionality, but the semisimplicity of vector spaces !!

Kevin Buzzard (Mar 02 2024 at 16:02):

Aah of course -- I had "added the nontriviality" with the existence of W but of course typeclass inference can't see this. Thanks!

Antoine Chambert-Loir (Mar 02 2024 at 16:07):

Over a ring, you need the hypothesis that the module is noetherian.

import Mathlib

variable {k : Type*} [Semiring k]
variable {M : Type*} [AddCommMonoid M] [Module k M]
variable [Nontrivial M]

example (hM : IsNoetherian k M): IsCoatomic (Submodule k M) := by
  rw [isNoetherian_iff_wellFounded] at hM
  exact isCoatomic_of_orderTop_gt_wellFounded hM

Kevin Buzzard (Mar 04 2024 at 16:52):

I've come back to this and realised that I can't find any results linking coatoms in finite-dimensional vector spaces to codimension 1 subspaces. I've come up with the following horrible proof that an n+1-dimensional space contains an n-dimensional subspace. How should I have done this?

import Mathlib

variable {k : Type*} [Field k]
variable {V : Type*} [AddCommGroup V] [Module k V] [FiniteDimensional k V]

open FiniteDimensional

lemma foo (n : ) (hV : finrank k V = n + 1) :  W : Submodule k V, finrank k W = n := by
  let B := IsNoetherian.finsetBasis k V
  have h := FiniteDimensional.finrank_eq_card_basis B
  let C : Basis (Finset.range (n + 1)) k V := Basis.reindex B <| Fintype.equivOfCardEq ?_
  · let g : Fin n  {x // x  Finset.range (n + 1)} := fun i => i.1, by
      have := i.2
      rw [Finset.mem_range]
      omega
    use Submodule.span k (Set.range (C  g))
    suffices finrank k (Submodule.span k (Set.range (C  g))) = Fintype.card (Fin n) by
      convert this
      exact (Fintype.card_fin n).symm
    apply finrank_span_eq_card _
    apply LinearIndependent.comp
    · exact Basis.linearIndependent C
    · intro x1, hx1 x2, hx2 h
      simp_all
  · rw [ h,  hV]
    simp

Antoine Chambert-Loir (Mar 04 2024 at 16:56):

I used noetherian, but finitely generated was all that was needed. Now, if you have a maximal submodule, you have to use that the quotient is a simple module and know about them. In particular any nonzero element is a generator. For vector spaces, that means dim 1.

Kevin Buzzard (Mar 04 2024 at 18:01):

Yes I'm sure that's a more elegant way to do it. @Lucas Whitfield instead of that horrible proof we just constructed, you might want to prove that the quotient by a coatom is simple and go that way.

Junyan Xu (Mar 04 2024 at 18:08):

I can't find any results linking coatoms in finite-dimensional vector spaces to codimension 1 subspaces

We have docs#isSimpleModule_iff_isCoatom and we should make docs#is_simple_module_of_finrank_eq_one an iff (edit: when K = A)

Kevin Buzzard (Mar 04 2024 at 19:13):

Oh nice! Yeah this approach is much more elegant:

import Mathlib

variable {k : Type*} [Field k]
variable {V : Type*} [AddCommGroup V] [Module k V] [FiniteDimensional k V]

open FiniteDimensional

instance : IsCoatomic (Submodule k V) :=
  isCoatomic_of_isAtomic_of_complementedLattice_of_isModular

lemma finrank_eq_one_of_isSimpleModule [IsSimpleModule k V] : finrank k V = 1 := by
  have : Nontrivial V := IsSimpleModule.nontrivial k V
  obtain v, hv := exists_ne (0 : V)
  rw [finrank_eq_one_iff_of_nonzero v hv]
  obtain (h | h) := eq_bot_or_eq_top <| Submodule.span k {v}
  · simp_all [Submodule.span_singleton_eq_bot]
  · assumption

lemma baz (n : ) (hV : finrank k V = n + 1) (X : Submodule k V) (hX : X  ) :
     W : Submodule k V, X  W  finrank k W = n := by
  obtain (h1 | W, hW1, hW2⟩) := eq_top_or_exists_le_coatom X; contradiction
  use W, hW2
  rw [ isSimpleModule_iff_isCoatom] at hW1
  apply finrank_eq_one_of_isSimpleModule at hW1
  have := W.finrank_quotient_add_finrank
  omega

Junyan Xu (Mar 05 2024 at 00:37):

I've added

theorem isSimpleModule_iff_finrank_eq_one {R} [DivisionRing R] [Module R M] :
    IsSimpleModule R M  FiniteDimensional.finrank R M = 1 :=

to #10808.


Last updated: May 02 2025 at 03:31 UTC