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

Proof steps:
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁✝ : InfinitePlace K
B : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B
w₁ : InfinitePlace K
⊢ ∃ u, ∀ (w : InfinitePlace K), w ≠ w₁ → Real.log (w ((algebraMap (𝓞 K) K) ↑u)) < 0
state_after: case intro
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁✝ : InfinitePlace K
B✝ : ℕ
hB✝ : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
w₁ : InfinitePlace K
B : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B
⊢ ∃ u, ∀ (w : InfinitePlace K), w ≠ w₁ → Real.log (w ((algebraMap (𝓞 K) K) ↑u)) < 0
tactic: obtain ⟨B, hB⟩ : ∃ B : ℕ, minkowskiBound K 1 < (convexBodyLTFactor K) * B := by
    conv => congr; ext; rw [mul_comm]
    exact ENNReal.exists_nat_mul_gt (ENNReal.coe_ne_zero.mpr (convexBodyLTFactor_ne_zero K))
      (ne_of_lt (minkowskiBound_lt_top K 1))
state_before: case intro
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁✝ : InfinitePlace K
B✝ : ℕ
hB✝ : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
w₁ : InfinitePlace K
B : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B
⊢ ∃ u, ∀ (w : InfinitePlace K), w ≠ w₁ → Real.log (w ((algebraMap (𝓞 K) K) ↑u)) < 0
state_after: case intro.intro.intro.intro
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁✝ : InfinitePlace K
B✝ : ℕ
hB✝ : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
w₁ : InfinitePlace K
B : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B
n m : ℕ
hnm : n < m
h : Ideal.span {↑(seq K w₁ hB n)} = Ideal.span {↑(seq K w₁ hB m)}
⊢ ∃ u, ∀ (w : InfinitePlace K), w ≠ w₁ → Real.log (w ((algebraMap (𝓞 K) K) ↑u)) < 0

K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁✝ : InfinitePlace K
B✝ : ℕ
hB✝ : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
w₁ : InfinitePlace K
B : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B
⊢ ∃ n m, n < m ∧ Ideal.span {↑(seq K w₁ hB n)} = Ideal.span {↑(seq K w₁ hB m)}
tactic: rsuffices ⟨n, m, hnm, h⟩ : ∃ n m, n < m ∧
      (Ideal.span ({ (seq K w₁ hB n : 𝓞 K) }) = Ideal.span ({ (seq K w₁ hB m : 𝓞 K) }))
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁✝ : InfinitePlace K
B✝ : ℕ
hB✝ : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
w₁ : InfinitePlace K
B : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B
⊢ ∃ n m, n < m ∧ Ideal.span {↑(seq K w₁ hB n)} = Ideal.span {↑(seq K w₁ hB m)}
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✝
w₁ : InfinitePlace K
B : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B
n : ℕ
⊢ Ideal.span {↑(seq K w₁ hB n)} ∈ {I | 1 ≤ Ideal.absNorm I ∧ Ideal.absNorm I ≤ B}

case refine_2
K : Type u_1
inst✝¹ : Field K
inst✝ : NumberField K
w₁✝ : InfinitePlace K
B✝ : ℕ
hB✝ : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B✝
w₁ : InfinitePlace K
B : ℕ
hB : minkowskiBound K 1 < ↑(convexBodyLTFactor K) * ↑B
⊢ {I | 1 ≤ Ideal.absNorm I ∧ Ideal.absNorm I ≤ B}.Finite
tactic: refine Set.Finite.exists_lt_map_eq_of_forall_mem
    (t := { I : Ideal (𝓞 K) | 1 ≤ Ideal.absNorm I ∧ Ideal.absNorm I ≤ B })
    (fun n => ?_) ?_