Theorem: LinearMap.finrank_range_dualMap_eq_finrank_range
File: Mathlib/LinearAlgebra/Dual.lean

tactic: have that := Submodule.finrank_quotient_add_finrank (LinearMap.range f)
state_before: K : Type u
inst✝⁵ : Field K
V₁ : Type v'
V₂ : Type v''
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₂
f : V₁ →ₗ[K] V₂
⊢ finrank K { x // x ∈ range (dualMap f) } = finrank K { x // x ∈ range f }

tactic: let equiv := (Subspace.quotEquivAnnihilator <| LinearMap.range f)
state_before: K : Type u
inst✝⁵ : Field K
V₁ : Type v'
V₂ : Type v''
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₂
f : V₁ →ₗ[K] V₂
that : finrank K (V₂ ⧸ range f) + finrank K { x // x ∈ range f } = finrank K V₂
⊢ finrank K { x // x ∈ range (dualMap f) } = finrank K { x // x ∈ range f }

tactic: have eq := LinearEquiv.finrank_eq (R := K) (M := (V₂ ⧸ range f))
  (M₂ := { x // x ∈ Submodule.dualAnnihilator (range f) }) equiv
state_before: K : Type u
inst✝⁵ : Field K
V₁ : Type v'
V₂ : Type v''
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₂
f : V₁ →ₗ[K] V₂
that : finrank K (V₂ ⧸ range f) + finrank K { x // x ∈ range f } = finrank K V₂
equiv : (V₂ ⧸ range f) ≃ₗ[K] { x // x ∈ Submodule.dualAnnihilator (range f) } := Subspace.quotEquivAnnihilator (range f)
⊢ finrank K { x // x ∈ range (dualMap f) } = finrank K { x // x ∈ range f }

tactic: rw [eq, ←ker_dualMap_eq_dualAnnihilator_range] at that
state_before: K : Type u
inst✝⁵ : Field K
V₁ : Type v'
V₂ : Type v''
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₂
f : V₁ →ₗ[K] V₂
that : finrank K (V₂ ⧸ range f) + finrank K { x // x ∈ range f } = finrank K V₂
equiv : (V₂ ⧸ range f) ≃ₗ[K] { x // x ∈ Submodule.dualAnnihilator (range f) } := Subspace.quotEquivAnnihilator (range f)
eq : finrank K (V₂ ⧸ range f) = finrank K { x // x ∈ Submodule.dualAnnihilator (range f) }
⊢ finrank K { x // x ∈ range (dualMap f) } = finrank K { x // x ∈ range f }

tactic: conv_rhs at that => rw [← Subspace.dual_finrank_eq]
state_before: K : Type u
inst✝⁵ : Field K
V₁ : Type v'
V₂ : Type v''
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₂
f : V₁ →ₗ[K] V₂
that : finrank K { x // x ∈ ker (dualMap f) } + finrank K { x // x ∈ range f } = finrank K V₂
equiv : (V₂ ⧸ range f) ≃ₗ[K] { x // x ∈ Submodule.dualAnnihilator (range f) } := Subspace.quotEquivAnnihilator (range f)
eq : finrank K (V₂ ⧸ range f) = finrank K { x // x ∈ Submodule.dualAnnihilator (range f) }
⊢ finrank K { x // x ∈ range (dualMap f) } = finrank K { x // x ∈ range f }

tactic: refine' add_left_injective (finrank K <| LinearMap.ker f.dualMap) _
state_before: K : Type u
inst✝⁵ : Field K
V₁ : Type v'
V₂ : Type v''
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₂
f : V₁ →ₗ[K] V₂
that : finrank K { x // x ∈ ker (dualMap f) } + finrank K { x // x ∈ range f } = finrank K (Dual K V₂)
equiv : (V₂ ⧸ range f) ≃ₗ[K] { x // x ∈ Submodule.dualAnnihilator (range f) } := Subspace.quotEquivAnnihilator (range f)
eq : finrank K (V₂ ⧸ range f) = finrank K { x // x ∈ Submodule.dualAnnihilator (range f) }
⊢ finrank K { x // x ∈ range (dualMap f) } = finrank K { x // x ∈ range f }

tactic: change _ + _ = _ + _
state_before: K : Type u
inst✝⁵ : Field K
V₁ : Type v'
V₂ : Type v''
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₂
f : V₁ →ₗ[K] V₂
that : finrank K { x // x ∈ ker (dualMap f) } + finrank K { x // x ∈ range f } = finrank K (Dual K V₂)
equiv : (V₂ ⧸ range f) ≃ₗ[K] { x // x ∈ Submodule.dualAnnihilator (range f) } := Subspace.quotEquivAnnihilator (range f)
eq : finrank K (V₂ ⧸ range f) = finrank K { x // x ∈ Submodule.dualAnnihilator (range f) }
⊢ (fun x => x + finrank K { x // x ∈ ker (dualMap f) }) (finrank K { x // x ∈ range (dualMap f) }) =
    (fun x => x + finrank K { x // x ∈ ker (dualMap f) }) (finrank K { x // x ∈ range f })

tactic: rw [finrank_range_add_finrank_ker f.dualMap, add_comm, that]
state_before: K : Type u
inst✝⁵ : Field K
V₁ : Type v'
V₂ : Type v''
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₂
f : V₁ →ₗ[K] V₂
that : finrank K { x // x ∈ ker (dualMap f) } + finrank K { x // x ∈ range f } = finrank K (Dual K V₂)
equiv : (V₂ ⧸ range f) ≃ₗ[K] { x // x ∈ Submodule.dualAnnihilator (range f) } := Subspace.quotEquivAnnihilator (range f)
eq : finrank K (V₂ ⧸ range f) = finrank K { x // x ∈ Submodule.dualAnnihilator (range f) }
⊢ finrank K { x // x ∈ range (dualMap f) } + finrank K { x // x ∈ ker (dualMap f) } =
    finrank K { x // x ∈ range f } + finrank K { x // x ∈ ker (dualMap f) }