[GOAL]
C : FloatCfg
e : ℤ
m : ℕ
⊢ Decidable (ValidFinite e m)
[PROOFSTEP]
unfold ValidFinite
[GOAL]
C : FloatCfg
e : ℤ
m : ℕ
⊢ Decidable (emin ≤ e + ↑prec - 1 ∧ e + ↑prec - 1 ≤ ↑emax ∧ e = max (e + ↑(Nat.size m) - ↑prec) emin)
[PROOFSTEP]
infer_instance
[GOAL]
C : FloatCfg
⊢ emin ≤ emin + ↑prec - 1
[PROOFSTEP]
rw [add_sub_assoc]
[GOAL]
C : FloatCfg
⊢ emin ≤ emin + (↑prec - 1)
[PROOFSTEP]
apply le_add_of_nonneg_right
[GOAL]
case h
C : FloatCfg
⊢ 0 ≤ ↑prec - 1
[PROOFSTEP]
apply sub_nonneg_of_le
[GOAL]
case h.a
C : FloatCfg
⊢ 1 ≤ ↑prec
[PROOFSTEP]
apply Int.ofNat_le_ofNat_of_le
[GOAL]
case h.a.a
C : FloatCfg
⊢ 1 ≤ prec
[PROOFSTEP]
exact C.precPos
[GOAL]
C : FloatCfg
⊢ 0 < 2
[PROOFSTEP]
decide
[GOAL]
C : FloatCfg
this : prec ≤ 2 * emax
⊢ emin + ↑prec - 1 ≤ ↑emax
[PROOFSTEP]
rw [← Int.ofNat_le] at this
[GOAL]
C : FloatCfg
this : ↑prec ≤ ↑(2 * emax)
⊢ emin + ↑prec - 1 ≤ ↑emax
[PROOFSTEP]
rw [← sub_nonneg] at *
[GOAL]
C : FloatCfg
this✝ : ↑prec ≤ ↑(2 * emax)
this : 0 ≤ ↑(2 * emax) - ↑prec
⊢ 0 ≤ ↑emax - (emin + ↑prec - 1)
[PROOFSTEP]
simp only [emin, emax] at *
[GOAL]
C : FloatCfg
this✝ : ↑prec ≤ ↑(2 * FloatCfg.emax)
this : 0 ≤ ↑(2 * FloatCfg.emax) - ↑prec
⊢ 0 ≤ ↑FloatCfg.emax - (1 - ↑FloatCfg.emax + ↑prec - 1)
[PROOFSTEP]
ring_nf
[GOAL]
C : FloatCfg
this✝ : ↑prec ≤ ↑(2 * FloatCfg.emax)
this : 0 ≤ ↑(2 * FloatCfg.emax) - ↑prec
⊢ 0 ≤ ↑FloatCfg.emax * 2 - ↑prec
[PROOFSTEP]
rw [mul_comm]
[GOAL]
C : FloatCfg
this✝ : ↑prec ≤ ↑(2 * FloatCfg.emax)
this : 0 ≤ ↑(2 * FloatCfg.emax) - ↑prec
⊢ 0 ≤ 2 * ↑FloatCfg.emax - ↑prec
[PROOFSTEP]
assumption
[GOAL]
C : FloatCfg
⊢ emin = max (emin + ↑(Nat.size 0) - ↑prec) emin
[PROOFSTEP]
rw [max_eq_right]
[GOAL]
C : FloatCfg
⊢ emin + ↑(Nat.size 0) - ↑prec ≤ emin
[PROOFSTEP]
simp [sub_eq_add_neg]
[GOAL]
C : FloatCfg
n d : ℕ+
⊢ Float × Bool
[PROOFSTEP]
let e₁ : ℤ := n.1.size - d.1.size - prec
[GOAL]
C : FloatCfg
n d : ℕ+
e₁ : ℤ := ↑(Nat.size ↑n) - ↑(Nat.size ↑d) - ↑prec
⊢ Float × Bool
[PROOFSTEP]
cases' h₁ : Int.shift2 d.1 n.1 (e₁ + prec) with d₁ n₁
[GOAL]
case mk
C : FloatCfg
n d : ℕ+
e₁ : ℤ := ↑(Nat.size ↑n) - ↑(Nat.size ↑d) - ↑prec
d₁ n₁ : ℕ
h₁ : Int.shift2 (↑d) (↑n) (e₁ + ↑prec) = (d₁, n₁)
⊢ Float × Bool
[PROOFSTEP]
let e₂ := if n₁ < d₁ then e₁ - 1 else e₁
[GOAL]
case mk
C : FloatCfg
n d : ℕ+
e₁ : ℤ := ↑(Nat.size ↑n) - ↑(Nat.size ↑d) - ↑prec
d₁ n₁ : ℕ
h₁ : Int.shift2 (↑d) (↑n) (e₁ + ↑prec) = (d₁, n₁)
e₂ : ℤ := if n₁ < d₁ then e₁ - 1 else e₁
⊢ Float × Bool
[PROOFSTEP]
let e₃ := max e₂ emin
[GOAL]
case mk
C : FloatCfg
n d : ℕ+
e₁ : ℤ := ↑(Nat.size ↑n) - ↑(Nat.size ↑d) - ↑prec
d₁ n₁ : ℕ
h₁ : Int.shift2 (↑d) (↑n) (e₁ + ↑prec) = (d₁, n₁)
e₂ : ℤ := if n₁ < d₁ then e₁ - 1 else e₁
e₃ : ℤ := max e₂ emin
⊢ Float × Bool
[PROOFSTEP]
cases' h₂ : Int.shift2 d.1 n.1 (e₃ + prec) with d₂ n₂
[GOAL]
case mk.mk
C : FloatCfg
n d : ℕ+
e₁ : ℤ := ↑(Nat.size ↑n) - ↑(Nat.size ↑d) - ↑prec
d₁ n₁ : ℕ
h₁ : Int.shift2 (↑d) (↑n) (e₁ + ↑prec) = (d₁, n₁)
e₂ : ℤ := if n₁ < d₁ then e₁ - 1 else e₁
e₃ : ℤ := max e₂ emin
d₂ n₂ : ℕ
h₂ : Int.shift2 (↑d) (↑n) (e₃ + ↑prec) = (d₂, n₂)
⊢ Float × Bool
[PROOFSTEP]
let r := mkRat n₂ d₂
[GOAL]
case mk.mk
C : FloatCfg
n d : ℕ+
e₁ : ℤ := ↑(Nat.size ↑n) - ↑(Nat.size ↑d) - ↑prec
d₁ n₁ : ℕ
h₁ : Int.shift2 (↑d) (↑n) (e₁ + ↑prec) = (d₁, n₁)
e₂ : ℤ := if n₁ < d₁ then e₁ - 1 else e₁
e₃ : ℤ := max e₂ emin
d₂ n₂ : ℕ
h₂ : Int.shift2 (↑d) (↑n) (e₃ + ↑prec) = (d₂, n₂)
r : ℚ := mkRat (↑n₂) d₂
⊢ Float × Bool
[PROOFSTEP]
let m := r.floor
[GOAL]
case mk.mk
C : FloatCfg
n d : ℕ+
e₁ : ℤ := ↑(Nat.size ↑n) - ↑(Nat.size ↑d) - ↑prec
d₁ n₁ : ℕ
h₁ : Int.shift2 (↑d) (↑n) (e₁ + ↑prec) = (d₁, n₁)
e₂ : ℤ := if n₁ < d₁ then e₁ - 1 else e₁
e₃ : ℤ := max e₂ emin
d₂ n₂ : ℕ
h₂ : Int.shift2 (↑d) (↑n) (e₃ + ↑prec) = (d₂, n₂)
r : ℚ := mkRat (↑n₂) d₂
m : ℤ := Rat.floor r
⊢ Float × Bool
[PROOFSTEP]
refine' (Float.finite Bool.false e₃ (Int.toNat m) _, r.den = 1)
[GOAL]
case mk.mk
C : FloatCfg
n d : ℕ+
e₁ : ℤ := ↑(Nat.size ↑n) - ↑(Nat.size ↑d) - ↑prec
d₁ n₁ : ℕ
h₁ : Int.shift2 (↑d) (↑n) (e₁ + ↑prec) = (d₁, n₁)
e₂ : ℤ := if n₁ < d₁ then e₁ - 1 else e₁
e₃ : ℤ := max e₂ emin
d₂ n₂ : ℕ
h₂ : Int.shift2 (↑d) (↑n) (e₃ + ↑prec) = (d₂, n₂)
r : ℚ := mkRat (↑n₂) d₂
m : ℤ := Rat.floor r
⊢ ValidFinite e₃ (Int.toNat m)
[PROOFSTEP]
exact lcProof
[GOAL]
C : FloatCfg
e : ℤ
m : ℕ
v : ValidFinite e m
m' : ℕ := Nat.succ m
ss : Nat.size m' = Nat.size m
⊢ ValidFinite e m'
[PROOFSTEP]
unfold ValidFinite at *
[GOAL]
C : FloatCfg
e : ℤ
m : ℕ
v : emin ≤ e + ↑prec - 1 ∧ e + ↑prec - 1 ≤ ↑emax ∧ e = max (e + ↑(Nat.size m) - ↑prec) emin
m' : ℕ := Nat.succ m
ss : Nat.size m' = Nat.size m
⊢ emin ≤ e + ↑prec - 1 ∧ e + ↑prec - 1 ≤ ↑emax ∧ e = max (e + ↑(Nat.size m') - ↑prec) emin
[PROOFSTEP]
rw [ss]
[GOAL]
C : FloatCfg
e : ℤ
m : ℕ
v : emin ≤ e + ↑prec - 1 ∧ e + ↑prec - 1 ≤ ↑emax ∧ e = max (e + ↑(Nat.size m) - ↑prec) emin
m' : ℕ := Nat.succ m
ss : Nat.size m' = Nat.size m
⊢ emin ≤ e + ↑prec - 1 ∧ e + ↑prec - 1 ≤ ↑emax ∧ e = max (e + ↑(Nat.size m) - ↑prec) emin
[PROOFSTEP]
exact v
[GOAL]
C : FloatCfg
e : ℤ
m m' : ℕ
v : ValidFinite e (Nat.succ m')
ss : Nat.size m' = Nat.size (Nat.succ m')
⊢ ValidFinite e m'
[PROOFSTEP]
unfold ValidFinite at *
[GOAL]
C : FloatCfg
e : ℤ
m m' : ℕ
v : emin ≤ e + ↑prec - 1 ∧ e + ↑prec - 1 ≤ ↑emax ∧ e = max (e + ↑(Nat.size (Nat.succ m')) - ↑prec) emin
ss : Nat.size m' = Nat.size (Nat.succ m')
⊢ emin ≤ e + ↑prec - 1 ∧ e + ↑prec - 1 ≤ ↑emax ∧ e = max (e + ↑(Nat.size m') - ↑prec) emin
[PROOFSTEP]
rw [ss]
[GOAL]
C : FloatCfg
e : ℤ
m m' : ℕ
v : emin ≤ e + ↑prec - 1 ∧ e + ↑prec - 1 ≤ ↑emax ∧ e = max (e + ↑(Nat.size (Nat.succ m')) - ↑prec) emin
ss : Nat.size m' = Nat.size (Nat.succ m')
⊢ emin ≤ e + ↑prec - 1 ∧ e + ↑prec - 1 ≤ ↑emax ∧ e = max (e + ↑(Nat.size (Nat.succ m')) - ↑prec) emin
[PROOFSTEP]
exact v


[GOAL]
M : Type u_1
inst✝ : MulOneClass M
a b : M
h : 1 * a = b
⊢ a = b
[PROOFSTEP]
rwa [one_mul] at h


[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x y z : V
hxyne : x ≠ y
hxzne : x ≠ z
hxy : ‖x‖ = ‖y‖
hxz : ‖x‖ = ‖z‖
⊢ oangle o y z = 2 • oangle o (y - x) (z - x)
[PROOFSTEP]
have hy : y ≠ 0 := by
  rintro rfl
  rw [norm_zero, norm_eq_zero] at hxy
  exact hxyne hxy
[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x y z : V
hxyne : x ≠ y
hxzne : x ≠ z
hxy : ‖x‖ = ‖y‖
hxz : ‖x‖ = ‖z‖
⊢ y ≠ 0
[PROOFSTEP]
rintro rfl
[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x z : V
hxzne : x ≠ z
hxz : ‖x‖ = ‖z‖
hxyne : x ≠ 0
hxy : ‖x‖ = ‖0‖
⊢ False
[PROOFSTEP]
rw [norm_zero, norm_eq_zero] at hxy
[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x z : V
hxzne : x ≠ z
hxz : ‖x‖ = ‖z‖
hxyne : x ≠ 0
hxy : x = 0
⊢ False
[PROOFSTEP]
exact hxyne hxy
[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x y z : V
hxyne : x ≠ y
hxzne : x ≠ z
hxy : ‖x‖ = ‖y‖
hxz : ‖x‖ = ‖z‖
hy : y ≠ 0
⊢ oangle o y z = 2 • oangle o (y - x) (z - x)
[PROOFSTEP]
have hx : x ≠ 0 := norm_ne_zero_iff.1 (hxy.symm ▸ norm_ne_zero_iff.2 hy)
[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x y z : V
hxyne : x ≠ y
hxzne : x ≠ z
hxy : ‖x‖ = ‖y‖
hxz : ‖x‖ = ‖z‖
hy : y ≠ 0
hx : x ≠ 0
⊢ oangle o y z = 2 • oangle o (y - x) (z - x)
[PROOFSTEP]
have hz : z ≠ 0 := norm_ne_zero_iff.1 (hxz ▸ norm_ne_zero_iff.2 hx)
[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x y z : V
hxyne : x ≠ y
hxzne : x ≠ z
hxy : ‖x‖ = ‖y‖
hxz : ‖x‖ = ‖z‖
hy : y ≠ 0
hx : x ≠ 0
hz : z ≠ 0
⊢ oangle o y z = 2 • oangle o (y - x) (z - x)
[PROOFSTEP]
calc
  o.oangle y z = o.oangle x z - o.oangle x y := (o.oangle_sub_left hx hy hz).symm
  _ = π - (2 : ℤ) • o.oangle (x - z) x - (π - (2 : ℤ) • o.oangle (x - y) x) := by
    rw [o.oangle_eq_pi_sub_two_zsmul_oangle_sub_of_norm_eq hxzne.symm hxz.symm,
      o.oangle_eq_pi_sub_two_zsmul_oangle_sub_of_norm_eq hxyne.symm hxy.symm]
  _ = (2 : ℤ) • (o.oangle (x - y) x - o.oangle (x - z) x) := by abel
  _ = (2 : ℤ) • o.oangle (x - y) (x - z) := by
    rw [o.oangle_sub_right (sub_ne_zero_of_ne hxyne) (sub_ne_zero_of_ne hxzne) hx]
  _ = (2 : ℤ) • o.oangle (y - x) (z - x) := by rw [← oangle_neg_neg, neg_sub, neg_sub]
[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x y z : V
hxyne : x ≠ y
hxzne : x ≠ z
hxy : ‖x‖ = ‖y‖
hxz : ‖x‖ = ‖z‖
hy : y ≠ 0
hx : x ≠ 0
hz : z ≠ 0
⊢ oangle o x z - oangle o x y = ↑π - 2 • oangle o (x - z) x - (↑π - 2 • oangle o (x - y) x)
[PROOFSTEP]
rw [o.oangle_eq_pi_sub_two_zsmul_oangle_sub_of_norm_eq hxzne.symm hxz.symm,
  o.oangle_eq_pi_sub_two_zsmul_oangle_sub_of_norm_eq hxyne.symm hxy.symm]
[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x y z : V
hxyne : x ≠ y
hxzne : x ≠ z
hxy : ‖x‖ = ‖y‖
hxz : ‖x‖ = ‖z‖
hy : y ≠ 0
hx : x ≠ 0
hz : z ≠ 0
⊢ ↑π - 2 • oangle o (x - z) x - (↑π - 2 • oangle o (x - y) x) = 2 • (oangle o (x - y) x - oangle o (x - z) x)
[PROOFSTEP]
abel
[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x y z : V
hxyne : x ≠ y
hxzne : x ≠ z
hxy : ‖x‖ = ‖y‖
hxz : ‖x‖ = ‖z‖
hy : y ≠ 0
hx : x ≠ 0
hz : z ≠ 0
⊢ ↑π - 2 • oangle o (x - z) x - (↑π - 2 • oangle o (x - y) x) = 2 • (oangle o (x - y) x - oangle o (x - z) x)
[PROOFSTEP]
abel
[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x y z : V
hxyne : x ≠ y
hxzne : x ≠ z
hxy : ‖x‖ = ‖y‖
hxz : ‖x‖ = ‖z‖
hy : y ≠ 0
hx : x ≠ 0
hz : z ≠ 0
⊢ 2 • (oangle o (x - y) x - oangle o (x - z) x) = 2 • oangle o (x - y) (x - z)
[PROOFSTEP]
rw [o.oangle_sub_right (sub_ne_zero_of_ne hxyne) (sub_ne_zero_of_ne hxzne) hx]
[GOAL]
V : Type u_1
inst✝² : NormedAddCommGroup V
inst✝¹ : InnerProductSpace ℝ V
inst✝ : Fact (finrank ℝ V = 2)
o : Orientation ℝ V (Fin 2)
x y z : V
hxyne : x ≠ y
hxzne : x ≠ z
hxy : ‖x‖ = ‖y‖
hxz : ‖x‖ = ‖z‖
hy : y ≠ 0
hx : x ≠ 0
hz : z ≠ 0
⊢ 2 • oangle o (x - y) (x - z) = 2 • oangle o (y - x) (z - x)
[PROOFSTEP]
rw [← oangle_neg_neg, neg_sub, neg_sub]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
hp₃ : p₃ ∈ s
hp₂p₁ : p₂ ≠ p₁
hp₂p₃ : p₂ ≠ p₃
⊢ ∡ p₁ s.center p₃ = 2 • ∡ p₁ p₂ p₃
[PROOFSTEP]
rw [mem_sphere, @dist_eq_norm_vsub V] at hp₁ hp₂ hp₃
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : ‖p₁ -ᵥ s.center‖ = s.radius
hp₂ : ‖p₂ -ᵥ s.center‖ = s.radius
hp₃ : ‖p₃ -ᵥ s.center‖ = s.radius
hp₂p₁ : p₂ ≠ p₁
hp₂p₃ : p₂ ≠ p₃
⊢ ∡ p₁ s.center p₃ = 2 • ∡ p₁ p₂ p₃
[PROOFSTEP]
rw [oangle, oangle, o.oangle_eq_two_zsmul_oangle_sub_of_norm_eq_real _ _ hp₂ hp₁ hp₃]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : ‖p₁ -ᵥ s.center‖ = s.radius
hp₂ : ‖p₂ -ᵥ s.center‖ = s.radius
hp₃ : ‖p₃ -ᵥ s.center‖ = s.radius
hp₂p₁ : p₂ ≠ p₁
hp₂p₃ : p₂ ≠ p₃
⊢ 2 • Orientation.oangle o (p₁ -ᵥ s.center - (p₂ -ᵥ s.center)) (p₃ -ᵥ s.center - (p₂ -ᵥ s.center)) =
    2 • Orientation.oangle o (p₁ -ᵥ p₂) (p₃ -ᵥ p₂)
[PROOFSTEP]
simp [hp₂p₁, hp₂p₃]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : ‖p₁ -ᵥ s.center‖ = s.radius
hp₂ : ‖p₂ -ᵥ s.center‖ = s.radius
hp₃ : ‖p₃ -ᵥ s.center‖ = s.radius
hp₂p₁ : p₂ ≠ p₁
hp₂p₃ : p₂ ≠ p₃
⊢ p₂ -ᵥ s.center ≠ p₁ -ᵥ s.center
[PROOFSTEP]
simp [hp₂p₁, hp₂p₃]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : ‖p₁ -ᵥ s.center‖ = s.radius
hp₂ : ‖p₂ -ᵥ s.center‖ = s.radius
hp₃ : ‖p₃ -ᵥ s.center‖ = s.radius
hp₂p₁ : p₂ ≠ p₁
hp₂p₃ : p₂ ≠ p₃
⊢ p₂ -ᵥ s.center ≠ p₃ -ᵥ s.center
[PROOFSTEP]
simp [hp₂p₁, hp₂p₃]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ p₄ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
hp₃ : p₃ ∈ s
hp₄ : p₄ ∈ s
hp₂p₁ : p₂ ≠ p₁
hp₂p₄ : p₂ ≠ p₄
hp₃p₁ : p₃ ≠ p₁
hp₃p₄ : p₃ ≠ p₄
⊢ 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
[PROOFSTEP]
rw [mem_sphere, @dist_eq_norm_vsub V] at hp₁ hp₂ hp₃ hp₄
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ p₄ : P
hp₁ : ‖p₁ -ᵥ s.center‖ = s.radius
hp₂ : ‖p₂ -ᵥ s.center‖ = s.radius
hp₃ : ‖p₃ -ᵥ s.center‖ = s.radius
hp₄ : ‖p₄ -ᵥ s.center‖ = s.radius
hp₂p₁ : p₂ ≠ p₁
hp₂p₄ : p₂ ≠ p₄
hp₃p₁ : p₃ ≠ p₁
hp₃p₄ : p₃ ≠ p₄
⊢ 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
[PROOFSTEP]
rw [oangle, oangle, ← vsub_sub_vsub_cancel_right p₁ p₂ s.center, ← vsub_sub_vsub_cancel_right p₄ p₂ s.center,
  o.two_zsmul_oangle_sub_eq_two_zsmul_oangle_sub_of_norm_eq _ _ _ _ hp₂ hp₃ hp₁ hp₄]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ p₄ : P
hp₁ : ‖p₁ -ᵥ s.center‖ = s.radius
hp₂ : ‖p₂ -ᵥ s.center‖ = s.radius
hp₃ : ‖p₃ -ᵥ s.center‖ = s.radius
hp₄ : ‖p₄ -ᵥ s.center‖ = s.radius
hp₂p₁ : p₂ ≠ p₁
hp₂p₄ : p₂ ≠ p₄
hp₃p₁ : p₃ ≠ p₁
hp₃p₄ : p₃ ≠ p₄
⊢ 2 • Orientation.oangle o (p₁ -ᵥ s.center - (p₃ -ᵥ s.center)) (p₄ -ᵥ s.center - (p₃ -ᵥ s.center)) =
    2 • Orientation.oangle o (p₁ -ᵥ p₃) (p₄ -ᵥ p₃)
[PROOFSTEP]
simp [hp₂p₁, hp₂p₄, hp₃p₁, hp₃p₄]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ p₄ : P
hp₁ : ‖p₁ -ᵥ s.center‖ = s.radius
hp₂ : ‖p₂ -ᵥ s.center‖ = s.radius
hp₃ : ‖p₃ -ᵥ s.center‖ = s.radius
hp₄ : ‖p₄ -ᵥ s.center‖ = s.radius
hp₂p₁ : p₂ ≠ p₁
hp₂p₄ : p₂ ≠ p₄
hp₃p₁ : p₃ ≠ p₁
hp₃p₄ : p₃ ≠ p₄
⊢ p₂ -ᵥ s.center ≠ p₁ -ᵥ s.center
[PROOFSTEP]
simp [hp₂p₁, hp₂p₄, hp₃p₁, hp₃p₄]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ p₄ : P
hp₁ : ‖p₁ -ᵥ s.center‖ = s.radius
hp₂ : ‖p₂ -ᵥ s.center‖ = s.radius
hp₃ : ‖p₃ -ᵥ s.center‖ = s.radius
hp₄ : ‖p₄ -ᵥ s.center‖ = s.radius
hp₂p₁ : p₂ ≠ p₁
hp₂p₄ : p₂ ≠ p₄
hp₃p₁ : p₃ ≠ p₁
hp₃p₄ : p₃ ≠ p₄
⊢ p₂ -ᵥ s.center ≠ p₄ -ᵥ s.center
[PROOFSTEP]
simp [hp₂p₁, hp₂p₄, hp₃p₁, hp₃p₄]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ p₄ : P
hp₁ : ‖p₁ -ᵥ s.center‖ = s.radius
hp₂ : ‖p₂ -ᵥ s.center‖ = s.radius
hp₃ : ‖p₃ -ᵥ s.center‖ = s.radius
hp₄ : ‖p₄ -ᵥ s.center‖ = s.radius
hp₂p₁ : p₂ ≠ p₁
hp₂p₄ : p₂ ≠ p₄
hp₃p₁ : p₃ ≠ p₁
hp₃p₄ : p₃ ≠ p₄
⊢ p₃ -ᵥ s.center ≠ p₁ -ᵥ s.center
[PROOFSTEP]
simp [hp₂p₁, hp₂p₄, hp₃p₁, hp₃p₄]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ p₄ : P
hp₁ : ‖p₁ -ᵥ s.center‖ = s.radius
hp₂ : ‖p₂ -ᵥ s.center‖ = s.radius
hp₃ : ‖p₃ -ᵥ s.center‖ = s.radius
hp₄ : ‖p₄ -ᵥ s.center‖ = s.radius
hp₂p₁ : p₂ ≠ p₁
hp₂p₄ : p₂ ≠ p₄
hp₃p₁ : p₃ ≠ p₁
hp₃p₄ : p₃ ≠ p₄
⊢ p₃ -ᵥ s.center ≠ p₄ -ᵥ s.center
[PROOFSTEP]
simp [hp₂p₁, hp₂p₄, hp₃p₁, hp₃p₄]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : Cospherical {p₁, p₂, p₃, p₄}
hp₂p₁ : p₂ ≠ p₁
hp₂p₄ : p₂ ≠ p₄
hp₃p₁ : p₃ ≠ p₁
hp₃p₄ : p₃ ≠ p₄
⊢ 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
[PROOFSTEP]
obtain ⟨s, hs⟩ := cospherical_iff_exists_sphere.1 h
[GOAL]
case intro
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : Cospherical {p₁, p₂, p₃, p₄}
hp₂p₁ : p₂ ≠ p₁
hp₂p₄ : p₂ ≠ p₄
hp₃p₁ : p₃ ≠ p₁
hp₃p₄ : p₃ ≠ p₄
s : Sphere P
hs : {p₁, p₂, p₃, p₄} ⊆ Metric.sphere s.center s.radius
⊢ 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
[PROOFSTEP]
simp_rw [Set.insert_subset_iff, Set.singleton_subset_iff, Sphere.mem_coe] at hs
[GOAL]
case intro
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : Cospherical {p₁, p₂, p₃, p₄}
hp₂p₁ : p₂ ≠ p₁
hp₂p₄ : p₂ ≠ p₄
hp₃p₁ : p₃ ≠ p₁
hp₃p₄ : p₃ ≠ p₄
s : Sphere P
hs : p₁ ∈ s ∧ p₂ ∈ s ∧ p₃ ∈ s ∧ p₄ ∈ s
⊢ 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
[PROOFSTEP]
exact Sphere.two_zsmul_oangle_eq hs.1 hs.2.1 hs.2.2.1 hs.2.2.2 hp₂p₁ hp₂p₄ hp₃p₁ hp₃p₄
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ ∡ p₁ s.center p₂ = ↑π - 2 • ∡ s.center p₂ p₁
[PROOFSTEP]
rw [oangle_eq_pi_sub_two_zsmul_oangle_of_dist_eq h.symm (dist_center_eq_dist_center_of_mem_sphere' hp₂ hp₁)]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ ∡ p₁ s.center p₂ = ↑π - 2 • ∡ p₂ p₁ s.center
[PROOFSTEP]
rw [oangle_eq_pi_sub_two_zsmul_oangle_center_left hp₁ hp₂ h,
  oangle_eq_oangle_of_dist_eq (dist_center_eq_dist_center_of_mem_sphere' hp₂ hp₁)]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
hp₃ : p₃ ∈ s
hp₂p₁ : p₂ ≠ p₁
hp₂p₃ : p₂ ≠ p₃
hp₁p₃ : p₁ ≠ p₃
⊢ 2 • ∡ p₃ p₁ s.center + 2 • ∡ p₁ p₂ p₃ = ↑π
[PROOFSTEP]
rw [← oangle_center_eq_two_zsmul_oangle hp₁ hp₂ hp₃ hp₂p₁ hp₂p₃,
  oangle_eq_pi_sub_two_zsmul_oangle_center_right hp₁ hp₃ hp₁p₃, add_sub_cancel'_right]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ (Real.Angle.tan (∡ p₂ p₁ s.center) / 2) • ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) +ᵥ midpoint ℝ p₁ p₂ = s.center
[PROOFSTEP]
obtain ⟨r, hr⟩ :=
  (dist_eq_iff_eq_smul_rotation_pi_div_two_vadd_midpoint h).1 (dist_center_eq_dist_center_of_mem_sphere hp₁ hp₂)
[GOAL]
case intro
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
r : ℝ
hr : r • ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) +ᵥ midpoint ℝ p₁ p₂ = s.center
⊢ (Real.Angle.tan (∡ p₂ p₁ s.center) / 2) • ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) +ᵥ midpoint ℝ p₁ p₂ = s.center
[PROOFSTEP]
rw [← hr, ← oangle_midpoint_rev_left, oangle, vadd_vsub_assoc]
[GOAL]
case intro
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
r : ℝ
hr : r • ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) +ᵥ midpoint ℝ p₁ p₂ = s.center
⊢ (Real.Angle.tan
            (Orientation.oangle o (midpoint ℝ p₁ p₂ -ᵥ p₁)
              (r • ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) + (midpoint ℝ p₁ p₂ -ᵥ p₁))) /
          2) •
        ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) +ᵥ
      midpoint ℝ p₁ p₂ =
    r • ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) +ᵥ midpoint ℝ p₁ p₂
[PROOFSTEP]
nth_rw 1 [show p₂ -ᵥ p₁ = (2 : ℝ) • (midpoint ℝ p₁ p₂ -ᵥ p₁) by simp]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
r : ℝ
hr : r • ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) +ᵥ midpoint ℝ p₁ p₂ = s.center
⊢ p₂ -ᵥ p₁ = 2 • (midpoint ℝ p₁ p₂ -ᵥ p₁)
[PROOFSTEP]
simp
[GOAL]
case intro
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
r : ℝ
hr : r • ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) +ᵥ midpoint ℝ p₁ p₂ = s.center
⊢ (Real.Angle.tan
            (Orientation.oangle o (midpoint ℝ p₁ p₂ -ᵥ p₁)
              (r • ↑(Orientation.rotation o ↑(π / 2)) (2 • (midpoint ℝ p₁ p₂ -ᵥ p₁)) + (midpoint ℝ p₁ p₂ -ᵥ p₁))) /
          2) •
        ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) +ᵥ
      midpoint ℝ p₁ p₂ =
    r • ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) +ᵥ midpoint ℝ p₁ p₂
[PROOFSTEP]
rw [map_smul, smul_smul, add_comm, o.tan_oangle_add_right_smul_rotation_pi_div_two, mul_div_cancel _ (two_ne_zero' ℝ)]
[GOAL]
case intro.h
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
r : ℝ
hr : r • ↑(Orientation.rotation o ↑(π / 2)) (p₂ -ᵥ p₁) +ᵥ midpoint ℝ p₁ p₂ = s.center
⊢ midpoint ℝ p₁ p₂ -ᵥ p₁ ≠ 0
[PROOFSTEP]
simpa using h.symm
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
hp₃ : p₃ ∈ s
hp₁p₂ : p₁ ≠ p₂
hp₁p₃ : p₁ ≠ p₃
hp₂p₃ : p₂ ≠ p₃
⊢ ((Real.Angle.tan (∡ p₁ p₂ p₃))⁻¹ / 2) • ↑(Orientation.rotation o ↑(π / 2)) (p₃ -ᵥ p₁) +ᵥ midpoint ℝ p₁ p₃ = s.center
[PROOFSTEP]
convert tan_div_two_smul_rotation_pi_div_two_vadd_midpoint_eq_center hp₁ hp₃ hp₁p₃
[GOAL]
case h.e'_2.h.e'_5.h.e'_5.h.e'_5
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
hp₃ : p₃ ∈ s
hp₁p₂ : p₁ ≠ p₂
hp₁p₃ : p₁ ≠ p₃
hp₂p₃ : p₂ ≠ p₃
⊢ (Real.Angle.tan (∡ p₁ p₂ p₃))⁻¹ = Real.Angle.tan (∡ p₃ p₁ s.center)
[PROOFSTEP]
convert (Real.Angle.tan_eq_inv_of_two_zsmul_add_two_zsmul_eq_pi _).symm
[GOAL]
case h.e'_2.h.e'_5.h.e'_5.h.e'_5.convert_3
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
hp₃ : p₃ ∈ s
hp₁p₂ : p₁ ≠ p₂
hp₁p₃ : p₁ ≠ p₃
hp₂p₃ : p₂ ≠ p₃
⊢ 2 • ∡ p₁ p₂ p₃ + 2 • ∡ p₃ p₁ s.center = ↑π
[PROOFSTEP]
rw [add_comm, two_zsmul_oangle_center_add_two_zsmul_oangle_eq_pi hp₁ hp₂ hp₃ hp₁p₂.symm hp₂p₃ hp₁p₃]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ dist p₁ p₂ / Real.Angle.cos (∡ p₂ p₁ s.center) / 2 = s.radius
[PROOFSTEP]
rw [div_right_comm, div_eq_mul_inv _ (2 : ℝ), mul_comm,
  show (2 : ℝ)⁻¹ * dist p₁ p₂ = dist p₁ (midpoint ℝ p₁ p₂) by simp, ← mem_sphere.1 hp₁, ←
  tan_div_two_smul_rotation_pi_div_two_vadd_midpoint_eq_center hp₁ hp₂ h, ← oangle_midpoint_rev_left, oangle,
  vadd_vsub_assoc, show p₂ -ᵥ p₁ = (2 : ℝ) • (midpoint ℝ p₁ p₂ -ᵥ p₁) by simp, map_smul, smul_smul,
  div_mul_cancel _ (two_ne_zero' ℝ), @dist_eq_norm_vsub' V, @dist_eq_norm_vsub' V, vadd_vsub_assoc, add_comm,
  o.oangle_add_right_smul_rotation_pi_div_two, Real.Angle.cos_coe, Real.cos_arctan]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ 2⁻¹ * dist p₁ p₂ = dist p₁ (midpoint ℝ p₁ p₂)
[PROOFSTEP]
simp
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ p₂ -ᵥ p₁ = 2 • (midpoint ℝ p₁ p₂ -ᵥ p₁)
[PROOFSTEP]
simp
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ / (↑1 / Real.sqrt (↑1 + Real.Angle.tan (∡ p₂ p₁ s.center) ^ 2)) =
    ‖midpoint ℝ p₁ p₂ -ᵥ p₁ +
        Real.Angle.tan (∡ p₂ p₁ s.center) • ↑(Orientation.rotation o ↑(π / 2)) (midpoint ℝ p₁ p₂ -ᵥ p₁)‖
case h
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ midpoint ℝ p₁ p₂ -ᵥ p₁ ≠ 0
[PROOFSTEP]
norm_cast
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ / (1 / Real.sqrt (1 + Real.Angle.tan (∡ p₂ p₁ s.center) ^ 2)) =
    ‖midpoint ℝ p₁ p₂ -ᵥ p₁ +
        Real.Angle.tan (∡ p₂ p₁ s.center) • ↑(Orientation.rotation o ↑(π / 2)) (midpoint ℝ p₁ p₂ -ᵥ p₁)‖
case h
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ midpoint ℝ p₁ p₂ -ᵥ p₁ ≠ 0
[PROOFSTEP]
rw [one_div, div_inv_eq_mul, ← mul_self_inj (mul_nonneg (norm_nonneg _) (Real.sqrt_nonneg _)) (norm_nonneg _),
  norm_add_sq_eq_norm_sq_add_norm_sq_real (o.inner_smul_rotation_pi_div_two_right _ _), ← mul_assoc, mul_comm,
  mul_comm _ (Real.sqrt _), ← mul_assoc, ← mul_assoc, Real.mul_self_sqrt (add_nonneg zero_le_one (sq_nonneg _)),
  norm_smul, LinearIsometryEquiv.norm_map]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ (1 + Real.Angle.tan (∡ p₂ p₁ s.center) ^ 2) * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ =
    ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ +
      ‖Real.Angle.tan (∡ p₂ p₁ s.center)‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ *
        (‖Real.Angle.tan (∡ p₂ p₁ s.center)‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖)
case h
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ midpoint ℝ p₁ p₂ -ᵥ p₁ ≠ 0
[PROOFSTEP]
swap
[GOAL]
case h
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ midpoint ℝ p₁ p₂ -ᵥ p₁ ≠ 0
[PROOFSTEP]
simpa using h.symm
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ (1 + Real.Angle.tan (∡ p₂ p₁ s.center) ^ 2) * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ =
    ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ +
      ‖Real.Angle.tan (∡ p₂ p₁ s.center)‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ *
        (‖Real.Angle.tan (∡ p₂ p₁ s.center)‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖)
[PROOFSTEP]
conv_rhs => rw [← mul_assoc, mul_comm _ ‖Real.Angle.tan _‖, ← mul_assoc, Real.norm_eq_abs, abs_mul_abs_self]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
| ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ +
    ‖Real.Angle.tan (∡ p₂ p₁ s.center)‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ *
      (‖Real.Angle.tan (∡ p₂ p₁ s.center)‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖)
[PROOFSTEP]
rw [← mul_assoc, mul_comm _ ‖Real.Angle.tan _‖, ← mul_assoc, Real.norm_eq_abs, abs_mul_abs_self]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
| ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ +
    ‖Real.Angle.tan (∡ p₂ p₁ s.center)‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ *
      (‖Real.Angle.tan (∡ p₂ p₁ s.center)‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖)
[PROOFSTEP]
rw [← mul_assoc, mul_comm _ ‖Real.Angle.tan _‖, ← mul_assoc, Real.norm_eq_abs, abs_mul_abs_self]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
| ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ +
    ‖Real.Angle.tan (∡ p₂ p₁ s.center)‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ *
      (‖Real.Angle.tan (∡ p₂ p₁ s.center)‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖)
[PROOFSTEP]
rw [← mul_assoc, mul_comm _ ‖Real.Angle.tan _‖, ← mul_assoc, Real.norm_eq_abs, abs_mul_abs_self]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ (1 + Real.Angle.tan (∡ p₂ p₁ s.center) ^ 2) * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ =
    ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ +
      Real.Angle.tan (∡ p₂ p₁ s.center) * Real.Angle.tan (∡ p₂ p₁ s.center) * ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖ *
        ‖midpoint ℝ p₁ p₂ -ᵥ p₁‖
[PROOFSTEP]
ring
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
h : p₁ ≠ p₂
⊢ dist p₁ p₂ / Real.Angle.cos (∡ p₂ p₁ s.center) = 2 * s.radius
[PROOFSTEP]
rw [← dist_div_cos_oangle_center_div_two_eq_radius hp₁ hp₂ h, mul_div_cancel' _ (two_ne_zero' ℝ)]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
hp₃ : p₃ ∈ s
hp₁p₂ : p₁ ≠ p₂
hp₁p₃ : p₁ ≠ p₃
hp₂p₃ : p₂ ≠ p₃
⊢ dist p₁ p₃ / |Real.Angle.sin (∡ p₁ p₂ p₃)| / 2 = s.radius
[PROOFSTEP]
convert dist_div_cos_oangle_center_div_two_eq_radius hp₁ hp₃ hp₁p₃
[GOAL]
case h.e'_2.h.e'_5.h.e'_6
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
hp₃ : p₃ ∈ s
hp₁p₂ : p₁ ≠ p₂
hp₁p₃ : p₁ ≠ p₃
hp₂p₃ : p₂ ≠ p₃
⊢ |Real.Angle.sin (∡ p₁ p₂ p₃)| = Real.Angle.cos (∡ p₃ p₁ s.center)
[PROOFSTEP]
rw [←
  Real.Angle.abs_cos_eq_abs_sin_of_two_zsmul_add_two_zsmul_eq_pi
    (two_zsmul_oangle_center_add_two_zsmul_oangle_eq_pi hp₁ hp₂ hp₃ hp₁p₂.symm hp₂p₃ hp₁p₃),
  _root_.abs_of_nonneg (Real.Angle.cos_nonneg_iff_abs_toReal_le_pi_div_two.2 _)]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
hp₃ : p₃ ∈ s
hp₁p₂ : p₁ ≠ p₂
hp₁p₃ : p₁ ≠ p₃
hp₂p₃ : p₂ ≠ p₃
⊢ |Real.Angle.toReal (∡ p₃ p₁ s.center)| ≤ π / 2
[PROOFSTEP]
exact (abs_oangle_center_right_toReal_lt_pi_div_two hp₁ hp₃).le
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
s : Sphere P
p₁ p₂ p₃ : P
hp₁ : p₁ ∈ s
hp₂ : p₂ ∈ s
hp₃ : p₃ ∈ s
hp₁p₂ : p₁ ≠ p₂
hp₁p₃ : p₁ ≠ p₃
hp₂p₃ : p₂ ≠ p₃
⊢ dist p₁ p₃ / |Real.Angle.sin (∡ p₁ p₂ p₃)| = 2 * s.radius
[PROOFSTEP]
rw [← dist_div_sin_oangle_div_two_eq_radius hp₁ hp₂ hp₃ hp₁p₂ hp₁p₃ hp₂p₃, mul_div_cancel' _ (two_ne_zero' ℝ)]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t₁ t₂ : Triangle ℝ P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h₁ : Simplex.points t₁ i₁ = Simplex.points t₂ i₁
h₃ : Simplex.points t₁ i₃ = Simplex.points t₂ i₃
h₂ :
  2 • ∡ (Simplex.points t₁ i₁) (Simplex.points t₁ i₂) (Simplex.points t₁ i₃) =
    2 • ∡ (Simplex.points t₂ i₁) (Simplex.points t₂ i₂) (Simplex.points t₂ i₃)
⊢ Simplex.circumsphere t₁ = Simplex.circumsphere t₂
[PROOFSTEP]
rw [t₁.circumsphere_eq_of_dist_of_oangle h₁₂ h₁₃ h₂₃, t₂.circumsphere_eq_of_dist_of_oangle h₁₂ h₁₃ h₂₃,
  -- Porting note: was `congrm ⟨((_ : ℝ)⁻¹ / 2) • _ +ᵥ _, _ / _ / 2⟩` and five more linesReal.Angle.tan_eq_of_two_zsmul_eq
    h₂,
  Real.Angle.abs_sin_eq_of_two_zsmul_eq h₂, h₁, h₃]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
⊢ p ∈ Simplex.circumsphere t
[PROOFSTEP]
let t'p : Fin 3 → P := Function.update t.points i₂ p
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
⊢ p ∈ Simplex.circumsphere t
[PROOFSTEP]
have h₁ : t'p i₁ = t.points i₁ := by simp [h₁₂]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
⊢ t'p i₁ = Simplex.points t i₁
[PROOFSTEP]
simp [h₁₂]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
⊢ p ∈ Simplex.circumsphere t
[PROOFSTEP]
have h₂ : t'p i₂ = p := by simp
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
⊢ t'p i₂ = p
[PROOFSTEP]
simp
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
⊢ p ∈ Simplex.circumsphere t
[PROOFSTEP]
have h₃ : t'p i₃ = t.points i₃ := by simp [h₂₃.symm]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
⊢ t'p i₃ = Simplex.points t i₃
[PROOFSTEP]
simp [h₂₃.symm]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
h₃ : t'p i₃ = Simplex.points t i₃
⊢ p ∈ Simplex.circumsphere t
[PROOFSTEP]
have ha : AffineIndependent ℝ t'p :=
  by
  rw [affineIndependent_iff_not_collinear_of_ne h₁₂ h₁₃ h₂₃, h₁, h₂, h₃, collinear_iff_of_two_zsmul_oangle_eq h, ←
    affineIndependent_iff_not_collinear_of_ne h₁₂ h₁₃ h₂₃]
  exact t.Independent
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
h₃ : t'p i₃ = Simplex.points t i₃
⊢ AffineIndependent ℝ t'p
[PROOFSTEP]
rw [affineIndependent_iff_not_collinear_of_ne h₁₂ h₁₃ h₂₃, h₁, h₂, h₃, collinear_iff_of_two_zsmul_oangle_eq h, ←
  affineIndependent_iff_not_collinear_of_ne h₁₂ h₁₃ h₂₃]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
h₃ : t'p i₃ = Simplex.points t i₃
⊢ AffineIndependent ℝ t.points
[PROOFSTEP]
exact t.Independent
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
h₃ : t'p i₃ = Simplex.points t i₃
ha : AffineIndependent ℝ t'p
⊢ p ∈ Simplex.circumsphere t
[PROOFSTEP]
let t' : Triangle ℝ P := ⟨t'p, ha⟩
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
h₃ : t'p i₃ = Simplex.points t i₃
ha : AffineIndependent ℝ t'p
t' : Triangle ℝ P := { points := t'p, Independent := ha }
⊢ p ∈ Simplex.circumsphere t
[PROOFSTEP]
have h₁' : t'.points i₁ = t.points i₁ := h₁
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
h₃ : t'p i₃ = Simplex.points t i₃
ha : AffineIndependent ℝ t'p
t' : Triangle ℝ P := { points := t'p, Independent := ha }
h₁' : Simplex.points t' i₁ = Simplex.points t i₁
⊢ p ∈ Simplex.circumsphere t
[PROOFSTEP]
have h₂' : t'.points i₂ = p := h₂
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
h₃ : t'p i₃ = Simplex.points t i₃
ha : AffineIndependent ℝ t'p
t' : Triangle ℝ P := { points := t'p, Independent := ha }
h₁' : Simplex.points t' i₁ = Simplex.points t i₁
h₂' : Simplex.points t' i₂ = p
⊢ p ∈ Simplex.circumsphere t
[PROOFSTEP]
have h₃' : t'.points i₃ = t.points i₃ := h₃
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
h₃ : t'p i₃ = Simplex.points t i₃
ha : AffineIndependent ℝ t'p
t' : Triangle ℝ P := { points := t'p, Independent := ha }
h₁' : Simplex.points t' i₁ = Simplex.points t i₁
h₂' : Simplex.points t' i₂ = p
h₃' : Simplex.points t' i₃ = Simplex.points t i₃
⊢ p ∈ Simplex.circumsphere t
[PROOFSTEP]
have h' :
  (2 : ℤ) • ∡ (t'.points i₁) (t'.points i₂) (t'.points i₃) = (2 : ℤ) • ∡ (t.points i₁) (t.points i₂) (t.points i₃) := by
  rwa [h₁', h₂', h₃']
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
h₃ : t'p i₃ = Simplex.points t i₃
ha : AffineIndependent ℝ t'p
t' : Triangle ℝ P := { points := t'p, Independent := ha }
h₁' : Simplex.points t' i₁ = Simplex.points t i₁
h₂' : Simplex.points t' i₂ = p
h₃' : Simplex.points t' i₃ = Simplex.points t i₃
⊢ 2 • ∡ (Simplex.points t' i₁) (Simplex.points t' i₂) (Simplex.points t' i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
[PROOFSTEP]
rwa [h₁', h₂', h₃']
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
h₃ : t'p i₃ = Simplex.points t i₃
ha : AffineIndependent ℝ t'p
t' : Triangle ℝ P := { points := t'p, Independent := ha }
h₁' : Simplex.points t' i₁ = Simplex.points t i₁
h₂' : Simplex.points t' i₂ = p
h₃' : Simplex.points t' i₃ = Simplex.points t i₃
h' :
  2 • ∡ (Simplex.points t' i₁) (Simplex.points t' i₂) (Simplex.points t' i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
⊢ p ∈ Simplex.circumsphere t
[PROOFSTEP]
rw [← circumsphere_eq_circumsphere_of_eq_of_eq_of_two_zsmul_oangle_eq h₁₂ h₁₃ h₂₃ h₁' h₃' h', ← h₂']
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
t : Triangle ℝ P
p : P
i₁ i₂ i₃ : Fin 3
h₁₂ : i₁ ≠ i₂
h₁₃ : i₁ ≠ i₃
h₂₃ : i₂ ≠ i₃
h :
  2 • ∡ (Simplex.points t i₁) p (Simplex.points t i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
t'p : Fin 3 → P := Function.update t.points i₂ p
h₁ : t'p i₁ = Simplex.points t i₁
h₂ : t'p i₂ = p
h₃ : t'p i₃ = Simplex.points t i₃
ha : AffineIndependent ℝ t'p
t' : Triangle ℝ P := { points := t'p, Independent := ha }
h₁' : Simplex.points t' i₁ = Simplex.points t i₁
h₂' : Simplex.points t' i₂ = p
h₃' : Simplex.points t' i₃ = Simplex.points t i₃
h' :
  2 • ∡ (Simplex.points t' i₁) (Simplex.points t' i₂) (Simplex.points t' i₃) =
    2 • ∡ (Simplex.points t i₁) (Simplex.points t i₂) (Simplex.points t i₃)
⊢ Simplex.points t' i₂ ∈ Simplex.circumsphere t'
[PROOFSTEP]
exact Simplex.mem_circumsphere _ _
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
⊢ Cospherical {p₁, p₂, p₃, p₄}
[PROOFSTEP]
have hn' : ¬Collinear ℝ ({ p₁, p₃, p₄ } : Set P) := by rwa [← collinear_iff_of_two_zsmul_oangle_eq h]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
⊢ ¬Collinear ℝ {p₁, p₃, p₄}
[PROOFSTEP]
rwa [← collinear_iff_of_two_zsmul_oangle_eq h]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
hn' : ¬Collinear ℝ {p₁, p₃, p₄}
⊢ Cospherical {p₁, p₂, p₃, p₄}
[PROOFSTEP]
let t₁ : Affine.Triangle ℝ P := ⟨![p₁, p₂, p₄], affineIndependent_iff_not_collinear_set.2 hn⟩
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
hn' : ¬Collinear ℝ {p₁, p₃, p₄}
t₁ : Affine.Triangle ℝ P := { points := ![p₁, p₂, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₂, p₄]) }
⊢ Cospherical {p₁, p₂, p₃, p₄}
[PROOFSTEP]
let t₂ : Affine.Triangle ℝ P := ⟨![p₁, p₃, p₄], affineIndependent_iff_not_collinear_set.2 hn'⟩
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
hn' : ¬Collinear ℝ {p₁, p₃, p₄}
t₁ : Affine.Triangle ℝ P := { points := ![p₁, p₂, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₂, p₄]) }
t₂ : Affine.Triangle ℝ P := { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }
⊢ Cospherical {p₁, p₂, p₃, p₄}
[PROOFSTEP]
rw [cospherical_iff_exists_sphere]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
hn' : ¬Collinear ℝ {p₁, p₃, p₄}
t₁ : Affine.Triangle ℝ P := { points := ![p₁, p₂, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₂, p₄]) }
t₂ : Affine.Triangle ℝ P := { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }
⊢ ∃ s, {p₁, p₂, p₃, p₄} ⊆ Metric.sphere s.center s.radius
[PROOFSTEP]
refine' ⟨t₂.circumsphere, _⟩
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
hn' : ¬Collinear ℝ {p₁, p₃, p₄}
t₁ : Affine.Triangle ℝ P := { points := ![p₁, p₂, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₂, p₄]) }
t₂ : Affine.Triangle ℝ P := { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }
⊢ {p₁, p₂, p₃, p₄} ⊆ Metric.sphere (Affine.Simplex.circumsphere t₂).center (Affine.Simplex.circumsphere t₂).radius
[PROOFSTEP]
simp_rw [Set.insert_subset_iff, Set.singleton_subset_iff]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
hn' : ¬Collinear ℝ {p₁, p₃, p₄}
t₁ : Affine.Triangle ℝ P := { points := ![p₁, p₂, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₂, p₄]) }
t₂ : Affine.Triangle ℝ P := { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }
⊢ p₁ ∈
      Metric.sphere
        (Affine.Simplex.circumsphere
            { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }).center
        (Affine.Simplex.circumsphere
            { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }).radius ∧
    p₂ ∈
        Metric.sphere
          (Affine.Simplex.circumsphere
              { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }).center
          (Affine.Simplex.circumsphere
              { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }).radius ∧
      p₃ ∈
          Metric.sphere
            (Affine.Simplex.circumsphere
                { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }).center
            (Affine.Simplex.circumsphere
                { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }).radius ∧
        p₄ ∈
          Metric.sphere
            (Affine.Simplex.circumsphere
                { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }).center
            (Affine.Simplex.circumsphere
                { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }).radius
[PROOFSTEP]
refine' ⟨t₂.mem_circumsphere 0, _, t₂.mem_circumsphere 1, t₂.mem_circumsphere 2⟩
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
hn' : ¬Collinear ℝ {p₁, p₃, p₄}
t₁ : Affine.Triangle ℝ P := { points := ![p₁, p₂, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₂, p₄]) }
t₂ : Affine.Triangle ℝ P := { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }
⊢ p₂ ∈
    Metric.sphere
      (Affine.Simplex.circumsphere
          { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }).center
      (Affine.Simplex.circumsphere
          { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }).radius
[PROOFSTEP]
rw [Affine.Triangle.circumsphere_eq_circumsphere_of_eq_of_eq_of_two_zsmul_oangle_eq (by decide : (0 : Fin 3) ≠ 1)
    (by decide : (0 : Fin 3) ≠ 2) (by decide) (show t₂.points 0 = t₁.points 0 from rfl) rfl h.symm]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
hn' : ¬Collinear ℝ {p₁, p₃, p₄}
t₁ : Affine.Triangle ℝ P := { points := ![p₁, p₂, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₂, p₄]) }
t₂ : Affine.Triangle ℝ P := { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }
⊢ 0 ≠ 1
[PROOFSTEP]
decide
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
hn' : ¬Collinear ℝ {p₁, p₃, p₄}
t₁ : Affine.Triangle ℝ P := { points := ![p₁, p₂, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₂, p₄]) }
t₂ : Affine.Triangle ℝ P := { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }
⊢ 0 ≠ 2
[PROOFSTEP]
decide
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
hn' : ¬Collinear ℝ {p₁, p₃, p₄}
t₁ : Affine.Triangle ℝ P := { points := ![p₁, p₂, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₂, p₄]) }
t₂ : Affine.Triangle ℝ P := { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }
⊢ 1 ≠ 2
[PROOFSTEP]
decide
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hn : ¬Collinear ℝ {p₁, p₂, p₄}
hn' : ¬Collinear ℝ {p₁, p₃, p₄}
t₁ : Affine.Triangle ℝ P := { points := ![p₁, p₂, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₂, p₄]) }
t₂ : Affine.Triangle ℝ P := { points := ![p₁, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₁, p₃, p₄]) }
⊢ p₂ ∈ Metric.sphere (Affine.Simplex.circumsphere t₁).center (Affine.Simplex.circumsphere t₁).radius
[PROOFSTEP]
exact t₁.mem_circumsphere 1
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
⊢ Cospherical {p₁, p₂, p₃, p₄} ∨ Collinear ℝ {p₁, p₂, p₃, p₄}
[PROOFSTEP]
by_cases hc : Collinear ℝ ({ p₁, p₂, p₄ } : Set P)
[GOAL]
case pos
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
⊢ Cospherical {p₁, p₂, p₃, p₄} ∨ Collinear ℝ {p₁, p₂, p₃, p₄}
[PROOFSTEP]
by_cases he : p₁ = p₄
[GOAL]
case pos
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : p₁ = p₄
⊢ Cospherical {p₁, p₂, p₃, p₄} ∨ Collinear ℝ {p₁, p₂, p₃, p₄}
[PROOFSTEP]
rw [he, Set.insert_eq_self.2 (Set.mem_insert_of_mem _ (Set.mem_insert_of_mem _ (Set.mem_singleton _)))]
[GOAL]
case pos
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : p₁ = p₄
⊢ Cospherical {p₂, p₃, p₄} ∨ Collinear ℝ {p₂, p₃, p₄}
[PROOFSTEP]
by_cases hl : Collinear ℝ ({ p₂, p₃, p₄ } : Set P)
[GOAL]
case pos
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : p₁ = p₄
hl : Collinear ℝ {p₂, p₃, p₄}
⊢ Cospherical {p₂, p₃, p₄} ∨ Collinear ℝ {p₂, p₃, p₄}
[PROOFSTEP]
exact Or.inr hl
[GOAL]
case neg
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : p₁ = p₄
hl : ¬Collinear ℝ {p₂, p₃, p₄}
⊢ Cospherical {p₂, p₃, p₄} ∨ Collinear ℝ {p₂, p₃, p₄}
[PROOFSTEP]
rw [or_iff_left hl]
[GOAL]
case neg
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : p₁ = p₄
hl : ¬Collinear ℝ {p₂, p₃, p₄}
⊢ Cospherical {p₂, p₃, p₄}
[PROOFSTEP]
let t : Affine.Triangle ℝ P := ⟨![p₂, p₃, p₄], affineIndependent_iff_not_collinear_set.2 hl⟩
[GOAL]
case neg
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : p₁ = p₄
hl : ¬Collinear ℝ {p₂, p₃, p₄}
t : Affine.Triangle ℝ P := { points := ![p₂, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₂, p₃, p₄]) }
⊢ Cospherical {p₂, p₃, p₄}
[PROOFSTEP]
rw [cospherical_iff_exists_sphere]
[GOAL]
case neg
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : p₁ = p₄
hl : ¬Collinear ℝ {p₂, p₃, p₄}
t : Affine.Triangle ℝ P := { points := ![p₂, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₂, p₃, p₄]) }
⊢ ∃ s, {p₂, p₃, p₄} ⊆ Metric.sphere s.center s.radius
[PROOFSTEP]
refine' ⟨t.circumsphere, _⟩
[GOAL]
case neg
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : p₁ = p₄
hl : ¬Collinear ℝ {p₂, p₃, p₄}
t : Affine.Triangle ℝ P := { points := ![p₂, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₂, p₃, p₄]) }
⊢ {p₂, p₃, p₄} ⊆ Metric.sphere (Affine.Simplex.circumsphere t).center (Affine.Simplex.circumsphere t).radius
[PROOFSTEP]
simp_rw [Set.insert_subset_iff, Set.singleton_subset_iff]
[GOAL]
case neg
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : p₁ = p₄
hl : ¬Collinear ℝ {p₂, p₃, p₄}
t : Affine.Triangle ℝ P := { points := ![p₂, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₂, p₃, p₄]) }
⊢ p₂ ∈
      Metric.sphere
        (Affine.Simplex.circumsphere
            { points := ![p₂, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₂, p₃, p₄]) }).center
        (Affine.Simplex.circumsphere
            { points := ![p₂, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₂, p₃, p₄]) }).radius ∧
    p₃ ∈
        Metric.sphere
          (Affine.Simplex.circumsphere
              { points := ![p₂, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₂, p₃, p₄]) }).center
          (Affine.Simplex.circumsphere
              { points := ![p₂, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₂, p₃, p₄]) }).radius ∧
      p₄ ∈
        Metric.sphere
          (Affine.Simplex.circumsphere
              { points := ![p₂, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₂, p₃, p₄]) }).center
          (Affine.Simplex.circumsphere
              { points := ![p₂, p₃, p₄], Independent := (_ : AffineIndependent ℝ ![p₂, p₃, p₄]) }).radius
[PROOFSTEP]
exact ⟨t.mem_circumsphere 0, t.mem_circumsphere 1, t.mem_circumsphere 2⟩
[GOAL]
case neg
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : ¬p₁ = p₄
⊢ Cospherical {p₁, p₂, p₃, p₄} ∨ Collinear ℝ {p₁, p₂, p₃, p₄}
[PROOFSTEP]
have hc' : Collinear ℝ ({ p₁, p₃, p₄ } : Set P) := by rwa [← collinear_iff_of_two_zsmul_oangle_eq h]
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : ¬p₁ = p₄
⊢ Collinear ℝ {p₁, p₃, p₄}
[PROOFSTEP]
rwa [← collinear_iff_of_two_zsmul_oangle_eq h]
[GOAL]
case neg
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : ¬p₁ = p₄
hc' : Collinear ℝ {p₁, p₃, p₄}
⊢ Cospherical {p₁, p₂, p₃, p₄} ∨ Collinear ℝ {p₁, p₂, p₃, p₄}
[PROOFSTEP]
refine' Or.inr _
[GOAL]
case neg
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₄}
he : ¬p₁ = p₄
hc' : Collinear ℝ {p₁, p₃, p₄}
⊢ Collinear ℝ {p₁, p₂, p₃, p₄}
[PROOFSTEP]
rw [Set.insert_comm p₁ p₂] at hc
[GOAL]
case neg
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₂, p₁, p₄}
he : ¬p₁ = p₄
hc' : Collinear ℝ {p₁, p₃, p₄}
⊢ Collinear ℝ {p₁, p₂, p₃, p₄}
[PROOFSTEP]
rwa [Set.insert_comm p₁ p₂,
  hc'.collinear_insert_iff_of_ne (Set.mem_insert _ _)
    (Set.mem_insert_of_mem _ (Set.mem_insert_of_mem _ (Set.mem_singleton _))) he]
[GOAL]
case neg
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : ¬Collinear ℝ {p₁, p₂, p₄}
⊢ Cospherical {p₁, p₂, p₃, p₄} ∨ Collinear ℝ {p₁, p₂, p₃, p₄}
[PROOFSTEP]
exact Or.inl (cospherical_of_two_zsmul_oangle_eq_of_not_collinear h hc)
[GOAL]
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
⊢ Concyclic {p₁, p₂, p₃, p₄} ∨ Collinear ℝ {p₁, p₂, p₃, p₄}
[PROOFSTEP]
rcases cospherical_or_collinear_of_two_zsmul_oangle_eq h with (hc | hc)
[GOAL]
case inl
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Cospherical {p₁, p₂, p₃, p₄}
⊢ Concyclic {p₁, p₂, p₃, p₄} ∨ Collinear ℝ {p₁, p₂, p₃, p₄}
[PROOFSTEP]
exact Or.inl ⟨hc, coplanar_of_fact_finrank_eq_two _⟩
[GOAL]
case inr
V : Type u_1
P : Type u_2
inst✝⁴ : NormedAddCommGroup V
inst✝³ : InnerProductSpace ℝ V
inst✝² : MetricSpace P
inst✝¹ : NormedAddTorsor V P
hd2 : Fact (finrank ℝ V = 2)
inst✝ : Module.Oriented ℝ V (Fin 2)
p₁ p₂ p₃ p₄ : P
h : 2 • ∡ p₁ p₂ p₄ = 2 • ∡ p₁ p₃ p₄
hc : Collinear ℝ {p₁, p₂, p₃, p₄}
⊢ Concyclic {p₁, p₂, p₃, p₄} ∨ Collinear ℝ {p₁, p₂, p₃, p₄}
[PROOFSTEP]
exact Or.inr hc


[GOAL]
R : Type u_1
inst✝ : CommRing R
r : R
⊢ ↑(aeval (IsLocalization.Away.invSelf r)) (↑C r * X - 1) = 0
[PROOFSTEP]
simp only [map_sub, map_mul, aeval_C, aeval_X, IsLocalization.Away.mul_invSelf, aeval_one, sub_self]


[GOAL]
a : { x // x ∈ circle }
src✝ : ℂ ≃ₗ[ℝ] ℂ := DistribMulAction.toLinearEquiv ℝ ℂ a
x : ℂ
⊢ ↑Complex.abs (↑a * x) = ↑Complex.abs x
[PROOFSTEP]
rw [map_mul, abs_coe_circle, one_mul]
[GOAL]
a b : { x // x ∈ circle }
⊢ LinearIsometryEquiv.trans (↑rotation a) (↑rotation b) = ↑rotation (b * a)
[PROOFSTEP]
ext1
[GOAL]
case h
a b : { x // x ∈ circle }
x✝ : ℂ
⊢ ↑(LinearIsometryEquiv.trans (↑rotation a) (↑rotation b)) x✝ = ↑(↑rotation (b * a)) x✝
[PROOFSTEP]
simp
[GOAL]
a : { x // x ∈ circle }
⊢ ↑rotation a ≠ conjLie
[PROOFSTEP]
intro h
[GOAL]
a : { x // x ∈ circle }
h : ↑rotation a = conjLie
⊢ False
[PROOFSTEP]
have h1 : rotation a 1 = conj 1 := LinearIsometryEquiv.congr_fun h 1
[GOAL]
a : { x // x ∈ circle }
h : ↑rotation a = conjLie
h1 : ↑(↑rotation a) 1 = ↑(starRingEnd ℂ) 1
⊢ False
[PROOFSTEP]
have hI : rotation a I = conj I := LinearIsometryEquiv.congr_fun h I
[GOAL]
a : { x // x ∈ circle }
h : ↑rotation a = conjLie
h1 : ↑(↑rotation a) 1 = ↑(starRingEnd ℂ) 1
hI : ↑(↑rotation a) I = ↑(starRingEnd ℂ) I
⊢ False
[PROOFSTEP]
rw [rotation_apply, RingHom.map_one, mul_one] at h1
[GOAL]
a : { x // x ∈ circle }
h : ↑rotation a = conjLie
h1 : ↑a = 1
hI : ↑(↑rotation a) I = ↑(starRingEnd ℂ) I
⊢ False
[PROOFSTEP]
rw [rotation_apply, conj_I, ← neg_one_mul, mul_left_inj' I_ne_zero, h1, eq_neg_self_iff] at hI
[GOAL]
a : { x // x ∈ circle }
h : ↑rotation a = conjLie
h1 : ↑a = 1
hI : 1 = 0
⊢ False
[PROOFSTEP]
exact one_ne_zero hI
[GOAL]
e : ℂ ≃ₗᵢ[ℝ] ℂ
⊢ ↑e 1 / ↑(↑Complex.abs (↑e 1)) ∈ circle
[PROOFSTEP]
simp
[GOAL]
a : { x // x ∈ circle }
⊢ ↑(rotationOf (↑rotation a)) = ↑a
[PROOFSTEP]
simp
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h₃ : ∀ (z : ℂ), z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
z : ℂ
⊢ (↑f z).re = z.re
[PROOFSTEP]
simpa [ext_iff, add_re, add_im, conj_re, conj_im, ← two_mul, show (2 : ℝ) ≠ 0 by simp [two_ne_zero]] using (h₃ z).symm
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h₃ : ∀ (z : ℂ), z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
z : ℂ
⊢ 2 ≠ 0
[PROOFSTEP]
simp [two_ne_zero]
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h₂ : ∀ (z : ℂ), (↑f z).re = z.re
z : ℂ
⊢ (↑f z).im = z.im ∨ (↑f z).im = -z.im
[PROOFSTEP]
have h₁ := f.norm_map z
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h₂ : ∀ (z : ℂ), (↑f z).re = z.re
z : ℂ
h₁ : ‖↑f z‖ = ‖z‖
⊢ (↑f z).im = z.im ∨ (↑f z).im = -z.im
[PROOFSTEP]
simp only [Complex.abs_def, norm_eq_abs] at h₁
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h₂ : ∀ (z : ℂ), (↑f z).re = z.re
z : ℂ
h₁ : Real.sqrt (↑normSq (↑f z)) = Real.sqrt (↑normSq z)
⊢ (↑f z).im = z.im ∨ (↑f z).im = -z.im
[PROOFSTEP]
rwa [Real.sqrt_inj (normSq_nonneg _) (normSq_nonneg _), normSq_apply (f z), normSq_apply z, h₂, add_left_cancel_iff,
  mul_self_eq_mul_self_iff] at h₁
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
have : ‖f z - 1‖ = ‖z - 1‖ := by rw [← f.norm_map (z - 1), f.map_sub, h]
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
⊢ ‖↑f z - 1‖ = ‖z - 1‖
[PROOFSTEP]
rw [← f.norm_map (z - 1), f.map_sub, h]
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
this : ‖↑f z - 1‖ = ‖z - 1‖
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
apply_fun fun x => x ^ 2 at this
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
this : ‖↑f z - 1‖ ^ 2 = ‖z - 1‖ ^ 2
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
simp only [norm_eq_abs, ← normSq_eq_abs] at this
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
this : ↑normSq (↑f z - 1) = ↑normSq (z - 1)
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
rw [← ofReal_inj, ← mul_conj, ← mul_conj] at this
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
this : (↑f z - 1) * ↑(starRingEnd ℂ) (↑f z - 1) = (z - 1) * ↑(starRingEnd ℂ) (z - 1)
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
rw [RingHom.map_sub, RingHom.map_sub] at this
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
this : (↑f z - 1) * (↑(starRingEnd ℂ) (↑f z) - ↑(starRingEnd ℂ) 1) = (z - 1) * (↑(starRingEnd ℂ) z - ↑(starRingEnd ℂ) 1)
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
simp only [sub_mul, mul_sub, one_mul, mul_one] at this
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
this :
  ↑f z * ↑(starRingEnd ℂ) (↑f z) - ↑(starRingEnd ℂ) (↑f z) - (↑f z * ↑(starRingEnd ℂ) 1 - ↑(starRingEnd ℂ) 1) =
    z * ↑(starRingEnd ℂ) z - ↑(starRingEnd ℂ) z - (z * ↑(starRingEnd ℂ) 1 - ↑(starRingEnd ℂ) 1)
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
rw [mul_conj, normSq_eq_abs, ← norm_eq_abs, LinearIsometry.norm_map] at this
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
this :
  ↑(‖z‖ ^ 2) - ↑(starRingEnd ℂ) (↑f z) - (↑f z * ↑(starRingEnd ℂ) 1 - ↑(starRingEnd ℂ) 1) =
    z * ↑(starRingEnd ℂ) z - ↑(starRingEnd ℂ) z - (z * ↑(starRingEnd ℂ) 1 - ↑(starRingEnd ℂ) 1)
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
rw [mul_conj, normSq_eq_abs, ← norm_eq_abs] at this
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
this :
  ↑(‖z‖ ^ 2) - ↑(starRingEnd ℂ) (↑f z) - (↑f z * ↑(starRingEnd ℂ) 1 - ↑(starRingEnd ℂ) 1) =
    ↑(‖z‖ ^ 2) - ↑(starRingEnd ℂ) z - (z * ↑(starRingEnd ℂ) 1 - ↑(starRingEnd ℂ) 1)
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
simp only [sub_sub, sub_right_inj, mul_one, ofReal_pow, RingHom.map_one, norm_eq_abs] at this
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
this : ↑(starRingEnd ℂ) (↑f z) + (↑f z - 1) = ↑(starRingEnd ℂ) z + (z - 1)
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
simp only [add_sub, sub_left_inj] at this
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
this : ↑(starRingEnd ℂ) (↑f z) + ↑f z = ↑(starRingEnd ℂ) z + z
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
rw [add_comm, ← this, add_comm]
[GOAL]
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
⊢ (↑f z).re = z.re
[PROOFSTEP]
apply LinearIsometry.re_apply_eq_re_of_add_conj_eq
[GOAL]
case h₃
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
⊢ ∀ (z : ℂ), z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
intro z
[GOAL]
case h₃
f : ℂ →ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z✝ z : ℂ
⊢ z + ↑(starRingEnd ℂ) z = ↑f z + ↑(starRingEnd ((fun x => ℂ) z)) (↑f z)
[PROOFSTEP]
apply LinearIsometry.im_apply_eq_im h
[GOAL]
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
⊢ f = LinearIsometryEquiv.refl ℝ ℂ ∨ f = conjLie
[PROOFSTEP]
have h0 : f I = I ∨ f I = -I :=
  by
  simp only [ext_iff, ← and_or_left, neg_re, I_re, neg_im, neg_zero]
  constructor
  · rw [← I_re]
    exact @LinearIsometry.re_apply_eq_re f.toLinearIsometry h I
  · apply @LinearIsometry.im_apply_eq_im_or_neg_of_re_apply_eq_re f.toLinearIsometry
    intro z
    rw [@LinearIsometry.re_apply_eq_re f.toLinearIsometry h]
[GOAL]
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
⊢ ↑f I = I ∨ ↑f I = -I
[PROOFSTEP]
simp only [ext_iff, ← and_or_left, neg_re, I_re, neg_im, neg_zero]
[GOAL]
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
⊢ (↑f I).re = 0 ∧ ((↑f I).im = I.im ∨ (↑f I).im = -I.im)
[PROOFSTEP]
constructor
[GOAL]
case left
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
⊢ (↑f I).re = 0
[PROOFSTEP]
rw [← I_re]
[GOAL]
case left
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
⊢ (↑f I).re = I.re
[PROOFSTEP]
exact @LinearIsometry.re_apply_eq_re f.toLinearIsometry h I
[GOAL]
case right
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
⊢ (↑f I).im = I.im ∨ (↑f I).im = -I.im
[PROOFSTEP]
apply @LinearIsometry.im_apply_eq_im_or_neg_of_re_apply_eq_re f.toLinearIsometry
[GOAL]
case right.h₂
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
⊢ ∀ (z : ℂ), (↑(LinearIsometryEquiv.toLinearIsometry f) z).re = z.re
[PROOFSTEP]
intro z
[GOAL]
case right.h₂
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
z : ℂ
⊢ (↑(LinearIsometryEquiv.toLinearIsometry f) z).re = z.re
[PROOFSTEP]
rw [@LinearIsometry.re_apply_eq_re f.toLinearIsometry h]
[GOAL]
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
⊢ f = LinearIsometryEquiv.refl ℝ ℂ ∨ f = conjLie
[PROOFSTEP]
refine' h0.imp (fun h' : f I = I => _) fun h' : f I = -I => _
[GOAL]
case refine'_1
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = I
⊢ f = LinearIsometryEquiv.refl ℝ ℂ
[PROOFSTEP]
apply LinearIsometryEquiv.toLinearEquiv_injective
[GOAL]
case refine'_1.a
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = I
⊢ f.toLinearEquiv = (LinearIsometryEquiv.refl ℝ ℂ).toLinearEquiv
[PROOFSTEP]
apply Complex.basisOneI.ext'
[GOAL]
case refine'_1.a
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = I
⊢ ∀ (i : Fin 2), ↑f.toLinearEquiv (↑basisOneI i) = ↑(LinearIsometryEquiv.refl ℝ ℂ).toLinearEquiv (↑basisOneI i)
[PROOFSTEP]
intro i
[GOAL]
case refine'_1.a
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = I
i : Fin 2
⊢ ↑f.toLinearEquiv (↑basisOneI i) = ↑(LinearIsometryEquiv.refl ℝ ℂ).toLinearEquiv (↑basisOneI i)
[PROOFSTEP]
fin_cases i
[GOAL]
case refine'_1.a.head
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = I
⊢ ↑f.toLinearEquiv (↑basisOneI { val := 0, isLt := (_ : 0 < 2) }) =
    ↑(LinearIsometryEquiv.refl ℝ ℂ).toLinearEquiv (↑basisOneI { val := 0, isLt := (_ : 0 < 2) })
[PROOFSTEP]
simp [h, h']
[GOAL]
case refine'_1.a.tail.head
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = I
⊢ ↑f.toLinearEquiv (↑basisOneI { val := 1, isLt := (_ : (fun a => a < 2) 1) }) =
    ↑(LinearIsometryEquiv.refl ℝ ℂ).toLinearEquiv (↑basisOneI { val := 1, isLt := (_ : (fun a => a < 2) 1) })
[PROOFSTEP]
simp [h, h']
[GOAL]
case refine'_2
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = -I
⊢ f = conjLie
[PROOFSTEP]
apply LinearIsometryEquiv.toLinearEquiv_injective
[GOAL]
case refine'_2.a
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = -I
⊢ f.toLinearEquiv = conjLie.toLinearEquiv
[PROOFSTEP]
apply Complex.basisOneI.ext'
[GOAL]
case refine'_2.a
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = -I
⊢ ∀ (i : Fin 2), ↑f.toLinearEquiv (↑basisOneI i) = ↑conjLie.toLinearEquiv (↑basisOneI i)
[PROOFSTEP]
intro i
[GOAL]
case refine'_2.a
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = -I
i : Fin 2
⊢ ↑f.toLinearEquiv (↑basisOneI i) = ↑conjLie.toLinearEquiv (↑basisOneI i)
[PROOFSTEP]
fin_cases i
[GOAL]
case refine'_2.a.head
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = -I
⊢ ↑f.toLinearEquiv (↑basisOneI { val := 0, isLt := (_ : 0 < 2) }) =
    ↑conjLie.toLinearEquiv (↑basisOneI { val := 0, isLt := (_ : 0 < 2) })
[PROOFSTEP]
simp [h, h']
[GOAL]
case refine'_2.a.tail.head
f : ℂ ≃ₗᵢ[ℝ] ℂ
h : ↑f 1 = 1
h0 : ↑f I = I ∨ ↑f I = -I
h' : ↑f I = -I
⊢ ↑f.toLinearEquiv (↑basisOneI { val := 1, isLt := (_ : (fun a => a < 2) 1) }) =
    ↑conjLie.toLinearEquiv (↑basisOneI { val := 1, isLt := (_ : (fun a => a < 2) 1) })
[PROOFSTEP]
simp [h, h']
[GOAL]
f : ℂ ≃ₗᵢ[ℝ] ℂ
⊢ ∃ a, f = ↑rotation a ∨ f = LinearIsometryEquiv.trans conjLie (↑rotation a)
[PROOFSTEP]
let a : circle := ⟨f 1, by rw [mem_circle_iff_abs, ← Complex.norm_eq_abs, f.norm_map, norm_one]⟩
[GOAL]
f : ℂ ≃ₗᵢ[ℝ] ℂ
⊢ ↑f 1 ∈ circle
[PROOFSTEP]
rw [mem_circle_iff_abs, ← Complex.norm_eq_abs, f.norm_map, norm_one]
[GOAL]
f : ℂ ≃ₗᵢ[ℝ] ℂ
a : { x // x ∈ circle } := { val := ↑f 1, property := (_ : ↑f 1 ∈ circle) }
⊢ ∃ a, f = ↑rotation a ∨ f = LinearIsometryEquiv.trans conjLie (↑rotation a)
[PROOFSTEP]
use a
[GOAL]
case h
f : ℂ ≃ₗᵢ[ℝ] ℂ
a : { x // x ∈ circle } := { val := ↑f 1, property := (_ : ↑f 1 ∈ circle) }
⊢ f = ↑rotation a ∨ f = LinearIsometryEquiv.trans conjLie (↑rotation a)
[PROOFSTEP]
have : (f.trans (rotation a).symm) 1 = 1 := by simpa using rotation_apply a⁻¹ (f 1)
[GOAL]
f : ℂ ≃ₗᵢ[ℝ] ℂ
a : { x // x ∈ circle } := { val := ↑f 1, property := (_ : ↑f 1 ∈ circle) }
⊢ ↑(LinearIsometryEquiv.trans f (LinearIsometryEquiv.symm (↑rotation a))) 1 = 1
[PROOFSTEP]
simpa using rotation_apply a⁻¹ (f 1)
[GOAL]
case h
f : ℂ ≃ₗᵢ[ℝ] ℂ
a : { x // x ∈ circle } := { val := ↑f 1, property := (_ : ↑f 1 ∈ circle) }
this : ↑(LinearIsometryEquiv.trans f (LinearIsometryEquiv.symm (↑rotation a))) 1 = 1
⊢ f = ↑rotation a ∨ f = LinearIsometryEquiv.trans conjLie (↑rotation a)
[PROOFSTEP]
refine' (linear_isometry_complex_aux this).imp (fun h₁ => _) fun h₂ => _
[GOAL]
case h.refine'_1
f : ℂ ≃ₗᵢ[ℝ] ℂ
a : { x // x ∈ circle } := { val := ↑f 1, property := (_ : ↑f 1 ∈ circle) }
this : ↑(LinearIsometryEquiv.trans f (LinearIsometryEquiv.symm (↑rotation a))) 1 = 1
h₁ : LinearIsometryEquiv.trans f (LinearIsometryEquiv.symm (↑rotation a)) = LinearIsometryEquiv.refl ℝ ℂ
⊢ f = ↑rotation a
[PROOFSTEP]
simpa using eq_mul_of_inv_mul_eq h₁
[GOAL]
case h.refine'_2
f : ℂ ≃ₗᵢ[ℝ] ℂ
a : { x // x ∈ circle } := { val := ↑f 1, property := (_ : ↑f 1 ∈ circle) }
this : ↑(LinearIsometryEquiv.trans f (LinearIsometryEquiv.symm (↑rotation a))) 1 = 1
h₂ : LinearIsometryEquiv.trans f (LinearIsometryEquiv.symm (↑rotation a)) = conjLie
⊢ f = LinearIsometryEquiv.trans conjLie (↑rotation a)
[PROOFSTEP]
exact eq_mul_of_inv_mul_eq h₂
[GOAL]
a : { x // x ∈ circle }
⊢ (↑a).re ^ 2 + (↑a).im ^ 2 ≠ 0
[PROOFSTEP]
simp [pow_two, ← normSq_apply]
[GOAL]
a : { x // x ∈ circle }
⊢ ↑(LinearMap.toMatrix basisOneI basisOneI) ↑(↑rotation a).toLinearEquiv =
    ↑(Matrix.planeConformalMatrix (↑a).re (↑a).im (_ : (↑a).re ^ 2 + (↑a).im ^ 2 ≠ 0))
[PROOFSTEP]
ext i j
[GOAL]
case a.h
a : { x // x ∈ circle }
i j : Fin 2
⊢ ↑(LinearMap.toMatrix basisOneI basisOneI) (↑(↑rotation a).toLinearEquiv) i j =
    ↑(Matrix.planeConformalMatrix (↑a).re (↑a).im (_ : (↑a).re ^ 2 + (↑a).im ^ 2 ≠ 0)) i j
[PROOFSTEP]
simp [LinearMap.toMatrix_apply]
[GOAL]
case a.h
a : { x // x ∈ circle }
i j : Fin 2
⊢ Matrix.vecCons ((↑a).re * (Matrix.vecCons 1 ![I] j).re - (↑a).im * (Matrix.vecCons 1 ![I] j).im)
      ![(↑a).re * (Matrix.vecCons 1 ![I] j).im + (↑a).im * (Matrix.vecCons 1 ![I] j).re] i =
    Matrix.vecCons (Matrix.vecCons (↑a).re ![-(↑a).im] j) (fun i => Matrix.vecCons (↑a).im ![(↑a).re] j) i
[PROOFSTEP]
fin_cases i
[GOAL]
case a.h.head
a : { x // x ∈ circle }
j : Fin 2
⊢ Matrix.vecCons ((↑a).re * (Matrix.vecCons 1 ![I] j).re - (↑a).im * (Matrix.vecCons 1 ![I] j).im)
      ![(↑a).re * (Matrix.vecCons 1 ![I] j).im + (↑a).im * (Matrix.vecCons 1 ![I] j).re]
      { val := 0, isLt := (_ : 0 < 2) } =
    Matrix.vecCons (Matrix.vecCons (↑a).re ![-(↑a).im] j) (fun i => Matrix.vecCons (↑a).im ![(↑a).re] j)
      { val := 0, isLt := (_ : 0 < 2) }
[PROOFSTEP]
fin_cases j
[GOAL]
case a.h.tail.head
a : { x // x ∈ circle }
j : Fin 2
⊢ Matrix.vecCons ((↑a).re * (Matrix.vecCons 1 ![I] j).re - (↑a).im * (Matrix.vecCons 1 ![I] j).im)
      ![(↑a).re * (Matrix.vecCons 1 ![I] j).im + (↑a).im * (Matrix.vecCons 1 ![I] j).re]
      { val := 1, isLt := (_ : (fun a => a < 2) 1) } =
    Matrix.vecCons (Matrix.vecCons (↑a).re ![-(↑a).im] j) (fun i => Matrix.vecCons (↑a).im ![(↑a).re] j)
      { val := 1, isLt := (_ : (fun a => a < 2) 1) }
[PROOFSTEP]
fin_cases j
[GOAL]
case a.h.head.head
a : { x // x ∈ circle }
⊢ Matrix.vecCons
      ((↑a).re * (Matrix.vecCons 1 ![I] { val := 0, isLt := (_ : 0 < 2) }).re -
        (↑a).im * (Matrix.vecCons 1 ![I] { val := 0, isLt := (_ : 0 < 2) }).im)
      ![(↑a).re * (Matrix.vecCons 1 ![I] { val := 0, isLt := (_ : 0 < 2) }).im +
          (↑a).im * (Matrix.vecCons 1 ![I] { val := 0, isLt := (_ : 0 < 2) }).re]
      { val := 0, isLt := (_ : 0 < 2) } =
    Matrix.vecCons (Matrix.vecCons (↑a).re ![-(↑a).im] { val := 0, isLt := (_ : 0 < 2) })
      (fun i => Matrix.vecCons (↑a).im ![(↑a).re] { val := 0, isLt := (_ : 0 < 2) }) { val := 0, isLt := (_ : 0 < 2) }
[PROOFSTEP]
simp
[GOAL]
case a.h.head.tail.head
a : { x // x ∈ circle }
⊢ Matrix.vecCons
      ((↑a).re * (Matrix.vecCons 1 ![I] { val := 1, isLt := (_ : (fun a => a < 2) 1) }).re -
        (↑a).im * (Matrix.vecCons 1 ![I] { val := 1, isLt := (_ : (fun a => a < 2) 1) }).im)
      ![(↑a).re * (Matrix.vecCons 1 ![I] { val := 1, isLt := (_ : (fun a => a < 2) 1) }).im +
          (↑a).im * (Matrix.vecCons 1 ![I] { val := 1, isLt := (_ : (fun a => a < 2) 1) }).re]
      { val := 0, isLt := (_ : 0 < 2) } =
    Matrix.vecCons (Matrix.vecCons (↑a).re ![-(↑a).im] { val := 1, isLt := (_ : (fun a => a < 2) 1) })
      (fun i => Matrix.vecCons (↑a).im ![(↑a).re] { val := 1, isLt := (_ : (fun a => a < 2) 1) })
      { val := 0, isLt := (_ : 0 < 2) }
[PROOFSTEP]
simp
[GOAL]
case a.h.tail.head.head
a : { x // x ∈ circle }
⊢ Matrix.vecCons
      ((↑a).re * (Matrix.vecCons 1 ![I] { val := 0, isLt := (_ : 0 < 2) }).re -
        (↑a).im * (Matrix.vecCons 1 ![I] { val := 0, isLt := (_ : 0 < 2) }).im)
      ![(↑a).re * (Matrix.vecCons 1 ![I] { val := 0, isLt := (_ : 0 < 2) }).im +
          (↑a).im * (Matrix.vecCons 1 ![I] { val := 0, isLt := (_ : 0 < 2) }).re]
      { val := 1, isLt := (_ : (fun a => a < 2) 1) } =
    Matrix.vecCons (Matrix.vecCons (↑a).re ![-(↑a).im] { val := 0, isLt := (_ : 0 < 2) })
      (fun i => Matrix.vecCons (↑a).im ![(↑a).re] { val := 0, isLt := (_ : 0 < 2) })
      { val := 1, isLt := (_ : (fun a => a < 2) 1) }
[PROOFSTEP]
simp
[GOAL]
case a.h.tail.head.tail.head
a : { x // x ∈ circle }
⊢ Matrix.vecCons
      ((↑a).re * (Matrix.vecCons 1 ![I] { val := 1, isLt := (_ : (fun a => a < 2) 1) }).re -
        (↑a).im * (Matrix.vecCons 1 ![I] { val := 1, isLt := (_ : (fun a => a < 2) 1) }).im)
      ![(↑a).re * (Matrix.vecCons 1 ![I] { val := 1, isLt := (_ : (fun a => a < 2) 1) }).im +
          (↑a).im * (Matrix.vecCons 1 ![I] { val := 1, isLt := (_ : (fun a => a < 2) 1) }).re]
      { val := 1, isLt := (_ : (fun a => a < 2) 1) } =
    Matrix.vecCons (Matrix.vecCons (↑a).re ![-(↑a).im] { val := 1, isLt := (_ : (fun a => a < 2) 1) })
      (fun i => Matrix.vecCons (↑a).im ![(↑a).re] { val := 1, isLt := (_ : (fun a => a < 2) 1) })
      { val := 1, isLt := (_ : (fun a => a < 2) 1) }
[PROOFSTEP]
simp
[GOAL]
a : { x // x ∈ circle }
⊢ ↑LinearMap.det ↑(↑rotation a).toLinearEquiv = 1
[PROOFSTEP]
rw [← LinearMap.det_toMatrix basisOneI, toMatrix_rotation, Matrix.det_fin_two]
[GOAL]
a : { x // x ∈ circle }
⊢ ↑(Matrix.planeConformalMatrix (↑a).re (↑a).im (_ : (↑a).re ^ 2 + (↑a).im ^ 2 ≠ 0)) 0 0 *
        ↑(Matrix.planeConformalMatrix (↑a).re (↑a).im (_ : (↑a).re ^ 2 + (↑a).im ^ 2 ≠ 0)) 1 1 -
      ↑(Matrix.planeConformalMatrix (↑a).re (↑a).im (_ : (↑a).re ^ 2 + (↑a).im ^ 2 ≠ 0)) 0 1 *
        ↑(Matrix.planeConformalMatrix (↑a).re (↑a).im (_ : (↑a).re ^ 2 + (↑a).im ^ 2 ≠ 0)) 1 0 =
    1
[PROOFSTEP]
simp [← normSq_apply]
[GOAL]
a : { x // x ∈ circle }
⊢ ↑LinearEquiv.det (↑rotation a).toLinearEquiv = 1
[PROOFSTEP]
rw [← Units.eq_iff, LinearEquiv.coe_det, det_rotation, Units.val_one]