[GOAL]
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
inst✝ : Module.Finite R M
hM : Module.IsTorsion R M
⊢ DirectSum.IsInternal fun p => torsionBy R M (IsPrincipal.generator ↑p ^ Multiset.count (↑p) (factors (annihilator ⊤)))
[PROOFSTEP]
convert isInternal_prime_power_torsion hM
[GOAL]
case h.e'_8.h
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
inst✝ : Module.Finite R M
hM : Module.IsTorsion R M
x✝ : { x // x ∈ Multiset.toFinset (factors (annihilator ⊤)) }
⊢ torsionBy R M (IsPrincipal.generator ↑x✝ ^ Multiset.count (↑x✝) (factors (annihilator ⊤))) =
    torsionBySet R M ↑(↑x✝ ^ Multiset.count (↑x✝) (factors (annihilator ⊤)))
[PROOFSTEP]
ext p : 1
[GOAL]
case h.e'_8.h.h
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
inst✝ : Module.Finite R M
hM : Module.IsTorsion R M
x✝ : { x // x ∈ Multiset.toFinset (factors (annihilator ⊤)) }
p : M
⊢ p ∈ torsionBy R M (IsPrincipal.generator ↑x✝ ^ Multiset.count (↑x✝) (factors (annihilator ⊤))) ↔
    p ∈ torsionBySet R M ↑(↑x✝ ^ Multiset.count (↑x✝) (factors (annihilator ⊤)))
[PROOFSTEP]
rw [← torsionBySet_span_singleton_eq, Ideal.submodule_span_eq, ← Ideal.span_singleton_pow,
  Ideal.span_singleton_generator]
[GOAL]
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
inst✝ : Module.Finite R M
hM : Module.IsTorsion R M
⊢ ∃ ι x x p x_1 e, DirectSum.IsInternal fun i => torsionBy R M (p i ^ e i)
[PROOFSTEP]
refine' ⟨_, _, _, _, _, _, Submodule.isInternal_prime_power_torsion_of_pid hM⟩
[GOAL]
case refine'_1
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
inst✝ : Module.Finite R M
hM : Module.IsTorsion R M
⊢ Fintype { x // x ∈ Multiset.toFinset (factors (annihilator ⊤)) }
case refine'_2
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
inst✝ : Module.Finite R M
hM : Module.IsTorsion R M
⊢ ∀ (i : { x // x ∈ Multiset.toFinset (factors (annihilator ⊤)) }), Irreducible (IsPrincipal.generator ↑i)
[PROOFSTEP]
exact Finset.fintypeCoeSort _
[GOAL]
case refine'_2
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
inst✝ : Module.Finite R M
hM : Module.IsTorsion R M
⊢ ∀ (i : { x // x ∈ Multiset.toFinset (factors (annihilator ⊤)) }), Irreducible (IsPrincipal.generator ↑i)
[PROOFSTEP]
rintro ⟨p, hp⟩
[GOAL]
case refine'_2.mk
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
inst✝ : Module.Finite R M
hM : Module.IsTorsion R M
p : Ideal R
hp : p ∈ Multiset.toFinset (factors (annihilator ⊤))
⊢ Irreducible (IsPrincipal.generator ↑{ val := p, property := hp })
[PROOFSTEP]
have hP := prime_of_factor p (Multiset.mem_toFinset.mp hp)
[GOAL]
case refine'_2.mk
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
inst✝ : Module.Finite R M
hM : Module.IsTorsion R M
p : Ideal R
hp : p ∈ Multiset.toFinset (factors (annihilator ⊤))
hP : Prime p
⊢ Irreducible (IsPrincipal.generator ↑{ val := p, property := hp })
[PROOFSTEP]
haveI := Ideal.isPrime_of_prime hP
[GOAL]
case refine'_2.mk
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
inst✝ : Module.Finite R M
hM : Module.IsTorsion R M
p : Ideal R
hp : p ∈ Multiset.toFinset (factors (annihilator ⊤))
hP : Prime p
this : Ideal.IsPrime p
⊢ Irreducible (IsPrincipal.generator ↑{ val := p, property := hp })
[PROOFSTEP]
exact (IsPrincipal.prime_generator_of_isPrime p hP.ne_zero).irreducible
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x : M
⊢ torsionOf R M x = Ideal.span {p ^ pOrder hM x}
[PROOFSTEP]
dsimp only [pOrder]
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x : M
⊢ torsionOf R M x = Ideal.span {p ^ Nat.find (_ : ∃ n, p ^ n • x = 0)}
[PROOFSTEP]
rw [← (torsionOf R M x).span_singleton_generator, Ideal.span_singleton_eq_span_singleton, ←
  Associates.mk_eq_mk_iff_associated, Associates.mk_pow]
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x : M
⊢ Associates.mk (generator (torsionOf R M x)) = Associates.mk p ^ Nat.find (_ : ∃ n, p ^ n • x = 0)
[PROOFSTEP]
have prop :
  (fun n : ℕ => p ^ n • x = 0) = fun n : ℕ => (Associates.mk <| generator <| torsionOf R M x) ∣ Associates.mk p ^ n :=
  by ext n; rw [← Associates.mk_pow, Associates.mk_dvd_mk, ← mem_iff_generator_dvd]; rfl
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x : M
⊢ (fun n => p ^ n • x = 0) = fun n => Associates.mk (generator (torsionOf R M x)) ∣ Associates.mk p ^ n
[PROOFSTEP]
ext n
[GOAL]
case h.a
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x : M
n : ℕ
⊢ p ^ n • x = 0 ↔ Associates.mk (generator (torsionOf R M x)) ∣ Associates.mk p ^ n
[PROOFSTEP]
rw [← Associates.mk_pow, Associates.mk_dvd_mk, ← mem_iff_generator_dvd]
[GOAL]
case h.a
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x : M
n : ℕ
⊢ p ^ n • x = 0 ↔ p ^ n ∈ torsionOf R M x
[PROOFSTEP]
rfl
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x : M
prop : (fun n => p ^ n • x = 0) = fun n => Associates.mk (generator (torsionOf R M x)) ∣ Associates.mk p ^ n
⊢ Associates.mk (generator (torsionOf R M x)) = Associates.mk p ^ Nat.find (_ : ∃ n, p ^ n • x = 0)
[PROOFSTEP]
have := (isTorsion'_powers_iff p).mp hM x
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x : M
prop : (fun n => p ^ n • x = 0) = fun n => Associates.mk (generator (torsionOf R M x)) ∣ Associates.mk p ^ n
this : ∃ n, p ^ n • x = 0
⊢ Associates.mk (generator (torsionOf R M x)) = Associates.mk p ^ Nat.find (_ : ∃ n, p ^ n • x = 0)
[PROOFSTEP]
rw [prop] at this
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x : M
prop : (fun n => p ^ n • x = 0) = fun n => Associates.mk (generator (torsionOf R M x)) ∣ Associates.mk p ^ n
this : ∃ n, Associates.mk (generator (torsionOf R M x)) ∣ Associates.mk p ^ n
⊢ Associates.mk (generator (torsionOf R M x)) = Associates.mk p ^ Nat.find (_ : ∃ n, p ^ n • x = 0)
[PROOFSTEP]
classical convert Associates.eq_pow_find_of_dvd_irreducible_pow ((Associates.irreducible_mk p).mpr hp) this.choose_spec
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x : M
prop : (fun n => p ^ n • x = 0) = fun n => Associates.mk (generator (torsionOf R M x)) ∣ Associates.mk p ^ n
this : ∃ n, Associates.mk (generator (torsionOf R M x)) ∣ Associates.mk p ^ n
⊢ Associates.mk (generator (torsionOf R M x)) = Associates.mk p ^ Nat.find (_ : ∃ n, p ^ n • x = 0)
[PROOFSTEP]
convert Associates.eq_pow_find_of_dvd_irreducible_pow ((Associates.irreducible_mk p).mpr hp) this.choose_spec
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
⊢ ∃ a, p ^ k • x = p ^ k • a • y
[PROOFSTEP]
letI : MulAction R M := MulActionWithZero.toMulAction
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
⊢ ∃ a, p ^ k • x = p ^ k • a • y
[PROOFSTEP]
by_cases hk : k ≤ pOrder hM y
[GOAL]
case pos
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ ∃ a, p ^ k • x = p ^ k • a • y
[PROOFSTEP]
let f := ((R ∙ p ^ (pOrder hM y - k) * p ^ k).quotEquivOfEq _ ?_).trans (quotTorsionOfEquivSpanSingleton R M y)
[GOAL]
case pos.refine_2
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
⊢ ∃ a, p ^ k • x = p ^ k • a • y
case pos.refine_1
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k} = torsionOf R M y
[PROOFSTEP]
have : f.symm ⟨p ^ k • x, h⟩ ∈ R ∙ Ideal.Quotient.mk (R ∙ p ^ (pOrder hM y - k) * p ^ k) (p ^ k) :=
  by
  rw [← Quotient.torsionBy_eq_span_singleton, mem_torsionBy_iff, ← f.symm.map_smul]
  convert f.symm.map_zero; ext
  rw [coe_smul_of_tower, coe_mk, coe_zero, smul_smul, ← pow_add, Nat.sub_add_cancel hk, @hM' x]
  · exact mem_nonZeroDivisors_of_ne_zero (pow_ne_zero _ hp.ne_zero)
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
⊢ ↑(LinearEquiv.symm f) { val := p ^ k • x, property := h } ∈
    Submodule.span R {↑(Ideal.Quotient.mk (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k})) (p ^ k)}
[PROOFSTEP]
rw [← Quotient.torsionBy_eq_span_singleton, mem_torsionBy_iff, ← f.symm.map_smul]
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
⊢ ↑(LinearEquiv.symm f) (p ^ (pOrder hM y - k) • { val := p ^ k • x, property := h }) = 0
case ha
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
⊢ p ^ (pOrder hM y - k) ∈ nonZeroDivisors R
[PROOFSTEP]
convert f.symm.map_zero
[GOAL]
case h.e'_2.h.e'_6
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
⊢ p ^ (pOrder hM y - k) • { val := p ^ k • x, property := h } = 0
case ha
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
⊢ p ^ (pOrder hM y - k) ∈ nonZeroDivisors R
[PROOFSTEP]
ext
[GOAL]
case h.e'_2.h.e'_6.a
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
⊢ ↑(p ^ (pOrder hM y - k) • { val := p ^ k • x, property := h }) = ↑0
case ha
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
⊢ p ^ (pOrder hM y - k) ∈ nonZeroDivisors R
[PROOFSTEP]
rw [coe_smul_of_tower, coe_mk, coe_zero, smul_smul, ← pow_add, Nat.sub_add_cancel hk, @hM' x]
[GOAL]
case ha
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
⊢ p ^ (pOrder hM y - k) ∈ nonZeroDivisors R
[PROOFSTEP]
exact mem_nonZeroDivisors_of_ne_zero (pow_ne_zero _ hp.ne_zero)
[GOAL]
case pos.refine_2
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this✝ : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
this :
  ↑(LinearEquiv.symm f) { val := p ^ k • x, property := h } ∈
    Submodule.span R {↑(Ideal.Quotient.mk (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k})) (p ^ k)}
⊢ ∃ a, p ^ k • x = p ^ k • a • y
case pos.refine_1
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k} = torsionOf R M y
[PROOFSTEP]
rw [Submodule.mem_span_singleton] at this
[GOAL]
case pos.refine_2
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this✝ : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
this :
  ∃ a,
    a • ↑(Ideal.Quotient.mk (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k})) (p ^ k) =
      ↑(LinearEquiv.symm f) { val := p ^ k • x, property := h }
⊢ ∃ a, p ^ k • x = p ^ k • a • y
case pos.refine_1
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k} = torsionOf R M y
[PROOFSTEP]
obtain ⟨a, ha⟩ := this
[GOAL]
case pos.refine_2.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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
a : R
ha :
  a • ↑(Ideal.Quotient.mk (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k})) (p ^ k) =
    ↑(LinearEquiv.symm f) { val := p ^ k • x, property := h }
⊢ ∃ a, p ^ k • x = p ^ k • a • y
case pos.refine_1
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k} = torsionOf R M y
[PROOFSTEP]
use a
[GOAL]
case h
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
a : R
ha :
  a • ↑(Ideal.Quotient.mk (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k})) (p ^ k) =
    ↑(LinearEquiv.symm f) { val := p ^ k • x, property := h }
⊢ p ^ k • x = p ^ k • a • y
case pos.refine_1
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k} = torsionOf R M y
[PROOFSTEP]
rw [f.eq_symm_apply, ← Ideal.Quotient.mk_eq_mk, ← Quotient.mk_smul] at ha
[GOAL]
case h
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
a : R
ha : ↑f (Submodule.Quotient.mk (a • p ^ k)) = { val := p ^ k • x, property := h }
⊢ p ^ k • x = p ^ k • a • y
case pos.refine_1
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k} = torsionOf R M y
[PROOFSTEP]
dsimp only [smul_eq_mul, LinearEquiv.trans_apply, Submodule.quotEquivOfEq_mk,
  quotTorsionOfEquivSpanSingleton_apply_mk] at ha
[GOAL]
case h
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
a : R
ha :
  ↑(quotTorsionOfEquivSpanSingleton R M y)
      (↑(Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
        (Submodule.Quotient.mk (a * p ^ k))) =
    { val := p ^ k • x, property := h }
⊢ p ^ k • x = p ^ k • a • y
case pos.refine_1
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k} = torsionOf R M y
[PROOFSTEP]
rw [smul_smul, mul_comm]
[GOAL]
case h
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
f : (R ⧸ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) ≃ₗ[R] { x // x ∈ Submodule.span R {y} } :=
  LinearEquiv.trans
    (Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
    (quotTorsionOfEquivSpanSingleton R M y)
a : R
ha :
  ↑(quotTorsionOfEquivSpanSingleton R M y)
      (↑(Submodule.quotEquivOfEq (Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}) (torsionOf R M y) ?pos.refine_1✝)
        (Submodule.Quotient.mk (a * p ^ k))) =
    { val := p ^ k • x, property := h }
⊢ p ^ k • x = (a * p ^ k) • y
case pos.refine_1
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k} = torsionOf R M y
[PROOFSTEP]
exact congr_arg ((↑) : _ → M) ha.symm
[GOAL]
case pos.refine_1
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ Submodule.span R {p ^ (pOrder hM y - k) * p ^ k} = torsionOf R M y
[PROOFSTEP]
symm
[GOAL]
case pos.refine_1
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ torsionOf R M y = Submodule.span R {p ^ (pOrder hM y - k) * p ^ k}
[PROOFSTEP]
convert Ideal.torsionOf_eq_span_pow_pOrder hp hM y
[GOAL]
case h.e'_3.h.e'_1.h.e'_4
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : k ≤ pOrder hM y
⊢ p ^ (pOrder hM y - k) * p ^ k = p ^ pOrder hM y
[PROOFSTEP]
rw [← pow_add, Nat.sub_add_cancel hk]
[GOAL]
case neg
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : ¬k ≤ pOrder hM y
⊢ ∃ a, p ^ k • x = p ^ k • a • y
[PROOFSTEP]
use 0
[GOAL]
case h
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
x y : M
k : ℕ
hM' : IsTorsionBy R M (p ^ pOrder hM y)
h : p ^ k • x ∈ Submodule.span R {y}
this : MulAction R M := MulActionWithZero.toMulAction
hk : ¬k ≤ pOrder hM y
⊢ p ^ k • x = p ^ k • 0 • y
[PROOFSTEP]
rw [zero_smul, smul_zero, ← Nat.sub_add_cancel (le_of_not_le hk), pow_add, mul_smul, hM', smul_zero]
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
z : M
hz : IsTorsionBy R M (p ^ pOrder hM z)
k : ℕ
f : R ⧸ Submodule.span R {p ^ k} →ₗ[R] M ⧸ Submodule.span R {z}
⊢ ∃ x, p ^ k • x = 0 ∧ Submodule.Quotient.mk x = ↑f 1
[PROOFSTEP]
have f1 := mk_surjective (R ∙ z) (f 1)
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
z : M
hz : IsTorsionBy R M (p ^ pOrder hM z)
k : ℕ
f : R ⧸ Submodule.span R {p ^ k} →ₗ[R] M ⧸ Submodule.span R {z}
f1 : ∃ a, Submodule.Quotient.mk a = ↑f 1
⊢ ∃ x, p ^ k • x = 0 ∧ Submodule.Quotient.mk x = ↑f 1
[PROOFSTEP]
have : p ^ k • f1.choose ∈ R ∙ z :=
  by
  rw [← Quotient.mk_eq_zero, mk_smul, f1.choose_spec, ← f.map_smul]
  convert f.map_zero; change _ • Submodule.Quotient.mk _ = _
  rw [← mk_smul, Quotient.mk_eq_zero, Algebra.id.smul_eq_mul, mul_one]
  exact Submodule.mem_span_singleton_self _
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
z : M
hz : IsTorsionBy R M (p ^ pOrder hM z)
k : ℕ
f : R ⧸ Submodule.span R {p ^ k} →ₗ[R] M ⧸ Submodule.span R {z}
f1 : ∃ a, Submodule.Quotient.mk a = ↑f 1
⊢ p ^ k • Exists.choose f1 ∈ Submodule.span R {z}
[PROOFSTEP]
rw [← Quotient.mk_eq_zero, mk_smul, f1.choose_spec, ← f.map_smul]
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
z : M
hz : IsTorsionBy R M (p ^ pOrder hM z)
k : ℕ
f : R ⧸ Submodule.span R {p ^ k} →ₗ[R] M ⧸ Submodule.span R {z}
f1 : ∃ a, Submodule.Quotient.mk a = ↑f 1
⊢ ↑f (p ^ k • 1) = 0
[PROOFSTEP]
convert f.map_zero
[GOAL]
case h.e'_2.h.e'_6
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
z : M
hz : IsTorsionBy R M (p ^ pOrder hM z)
k : ℕ
f : R ⧸ Submodule.span R {p ^ k} →ₗ[R] M ⧸ Submodule.span R {z}
f1 : ∃ a, Submodule.Quotient.mk a = ↑f 1
⊢ p ^ k • 1 = 0
[PROOFSTEP]
change _ • Submodule.Quotient.mk _ = _
[GOAL]
case h.e'_2.h.e'_6
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
z : M
hz : IsTorsionBy R M (p ^ pOrder hM z)
k : ℕ
f : R ⧸ Submodule.span R {p ^ k} →ₗ[R] M ⧸ Submodule.span R {z}
f1 : ∃ a, Submodule.Quotient.mk a = ↑f 1
⊢ p ^ k • Submodule.Quotient.mk 1 = 0
[PROOFSTEP]
rw [← mk_smul, Quotient.mk_eq_zero, Algebra.id.smul_eq_mul, mul_one]
[GOAL]
case h.e'_2.h.e'_6
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
z : M
hz : IsTorsionBy R M (p ^ pOrder hM z)
k : ℕ
f : R ⧸ Submodule.span R {p ^ k} →ₗ[R] M ⧸ Submodule.span R {z}
f1 : ∃ a, Submodule.Quotient.mk a = ↑f 1
⊢ p ^ k ∈ Submodule.span R {p ^ k}
[PROOFSTEP]
exact Submodule.mem_span_singleton_self _
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
z : M
hz : IsTorsionBy R M (p ^ pOrder hM z)
k : ℕ
f : R ⧸ Submodule.span R {p ^ k} →ₗ[R] M ⧸ Submodule.span R {z}
f1 : ∃ a, Submodule.Quotient.mk a = ↑f 1
this : p ^ k • Exists.choose f1 ∈ Submodule.span R {z}
⊢ ∃ x, p ^ k • x = 0 ∧ Submodule.Quotient.mk x = ↑f 1
[PROOFSTEP]
obtain ⟨a, ha⟩ := p_pow_smul_lift hp hM hz this
[GOAL]
case 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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
z : M
hz : IsTorsionBy R M (p ^ pOrder hM z)
k : ℕ
f : R ⧸ Submodule.span R {p ^ k} →ₗ[R] M ⧸ Submodule.span R {z}
f1 : ∃ a, Submodule.Quotient.mk a = ↑f 1
this : p ^ k • Exists.choose f1 ∈ Submodule.span R {z}
a : R
ha : p ^ k • Exists.choose f1 = p ^ k • a • z
⊢ ∃ x, p ^ k • x = 0 ∧ Submodule.Quotient.mk x = ↑f 1
[PROOFSTEP]
refine' ⟨f1.choose - a • z, by rw [smul_sub, sub_eq_zero, ha], _⟩
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
z : M
hz : IsTorsionBy R M (p ^ pOrder hM z)
k : ℕ
f : R ⧸ Submodule.span R {p ^ k} →ₗ[R] M ⧸ Submodule.span R {z}
f1 : ∃ a, Submodule.Quotient.mk a = ↑f 1
this : p ^ k • Exists.choose f1 ∈ Submodule.span R {z}
a : R
ha : p ^ k • Exists.choose f1 = p ^ k • a • z
⊢ p ^ k • (Exists.choose f1 - a • z) = 0
[PROOFSTEP]
rw [smul_sub, sub_eq_zero, ha]
[GOAL]
case 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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
z : M
hz : IsTorsionBy R M (p ^ pOrder hM z)
k : ℕ
f : R ⧸ Submodule.span R {p ^ k} →ₗ[R] M ⧸ Submodule.span R {z}
f1 : ∃ a, Submodule.Quotient.mk a = ↑f 1
this : p ^ k • Exists.choose f1 ∈ Submodule.span R {z}
a : R
ha : p ^ k • Exists.choose f1 = p ^ k • a • z
⊢ Submodule.Quotient.mk (Exists.choose f1 - a • z) = ↑f 1
[PROOFSTEP]
rw [mk_sub, mk_smul, (Quotient.mk_eq_zero _).mpr <| Submodule.mem_span_singleton_self _, smul_zero, sub_zero,
  f1.choose_spec]
[GOAL]
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
h' : Finite R N
⊢ ∃ d k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
obtain ⟨d, s, hs⟩ := @Module.Finite.exists_fin _ _ _ _ _ h'
[GOAL]
case 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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
h' : Finite R N
d : ℕ
s : Fin d → N
hs : Submodule.span R (Set.range s) = ⊤
⊢ ∃ d k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
use d
[GOAL]
case h
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
h' : Finite R N
d : ℕ
s : Fin d → N
hs : Submodule.span R (Set.range s) = ⊤
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
clear h'
[GOAL]
case h
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
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
d : ℕ
s : Fin d → N
hs : Submodule.span R (Set.range s) = ⊤
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
induction' d with d IH generalizing N
[GOAL]
case h.zero
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d : ℕ
s✝ : Fin d → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin Nat.zero → N
hs : Submodule.span R (Set.range s) = ⊤
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin Nat.zero), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
simp only [Nat.zero_eq] at *
  -- Porting note: was `use fun i => finZeroElim i`
[GOAL]
case h.zero
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d : ℕ
s✝ : Fin d → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin Nat.zero → N
hs : Submodule.span R (Set.range s) = ⊤
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin Nat.zero), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
use finZeroElim
[GOAL]
case h
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d : ℕ
s✝ : Fin d → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin Nat.zero → N
hs : Submodule.span R (Set.range s) = ⊤
⊢ Nonempty (N ≃ₗ[R] ⨁ (i : Fin Nat.zero), R ⧸ Submodule.span R {p ^ finZeroElim i})
[PROOFSTEP]
rw [Set.range_eq_empty, Submodule.span_empty] at hs
[GOAL]
case h
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d : ℕ
s✝ : Fin d → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin Nat.zero → N
hs : ⊥ = ⊤
⊢ Nonempty (N ≃ₗ[R] ⨁ (i : Fin Nat.zero), R ⧸ Submodule.span R {p ^ finZeroElim i})
[PROOFSTEP]
haveI : Unique N := ⟨⟨0⟩, fun x => by dsimp; rw [← Submodule.mem_bot R, hs]; exact Submodule.mem_top⟩
[GOAL]
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d : ℕ
s✝ : Fin d → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin Nat.zero → N
hs : ⊥ = ⊤
x : N
⊢ x = default
[PROOFSTEP]
dsimp
[GOAL]
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d : ℕ
s✝ : Fin d → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin Nat.zero → N
hs : ⊥ = ⊤
x : N
⊢ x = 0
[PROOFSTEP]
rw [← Submodule.mem_bot R, hs]
[GOAL]
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d : ℕ
s✝ : Fin d → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin Nat.zero → N
hs : ⊥ = ⊤
x : N
⊢ x ∈ ⊤
[PROOFSTEP]
exact Submodule.mem_top
[GOAL]
case h
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d : ℕ
s✝ : Fin d → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin Nat.zero → N
hs : ⊥ = ⊤
this : Unique N
⊢ Nonempty (N ≃ₗ[R] ⨁ (i : Fin Nat.zero), R ⧸ Submodule.span R {p ^ finZeroElim i})
[PROOFSTEP]
haveI : IsEmpty (Fin Nat.zero) := inferInstanceAs (IsEmpty (Fin 0))
[GOAL]
case h
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d : ℕ
s✝ : Fin d → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin Nat.zero → N
hs : ⊥ = ⊤
this✝ : Unique N
this : IsEmpty (Fin Nat.zero)
⊢ Nonempty (N ≃ₗ[R] ⨁ (i : Fin Nat.zero), R ⧸ Submodule.span R {p ^ finZeroElim i})
[PROOFSTEP]
exact ⟨0⟩
[GOAL]
case h.succ
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin (Nat.succ d)), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
have : ∀ x : N, Decidable (x = 0) := fun _ => by classical infer_instance
[GOAL]
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
x✝ : N
⊢ Decidable (x✝ = 0)
[PROOFSTEP]
classical infer_instance
[GOAL]
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
x✝ : N
⊢ Decidable (x✝ = 0)
[PROOFSTEP]
infer_instance
[GOAL]
case h.succ
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin (Nat.succ d)), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
obtain ⟨j, hj⟩ := exists_isTorsionBy hN d.succ d.succ_ne_zero s hs
[GOAL]
case h.succ.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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin (Nat.succ d)), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
let s' : Fin d → N ⧸ R ∙ s j := Submodule.Quotient.mk ∘ s ∘ j.succAbove
[GOAL]
case h.succ.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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin (Nat.succ d)), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
have := IH ?_ s' ?_
[GOAL]
case h.succ.intro.refine_3
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this✝ : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
this : ∃ k, Nonempty ((N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin (Nat.succ d)), R ⧸ Submodule.span R {p ^ k i})
case h.succ.intro.refine_1
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
⊢ IsTorsion' (N ⧸ Submodule.span R {s j}) { x // x ∈ Submonoid.powers p }
case h.succ.intro.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
⊢ Submodule.span R (Set.range s') = ⊤
[PROOFSTEP]
obtain ⟨k, ⟨f⟩⟩ := this
[GOAL]
case h.succ.intro.refine_3.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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin (Nat.succ d)), R ⧸ Submodule.span R {p ^ k i})
case h.succ.intro.refine_1
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
⊢ IsTorsion' (N ⧸ Submodule.span R {s j}) { x // x ∈ Submonoid.powers p }
case h.succ.intro.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
⊢ Submodule.span R (Set.range s') = ⊤
[PROOFSTEP]
clear IH
[GOAL]
case h.succ.intro.refine_3.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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin (Nat.succ d)), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
have : ∀ i : Fin d, ∃ x : N, 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 hN hj fi; refine' ⟨x, h0, _⟩; rw [h1]
  simp only [LinearMap.coe_comp, f.symm.coe_toLinearMap, f.apply_symm_apply, Function.comp_apply]
[GOAL]
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
⊢ ∀ (i : Fin d),
    ∃ x,
      p ^ k i • x = 0 ∧
        ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
[PROOFSTEP]
intro i
[GOAL]
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
i : Fin d
⊢ ∃ x,
    p ^ k i • x = 0 ∧
      ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
[PROOFSTEP]
let fi := f.symm.toLinearMap.comp (DirectSum.lof _ _ _ i)
[GOAL]
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
i : Fin d
fi : R ⧸ Submodule.span R {p ^ k i} →ₗ[R] N ⧸ Submodule.span R {s j} :=
  LinearMap.comp (↑(LinearEquiv.symm f)) (DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i)
⊢ ∃ x,
    p ^ k i • x = 0 ∧
      ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
[PROOFSTEP]
obtain ⟨x, h0, h1⟩ := exists_smul_eq_zero_and_mk_eq hp hN hj fi
[GOAL]
case 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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
i : Fin d
fi : R ⧸ Submodule.span R {p ^ k i} →ₗ[R] N ⧸ Submodule.span R {s j} :=
  LinearMap.comp (↑(LinearEquiv.symm f)) (DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i)
x : N
h0 : p ^ k i • x = 0
h1 : Submodule.Quotient.mk x = ↑fi 1
⊢ ∃ x,
    p ^ k i • x = 0 ∧
      ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
[PROOFSTEP]
refine' ⟨x, h0, _⟩
[GOAL]
case 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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
i : Fin d
fi : R ⧸ Submodule.span R {p ^ k i} →ₗ[R] N ⧸ Submodule.span R {s j} :=
  LinearMap.comp (↑(LinearEquiv.symm f)) (DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i)
x : N
h0 : p ^ k i • x = 0
h1 : Submodule.Quotient.mk x = ↑fi 1
⊢ ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
[PROOFSTEP]
rw [h1]
[GOAL]
case 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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
i : Fin d
fi : R ⧸ Submodule.span R {p ^ k i} →ₗ[R] N ⧸ Submodule.span R {s j} :=
  LinearMap.comp (↑(LinearEquiv.symm f)) (DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i)
x : N
h0 : p ^ k i • x = 0
h1 : Submodule.Quotient.mk x = ↑fi 1
⊢ ↑f (↑fi 1) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
[PROOFSTEP]
simp only [LinearMap.coe_comp, f.symm.coe_toLinearMap, f.apply_symm_apply, Function.comp_apply]
[GOAL]
case h.succ.intro.refine_3.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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this✝ : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
this :
  ∀ (i : Fin d),
    ∃ x,
      p ^ k i • x = 0 ∧
        ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
⊢ ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin (Nat.succ d)), R ⧸ Submodule.span R {p ^ k i})
[PROOFSTEP]
refine ⟨?_, ⟨?_⟩⟩
[GOAL]
case h.succ.intro.refine_3.intro.intro.refine_1
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this✝ : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
this :
  ∀ (i : Fin d),
    ∃ x,
      p ^ k i • x = 0 ∧
        ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
⊢ Fin (Nat.succ d) → ℕ
[PROOFSTEP]
exact fun a => (fun i => (Option.rec (pOrder hN (s j)) k i : ℕ)) (finSuccEquiv d a)
[GOAL]
case h.succ.intro.refine_3.intro.intro.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this✝ : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
this :
  ∀ (i : Fin d),
    ∃ x,
      p ^ k i • x = 0 ∧
        ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
⊢ N ≃ₗ[R]
    ⨁ (i : Fin (Nat.succ d)),
      R ⧸ Submodule.span R {p ^ (fun i => Option.rec (pOrder hN (s j)) k i) (↑(finSuccEquiv d) i)}
[PROOFSTEP]
refine
  (((@lequivProdOfRightSplitExact _ _ _ _ _ _ _ _ _ _ _ _
                ((f.trans ULift.moduleEquiv.{u, u, v}.symm).toLinearMap.comp <| mkQ _)
                ((DirectSum.toModule _ _ _ fun i =>
                      (liftQSpanSingleton (p ^ k i) (LinearMap.toSpanSingleton _ _ _) (this i).choose_spec.left :
                        R ⧸ _ →ₗ[R] _)).comp
                  ULift.moduleEquiv.toLinearMap)
                (R ∙ s j).injective_subtype ?_ ?_).symm.trans
            (((quotTorsionOfEquivSpanSingleton R N (s j)).symm.trans
                  (quotEquivOfEq (torsionOf R N (s j)) _ (Ideal.torsionOf_eq_span_pow_pOrder hp hN (s j)))).prod
              (ULift.moduleEquiv))).trans
        (@DirectSum.lequivProdDirectSum R _ _ _ (fun i => R ⧸ R ∙ p ^ @Option.rec _ (fun _ => ℕ) (pOrder hN <| s j) k i)
            _ _).symm).trans
    (DirectSum.lequivCongrLeft R (finSuccEquiv d).symm)
[GOAL]
case h.succ.intro.refine_3.intro.intro.refine_2.refine_1
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this✝ : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
this :
  ∀ (i : Fin d),
    ∃ x,
      p ^ k i • x = 0 ∧
        ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
⊢ LinearMap.range (Submodule.subtype (Submodule.span R {s j})) =
    LinearMap.ker
      (LinearMap.comp (↑(LinearEquiv.trans f (LinearEquiv.symm ULift.moduleEquiv))) (mkQ (Submodule.span R {s j})))
[PROOFSTEP]
rw [range_subtype, LinearEquiv.ker_comp, ker_mkQ]
[GOAL]
case h.succ.intro.refine_3.intro.intro.refine_2.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this✝ : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
this :
  ∀ (i : Fin d),
    ∃ x,
      p ^ k i • x = 0 ∧
        ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
⊢ LinearMap.comp
      (LinearMap.comp (↑(LinearEquiv.trans f (LinearEquiv.symm ULift.moduleEquiv))) (mkQ (Submodule.span R {s j})))
      (LinearMap.comp
        (DirectSum.toModule R (Fin d) N fun i =>
          liftQSpanSingleton (p ^ k i)
            (LinearMap.toSpanSingleton R N
              (Exists.choose
                (_ :
                  ∃ x,
                    p ^ k i • x = 0 ∧
                      ↑f (Submodule.Quotient.mk x) =
                        ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1)))
            (_ :
              p ^ k i •
                  Exists.choose
                    (_ :
                      ∃ x,
                        p ^ k i • x = 0 ∧
                          ↑f (Submodule.Quotient.mk x) =
                            ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1) =
                0))
        ↑ULift.moduleEquiv) =
    LinearMap.id
[PROOFSTEP]
rw [← f.comp_coe, LinearMap.comp_assoc, LinearMap.comp_assoc, LinearEquiv.toLinearMap_symm_comp_eq, LinearMap.comp_id, ←
  LinearMap.comp_assoc, ← LinearMap.comp_assoc]
[GOAL]
case h.succ.intro.refine_3.intro.intro.refine_2.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this✝ : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
this :
  ∀ (i : Fin d),
    ∃ x,
      p ^ k i • x = 0 ∧
        ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
⊢ LinearMap.comp
      (LinearMap.comp (LinearMap.comp (↑f) (mkQ (Submodule.span R {s j})))
        (DirectSum.toModule R (Fin d) N fun i =>
          liftQSpanSingleton (p ^ k i)
            (LinearMap.toSpanSingleton R N
              (Exists.choose
                (_ :
                  ∃ x,
                    p ^ k i • x = 0 ∧
                      ↑f (Submodule.Quotient.mk x) =
                        ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1)))
            (_ :
              p ^ k i •
                  Exists.choose
                    (_ :
                      ∃ x,
                        p ^ k i • x = 0 ∧
                          ↑f (Submodule.Quotient.mk x) =
                            ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1) =
                0)))
      ↑ULift.moduleEquiv =
    ↑ULift.moduleEquiv
[PROOFSTEP]
suffices (f.toLinearMap.comp (R ∙ s j).mkQ).comp _ = LinearMap.id by rw [this, LinearMap.id_comp]
[GOAL]
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this✝¹ : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
this✝ :
  ∀ (i : Fin d),
    ∃ x,
      p ^ k i • x = 0 ∧
        ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
this : LinearMap.comp (LinearMap.comp (↑f) (mkQ (Submodule.span R {s j}))) ?m.464090 = LinearMap.id
⊢ LinearMap.comp
      (LinearMap.comp (LinearMap.comp (↑f) (mkQ (Submodule.span R {s j})))
        (DirectSum.toModule R (Fin d) N fun i =>
          liftQSpanSingleton (p ^ k i)
            (LinearMap.toSpanSingleton R N
              (Exists.choose
                (_ :
                  ∃ x,
                    p ^ k i • x = 0 ∧
                      ↑f (Submodule.Quotient.mk x) =
                        ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1)))
            (_ :
              p ^ k i •
                  Exists.choose
                    (_ :
                      ∃ x,
                        p ^ k i • x = 0 ∧
                          ↑f (Submodule.Quotient.mk x) =
                            ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1) =
                0)))
      ↑ULift.moduleEquiv =
    ↑ULift.moduleEquiv
[PROOFSTEP]
rw [this, LinearMap.id_comp]
[GOAL]
case h.succ.intro.refine_3.intro.intro.refine_2.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this✝ : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
this :
  ∀ (i : Fin d),
    ∃ x,
      p ^ k i • x = 0 ∧
        ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
⊢ LinearMap.comp (LinearMap.comp (↑f) (mkQ (Submodule.span R {s j})))
      (DirectSum.toModule R (Fin d) N fun i =>
        liftQSpanSingleton (p ^ k i)
          (LinearMap.toSpanSingleton R N
            (Exists.choose
              (_ :
                ∃ x,
                  p ^ k i • x = 0 ∧
                    ↑f (Submodule.Quotient.mk x) =
                      ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1)))
          (_ :
            p ^ k i •
                Exists.choose
                  (_ :
                    ∃ x,
                      p ^ k i • x = 0 ∧
                        ↑f (Submodule.Quotient.mk x) =
                          ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1) =
              0)) =
    LinearMap.id
[PROOFSTEP]
ext i : 3
[GOAL]
case h.succ.intro.refine_3.intro.intro.refine_2.refine_2.H.h.h
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this✝ : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
this :
  ∀ (i : Fin d),
    ∃ x,
      p ^ k i • x = 0 ∧
        ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
i : Fin d
⊢ ↑(LinearMap.comp
          (LinearMap.comp
            (LinearMap.comp (LinearMap.comp (↑f) (mkQ (Submodule.span R {s j})))
              (DirectSum.toModule R (Fin d) N fun i =>
                liftQSpanSingleton (p ^ k i)
                  (LinearMap.toSpanSingleton R N
                    (Exists.choose
                      (_ :
                        ∃ x,
                          p ^ k i • x = 0 ∧
                            ↑f (Submodule.Quotient.mk x) =
                              ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1)))
                  (_ :
                    p ^ k i •
                        Exists.choose
                          (_ :
                            ∃ x,
                              p ^ k i • x = 0 ∧
                                ↑f (Submodule.Quotient.mk x) =
                                  ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1) =
                      0)))
            (DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i))
          (mkQ (Submodule.span R {p ^ k i})))
      1 =
    ↑(LinearMap.comp (LinearMap.comp LinearMap.id (DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i))
          (mkQ (Submodule.span R {p ^ k i})))
      1
[PROOFSTEP]
simp only [LinearMap.coe_comp, Function.comp_apply, mkQ_apply]
[GOAL]
case h.succ.intro.refine_3.intro.intro.refine_2.refine_2.H.h.h
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this✝ : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
k : Fin d → ℕ
f : (N ⧸ Submodule.span R {s j}) ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i}
this :
  ∀ (i : Fin d),
    ∃ x,
      p ^ k i • x = 0 ∧
        ↑f (Submodule.Quotient.mk x) = ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1
i : Fin d
⊢ ↑↑f
      (Submodule.Quotient.mk
        (↑(DirectSum.toModule R (Fin d) N fun i =>
              liftQSpanSingleton (p ^ k i)
                (LinearMap.toSpanSingleton R N
                  (Exists.choose
                    (_ :
                      ∃ x,
                        p ^ k i • x = 0 ∧
                          ↑f (Submodule.Quotient.mk x) =
                            ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1)))
                (_ :
                  p ^ k i •
                      Exists.choose
                        (_ :
                          ∃ x,
                            p ^ k i • x = 0 ∧
                              ↑f (Submodule.Quotient.mk x) =
                                ↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) 1) =
                    0))
          (↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) (Submodule.Quotient.mk 1)))) =
    ↑LinearMap.id (↑(DirectSum.lof R (Fin d) (fun i => R ⧸ Submodule.span R {p ^ k i}) i) (Submodule.Quotient.mk 1))
[PROOFSTEP]
rw [LinearEquiv.coe_toLinearMap, LinearMap.id_apply, DirectSum.toModule_lof, liftQSpanSingleton_apply,
  LinearMap.toSpanSingleton_one, Ideal.Quotient.mk_eq_mk, map_one, (this i).choose_spec.right]
[GOAL]
case h.succ.intro.refine_1
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
⊢ IsTorsion' (N ⧸ Submodule.span R {s j}) { x // x ∈ Submonoid.powers p }
[PROOFSTEP]
exact
  (mk_surjective _).forall.mpr fun x =>
    ⟨(@hN x).choose, by rw [← Quotient.mk_smul, (@hN x).choose_spec, Quotient.mk_zero]⟩
[GOAL]
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
x : N
⊢ Exists.choose (_ : ∃ a, a • x = 0) • Submodule.Quotient.mk x = 0
[PROOFSTEP]
rw [← Quotient.mk_smul, (@hN x).choose_spec, Quotient.mk_zero]
[GOAL]
case h.succ.intro.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
⊢ Submodule.span R (Set.range s') = ⊤
[PROOFSTEP]
have hs' := congr_arg (Submodule.map <| mkQ <| R ∙ s j) hs
[GOAL]
case h.succ.intro.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
hs' :
  Submodule.map (mkQ (Submodule.span R {s j})) (Submodule.span R (Set.range s)) =
    Submodule.map (mkQ (Submodule.span R {s j})) ⊤
⊢ Submodule.span R (Set.range s') = ⊤
[PROOFSTEP]
rw [Submodule.map_span, Submodule.map_top, range_mkQ] at hs'
[GOAL]
case h.succ.intro.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
hs' : Submodule.span R (↑(mkQ (Submodule.span R {s j})) '' Set.range s) = ⊤
⊢ Submodule.span R (Set.range s') = ⊤
[PROOFSTEP]
simp only [mkQ_apply] at hs'
[GOAL]
case h.succ.intro.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
hs' : Submodule.span R ((fun a => Submodule.Quotient.mk a) '' Set.range s) = ⊤
⊢ Submodule.span R (Set.range s') = ⊤
[PROOFSTEP]
simp only
[GOAL]
case h.succ.intro.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
hs' : Submodule.span R ((fun a => Submodule.Quotient.mk a) '' Set.range s) = ⊤
⊢ Submodule.span R (Set.range (Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j)) = ⊤
[PROOFSTEP]
rw [← Function.comp.assoc, Set.range_comp (_ ∘ s), Fin.range_succAbove]
[GOAL]
case h.succ.intro.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
hs' : Submodule.span R ((fun a => Submodule.Quotient.mk a) '' Set.range s) = ⊤
⊢ Submodule.span R (Submodule.Quotient.mk ∘ s '' {j}ᶜ) = ⊤
[PROOFSTEP]
rw [← Set.range_comp, ← Set.insert_image_compl_eq_range _ j, Function.comp_apply,
  (Quotient.mk_eq_zero _).mpr (Submodule.mem_span_singleton_self _), span_insert_zero] at hs'
[GOAL]
case h.succ.intro.refine_2
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✝
p : R
hp : Irreducible p
hM : IsTorsion' M { x // x ∈ Submonoid.powers p }
dec : (x : M) → Decidable (x = 0)
hN✝ : IsTorsion' N✝ { x // x ∈ Submonoid.powers p }
d✝ : ℕ
s✝ : Fin d✝ → N✝
hs✝ : Submodule.span R (Set.range s✝) = ⊤
d : ℕ
IH :
  ∀ {N : Type (max u v)} [inst : AddCommGroup N] [inst_1 : Module R N],
    IsTorsion' N { x // x ∈ Submonoid.powers p } →
      ∀ (s : Fin d → N),
        Submodule.span R (Set.range s) = ⊤ → ∃ k, Nonempty (N ≃ₗ[R] ⨁ (i : Fin d), R ⧸ Submodule.span R {p ^ k i})
N : Type (max u v)
inst✝¹ : AddCommGroup N
inst✝ : Module R N
hN : IsTorsion' N { x // x ∈ Submonoid.powers p }
s : Fin (Nat.succ d) → N
hs : Submodule.span R (Set.range s) = ⊤
this : (x : N) → Decidable (x = 0)
j : Fin (Nat.succ d)
hj : IsTorsionBy R N (p ^ pOrder hN (s j))
s' : Fin d → N ⧸ Submodule.span R {s j} := Submodule.Quotient.mk ∘ s ∘ Fin.succAbove j
hs' : Submodule.span R ((fun a => Submodule.Quotient.mk a) ∘ s '' {j}ᶜ) = ⊤
⊢ Submodule.span R (Submodule.Quotient.mk ∘ s '' {j}ᶜ) = ⊤
[PROOFSTEP]
exact hs'
[GOAL]
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
hN : IsTorsion R N
⊢ ∃ ι x p x e, Nonempty (N ≃ₗ[R] ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
obtain ⟨I, fI, _, p, hp, e, h⟩ := Submodule.exists_isInternal_prime_power_torsion_of_pid hN
[GOAL]
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
hN : IsTorsion R N
I : Type u
fI : Fintype I
w✝ : DecidableEq I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : DirectSum.IsInternal fun i => torsionBy R N (p i ^ e i)
⊢ ∃ ι x p x e, Nonempty (N ≃ₗ[R] ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
haveI := fI
[GOAL]
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
hN : IsTorsion R N
I : Type u
fI : Fintype I
w✝ : DecidableEq I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : DirectSum.IsInternal fun i => torsionBy R N (p i ^ e i)
this : Fintype I
⊢ ∃ ι x p x e, Nonempty (N ≃ₗ[R] ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
have : ∀ i, ∃ (d : ℕ) (k : Fin d → ℕ), Nonempty <| torsionBy R N (p i ^ e i) ≃ₗ[R] ⨁ j, R ⧸ R ∙ p i ^ k j :=
  by
  have := isNoetherian_of_isNoetherianRing_of_finite R N
  haveI := fun i => isNoetherian_submodule' (torsionBy R N <| p i ^ e i)
  exact fun i =>
    torsion_by_prime_power_decomposition.{u, v} (hp i)
      ((isTorsion'_powers_iff <| p i).mpr fun x => ⟨e i, smul_torsionBy _ _⟩)
[GOAL]
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
hN : IsTorsion R N
I : Type u
fI : Fintype I
w✝ : DecidableEq I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : DirectSum.IsInternal fun i => torsionBy R N (p i ^ e i)
this : Fintype I
⊢ ∀ (i : I), ∃ d k, Nonempty ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R] ⨁ (j : Fin d), R ⧸ span R {p i ^ k j})
[PROOFSTEP]
have := isNoetherian_of_isNoetherianRing_of_finite R N
[GOAL]
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
hN : IsTorsion R N
I : Type u
fI : Fintype I
w✝ : DecidableEq I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : DirectSum.IsInternal fun i => torsionBy R N (p i ^ e i)
this✝ : Fintype I
this : IsNoetherian R N
⊢ ∀ (i : I), ∃ d k, Nonempty ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R] ⨁ (j : Fin d), R ⧸ span R {p i ^ k j})
[PROOFSTEP]
haveI := fun i => isNoetherian_submodule' (torsionBy R N <| p i ^ e i)
[GOAL]
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
hN : IsTorsion R N
I : Type u
fI : Fintype I
w✝ : DecidableEq I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : DirectSum.IsInternal fun i => torsionBy R N (p i ^ e i)
this✝¹ : Fintype I
this✝ : IsNoetherian R N
this : ∀ (i : I), IsNoetherian R { x // x ∈ torsionBy R N (p i ^ e i) }
⊢ ∀ (i : I), ∃ d k, Nonempty ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R] ⨁ (j : Fin d), R ⧸ span R {p i ^ k j})
[PROOFSTEP]
exact fun i =>
  torsion_by_prime_power_decomposition.{u, v} (hp i)
    ((isTorsion'_powers_iff <| p i).mpr fun x => ⟨e i, smul_torsionBy _ _⟩)
[GOAL]
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
hN : IsTorsion R N
I : Type u
fI : Fintype I
w✝ : DecidableEq I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : DirectSum.IsInternal fun i => torsionBy R N (p i ^ e i)
this✝ : Fintype I
this : ∀ (i : I), ∃ d k, Nonempty ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R] ⨁ (j : Fin d), R ⧸ span R {p i ^ k j})
⊢ ∃ ι x p x e, Nonempty (N ≃ₗ[R] ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
classical
refine'
  ⟨Σ i, Fin (this i).choose, inferInstance, fun ⟨i, _⟩ => p i, fun ⟨i, _⟩ => hp i, fun ⟨i, j⟩ =>
    (this i).choose_spec.choose j,
    ⟨(LinearEquiv.ofBijective (DirectSum.coeLinearMap _) h).symm.trans <|
        (DFinsupp.mapRange.linearEquiv fun i => (this i).choose_spec.choose_spec.some).trans <|
          (DirectSum.sigmaLcurryEquiv R).symm.trans (DFinsupp.mapRange.linearEquiv fun i => quotEquivOfEq _ _ _)⟩⟩
cases' i with i j
simp only
[GOAL]
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
hN : IsTorsion R N
I : Type u
fI : Fintype I
w✝ : DecidableEq I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : DirectSum.IsInternal fun i => torsionBy R N (p i ^ e i)
this✝ : Fintype I
this : ∀ (i : I), ∃ d k, Nonempty ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R] ⨁ (j : Fin d), R ⧸ span R {p i ^ k j})
⊢ ∃ ι x p x e, Nonempty (N ≃ₗ[R] ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
refine'
  ⟨Σ i, Fin (this i).choose, inferInstance, fun ⟨i, _⟩ => p i, fun ⟨i, _⟩ => hp i, fun ⟨i, j⟩ =>
    (this i).choose_spec.choose j,
    ⟨(LinearEquiv.ofBijective (DirectSum.coeLinearMap _) h).symm.trans <|
        (DFinsupp.mapRange.linearEquiv fun i => (this i).choose_spec.choose_spec.some).trans <|
          (DirectSum.sigmaLcurryEquiv R).symm.trans (DFinsupp.mapRange.linearEquiv fun i => quotEquivOfEq _ _ _)⟩⟩
[GOAL]
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
hN : IsTorsion R N
I : Type u
fI : Fintype I
w✝ : DecidableEq I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : DirectSum.IsInternal fun i => torsionBy R N (p i ^ e i)
this✝ : Fintype I
this : ∀ (i : I), ∃ d k, Nonempty ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R] ⨁ (j : Fin d), R ⧸ span R {p i ^ k j})
i :
  (x : I) ×
    Fin
      (Exists.choose
        (_ : ∃ d k, Nonempty ({ x_1 // x_1 ∈ torsionBy R N (p x ^ e x) } ≃ₗ[R] ⨁ (j : Fin d), R ⧸ span R {p x ^ k j})))
⊢ span R
      {p i.fst ^
          Exists.choose
            (_ :
              ∃ k,
                Nonempty
                  ({ x // x ∈ torsionBy R N (p i.fst ^ e i.fst) } ≃ₗ[R]
                    ⨁ (j :
                      Fin
                        (Exists.choose
                          (_ :
                            ∃ d k,
                              Nonempty
                                ({ x // x ∈ torsionBy R N (p i.fst ^ e i.fst) } ≃ₗ[R]
                                  ⨁ (j : Fin d), R ⧸ span R {p i.fst ^ k j})))),
                      R ⧸ span R {p i.fst ^ k j}))
            i.snd} =
    span R
      {(fun x =>
              match x with
              | { fst := i, snd := snd } => p i)
            i ^
          (fun x =>
              match x with
              | { fst := i, snd := j } =>
                Exists.choose
                  (_ :
                    ∃ k,
                      Nonempty
                        ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R]
                          ⨁ (j :
                            Fin
                              (Exists.choose
                                (_ :
                                  ∃ d k,
                                    Nonempty
                                      ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R]
                                        ⨁ (j : Fin d), R ⧸ span R {p i ^ k j})))),
                            R ⧸ span R {p i ^ k j}))
                  j)
            i}
[PROOFSTEP]
cases' i with i j
[GOAL]
case intro.intro.intro.intro.intro.intro.mk
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
hN : IsTorsion R N
I : Type u
fI : Fintype I
w✝ : DecidableEq I
p : I → R
hp : ∀ (i : I), Irreducible (p i)
e : I → ℕ
h : DirectSum.IsInternal fun i => torsionBy R N (p i ^ e i)
this✝ : Fintype I
this : ∀ (i : I), ∃ d k, Nonempty ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R] ⨁ (j : Fin d), R ⧸ span R {p i ^ k j})
i : I
j :
  Fin
    (Exists.choose
      (_ : ∃ d k, Nonempty ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R] ⨁ (j : Fin d), R ⧸ span R {p i ^ k j})))
⊢ span R
      {p { fst := i, snd := j }.fst ^
          Exists.choose
            (_ :
              ∃ k,
                Nonempty
                  ({ x // x ∈ torsionBy R N (p { fst := i, snd := j }.fst ^ e { fst := i, snd := j }.fst) } ≃ₗ[R]
                    ⨁ (j_1 :
                      Fin
                        (Exists.choose
                          (_ :
                            ∃ d k,
                              Nonempty
                                ({ x //
                                    x ∈
                                      torsionBy R N
                                        (p { fst := i, snd := j }.fst ^ e { fst := i, snd := j }.fst) } ≃ₗ[R]
                                  ⨁ (j_1 : Fin d), R ⧸ span R {p { fst := i, snd := j }.fst ^ k j_1})))),
                      R ⧸ span R {p { fst := i, snd := j }.fst ^ k j_1}))
            { fst := i, snd := j }.snd} =
    span R
      {(fun x =>
              match x with
              | { fst := i, snd := snd } => p i)
            { fst := i, snd := j } ^
          (fun x =>
              match x with
              | { fst := i, snd := j } =>
                Exists.choose
                  (_ :
                    ∃ k,
                      Nonempty
                        ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R]
                          ⨁ (j :
                            Fin
                              (Exists.choose
                                (_ :
                                  ∃ d k,
                                    Nonempty
                                      ({ x // x ∈ torsionBy R N (p i ^ e i) } ≃ₗ[R]
                                        ⨁ (j : Fin d), R ⧸ span R {p i ^ k j})))),
                            R ⧸ span R {p i ^ k j}))
                  j)
            { fst := i, snd := j }}
[PROOFSTEP]
simp only
[GOAL]
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 x e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
have := isNoetherian_of_isNoetherianRing_of_finite R N
[GOAL]
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 N
⊢ ∃ n ι x p x e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
haveI := isNoetherian_submodule' (torsion R N)
[GOAL]
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 N
this : IsNoetherian R { x // x ∈ torsion R N }
⊢ ∃ n ι x p x e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
haveI := Module.Finite.of_surjective _ (torsion R N).mkQ_surjective
[GOAL]
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 N
this✝ : IsNoetherian R { x // x ∈ torsion R N }
this : Finite R (N ⧸ torsion R N)
⊢ ∃ n ι x p x e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
obtain ⟨I, fI, p, hp, e, ⟨h⟩⟩ := equiv_directSum_of_isTorsion.{u, v} (@torsion_isTorsion R N _ _ _)
[GOAL]
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 N
this✝ : IsNoetherian R { x // x ∈ 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 : { x // x ∈ torsion R N } ≃ₗ[R] ⨁ (i : I), R ⧸ span R {p i ^ e i}
⊢ ∃ n ι x p x e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
obtain ⟨n, ⟨g⟩⟩ := @Module.basisOfFiniteTypeTorsionFree' R _ _ _ (N ⧸ torsion R N) _ _ _ _
[GOAL]
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 N
this✝ : IsNoetherian R { x // x ∈ 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 : { x // x ∈ 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 x e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
haveI : Module.Projective R (N ⧸ torsion R N) := Module.Projective.of_basis ⟨g⟩
[GOAL]
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 N
this✝¹ : IsNoetherian R { x // x ∈ 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 : { x // x ∈ 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 x e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
obtain ⟨f, hf⟩ := Module.projective_lifting_property _ LinearMap.id (torsion R N).mkQ_surjective
[GOAL]
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 N
this✝¹ : IsNoetherian R { x // x ∈ 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 : { x // x ∈ 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 : LinearMap.comp (mkQ (torsion R N)) f = LinearMap.id
⊢ ∃ n ι x p x e, Nonempty (N ≃ₗ[R] (Fin n →₀ R) × ⨁ (i : ι), R ⧸ span R {p i ^ e i})
[PROOFSTEP]
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)⟩⟩
[GOAL]
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 N
this✝¹ : IsNoetherian R { x // x ∈ 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 : { x // x ∈ 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 : LinearMap.comp (mkQ (torsion R N)) f = LinearMap.id
⊢ LinearMap.range (Submodule.subtype (torsion R N)) = LinearMap.ker (mkQ (torsion R N))
[PROOFSTEP]
rw [range_subtype, ker_mkQ]