Documentation

Mathlib.Analysis.Polynomial.Basic

Limits related to polynomial and rational functions #

This file proves basic facts about limits of polynomial and rational functions. The main result is Polynomial.isEquivalent_atTop_lead, which states that for any polynomial P of degree n with leading coefficient a, the corresponding polynomial function is equivalent to a * x^n as x goes to +∞.

We can then use this result to prove various limits for polynomial and rational functions, depending on the degrees and leading coefficients of the considered polynomials.

theorem Polynomial.eventually_atTop_not_isRoot {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) (hP : P β‰  0) :
@[deprecated Polynomial.eventually_atTop_not_isRoot (since := "2026-02-05")]
theorem Polynomial.eventually_no_roots {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) (hP : P β‰  0) :

Alias of Polynomial.eventually_atTop_not_isRoot.

theorem Polynomial.eventually_atBot_not_isRoot {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) (hP : P β‰  0) :
theorem Polynomial.isEquivalent_atTop_lead {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] :
Asymptotics.IsEquivalent Filter.atTop (fun (x : π•œ) => eval x P) fun (x : π•œ) => P.leadingCoeff * x ^ P.natDegree
theorem Polynomial.tendsto_atTop_of_leadingCoeff_nonneg {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] (hdeg : 0 < P.degree) (hnng : 0 ≀ P.leadingCoeff) :
Filter.Tendsto (fun (x : π•œ) => eval x P) Filter.atTop Filter.atTop
theorem Polynomial.tendsto_atTop_iff_leadingCoeff_nonneg {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] :
theorem Polynomial.tendsto_atBot_iff_leadingCoeff_nonpos {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] :
theorem Polynomial.tendsto_atBot_of_leadingCoeff_nonpos {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] (hdeg : 0 < P.degree) (hnps : P.leadingCoeff ≀ 0) :
Filter.Tendsto (fun (x : π•œ) => eval x P) Filter.atTop Filter.atBot
theorem Polynomial.abs_tendsto_atTop {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] (hdeg : 0 < P.degree) :
Filter.Tendsto (fun (x : π•œ) => |eval x P|) Filter.atTop Filter.atTop
theorem Polynomial.isBoundedUnder_abs_atTop_iff {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] :
(Filter.IsBoundedUnder (fun (x1 x2 : π•œ) => x1 ≀ x2) Filter.atTop fun (x : π•œ) => |eval x P|) ↔ P.degree ≀ 0
@[deprecated Polynomial.isBoundedUnder_abs_atTop_iff (since := "2026-02-05")]
theorem Polynomial.abs_isBoundedUnder_iff {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] :
(Filter.IsBoundedUnder (fun (x1 x2 : π•œ) => x1 ≀ x2) Filter.atTop fun (x : π•œ) => |eval x P|) ↔ P.degree ≀ 0

Alias of Polynomial.isBoundedUnder_abs_atTop_iff.

theorem Polynomial.abs_tendsto_atTop_iff {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] :
Filter.Tendsto (fun (x : π•œ) => |eval x P|) Filter.atTop Filter.atTop ↔ 0 < P.degree
theorem Polynomial.tendsto_nhds_iff {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] {c : π•œ} :
Filter.Tendsto (fun (x : π•œ) => eval x P) Filter.atTop (nhds c) ↔ P.leadingCoeff = c ∧ P.degree ≀ 0
theorem Polynomial.isEquivalent_atBot_lead {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] :
Asymptotics.IsEquivalent Filter.atBot (fun (x : π•œ) => eval x P) fun (x : π•œ) => P.leadingCoeff * x ^ P.natDegree
theorem Polynomial.abs_tendsto_atBot {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] (hdeg : 0 < P.degree) :
Filter.Tendsto (fun (x : π•œ) => |eval x P|) Filter.atBot Filter.atTop
theorem Polynomial.isBoundedUnder_abs_atBot_iff {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] :
(Filter.IsBoundedUnder (fun (x1 x2 : π•œ) => x1 ≀ x2) Filter.atBot fun (x : π•œ) => |eval x P|) ↔ P.degree ≀ 0
theorem Polynomial.abs_tendsto_atBot_iff {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P : Polynomial π•œ) [OrderTopology π•œ] :
Filter.Tendsto (fun (x : π•œ) => |eval x P|) Filter.atBot Filter.atTop ↔ 0 < P.degree
theorem Polynomial.isEquivalent_atTop_div {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] :
Asymptotics.IsEquivalent Filter.atTop (fun (x : π•œ) => eval x P / eval x Q) fun (x : π•œ) => P.leadingCoeff / Q.leadingCoeff * x ^ (↑P.natDegree - ↑Q.natDegree)
theorem Polynomial.div_tendsto_atTop_zero_of_degree_lt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : P.degree < Q.degree) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atTop (nhds 0)
@[deprecated Polynomial.div_tendsto_atTop_zero_of_degree_lt (since := "2026-02-05")]
theorem Polynomial.div_tendsto_zero_of_degree_lt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : P.degree < Q.degree) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atTop (nhds 0)

Alias of Polynomial.div_tendsto_atTop_zero_of_degree_lt.

theorem Polynomial.div_tendsto_atTop_zero_iff_degree_lt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hQ : Q β‰  0) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atTop (nhds 0) ↔ P.degree < Q.degree
@[deprecated Polynomial.div_tendsto_atTop_zero_iff_degree_lt (since := "2026-02-05")]
theorem Polynomial.div_tendsto_zero_iff_degree_lt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hQ : Q β‰  0) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atTop (nhds 0) ↔ P.degree < Q.degree

Alias of Polynomial.div_tendsto_atTop_zero_iff_degree_lt.

theorem Polynomial.div_tendsto_atTop_leadingCoeff_div_of_degree_eq {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : P.degree = Q.degree) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atTop (nhds (P.leadingCoeff / Q.leadingCoeff))
@[deprecated Polynomial.div_tendsto_atTop_leadingCoeff_div_of_degree_eq (since := "2026-02-05")]
theorem Polynomial.div_tendsto_leadingCoeff_div_of_degree_eq {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : P.degree = Q.degree) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atTop (nhds (P.leadingCoeff / Q.leadingCoeff))

Alias of Polynomial.div_tendsto_atTop_leadingCoeff_div_of_degree_eq.

theorem Polynomial.div_tendsto_atTop_of_degree_gt' {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : Q.degree < P.degree) (hpos : 0 < P.leadingCoeff / Q.leadingCoeff) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atTop Filter.atTop
theorem Polynomial.div_tendsto_atTop_of_degree_gt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : Q.degree < P.degree) (hQ : Q β‰  0) (hnng : 0 ≀ P.leadingCoeff / Q.leadingCoeff) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atTop Filter.atTop
theorem Polynomial.div_tendsto_atBot_of_degree_gt' {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : Q.degree < P.degree) (hneg : P.leadingCoeff / Q.leadingCoeff < 0) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atTop Filter.atBot
theorem Polynomial.div_tendsto_atBot_of_degree_gt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : Q.degree < P.degree) (hQ : Q β‰  0) (hnps : P.leadingCoeff / Q.leadingCoeff ≀ 0) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atTop Filter.atBot
theorem Polynomial.abs_div_tendsto_atTop_atTop_of_degree_gt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : Q.degree < P.degree) (hQ : Q β‰  0) :
Filter.Tendsto (fun (x : π•œ) => |eval x P / eval x Q|) Filter.atTop Filter.atTop
@[deprecated Polynomial.abs_div_tendsto_atTop_atTop_of_degree_gt (since := "2026-02-05")]
theorem Polynomial.abs_div_tendsto_atTop_of_degree_gt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : Q.degree < P.degree) (hQ : Q β‰  0) :
Filter.Tendsto (fun (x : π•œ) => |eval x P / eval x Q|) Filter.atTop Filter.atTop

Alias of Polynomial.abs_div_tendsto_atTop_atTop_of_degree_gt.

theorem Polynomial.isEquivalent_atBot_div {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] :
Asymptotics.IsEquivalent Filter.atBot (fun (x : π•œ) => eval x P / eval x Q) fun (x : π•œ) => P.leadingCoeff / Q.leadingCoeff * x ^ (↑P.natDegree - ↑Q.natDegree)
theorem Polynomial.div_tendsto_atBot_zero_of_degree_lt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : P.degree < Q.degree) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atBot (nhds 0)
theorem Polynomial.div_tendsto_atBot_zero_iff_degree_lt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hQ : Q β‰  0) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atBot (nhds 0) ↔ P.degree < Q.degree
theorem Polynomial.div_tendsto_atBot_leadingCoeff_div_of_degree_eq {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : P.degree = Q.degree) :
Filter.Tendsto (fun (x : π•œ) => eval x P / eval x Q) Filter.atBot (nhds (P.leadingCoeff / Q.leadingCoeff))
theorem Polynomial.abs_div_tendsto_atBot_atTop_of_degree_gt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (hdeg : Q.degree < P.degree) (hQ : Q β‰  0) :
Filter.Tendsto (fun (x : π•œ) => |eval x P / eval x Q|) Filter.atBot Filter.atTop
theorem Polynomial.isLittleO_atTop_of_degree_lt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (h : P.degree < Q.degree) :
(fun (x : π•œ) => eval x P) =o[Filter.atTop] fun (x : π•œ) => eval x Q
theorem Polynomial.isLittleO_atBot_of_degree_lt {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (h : P.degree < Q.degree) :
(fun (x : π•œ) => eval x P) =o[Filter.atBot] fun (x : π•œ) => eval x Q
theorem Polynomial.isBigO_atTop_of_degree_le {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (h : P.degree ≀ Q.degree) :
(fun (x : π•œ) => eval x P) =O[Filter.atTop] fun (x : π•œ) => eval x Q
theorem Polynomial.isBigO_atBot_of_degree_le {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (h : P.degree ≀ Q.degree) :
(fun (x : π•œ) => eval x P) =O[Filter.atBot] fun (x : π•œ) => eval x Q
@[deprecated Polynomial.isBigO_atTop_of_degree_le (since := "2026-02-05")]
theorem Polynomial.isBigO_of_degree_le {π•œ : Type u_1} [NormedField π•œ] [LinearOrder π•œ] [IsStrictOrderedRing π•œ] (P Q : Polynomial π•œ) [OrderTopology π•œ] (h : P.degree ≀ Q.degree) :
(fun (x : π•œ) => eval x P) =O[Filter.atTop] fun (x : π•œ) => eval x Q

Alias of Polynomial.isBigO_atTop_of_degree_le.

theorem Polynomial.isLittleO_cobounded_of_degree_lt {R : Type u_2} [NormedRing R] [NormMulClass R] {P Q : Polynomial R} (h : P.degree < Q.degree) :
(fun (x : R) => eval x P) =o[Bornology.cobounded R] fun (x : R) => eval x Q
theorem Polynomial.isBigO_cobounded_of_degree_le {R : Type u_2} [NormedRing R] [NormMulClass R] {P Q : Polynomial R} (h : P.degree ≀ Q.degree) :
(fun (x : R) => eval x P) =O[Bornology.cobounded R] fun (x : R) => eval x Q

If deg Q < deg P, there are only finitely many integers x where |P(x)| ≀ |Q(x)|.

If Q(x) ∣ P(x) at infinitely many integers x and Q is monic, Q ∣ P.