Theorem: NumberField.Units.dirichletUnitTheorem.unitLattice_span_eq_top
File: Mathlib/NumberTheory/NumberField/Units/DirichletTheorem.lean

tactic: refine le_antisymm le_top ?_
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B
⊢ Submodule.span ℝ ↑(unitLattice K) = ⊤
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B
⊢ ⊤ ≤ Submodule.span ℝ ↑(unitLattice K)

tactic: let B := Pi.basisFun ℝ {w : InfinitePlace K // w ≠ w₀}
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B
⊢ ⊤ ≤ Submodule.span ℝ ↑(unitLattice K)
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
⊢ ⊤ ≤ Submodule.span ℝ ↑(unitLattice K)

tactic: let v := fun w : { w : InfinitePlace K // w ≠ w₀ } => logEmbedding K (exists_unit K w).choose
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
⊢ ⊤ ≤ Submodule.span ℝ ↑(unitLattice K)
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
⊢ ⊤ ≤ Submodule.span ℝ ↑(unitLattice K)

tactic: suffices B.det v ≠ 0 by
  rw [← isUnit_iff_ne_zero, ← is_basis_iff_det] at this
  rw [← this.2]
  exact Submodule.span_monotone (fun _ ⟨w, hw⟩ =>
    ⟨(exists_unit K w).choose, trivial, by rw [← hw]⟩)
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
⊢ ⊤ ≤ Submodule.span ℝ ↑(unitLattice K)
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
⊢ B.det v ≠ 0

tactic: rw [Basis.det_apply]
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
⊢ B.det v ≠ 0
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
⊢ (B.toMatrix v).det ≠ 0

tactic: refine det_ne_zero_of_sum_col_lt_diag (fun w => ?_)
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
⊢ (B.toMatrix v).det ≠ 0
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ ∑ i ∈ univ.erase w, ‖B.toMatrix v i w‖ < ‖B.toMatrix v w w‖

tactic: simp_rw [Real.norm_eq_abs, B, Basis.coePiBasisFun.toMatrix_eq_transpose, Matrix.transpose_apply]
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ ∑ i ∈ univ.erase w, ‖B.toMatrix v i w‖ < ‖B.toMatrix v w w‖
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ ∑ x ∈ univ.erase w, |v w x| < |v w w|

tactic: rw [← sub_pos, sum_congr rfl (fun x hx => abs_of_neg ?_), sum_neg_distrib, sub_neg_eq_add,
  sum_erase_eq_sub (mem_univ _), ← add_comm_sub]
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ ∑ x ∈ univ.erase w, |v w x| < |v w w|
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ 0 < |v w w| - v w w + ∑ x : { w // w ≠ w₀ }, v w x

K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w x : { w // w ≠ w₀ }
hx : x ∈ univ.erase w
⊢ v w x < 0

tactic: rw [← isUnit_iff_ne_zero, ← is_basis_iff_det] at this
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
this : B.det v ≠ 0
⊢ ⊤ ≤ Submodule.span ℝ ↑(unitLattice K)
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
this : LinearIndependent ℝ v ∧ Submodule.span ℝ (Set.range v) = ⊤
⊢ ⊤ ≤ Submodule.span ℝ ↑(unitLattice K)

tactic: rw [← this.2]
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
this : LinearIndependent ℝ v ∧ Submodule.span ℝ (Set.range v) = ⊤
⊢ ⊤ ≤ Submodule.span ℝ ↑(unitLattice K)
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
this : LinearIndependent ℝ v ∧ Submodule.span ℝ (Set.range v) = ⊤
⊢ Submodule.span ℝ (Set.range v) ≤ Submodule.span ℝ ↑(unitLattice K)

tactic: exact Submodule.span_monotone (fun _ ⟨w, hw⟩ =>
  ⟨(exists_unit K w).choose, trivial, by rw [← hw]⟩)
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
this : LinearIndependent ℝ v ∧ Submodule.span ℝ (Set.range v) = ⊤
⊢ Submodule.span ℝ (Set.range v) ≤ Submodule.span ℝ ↑(unitLattice K)
state_after: no goals

tactic: rw [← hw]
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
this : LinearIndependent ℝ v ∧ Submodule.span ℝ (Set.range v) = ⊤
x✝¹ : { w // w ≠ w₀ } → ℝ
x✝ : x✝¹ ∈ Set.range v
w : { w // w ≠ w₀ }
hw : v w = x✝¹
⊢ (logEmbedding K) ⋯.choose = x✝¹
state_after: no goals

tactic: refine add_pos_of_nonneg_of_pos ?_ ?_
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ 0 < |v w w| - v w w + ∑ x : { w // w ≠ w₀ }, v w x
state_after: case refine_1
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ 0 ≤ |v w w| - v w w

case refine_2
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ 0 < ∑ x : { w // w ≠ w₀ }, v w x

tactic: rw [sub_nonneg]
state_before: case refine_1
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ 0 ≤ |v w w| - v w w
state_after: case refine_1
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ v w w ≤ |v w w|

tactic: exact le_abs_self _
state_before: case refine_1
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ v w w ≤ |v w w|
state_after: no goals

tactic: rw [sum_logEmbedding_component (exists_unit K w).choose]
state_before: case refine_2
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ 0 < ∑ x : { w // w ≠ w₀ }, v w x
state_after: case refine_2
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ 0 < -↑w₀.mult * Real.log (w₀ ((algebraMap (𝓞 K) K) ↑⋯.choose))

tactic: refine mul_pos_of_neg_of_neg ?_ ((exists_unit K w).choose_spec _ w.prop.symm)
state_before: case refine_2
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ 0 < -↑w₀.mult * Real.log (w₀ ((algebraMap (𝓞 K) K) ↑⋯.choose))
state_after: case refine_2
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ -↑w₀.mult < 0

tactic: rw [mult]
state_before: case refine_2
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ -↑w₀.mult < 0
state_after: case refine_2
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ -↑(if w₀.IsReal then 1 else 2) < 0

tactic: split_ifs <;> norm_num
state_before: case refine_2
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w : { w // w ≠ w₀ }
⊢ -↑(if w₀.IsReal then 1 else 2) < 0
state_after: no goals

tactic: refine mul_neg_of_pos_of_neg ?_ ((exists_unit K w).choose_spec x ?_)
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w x : { w // w ≠ w₀ }
hx : x ∈ univ.erase w
⊢ v w x < 0
state_after: case refine_1
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w x : { w // w ≠ w₀ }
hx : x ∈ univ.erase w
⊢ 0 < ↑(↑x).mult

case refine_2
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w x : { w // w ≠ w₀ }
hx : x ∈ univ.erase w
⊢ ↑x ≠ ↑w

tactic: rw [mult]
state_before: case refine_1
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w x : { w // w ≠ w₀ }
hx : x ∈ univ.erase w
⊢ 0 < ↑(↑x).mult
state_after: case refine_1
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w x : { w // w ≠ w₀ }
hx : x ∈ univ.erase w
⊢ 0 < ↑(if (↑x).IsReal then 1 else 2)

tactic: split_ifs <;> norm_num
state_before: case refine_1
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w x : { w // w ≠ w₀ }
hx : x ∈ univ.erase w
⊢ 0 < ↑(if (↑x).IsReal then 1 else 2)
state_after: no goals

tactic: exact Subtype.ext_iff_val.not.mp (ne_of_mem_erase hx)
state_before: case refine_2
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁ : InfinitePlace K
B✝ : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
B : Basis { w // w ≠ w₀ } ℝ ({ w // w ≠ w₀ } → ℝ) := Pi.basisFun ℝ { w // w ≠ w₀ }
v : { w // w ≠ w₀ } → { w // w ≠ w₀ } → ℝ := fun w => (logEmbedding K) ⋯.choose
w x : { w // w ≠ w₀ }
hx : x ∈ univ.erase w
⊢ ↑x ≠ ↑w
state_after: no goals