-- Mathlib/NumberTheory/Ostrowski.lean
theorem equiv_padic_of_bounded :
    ∃! p, ∃ (_ : Fact p.Prime), f ≈ (padic p)

Proof state:
case intro.intro.intro.refine_1.inr
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
n : ℕ
ht : t⁻¹ ≠ 0
hn : n ≠ 0
⊢ f ↑n ^ t⁻¹ = (padic p) ↑n

Tactic:
rcases Nat.exists_eq_pow_mul_and_not_dvd hn p hprime.ne_one with ⟨e, m, hpm, rfl⟩

Result:
case intro.intro.intro.refine_1.inr.intro.intro.intro
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
ht : t⁻¹ ≠ 0
e m : ℕ
hpm : ¬p ∣ m
hn : p ^ e * m ≠ 0
⊢ f ↑(p ^ e * m) ^ t⁻¹ = (padic p) ↑(p ^ e * m)

Proof state:
case intro.intro.intro.refine_1.inl
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
ht : t⁻¹ ≠ 0
⊢ f ↑0 ^ t⁻¹ = (padic p) ↑0

Tactic:
simp [ht]

Result:
no goals

Proof state:
case intro.intro.intro.refine_2.intro.intro
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
q : ℕ
x✝ : (fun p => ∃ (h : Fact (Nat.Prime p)), ∃ c, 0 < c ∧ ∀ (n : ℕ), f ↑n ^ c = (padic p) ↑n) q
hq_prime : Fact (Nat.Prime q)
hne : ¬p ∣ q
c : ℝ
left✝ : 0 < c
h_eq : ∀ (n : ℕ), f ↑n ^ c = (padic q) ↑n
h_eq' : ↑q = 1
⊢ q = 1

Tactic:
exact_mod_cast h_eq'

Result:
no goals

Proof state:
case intro.intro.intro.refine_1
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
n : ℕ
ht : t⁻¹ ≠ 0
⊢ f ↑n ^ t⁻¹ = (padic p) ↑n

Tactic:
rcases eq_or_ne n 0 with rfl | hn

Result:
case intro.intro.intro.refine_1.inl
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
ht : t⁻¹ ≠ 0
⊢ f ↑0 ^ t⁻¹ = (padic p) ↑0

case intro.intro.intro.refine_1.inr
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
n : ℕ
ht : t⁻¹ ≠ 0
hn : n ≠ 0
⊢ f ↑n ^ t⁻¹ = (padic p) ↑n

Proof state:
case intro.intro.intro.refine_2.intro.intro
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
q : ℕ
x✝ : (fun p => ∃ (h : Fact (Nat.Prime p)), ∃ c, 0 < c ∧ ∀ (n : ℕ), f ↑n ^ c = (padic p) ↑n) q
hq_prime : Fact (Nat.Prime q)
hne : ¬p ∣ q
c : ℝ
left✝ : 0 < c
h_eq : ∀ (n : ℕ), f ↑n ^ c = (padic q) ↑n
⊢ q = 1

Tactic:
have h_eq' := h_eq q

Result:
case intro.intro.intro.refine_2.intro.intro
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
q : ℕ
x✝ : (fun p => ∃ (h : Fact (Nat.Prime p)), ∃ c, 0 < c ∧ ∀ (n : ℕ), f ↑n ^ c = (padic p) ↑n) q
hq_prime : Fact (Nat.Prime q)
hne : ¬p ∣ q
c : ℝ
left✝ : 0 < c
h_eq : ∀ (n : ℕ), f ↑n ^ c = (padic q) ↑n
h_eq' : f ↑q ^ c = (padic q) ↑q
⊢ q = 1

Proof state:
case intro.intro.intro.refine_2
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
q : ℕ
x✝ : (fun p => ∃ (h : Fact (Nat.Prime p)), ∃ c, 0 < c ∧ ∀ (n : ℕ), f ↑n ^ c = (padic p) ↑n) q
hq_prime : Fact (Nat.Prime q)
h_equiv : ∃ c, 0 < c ∧ ∀ (n : ℕ), f ↑n ^ c = (padic q) ↑n
⊢ q = p

Tactic:
by_contra! hne

Result:
case intro.intro.intro.refine_2
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
q : ℕ
x✝ : (fun p => ∃ (h : Fact (Nat.Prime p)), ∃ c, 0 < c ∧ ∀ (n : ℕ), f ↑n ^ c = (padic p) ↑n) q
hq_prime : Fact (Nat.Prime q)
h_equiv : ∃ c, 0 < c ∧ ∀ (n : ℕ), f ↑n ^ c = (padic q) ↑n
hne : q ≠ p
⊢ False

Proof state:
case intro.intro.intro
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
⊢ ∃! p, ∃ (h : Fact (Nat.Prime p)), ∃ c, 0 < c ∧ ∀ (n : ℕ), f ↑n ^ c = (padic p) ↑n

Tactic:
refine ⟨p, ⟨hprime_fact, t⁻¹, inv_pos_of_pos h.1, fun n ↦ ?_⟩, fun q ⟨hq_prime, h_equiv⟩ ↦ ?_⟩

Result:
case intro.intro.intro.refine_1
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
n : ℕ
⊢ f ↑n ^ t⁻¹ = (padic p) ↑n

case intro.intro.intro.refine_2
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
q : ℕ
x✝ : (fun p => ∃ (h : Fact (Nat.Prime p)), ∃ c, 0 < c ∧ ∀ (n : ℕ), f ↑n ^ c = (padic p) ↑n) q
hq_prime : Fact (Nat.Prime q)
h_equiv : ∃ c, 0 < c ∧ ∀ (n : ℕ), f ↑n ^ c = (padic q) ↑n
⊢ q = p

Proof state:
case intro.intro
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
⊢ ∃! p, ∃ (x : Fact (Nat.Prime p)), f ≈ padic p

Tactic:
have hprime_fact : Fact p.Prime := ⟨hprime⟩

Result:
case intro.intro
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
⊢ ∃! p, ∃ (x : Fact (Nat.Prime p)), f ≈ padic p

Proof state:
case intro.intro.intro.refine_1
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
n : ℕ
⊢ f ↑n ^ t⁻¹ = (padic p) ↑n

Tactic:
have ht : t⁻¹ ≠ 0 := inv_ne_zero h.1.ne'

Result:
case intro.intro.intro.refine_1
f : AbsoluteValue ℚ ℝ
hf_nontriv : f.IsNontrivial
bdd : ∀ (n : ℕ), f ↑n ≤ 1
p : ℕ
hfp : 0 < f ↑p ∧ f ↑p < 1
hmin : ∀ (m : ℕ), 0 < f ↑m ∧ f ↑m < 1 → p ≤ m
hprime : Nat.Prime p
hprime_fact : Fact (Nat.Prime p)
t : ℝ
h : 0 < t ∧ f ↑p = ↑p ^ (-t)
n : ℕ
ht : t⁻¹ ≠ 0
⊢ f ↑n ^ t⁻¹ = (padic p) ↑n