Theorem: contDiffOn_homeomorphUnitBall_symm
File: Mathlib/Analysis/InnerProductSpace/Calculus.lean

tactic: apply ContDiffAt.contDiffWithinAt
state_before: n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
⊢ ContDiffWithinAt ℝ n f (ball 0 1) y

tactic: have hf : f =ᶠ[𝓝 y] fun y => ((1 : ℝ) - ‖(y : E)‖ ^ 2).sqrt⁻¹ • (y : E) := by
  filter_upwards [isOpen_ball.mem_nhds hy] with z hz
  rw [h z hz]
  rfl
state_before: case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
⊢ ContDiffAt ℝ n f y

tactic: refine' ContDiffAt.congr_of_eventuallyEq _ hf
state_before: case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
hf : f =ᶠ[𝓝 y] fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹ • y
⊢ ContDiffAt ℝ n f y

tactic: suffices ContDiffAt ℝ n (fun y => ((1 : ℝ) - ‖(y : E)‖ ^ 2).sqrt⁻¹) y from this.smul contDiffAt_id
state_before: case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
hf : f =ᶠ[𝓝 y] fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹ • y
⊢ ContDiffAt ℝ n (fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹ • y) y

tactic: have h : (0 : ℝ) < (1 : ℝ) - ‖(y : E)‖ ^ 2 := by
  rwa [mem_ball_zero_iff, ← _root_.abs_one, ← abs_norm, ← sq_lt_sq, one_pow, ← sub_pos] at hy
state_before: case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
hf : f =ᶠ[𝓝 y] fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹ • y
⊢ ContDiffAt ℝ n (fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹) y

tactic: refine' ContDiffAt.inv _ (Real.sqrt_ne_zero'.mpr h)
state_before: case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h✝ : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
hf : f =ᶠ[𝓝 y] fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹ • y
h : 0 < 1 - ‖y‖ ^ 2
⊢ ContDiffAt ℝ n (fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹) y

tactic: refine' (contDiffAt_sqrt h.ne').comp y _
state_before: case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h✝ : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
hf : f =ᶠ[𝓝 y] fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹ • y
h : 0 < 1 - ‖y‖ ^ 2
⊢ ContDiffAt ℝ n (fun y => sqrt (1 - ‖y‖ ^ 2)) y

tactic: exact contDiffAt_const.sub (contDiff_norm_sq ℝ).contDiffAt
state_before: case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h✝ : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
hf : f =ᶠ[𝓝 y] fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹ • y
h : 0 < 1 - ‖y‖ ^ 2
⊢ ContDiffAt ℝ n (fun y => 1 - ‖y‖ ^ 2) y

tactic: filter_upwards [isOpen_ball.mem_nhds hy] with z hz
state_before: n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
⊢ f =ᶠ[𝓝 y] fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹ • y

tactic: rw [h z hz]
state_before: case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
z : E
hz : z ∈ ball 0 1
⊢ f z = (sqrt (1 - ‖z‖ ^ 2))⁻¹ • z

tactic: rfl
state_before: case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
z : E
hz : z ∈ ball 0 1
⊢ ↑(Homeomorph.symm homeomorphUnitBall) { val := z, property := hz } = (sqrt (1 - ‖z‖ ^ 2))⁻¹ • z

tactic: rwa [mem_ball_zero_iff, ← _root_.abs_one, ← abs_norm, ← sq_lt_sq, one_pow, ← sub_pos] at hy
state_before: n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → E
h : ∀ (y : E) (hy : y ∈ ball 0 1), f y = ↑(Homeomorph.symm homeomorphUnitBall) { val := y, property := hy }
y : E
hy : y ∈ ball 0 1
hf : f =ᶠ[𝓝 y] fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹ • y
⊢ 0 < 1 - ‖y‖ ^ 2