English
For a finitely generated p∞-torsion module M over a PID and irreducible p, M decomposes as a direct sum of p^e_i-torsion submodules; i.e., M ≅ ⊕ R/(p_i^{e_i}).
Русский
Для конечнопорожденного p∞-torsion модуля M над ПИД, при ирредуцируемом p mодуля M распадается как прямая сумма p_i^{e_i}-torsion подмодулей: M ≅ ⊕ R/(p_i^{e_i}).
LaTeX
$$$\\text{torsion_by_prime_power_decomposition}\\ R\\ M\\ (hM)\\ h' : \\text{exists } d,k,\\ Nonempty\\ (M \\cong_ℓ[R] \\bigoplus_{i=0}^{d-1} R /(p_i^{k(i)}))$$$
Lean4
/-- A finitely generated `p ^ ∞`-torsion module over a PID is isomorphic to a direct sum of some
`R ⧸ R ∙ (p ^ e i)` for some `e i`. -/
theorem torsion_by_prime_power_decomposition (hM : Module.IsTorsion' M (Submonoid.powers p)) [h' : Module.Finite R M] :
∃ (d : ℕ) (k : Fin d → ℕ), Nonempty <| M ≃ₗ[R] ⨁ i : Fin d, R ⧸ R ∙ p ^ (k i : ℕ) :=
by
obtain ⟨d, s, hs⟩ := @Module.Finite.exists_fin _ _ _ _ _ h'; use d; clear h'
induction d generalizing M with
| zero =>
use finZeroElim
rw [Set.range_eq_empty, Submodule.span_empty] at hs
haveI : Unique M := ⟨⟨0⟩, fun x => by dsimp; rw [← Submodule.mem_bot R, hs]; exact Submodule.mem_top⟩
exact ⟨0⟩
| succ d IH =>
have : ∀ x : M, Decidable (x = 0) := fun _ => by classical infer_instance
obtain ⟨j, hj⟩ := exists_isTorsionBy hM d.succ d.succ_ne_zero s hs
let s' : Fin d → M ⧸ R ∙ s j := Submodule.Quotient.mk ∘ s ∘ j.succAbove
have := IH ?_ s' ?_
· obtain ⟨k, ⟨f⟩⟩ := this
clear IH
have : ∀ i : Fin d, ∃ x : M, p ^ k i • x = 0 ∧ f (Submodule.Quotient.mk x) = DirectSum.lof R _ _ i 1 :=
by
intro i
let fi := f.symm.toLinearMap.comp (DirectSum.lof _ _ _ i)
obtain ⟨x, h0, h1⟩ := exists_smul_eq_zero_and_mk_eq hp hM hj fi; refine ⟨x, h0, ?_⟩; rw [h1]
simp only [fi, LinearMap.coe_comp, f.symm.coe_toLinearMap, f.apply_symm_apply, Function.comp_apply]
refine ⟨?_, ⟨?_⟩⟩
· exact fun a => (fun i => (Option.rec (pOrder hM (s j)) k i : ℕ)) (finSuccEquiv d a)
· refine
(lequivProdOfRightSplitExact (g := f.toLinearMap.comp <| mkQ _) (f :=
(DirectSum.toModule _ _ _ fun i =>
(liftQSpanSingleton (p ^ k i) (LinearMap.toSpanSingleton _ _ _) (this i).choose_spec.left :
R ⧸ _ →ₗ[R] _)))
(R ∙ s j).injective_subtype ?_ ?_).symm ≪≫ₗ
(((quotTorsionOfEquivSpanSingleton R M (s j)).symm ≪≫ₗ
(quotEquivOfEq (torsionOf R M (s j)) _
(Ideal.torsionOf_eq_span_pow_pOrder hp hM (s j)))).prodCongr
(.refl _ _)) ≪≫ₗ
(@DirectSum.lequivProdDirectSum R _ _
(fun i => R ⧸ R ∙ p ^ @Option.rec _ (fun _ => ℕ) (pOrder hM <| s j) k i) _ _).symm ≪≫ₗ
(DirectSum.lequivCongrLeft R (finSuccEquiv d).symm)
· rw [range_subtype, LinearEquiv.ker_comp, ker_mkQ]
· rw [LinearMap.comp_assoc]
ext i : 3
simp only [LinearMap.coe_comp, Function.comp_apply, mkQ_apply]
rw [LinearEquiv.coe_toLinearMap, LinearMap.id_apply, DirectSum.toModule_lof, liftQSpanSingleton_apply,
LinearMap.toSpanSingleton_one, Ideal.Quotient.mk_eq_mk, map_one (Ideal.Quotient.mk _),
(this i).choose_spec.right]
·
exact
(mk_surjective _).forall.mpr fun x =>
⟨(@hM x).choose, by rw [← Quotient.mk_smul, (@hM x).choose_spec, Quotient.mk_zero]⟩
· have hs' := congr_arg (Submodule.map <| mkQ <| R ∙ s j) hs
rw [Submodule.map_span, Submodule.map_top, range_mkQ] at hs'; simp only [mkQ_apply] at hs'
simp only [s']; rw [← Function.comp_assoc, Set.range_comp (_ ∘ s), Fin.range_succAbove]
rw [← Set.range_comp, ← Set.insert_image_compl_eq_range _ j, Function.comp_apply,
(Quotient.mk_eq_zero _).mpr (Submodule.mem_span_singleton_self _), Submodule.span_insert_zero] at hs'
exact hs'