-
Notifications
You must be signed in to change notification settings - Fork 373
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(LinearMap): Added lemmas relating kernels of linear maps to Submodule.map #22069
base: master
Are you sure you want to change the base?
Conversation
PR summary d7b7085dfaImport changes for modified filesNo significant changes to the import graph Import changes for all files
|
theorem ne_map_or_ne_kernel_inter_of_lt {M' : Type*} [AddCommGroup M'] [Module R M'] | ||
{A B : Submodule R M} (f : M →ₗ[R] M') (hab : A < B) : | ||
Submodule.map f A ≠ Submodule.map f B ∨ ker f ⊓ A ≠ ker f ⊓ B := by | ||
by_cases q : ker f ⊓ A ≠ ker f ⊓ B | ||
· exact Or.inr q | ||
· simp only [ne_eq, not_not] at q | ||
apply Or.inl | ||
intro h | ||
apply hab.ne | ||
apply le_antisymm hab.le | ||
intro x hx | ||
obtain ⟨z, hz, hzy⟩ := (h ▸ ⟨x, hx, rfl⟩ : f x ∈ Submodule.map f A) | ||
suffices x - z ∈ LinearMap.ker f ⊓ A by simpa using add_mem this.2 hz | ||
exact q ▸ ⟨by simp[hzy], sub_mem hx (hab.le hz)⟩ | ||
|
||
theorem ker_inter_mono_of_map_eq {M' : Type*} [AddCommGroup M'] [Module R M'] | ||
{A B : Submodule R M} {f : M →ₗ[R] M'} (hab : A < B) | ||
(q : Submodule.map f A = Submodule.map f B) : LinearMap.ker f ⊓ A < LinearMap.ker f ⊓ B := | ||
lt_iff_le_and_ne.mpr ⟨inf_le_inf le_rfl hab.le, | ||
Or.elim (LinearMap.ne_map_or_ne_kernel_inter_of_lt f hab) | ||
(fun h ↦ False.elim (h q)) (fun h ↦ h)⟩ | ||
|
||
theorem map_mono_of_ker_inter_eq {M' : Type*} [AddCommGroup M'] [Module R M'] | ||
{A B : Submodule R M} {f : M →ₗ[R] M'} (hab : A < B) | ||
(q : LinearMap.ker f ⊓ A = LinearMap.ker f ⊓ B) : Submodule.map f A < Submodule.map f B := | ||
lt_iff_le_and_ne.mpr ⟨Set.image_mono hab.le, | ||
Or.elim (LinearMap.ne_map_or_ne_kernel_inter_of_lt f hab) | ||
(fun h ↦ h) (fun h ↦ False.elim (h q))⟩ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here are alternate names, statements and proofs. Note that the proof uses the IsModularLattice (Submodule R M)
instance, so this would need to be placed in LinearAlgebra.Span.Basic
.
theorem ne_map_or_ne_kernel_inter_of_lt {M' : Type*} [AddCommGroup M'] [Module R M'] | |
{A B : Submodule R M} (f : M →ₗ[R] M') (hab : A < B) : | |
Submodule.map f A ≠ Submodule.map f B ∨ ker f ⊓ A ≠ ker f ⊓ B := by | |
by_cases q : ker f ⊓ A ≠ ker f ⊓ B | |
· exact Or.inr q | |
· simp only [ne_eq, not_not] at q | |
apply Or.inl | |
intro h | |
apply hab.ne | |
apply le_antisymm hab.le | |
intro x hx | |
obtain ⟨z, hz, hzy⟩ := (h ▸ ⟨x, hx, rfl⟩ : f x ∈ Submodule.map f A) | |
suffices x - z ∈ LinearMap.ker f ⊓ A by simpa using add_mem this.2 hz | |
exact q ▸ ⟨by simp[hzy], sub_mem hx (hab.le hz)⟩ | |
theorem ker_inter_mono_of_map_eq {M' : Type*} [AddCommGroup M'] [Module R M'] | |
{A B : Submodule R M} {f : M →ₗ[R] M'} (hab : A < B) | |
(q : Submodule.map f A = Submodule.map f B) : LinearMap.ker f ⊓ A < LinearMap.ker f ⊓ B := | |
lt_iff_le_and_ne.mpr ⟨inf_le_inf le_rfl hab.le, | |
Or.elim (LinearMap.ne_map_or_ne_kernel_inter_of_lt f hab) | |
(fun h ↦ False.elim (h q)) (fun h ↦ h)⟩ | |
theorem map_mono_of_ker_inter_eq {M' : Type*} [AddCommGroup M'] [Module R M'] | |
{A B : Submodule R M} {f : M →ₗ[R] M'} (hab : A < B) | |
(q : LinearMap.ker f ⊓ A = LinearMap.ker f ⊓ B) : Submodule.map f A < Submodule.map f B := | |
lt_iff_le_and_ne.mpr ⟨Set.image_mono hab.le, | |
Or.elim (LinearMap.ne_map_or_ne_kernel_inter_of_lt f hab) | |
(fun h ↦ h) (fun h ↦ False.elim (h q))⟩ | |
theorem map_lt_map_or {M' : Type*} [AddCommGroup M'] [Module R M'] | |
{A B : Submodule R M} (f : M →ₗ[R] M') (hab : A < B) : | |
Submodule.map f A < Submodule.map f B ∨ ker f ⊓ A < ker f ⊓ B := by | |
obtain (⟨h, -⟩ | ⟨-, h⟩) := Prod.mk_lt_mk.mp <| strictMono_inf_prod_sup (z := ker f) hab | |
· exact .inr <| by simpa [inf_comm] | |
· simp_rw [← Submodule.comap_map_eq] at h | |
exact Or.inl <| lt_of_le_of_ne (Submodule.map_mono hab.le) fun _ ↦ h.ne <| by congr | |
theorem ker_inf_lt_ker_inf {M' : Type*} [AddCommGroup M'] [Module R M'] | |
{A B : Submodule R M} {f : M →ₗ[R] M'} (hab : A < B) | |
(q : Submodule.map f A = Submodule.map f B) : LinearMap.ker f ⊓ A < LinearMap.ker f ⊓ B := | |
f.map_lt_map_or hab |>.resolve_left q.not_lt | |
theorem map_lt_map_of_ker_inf_eq {M' : Type*} [AddCommGroup M'] [Module R M'] | |
{A B : Submodule R M} {f : M →ₗ[R] M'} (hab : A < B) | |
(q : LinearMap.ker f ⊓ A = LinearMap.ker f ⊓ B) : Submodule.map f A < Submodule.map f B := | |
f.map_lt_map_or hab |>.resolve_right q.not_lt |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks so much for the suggestions, these proofs are really nice and compact and the names are much cleaner :)
Added the lemma ne_map_or_ne_kernel_inter_of_lt stating that if A < B as submodules, then for any linear map f,
ker f ⊓ A ≠ ker f ⊓ B ∨ Submodule.map f A ≠ Submodule.map f B
. We also prove the corollaries ker_inter_mono_of_map_eq and map_mono_of_ker_inter_eq.Co-authored-by: Raphael Douglas Giles ([email protected])