Theorem: Asymptotics.isBigO_iff_div_isBoundedUnder
File: Mathlib/Analysis/Asymptotics/Asymptotics.lean

tactic: refine' ⟨div_isBoundedUnder_of_isBigO, fun h => _⟩
state_before: α✝ : Type ?u.636916
β : Type ?u.636919
E : Type ?u.636922
F : Type ?u.636925
G : Type ?u.636928
E' : Type ?u.636931
F' : Type ?u.636934
G' : Type ?u.636937
E'' : Type ?u.636940
F'' : Type ?u.636943
G'' : Type ?u.636946
R : Type ?u.636949
R' : Type ?u.636952
𝕜 : Type u_2
𝕜' : Type ?u.636958
inst✝¹² : Norm E
inst✝¹¹ : Norm F
inst✝¹⁰ : Norm G
inst✝⁹ : SeminormedAddCommGroup E'
inst✝⁸ : SeminormedAddCommGroup F'
inst✝⁷ : SeminormedAddCommGroup G'
inst✝⁶ : NormedAddCommGroup E''
inst✝⁵ : NormedAddCommGroup F''
inst✝⁴ : NormedAddCommGroup G''
inst✝³ : SeminormedRing R
inst✝² : SeminormedRing R'
inst✝¹ : NormedField 𝕜
inst✝ : NormedField 𝕜'
c c' c₁ c₂ : ℝ
f✝ : α✝ → E
g✝ : α✝ → F
k : α✝ → G
f' : α✝ → E'
g' : α✝ → F'
k' : α✝ → G'
f'' : α✝ → E''
g'' : α✝ → F''
k'' : α✝ → G''
l✝ l' : Filter α✝
α : Type u_1
l : Filter α
f g : α → 𝕜
hgf : ∀ᶠ (x : α) in l, g x = 0 → f x = 0
⊢ f =O[l] g ↔ IsBoundedUnder (fun x x_1 => x ≤ x_1) l fun x => ‖f x / g x‖

tactic: obtain ⟨c, hc⟩ := h
state_before: α✝ : Type ?u.636916
β : Type ?u.636919
E : Type ?u.636922
F : Type ?u.636925
G : Type ?u.636928
E' : Type ?u.636931
F' : Type ?u.636934
G' : Type ?u.636937
E'' : Type ?u.636940
F'' : Type ?u.636943
G'' : Type ?u.636946
R : Type ?u.636949
R' : Type ?u.636952
𝕜 : Type u_2
𝕜' : Type ?u.636958
inst✝¹² : Norm E
inst✝¹¹ : Norm F
inst✝¹⁰ : Norm G
inst✝⁹ : SeminormedAddCommGroup E'
inst✝⁸ : SeminormedAddCommGroup F'
inst✝⁷ : SeminormedAddCommGroup G'
inst✝⁶ : NormedAddCommGroup E''
inst✝⁵ : NormedAddCommGroup F''
inst✝⁴ : NormedAddCommGroup G''
inst✝³ : SeminormedRing R
inst✝² : SeminormedRing R'
inst✝¹ : NormedField 𝕜
inst✝ : NormedField 𝕜'
c c' c₁ c₂ : ℝ
f✝ : α✝ → E
g✝ : α✝ → F
k : α✝ → G
f' : α✝ → E'
g' : α✝ → F'
k' : α✝ → G'
f'' : α✝ → E''
g'' : α✝ → F''
k'' : α✝ → G''
l✝ l' : Filter α✝
α : Type u_1
l : Filter α
f g : α → 𝕜
hgf : ∀ᶠ (x : α) in l, g x = 0 → f x = 0
h : IsBoundedUnder (fun x x_1 => x ≤ x_1) l fun x => ‖f x / g x‖
⊢ f =O[l] g

tactic: simp only [eventually_map, norm_div] at hc
state_before: case intro
α✝ : Type ?u.636916
β : Type ?u.636919
E : Type ?u.636922
F : Type ?u.636925
G : Type ?u.636928
E' : Type ?u.636931
F' : Type ?u.636934
G' : Type ?u.636937
E'' : Type ?u.636940
F'' : Type ?u.636943
G'' : Type ?u.636946
R : Type ?u.636949
R' : Type ?u.636952
𝕜 : Type u_2
𝕜' : Type ?u.636958
inst✝¹² : Norm E
inst✝¹¹ : Norm F
inst✝¹⁰ : Norm G
inst✝⁹ : SeminormedAddCommGroup E'
inst✝⁸ : SeminormedAddCommGroup F'
inst✝⁷ : SeminormedAddCommGroup G'
inst✝⁶ : NormedAddCommGroup E''
inst✝⁵ : NormedAddCommGroup F''
inst✝⁴ : NormedAddCommGroup G''
inst✝³ : SeminormedRing R
inst✝² : SeminormedRing R'
inst✝¹ : NormedField 𝕜
inst✝ : NormedField 𝕜'
c✝ c' c₁ c₂ : ℝ
f✝ : α✝ → E
g✝ : α✝ → F
k : α✝ → G
f' : α✝ → E'
g' : α✝ → F'
k' : α✝ → G'
f'' : α✝ → E''
g'' : α✝ → F''
k'' : α✝ → G''
l✝ l' : Filter α✝
α : Type u_1
l : Filter α
f g : α → 𝕜
hgf : ∀ᶠ (x : α) in l, g x = 0 → f x = 0
c : ℝ
hc : ∀ᶠ (x : ℝ) in map (fun x => ‖f x / g x‖) l, (fun x x_1 => x ≤ x_1) x c
⊢ f =O[l] g

tactic: refine' IsBigO.of_bound c (hc.mp <| hgf.mono fun x hx₁ hx₂ => _)
state_before: case intro
α✝ : Type ?u.636916
β : Type ?u.636919
E : Type ?u.636922
F : Type ?u.636925
G : Type ?u.636928
E' : Type ?u.636931
F' : Type ?u.636934
G' : Type ?u.636937
E'' : Type ?u.636940
F'' : Type ?u.636943
G'' : Type ?u.636946
R : Type ?u.636949
R' : Type ?u.636952
𝕜 : Type u_2
𝕜' : Type ?u.636958
inst✝¹² : Norm E
inst✝¹¹ : Norm F
inst✝¹⁰ : Norm G
inst✝⁹ : SeminormedAddCommGroup E'
inst✝⁸ : SeminormedAddCommGroup F'
inst✝⁷ : SeminormedAddCommGroup G'
inst✝⁶ : NormedAddCommGroup E''
inst✝⁵ : NormedAddCommGroup F''
inst✝⁴ : NormedAddCommGroup G''
inst✝³ : SeminormedRing R
inst✝² : SeminormedRing R'
inst✝¹ : NormedField 𝕜
inst✝ : NormedField 𝕜'
c✝ c' c₁ c₂ : ℝ
f✝ : α✝ → E
g✝ : α✝ → F
k : α✝ → G
f' : α✝ → E'
g' : α✝ → F'
k' : α✝ → G'
f'' : α✝ → E''
g'' : α✝ → F''
k'' : α✝ → G''
l✝ l' : Filter α✝
α : Type u_1
l : Filter α
f g : α → 𝕜
hgf : ∀ᶠ (x : α) in l, g x = 0 → f x = 0
c : ℝ
hc : ∀ᶠ (a : α) in l, ‖f a‖ / ‖g a‖ ≤ c
⊢ f =O[l] g

tactic: by_cases hgx : g x = 0
state_before: case intro
α✝ : Type ?u.636916
β : Type ?u.636919
E : Type ?u.636922
F : Type ?u.636925
G : Type ?u.636928
E' : Type ?u.636931
F' : Type ?u.636934
G' : Type ?u.636937
E'' : Type ?u.636940
F'' : Type ?u.636943
G'' : Type ?u.636946
R : Type ?u.636949
R' : Type ?u.636952
𝕜 : Type u_2
𝕜' : Type ?u.636958
inst✝¹² : Norm E
inst✝¹¹ : Norm F
inst✝¹⁰ : Norm G
inst✝⁹ : SeminormedAddCommGroup E'
inst✝⁸ : SeminormedAddCommGroup F'
inst✝⁷ : SeminormedAddCommGroup G'
inst✝⁶ : NormedAddCommGroup E''
inst✝⁵ : NormedAddCommGroup F''
inst✝⁴ : NormedAddCommGroup G''
inst✝³ : SeminormedRing R
inst✝² : SeminormedRing R'
inst✝¹ : NormedField 𝕜
inst✝ : NormedField 𝕜'
c✝ c' c₁ c₂ : ℝ
f✝ : α✝ → E
g✝ : α✝ → F
k : α✝ → G
f' : α✝ → E'
g' : α✝ → F'
k' : α✝ → G'
f'' : α✝ → E''
g'' : α✝ → F''
k'' : α✝ → G''
l✝ l' : Filter α✝
α : Type u_1
l : Filter α
f g : α → 𝕜
hgf : ∀ᶠ (x : α) in l, g x = 0 → f x = 0
c : ℝ
hc : ∀ᶠ (a : α) in l, ‖f a‖ / ‖g a‖ ≤ c
x : α
hx₁ : g x = 0 → f x = 0
hx₂ : ‖f x‖ / ‖g x‖ ≤ c
⊢ ‖f x‖ ≤ c * ‖g x‖

tactic: simp [hx₁ hgx, hgx]
state_before: case pos
α✝ : Type ?u.636916
β : Type ?u.636919
E : Type ?u.636922
F : Type ?u.636925
G : Type ?u.636928
E' : Type ?u.636931
F' : Type ?u.636934
G' : Type ?u.636937
E'' : Type ?u.636940
F'' : Type ?u.636943
G'' : Type ?u.636946
R : Type ?u.636949
R' : Type ?u.636952
𝕜 : Type u_2
𝕜' : Type ?u.636958
inst✝¹² : Norm E
inst✝¹¹ : Norm F
inst✝¹⁰ : Norm G
inst✝⁹ : SeminormedAddCommGroup E'
inst✝⁸ : SeminormedAddCommGroup F'
inst✝⁷ : SeminormedAddCommGroup G'
inst✝⁶ : NormedAddCommGroup E''
inst✝⁵ : NormedAddCommGroup F''
inst✝⁴ : NormedAddCommGroup G''
inst✝³ : SeminormedRing R
inst✝² : SeminormedRing R'
inst✝¹ : NormedField 𝕜
inst✝ : NormedField 𝕜'
c✝ c' c₁ c₂ : ℝ
f✝ : α✝ → E
g✝ : α✝ → F
k : α✝ → G
f' : α✝ → E'
g' : α✝ → F'
k' : α✝ → G'
f'' : α✝ → E''
g'' : α✝ → F''
k'' : α✝ → G''
l✝ l' : Filter α✝
α : Type u_1
l : Filter α
f g : α → 𝕜
hgf : ∀ᶠ (x : α) in l, g x = 0 → f x = 0
c : ℝ
hc : ∀ᶠ (a : α) in l, ‖f a‖ / ‖g a‖ ≤ c
x : α
hx₁ : g x = 0 → f x = 0
hx₂ : ‖f x‖ / ‖g x‖ ≤ c
hgx : g x = 0
⊢ ‖f x‖ ≤ c * ‖g x‖

tactic: exact (div_le_iff (norm_pos_iff.2 hgx)).mp hx₂
state_before: case neg
α✝ : Type ?u.636916
β : Type ?u.636919
E : Type ?u.636922
F : Type ?u.636925
G : Type ?u.636928
E' : Type ?u.636931
F' : Type ?u.636934
G' : Type ?u.636937
E'' : Type ?u.636940
F'' : Type ?u.636943
G'' : Type ?u.636946
R : Type ?u.636949
R' : Type ?u.636952
𝕜 : Type u_2
𝕜' : Type ?u.636958
inst✝¹² : Norm E
inst✝¹¹ : Norm F
inst✝¹⁰ : Norm G
inst✝⁹ : SeminormedAddCommGroup E'
inst✝⁸ : SeminormedAddCommGroup F'
inst✝⁷ : SeminormedAddCommGroup G'
inst✝⁶ : NormedAddCommGroup E''
inst✝⁵ : NormedAddCommGroup F''
inst✝⁴ : NormedAddCommGroup G''
inst✝³ : SeminormedRing R
inst✝² : SeminormedRing R'
inst✝¹ : NormedField 𝕜
inst✝ : NormedField 𝕜'
c✝ c' c₁ c₂ : ℝ
f✝ : α✝ → E
g✝ : α✝ → F
k : α✝ → G
f' : α✝ → E'
g' : α✝ → F'
k' : α✝ → G'
f'' : α✝ → E''
g'' : α✝ → F''
k'' : α✝ → G''
l✝ l' : Filter α✝
α : Type u_1
l : Filter α
f g : α → 𝕜
hgf : ∀ᶠ (x : α) in l, g x = 0 → f x = 0
c : ℝ
hc : ∀ᶠ (a : α) in l, ‖f a‖ / ‖g a‖ ≤ c
x : α
hx₁ : g x = 0 → f x = 0
hx₂ : ‖f x‖ / ‖g x‖ ≤ c
hgx : ¬g x = 0
⊢ ‖f x‖ ≤ c * ‖g x‖