-- Mathlib/NumberTheory/LSeries/Basic.lean
/-- If `f = O(n^(x-1))` and `re s > x`, then the `LSeries` of `f` is summable at `s`. -/
lemma LSeriesSummable_of_isBigO_rpow {f : ℕ → ℂ} {x : ℝ} {s : ℂ} (hs : x < s.re)
    (h : f =O[atTop] fun n ↦ (n : ℝ) ^ (x - 1)) :
    LSeriesSummable f s

Proof state:
case intro.intro.inl.h₂
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀✝ : n ≠ 0
hn : m ≤ n
hn₀ : 0 ≤ ↑n
⊢ ‖↑n ^ (x - 1)‖ ≤ ↑n ^ (x - 1)

Tactic:
rw [Real.norm_eq_abs, abs_rpow_of_nonneg hn₀, abs_of_nonneg hn₀]

Result:
no goals

Proof state:
case intro.intro.inl
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀ : n ≠ 0
hn : m ≤ n
⊢ ‖f n‖ ≤ C' * ↑n ^ (x - 1)

Tactic:
refine (hm n hn).trans ?_

Result:
case intro.intro.inl
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀ : n ≠ 0
hn : m ≤ n
⊢ C * ‖↑n ^ (x - 1)‖ ≤ C' * ↑n ^ (x - 1)

Proof state:
case intro.intro
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀ : n ≠ 0
⊢ ‖f n‖ ≤ C' * ↑n ^ (x - 1)

Tactic:
rcases le_or_lt m n with hn | hn

Result:
case intro.intro.inl
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀ : n ≠ 0
hn : m ≤ n
⊢ ‖f n‖ ≤ C' * ↑n ^ (x - 1)

case intro.intro.inr
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀ : n ≠ 0
hn : n < m
⊢ ‖f n‖ ≤ C' * ↑n ^ (x - 1)

Proof state:
case intro.intro.inl
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀✝ : n ≠ 0
hn : m ≤ n
hn₀ : 0 ≤ ↑n
⊢ C * ‖↑n ^ (x - 1)‖ ≤ C' * ↑n ^ (x - 1)

Tactic:
gcongr

Result:
case intro.intro.inl.h₂
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀✝ : n ≠ 0
hn : m ≤ n
hn₀ : 0 ≤ ↑n
⊢ ‖↑n ^ (x - 1)‖ ≤ ↑n ^ (x - 1)

Proof state:
case intro.intro.inr
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀ : n ≠ 0
hn : n < m
hn' : 0 < n
⊢ ‖f n‖ / ↑n ^ (x - 1) ∈ image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m)

Tactic:
exact mem_image.mpr ⟨n, mem_range.mpr hn, rfl⟩

Result:
no goals

Proof state:
case intro.intro.inr
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀ : n ≠ 0
hn : n < m
hn' : 0 < n
⊢ ‖f n‖ ≤ C' * ↑n ^ (x - 1)

Tactic:
refine (div_le_iff₀ <| rpow_pos_of_pos (cast_pos.mpr hn') _).mp ?_

Result:
case intro.intro.inr
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀ : n ≠ 0
hn : n < m
hn' : 0 < n
⊢ ‖f n‖ / ↑n ^ (x - 1) ≤ C'

Proof state:
case intro.intro.inl
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀ : n ≠ 0
hn : m ≤ n
⊢ C * ‖↑n ^ (x - 1)‖ ≤ C' * ↑n ^ (x - 1)

Tactic:
have hn₀ : (0 : ℝ) ≤ n := cast_nonneg _

Result:
case intro.intro.inl
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀✝ : n ≠ 0
hn : m ≤ n
hn₀ : 0 ≤ ↑n
⊢ C * ‖↑n ^ (x - 1)‖ ≤ C' * ↑n ^ (x - 1)

Proof state:
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
⊢ LSeriesSummable f s

Tactic:
obtain ⟨C, hC⟩ := Asymptotics.isBigO_iff.mp h

Result:
case intro
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
⊢ LSeriesSummable f s

Proof state:
case intro.intro
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
⊢ LSeriesSummable f s

Tactic:
have hCC' : C ≤ C' := le_max_left ..

Result:
case intro.intro
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
⊢ LSeriesSummable f s

Proof state:
case intro.intro.inr
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀ : n ≠ 0
hn : n < m
hn' : 0 < n
⊢ ‖f n‖ / ↑n ^ (x - 1) ≤ C'

Tactic:
refine (le_max' _ _ <| mem_insert_of_mem ?_).trans <| le_max_right ..

Result:
case intro.intro.inr
f : ℕ → ℂ
x : ℝ
s : ℂ
hs : x < s.re
h : f =O[atTop] fun n => ↑n ^ (x - 1)
C : ℝ
hC : ∀ᶠ (x_1 : ℕ) in atTop, ‖f x_1‖ ≤ C * ‖↑x_1 ^ (x - 1)‖
m : ℕ
hm : ∀ b ≥ m, ‖f b‖ ≤ C * ‖↑b ^ (x - 1)‖
C' : ℝ := C ⊔ (insert 0 (image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m))).max' ⋯
hC'₀ : 0 ≤ C'
hCC' : C ≤ C'
n : ℕ
hn₀ : n ≠ 0
hn : n < m
hn' : 0 < n
⊢ ‖f n‖ / ↑n ^ (x - 1) ∈ image (fun n => ‖f n‖ / ↑n ^ (x - 1)) (range m)