-- Mathlib/LinearAlgebra/PID.lean
/-- If a linear endomorphism of a (finite, free) module `M` takes values in a submodule `p ⊆ M`,
then the trace of its restriction to `p` is equal to its trace on `M`. -/
lemma trace_restrict_eq_of_forall_mem [IsDomain R] [IsPrincipalIdealRing R]
    (p : Submodule R M) (f : M →ₗ[R] M)
    (hf : ∀ x, f x ∈ p) (hf' : ∀ x ∈ p, f x ∈ p := fun x _ ↦ hf x) :
    trace R p (f.restrict hf') = trace R M f

Proof state:
case mk
R : Type u_1
M : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module.Finite R M
inst✝² : Module.Free R M
inst✝¹ : IsDomain R
inst✝ : IsPrincipalIdealRing R
p : Submodule R M
f : M →ₗ[R] M
hf : ∀ (x : M), f x ∈ p
hf' : optParam (∀ x ∈ p, f x ∈ p) ⋯
ι : Type u_2 := Module.Free.ChooseBasisIndex R M
n : ℕ
snf : Basis.SmithNormalForm p ι n
A : Matrix (Fin n) (Fin n) R := (toMatrix snf.bN snf.bN) (f.restrict hf')
⊢ A.trace = ((toMatrix snf.bM snf.bM) f).trace

Tactic:
set B : Matrix ι ι R := toMatrix snf.bM snf.bM f

Result:
case mk
R : Type u_1
M : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module.Finite R M
inst✝² : Module.Free R M
inst✝¹ : IsDomain R
inst✝ : IsPrincipalIdealRing R
p : Submodule R M
f : M →ₗ[R] M
hf : ∀ (x : M), f x ∈ p
hf' : optParam (∀ x ∈ p, f x ∈ p) ⋯
ι : Type u_2 := Module.Free.ChooseBasisIndex R M
n : ℕ
snf : Basis.SmithNormalForm p ι n
A : Matrix (Fin n) (Fin n) R := (toMatrix snf.bN snf.bN) (f.restrict hf')
B : Matrix ι ι R := (toMatrix snf.bM snf.bM) f
⊢ A.trace = B.trace

Proof state:
R : Type u_1
M : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module.Finite R M
inst✝² : Module.Free R M
inst✝¹ : IsDomain R
inst✝ : IsPrincipalIdealRing R
p : Submodule R M
f : M →ₗ[R] M
hf : ∀ (x : M), f x ∈ p
hf' : optParam (∀ x ∈ p, f x ∈ p) ⋯
ι : Type u_2 := Module.Free.ChooseBasisIndex R M
n : ℕ
snf : Basis.SmithNormalForm p ι n
A : Matrix (Fin n) (Fin n) R := (toMatrix snf.bN snf.bN) (f.restrict hf')
B : Matrix ι ι R := (toMatrix snf.bM snf.bM) f
aux : ∀ (i : ι), B i i ≠ 0 → i ∈ Set.range ⇑snf.f
⊢ ∀ x ∈ Finset.univ, B x x ≠ 0 → (fun j => j ∈ Set.range ⇑snf.f) x

Tactic:
simpa using aux

Result:
no goals

Proof state:
R : Type u_1
M : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module.Finite R M
inst✝² : Module.Free R M
inst✝¹ : IsDomain R
inst✝ : IsPrincipalIdealRing R
p : Submodule R M
f : M →ₗ[R] M
hf : ∀ (x : M), f x ∈ p
hf' : optParam (∀ x ∈ p, f x ∈ p) ⋯
ι : Type u_2 := Module.Free.ChooseBasisIndex R M
n : ℕ
snf : Basis.SmithNormalForm p ι n
A : Matrix (Fin n) (Fin n) R := (toMatrix snf.bN snf.bN) (f.restrict hf')
B : Matrix ι ι R := (toMatrix snf.bM snf.bM) f
i : ι
hi : B i i ≠ 0
⊢ i ∈ Set.range ⇑snf.f

Tactic:
contrapose! hi

Result:
R : Type u_1
M : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module.Finite R M
inst✝² : Module.Free R M
inst✝¹ : IsDomain R
inst✝ : IsPrincipalIdealRing R
p : Submodule R M
f : M →ₗ[R] M
hf : ∀ (x : M), f x ∈ p
hf' : optParam (∀ x ∈ p, f x ∈ p) ⋯
ι : Type u_2 := Module.Free.ChooseBasisIndex R M
n : ℕ
snf : Basis.SmithNormalForm p ι n
A : Matrix (Fin n) (Fin n) R := (toMatrix snf.bN snf.bN) (f.restrict hf')
B : Matrix ι ι R := (toMatrix snf.bM snf.bM) f
i : ι
hi : i ∉ Set.range ⇑snf.f
⊢ B i i = 0

Proof state:
case mk
R : Type u_1
M : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module.Finite R M
inst✝² : Module.Free R M
inst✝¹ : IsDomain R
inst✝ : IsPrincipalIdealRing R
p : Submodule R M
f : M →ₗ[R] M
hf : ∀ (x : M), f x ∈ p
hf' : optParam (∀ x ∈ p, f x ∈ p) ⋯
ι : Type u_2 := Module.Free.ChooseBasisIndex R M
n : ℕ
snf : Basis.SmithNormalForm p ι n
A : Matrix (Fin n) (Fin n) R := (toMatrix snf.bN snf.bN) (f.restrict hf')
B : Matrix ι ι R := (toMatrix snf.bM snf.bM) f
aux : ∀ (i : ι), B i i ≠ 0 → i ∈ Set.range ⇑snf.f
⊢ ∑ i : Fin n, A i i = ∑ i : ι, B i i

Tactic:
rw [← Finset.sum_filter_of_ne (p := fun j ↦ j ∈ Set.range snf.f) (by simpa using aux)]

Result:
case mk
R : Type u_1
M : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module.Finite R M
inst✝² : Module.Free R M
inst✝¹ : IsDomain R
inst✝ : IsPrincipalIdealRing R
p : Submodule R M
f : M →ₗ[R] M
hf : ∀ (x : M), f x ∈ p
hf' : optParam (∀ x ∈ p, f x ∈ p) ⋯
ι : Type u_2 := Module.Free.ChooseBasisIndex R M
n : ℕ
snf : Basis.SmithNormalForm p ι n
A : Matrix (Fin n) (Fin n) R := (toMatrix snf.bN snf.bN) (f.restrict hf')
B : Matrix ι ι R := (toMatrix snf.bM snf.bM) f
aux : ∀ (i : ι), B i i ≠ 0 → i ∈ Set.range ⇑snf.f
⊢ ∑ i : Fin n, A i i = ∑ x ∈ Finset.filter (fun x => x ∈ Set.range ⇑snf.f) Finset.univ, B x x

Proof state:
R : Type u_1
M : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Module.Finite R M
inst✝² : Module.Free R M
inst✝¹ : IsDomain R
inst✝ : IsPrincipalIdealRing R
p : Submodule R M
f : M →ₗ[R] M
hf : ∀ (x : M), f x ∈ p
hf' : optParam (∀ x ∈ p, f x ∈ p) ⋯
ι : Type u_2 := Module.Free.ChooseBasisIndex R M
n : ℕ
snf : Basis.SmithNormalForm p ι n
A : Matrix (Fin n) (Fin n) R := (toMatrix snf.bN snf.bN) (f.restrict hf')
B : Matrix ι ι R := (toMatrix snf.bM snf.bM) f
i : ι
hi : i ∉ Set.range ⇑snf.f
⊢ B i i = 0

Tactic:
exact snf.repr_eq_zero_of_nmem_range ⟨_, (hf _)⟩ hi

Result:
no goals