Theorem: Module.equiv_free_prod_directSum
File: Mathlib/Algebra/Module/PID.lean

tactic: haveI := isNoetherian_submodule' (torsion R N)
state_before: R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
state_after: R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this : IsNoetherian R ↥(torsion R N)
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})

tactic: haveI := Module.Finite.of_surjective _ (torsion R N).mkQ_surjective
state_before: R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this : IsNoetherian R ↥(torsion R N)
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
state_after: R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝ : IsNoetherian R ↥(torsion R N)
this : Finite R (N ⧸ torsion R N)
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})

tactic: obtain ⟨I, fI, p, hp, e, ⟨h⟩⟩ :=
  equiv_directSum_of_isTorsion.{u, v} (@torsion_isTorsion R N _ _ _)
state_before: R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝ : IsNoetherian R ↥(torsion R N)
this : Finite R (N ⧸ torsion R N)
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
state_after: case intro.intro.intro.intro.intro.intro
R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝ : IsNoetherian R ↥(torsion R N)
this : Finite R (N ⧸ torsion R N)
I : Type u
fI : Fintype I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : ↥(torsion R N) ≃ₗ[R] ⨁ (i : I), R ⧸ span R {p i ^ e i}
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})

tactic: obtain ⟨n, ⟨g⟩⟩ := @Module.basisOfFiniteTypeTorsionFree' R _ _ _ (N ⧸ torsion R N) _ _ _ _
state_before: case intro.intro.intro.intro.intro.intro
R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝ : IsNoetherian R ↥(torsion R N)
this : Finite R (N ⧸ torsion R N)
I : Type u
fI : Fintype I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : ↥(torsion R N) ≃ₗ[R] ⨁ (i : I), R ⧸ span R {p i ^ e i}
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
state_after: case intro.intro.intro.intro.intro.intro.mk.ofRepr
R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝ : IsNoetherian R ↥(torsion R N)
this : Finite R (N ⧸ torsion R N)
I : Type u
fI : Fintype I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : ↥(torsion R N) ≃ₗ[R] ⨁ (i : I), R ⧸ span R {p i ^ e i}
n : ℕ
g : (N ⧸ torsion R N) ≃ₗ[R] Fin n →₀ R
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})

tactic: haveI : Module.Projective R (N ⧸ torsion R N) := Module.Projective.of_basis ⟨g⟩
state_before: case intro.intro.intro.intro.intro.intro.mk.ofRepr
R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝ : IsNoetherian R ↥(torsion R N)
this : Finite R (N ⧸ torsion R N)
I : Type u
fI : Fintype I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : ↥(torsion R N) ≃ₗ[R] ⨁ (i : I), R ⧸ span R {p i ^ e i}
n : ℕ
g : (N ⧸ torsion R N) ≃ₗ[R] Fin n →₀ R
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
state_after: case intro.intro.intro.intro.intro.intro.mk.ofRepr
R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝¹ : IsNoetherian R ↥(torsion R N)
this✝ : Finite R (N ⧸ torsion R N)
I : Type u
fI : Fintype I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : ↥(torsion R N) ≃ₗ[R] ⨁ (i : I), R ⧸ span R {p i ^ e i}
n : ℕ
g : (N ⧸ torsion R N) ≃ₗ[R] Fin n →₀ R
this : Projective R (N ⧸ torsion R N)
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})

tactic: obtain ⟨f, hf⟩ := Module.projective_lifting_property _ LinearMap.id (torsion R N).mkQ_surjective
state_before: case intro.intro.intro.intro.intro.intro.mk.ofRepr
R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝¹ : IsNoetherian R ↥(torsion R N)
this✝ : Finite R (N ⧸ torsion R N)
I : Type u
fI : Fintype I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : ↥(torsion R N) ≃ₗ[R] ⨁ (i : I), R ⧸ span R {p i ^ e i}
n : ℕ
g : (N ⧸ torsion R N) ≃ₗ[R] Fin n →₀ R
this : Projective R (N ⧸ torsion R N)
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
state_after: case intro.intro.intro.intro.intro.intro.mk.ofRepr.intro
R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝¹ : IsNoetherian R ↥(torsion R N)
this✝ : Finite R (N ⧸ torsion R N)
I : Type u
fI : Fintype I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : ↥(torsion R N) ≃ₗ[R] ⨁ (i : I), R ⧸ span R {p i ^ e i}
n : ℕ
g : (N ⧸ torsion R N) ≃ₗ[R] Fin n →₀ R
this : Projective R (N ⧸ torsion R N)
f : N ⧸ torsion R N →ₗ[R] N
hf : (torsion R N).mkQ ∘ₗ f = LinearMap.id
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})

tactic: refine
  ⟨n, I, fI, p, hp, e,
    ⟨(lequivProdOfRightSplitExact (torsion R N).injective_subtype ?_ hf).symm.trans <|
        (h.prod g).trans <| LinearEquiv.prodComm.{u, u} R _ (Fin n →₀ R) ⟩⟩
state_before: case intro.intro.intro.intro.intro.intro.mk.ofRepr.intro
R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝¹ : IsNoetherian R ↥(torsion R N)
this✝ : Finite R (N ⧸ torsion R N)
I : Type u
fI : Fintype I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : ↥(torsion R N) ≃ₗ[R] ⨁ (i : I), R ⧸ span R {p i ^ e i}
n : ℕ
g : (N ⧸ torsion R N) ≃ₗ[R] Fin n →₀ R
this : Projective R (N ⧸ torsion R N)
f : N ⧸ torsion R N →ₗ[R] N
hf : (torsion R N).mkQ ∘ₗ f = LinearMap.id
⊢ ∃ n ι x p,
    ∃ (_ : ∀ (i : ι), Irreducible (p i)), ∃ e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
state_after: case intro.intro.intro.intro.intro.intro.mk.ofRepr.intro
R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝¹ : IsNoetherian R ↥(torsion R N)
this✝ : Finite R (N ⧸ torsion R N)
I : Type u
fI : Fintype I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : ↥(torsion R N) ≃ₗ[R] ⨁ (i : I), R ⧸ span R {p i ^ e i}
n : ℕ
g : (N ⧸ torsion R N) ≃ₗ[R] Fin n →₀ R
this : Projective R (N ⧸ torsion R N)
f : N ⧸ torsion R N →ₗ[R] N
hf : (torsion R N).mkQ ∘ₗ f = LinearMap.id
⊢ LinearMap.range (torsion R N).subtype = LinearMap.ker (torsion R N).mkQ

tactic: rw [range_subtype, ker_mkQ]
state_before: case intro.intro.intro.intro.intro.intro.mk.ofRepr.intro
R : Type u
inst✝⁶ : CommRing R
inst✝⁵ : IsDomain R
inst✝⁴ : IsPrincipalIdealRing R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
h' : Finite R N
this✝¹ : IsNoetherian R ↥(torsion R N)
this✝ : Finite R (N ⧸ torsion R N)
I : Type u
fI : Fintype I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : ↥(torsion R N) ≃ₗ[R] ⨁ (i : I), R ⧸ span R {p i ^ e i}
n : ℕ
g : (N ⧸ torsion R N) ≃ₗ[R] Fin n →₀ R
this : Projective R (N ⧸ torsion R N)
f : N ⧸ torsion R N →ₗ[R] N
hf : (torsion R N).mkQ ∘ₗ f = LinearMap.id
⊢ LinearMap.range (torsion R N).subtype = LinearMap.ker (torsion R N).mkQ
state_after: no goals