Theorem: AffineMap.linear_surjective_iff
File: Mathlib/LinearAlgebra/AffineSpace/AffineMap.lean

tactic: obtain ⟨p⟩ := (inferInstance : Nonempty P1)
state_before: k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
V3 : Type ?u.368345
P3 : Type ?u.368348
V4 : Type ?u.368351
P4 : Type ?u.368354
inst✝¹² : Ring k
inst✝¹¹ : AddCommGroup V1
inst✝¹⁰ : Module k V1
inst✝⁹ : AffineSpace V1 P1
inst✝⁸ : AddCommGroup V2
inst✝⁷ : Module k V2
inst✝⁶ : AffineSpace V2 P2
inst✝⁵ : AddCommGroup V3
inst✝⁴ : Module k V3
inst✝³ : AffineSpace V3 P3
inst✝² : AddCommGroup V4
inst✝¹ : Module k V4
inst✝ : AffineSpace V4 P4
f : P1 →ᵃ[k] P2
⊢ Function.Surjective ↑f.linear ↔ Function.Surjective ↑f

tactic: have h : ⇑f.linear = (Equiv.vaddConst (f p)).symm ∘ f ∘ Equiv.vaddConst p := by
  ext v
  simp [f.map_vadd, vadd_vsub_assoc]
state_before: case intro
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
V3 : Type ?u.368345
P3 : Type ?u.368348
V4 : Type ?u.368351
P4 : Type ?u.368354
inst✝¹² : Ring k
inst✝¹¹ : AddCommGroup V1
inst✝¹⁰ : Module k V1
inst✝⁹ : AffineSpace V1 P1
inst✝⁸ : AddCommGroup V2
inst✝⁷ : Module k V2
inst✝⁶ : AffineSpace V2 P2
inst✝⁵ : AddCommGroup V3
inst✝⁴ : Module k V3
inst✝³ : AffineSpace V3 P3
inst✝² : AddCommGroup V4
inst✝¹ : Module k V4
inst✝ : AffineSpace V4 P4
f : P1 →ᵃ[k] P2
p : P1
⊢ Function.Surjective ↑f.linear ↔ Function.Surjective ↑f

tactic: rw [h, Equiv.comp_surjective, Equiv.surjective_comp]
state_before: case intro
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
V3 : Type ?u.368345
P3 : Type ?u.368348
V4 : Type ?u.368351
P4 : Type ?u.368354
inst✝¹² : Ring k
inst✝¹¹ : AddCommGroup V1
inst✝¹⁰ : Module k V1
inst✝⁹ : AffineSpace V1 P1
inst✝⁸ : AddCommGroup V2
inst✝⁷ : Module k V2
inst✝⁶ : AffineSpace V2 P2
inst✝⁵ : AddCommGroup V3
inst✝⁴ : Module k V3
inst✝³ : AffineSpace V3 P3
inst✝² : AddCommGroup V4
inst✝¹ : Module k V4
inst✝ : AffineSpace V4 P4
f : P1 →ᵃ[k] P2
p : P1
h : ↑f.linear = ↑(Equiv.vaddConst (↑f p)).symm ∘ ↑f ∘ ↑(Equiv.vaddConst p)
⊢ Function.Surjective ↑f.linear ↔ Function.Surjective ↑f

tactic: ext v
state_before: k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
V3 : Type ?u.368345
P3 : Type ?u.368348
V4 : Type ?u.368351
P4 : Type ?u.368354
inst✝¹² : Ring k
inst✝¹¹ : AddCommGroup V1
inst✝¹⁰ : Module k V1
inst✝⁹ : AffineSpace V1 P1
inst✝⁸ : AddCommGroup V2
inst✝⁷ : Module k V2
inst✝⁶ : AffineSpace V2 P2
inst✝⁵ : AddCommGroup V3
inst✝⁴ : Module k V3
inst✝³ : AffineSpace V3 P3
inst✝² : AddCommGroup V4
inst✝¹ : Module k V4
inst✝ : AffineSpace V4 P4
f : P1 →ᵃ[k] P2
p : P1
⊢ ↑f.linear = ↑(Equiv.vaddConst (↑f p)).symm ∘ ↑f ∘ ↑(Equiv.vaddConst p)

tactic: simp [f.map_vadd, vadd_vsub_assoc]
state_before: case h
k : Type u_1
V1 : Type u_2
P1 : Type u_3
V2 : Type u_4
P2 : Type u_5
V3 : Type ?u.368345
P3 : Type ?u.368348
V4 : Type ?u.368351
P4 : Type ?u.368354
inst✝¹² : Ring k
inst✝¹¹ : AddCommGroup V1
inst✝¹⁰ : Module k V1
inst✝⁹ : AffineSpace V1 P1
inst✝⁸ : AddCommGroup V2
inst✝⁷ : Module k V2
inst✝⁶ : AffineSpace V2 P2
inst✝⁵ : AddCommGroup V3
inst✝⁴ : Module k V3
inst✝³ : AffineSpace V3 P3
inst✝² : AddCommGroup V4
inst✝¹ : Module k V4
inst✝ : AffineSpace V4 P4
f : P1 →ᵃ[k] P2
p : P1
v : V1
⊢ ↑f.linear v = (↑(Equiv.vaddConst (↑f p)).symm ∘ ↑f ∘ ↑(Equiv.vaddConst p)) v