section‹Subadditive and submultiplicative sequences›
theory Fekete imports"HOL-Analysis.Multivariate_Analysis" begin
text‹A real sequence is subadditive if $u_{n+m} \leq u_n+u_m$. This implies the
of $u_n/n$ to $Inf\{u_n/n\}\in [-\infty, +\infty)$, a useful result known
Fekete lemma. We prove it below.
logarithms, the same result applies to submultiplicative sequences. We illustrate
with the definition of the spectral radius as the limit of $\|x^n\|^{1/n}$, the
following from Fekete lemma.›
subsection‹Subadditive sequences›
text‹We define subadditive sequences, either from the start or eventually.›
definition subadditive::"(nat==>real) ==> bool" where"subadditive u = (∀m n. u (m+n) ≤ u m + u n)"
lemma subadditiveI: assumes"∧m n. u (m+n) ≤ u m + u n" shows"subadditive u" unfolding subadditive_def using assms by auto
lemma subadditiveD: assumes"subadditive u" shows"u (m+n) ≤ u m + u n" using assms unfolding subadditive_def by auto
lemma subadditive_un_le_nu1: assumes"subadditive u" "n > 0" shows"u n ≤ n * u 1" proof - have *: "n = 0 ∨ (u n ≤ n * u 1)"for n proof (induction n) case0 thenshow ?caseby auto next case (Suc n)
consider "n = 0" | "n > 0"by auto thenshow ?case proof (cases) case1 thenshow ?thesis by auto next case2 thenhave"u (Suc n) ≤ u n + u 1"using subadditiveD[OF assms(1), of n 1] by auto thenshow ?thesis using Suc.IH 2by (auto simp add: algebra_simps) qed qed show ?thesis using *[of n] ‹n > 0›by auto qed
definition eventually_subadditive::"(nat==>real) ==> nat ==> bool" where"eventually_subadditive u N0 = (∀m>N0. ∀n>N0. u (m+n) ≤ u m + u n)"
lemma eventually_subadditiveI: assumes"∧m n. m > N0 ==> n > N0 ==> u (m+n) ≤ u m + u n" shows"eventually_subadditive u N0" unfolding eventually_subadditive_def using assms by auto
lemma subadditive_imp_eventually_subadditive: assumes"subadditive u" shows"eventually_subadditive u 0" using assms unfolding subadditive_def eventually_subadditive_def by auto
text‹The main inequality that will lead to convergence is given in the next lemma:
$n$, then eventually $u_m/m$ is bounded by $u_n/n$, up to an arbitrarily small error.
is proved by doing the euclidean division of $m$ by $n$ and using the subadditivity.
the remainder in the euclidean division will give the error term.)›
lemma eventually_subadditive_ineq: assumes"eventually_subadditive u N0""e>0""n>N0" shows"∃N>N0. ∀m≥N. u m/m < u n/n + e" proof - have ineq_rec: "u(a*n+r) ≤ a * u n + u r"if"n>N0""r>N0"for a n r proof (induct a) case (Suc a) have"a*n+r>N0"using‹r>N0›by simp have"u((Suc a)*n+r) = u(a*n+r+n)"by (simp add: algebra_simps) alsohave"... ≤ u(a*n+r)+u n"using assms ‹n>N0›‹a*n+r>N0› eventually_subadditive_def by blast alsohave"... ≤ a*u n + u r + u n"by (simp add: Suc.hyps) alsohave"... = (Suc a) * u n + u r"by (simp add: algebra_simps) finallyshow ?caseby simp qed (simp)
have"n>0""real n > 0"using‹n>N0›by auto
define C where"C = Max {abs(u i) |i. i≤2*n}" have ineq_C: "abs(u i) ≤ C"if"i ≤ 2 * n"for i unfolding C_def by (intro Max_ge, auto simp add: that)
have ineq_all_m: "u m/m ≤ u n/n + 3*C/m"if"m≥n"for m proof - have"real m>0"using‹m≥n›‹0 < real n›by linarith
obtain a0 r0 where"r0<n""m = a0*n+r0" using‹0 < n› mod_div_decomp mod_less_divisor by blast
define a where"a = a0-1"
define r where"r = r0+n" have"r<2*n""r≥n"unfolding r_def by (auto simp add: ‹r0<n\›) have"a0>0"using‹m = a0*n + r0›‹n ≤ m›‹r0 < n› not_le by fastforce thenhave"m = a * n + r"using a_def r_def ‹m = a0*n+r0› mult_eq_if by auto thenhave real_eq: "-r = real n * a - m"by simp
have"r>N0"using‹r≥n›‹n>N0›by simp thenhave"u m ≤ a * u n + u r"using ineq_rec ‹m = a*n+r›‹n>N0›by simp thenhave"n * u m ≤ n * (a * u n + u r)"using‹real n>0›by simp thenhave"n * u m - m * u n ≤ -r * u n + n * u r" unfolding real_eq by (simp add: algebra_simps) alsohave"... ≤ r * abs(u n) + n * abs(u r)" apply (intro add_mono mult_left_mono) using real_0_le_add_iff by fastforce+ alsohave"... ≤ (2 * n) * C + n * C" apply (intro add_mono mult_mono ineq_C) using less_imp_le[OF ‹r < 2 * n›] by auto finallyhave"n * u m - m * u n ≤ 3*C*n"by auto thenshow"u m/m ≤ u n/n + 3*C/m" using‹0 < real n›‹0 < real m›by (simp add: divide_simps mult.commute) qed
obtain M::nat where M: "M ≥ 3 * C / e"using real_nat_ceiling_ge by auto
define N where"N = M + n + N0 + 1" have"N > 3 * C / e""N ≥ n""N > N0"unfolding N_def using M by auto have"u m/m < u n/n + e"if"m ≥ N"for m proof - have"3 * C / m < e" using that ‹N > 3 * C / e›‹e > 0›apply (auto simp add: algebra_simps divide_simps) by (meson le_less_trans linorder_not_le mult_less_cancel_left_pos of_nat_less_iff) thenshow ?thesis using ineq_all_m[of m] ‹n ≤ N›‹N ≤ m›by auto qed thenshow ?thesis using‹N0 < N›by blast qed
text‹From the inequality above, we deduce the convergence of $u_n/n$ to its infimum. As this
might be $-\infty$, we formulate this convergence in the extended reals. Then, we
it to the real situation, separating the cases where $u_n/n$ is bounded below or not.›
lemma subadditive_converges_ereal': assumes"eventually_subadditive u N0" shows"(λm. ereal(u m/m)) <---- Inf {ereal(u n/n) | n. n>N0}" proof -
define v where"v = (λm. ereal(u m/m))"
define V where"V = {v n | n. n>N0}"
define l where"l = Inf V"
have"∧t. t∈V ==> t≥l"by (simp add: Inf_lower l_def) thenhave"v n ≥ l"if"n > N0"for n using V_def that by blast thenhave lower: "eventually (λn. a < v n) sequentially"if"a < l"for a by (meson that dual_order.strict_trans1 eventually_at_top_dense)
have upper: "eventually (λn. a > v n) sequentially"if"a > l"for a proof - obtain t where"t∈V""t<a"by (metis ‹a>l› Inf_greatest l_def not_le) thenobtain e::real where"e>0""t+e < a"by (meson ereal_le_epsilon2 leD le_less_linear) obtain n where"n>N0""t = u n/n"using V_def v_def ‹t ∈ V›by blast thenhave"u n/n + e < a"using‹t+e < a›by simp obtain N where"∀m≥N. u m/m < u n/n + e" using eventually_subadditive_ineq[OF assms] ‹0 < e›‹N0 < n›by blast thenhave"u m/m < a"if"m ≥ N"for m using that ‹u n/n + e < a› less_ereal.simps(1) less_trans by blast thenhave"v m< a"if"m ≥ N"for m using v_def that by blast thenshow ?thesis using eventually_at_top_linorder by auto qed show ?thesis using lower upper unfolding V_def l_def v_def by (simp add: order_tendsto_iff) qed
lemma subadditive_converges_ereal: assumes"subadditive u" shows"(λm. ereal(u m/m)) <---- Inf {ereal(u n/n) | n. n>0}" by (rule subadditive_converges_ereal'[OF subadditive_imp_eventually_subadditive[OF assms]])
lemma subadditive_converges_bounded': assumes"eventually_subadditive u N0" "bdd_below {u n/n | n. n>N0}" shows"(λn. u n/n) <---- Inf {u n/n | n. n>N0}" proof- have *: "(λn. ereal(u n /n)) <---- Inf {ereal(u n/n)|n. n > N0}" by (simp add: assms(1) subadditive_converges_ereal')
define V where"V = {u n/n | n. n>N0}" have a: "bdd_below V""V≠{}"by (auto simp add: V_def assms(2)) have"Inf {ereal(t)| t. t∈V} = ereal(Inf V)"by (subst ereal_Inf'[OF a], simp add: Setcompr_eq_image) moreoverhave"{ereal(t)| t. t∈V} = {ereal(u n/n)|n. n > N0}"using V_def by blast ultimatelyhave"Inf {ereal(u n/n)|n. n > N0} = ereal(Inf {u n/n |n. n > N0})"using V_def by auto thenhave"(λn. ereal(u n /n)) <---- ereal(Inf {u n/n | n. n>N0})"using * by auto thenshow ?thesis by simp qed
lemma subadditive_converges_bounded: assumes"subadditive u" "bdd_below {u n/n | n. n>0}" shows"(λn. u n/n) <---- Inf {u n/n | n. n>0}" by (rule subadditive_converges_bounded'[OF subadditive_imp_eventually_subadditive[OF assms(1)] assms(2)])
text‹We reformulate the previous lemma in a more directly usable form, avoiding the infimum.›
lemma subadditive_converges_bounded'': assumes"subadditive u" "∧n. n > 0 ==> u n ≥ n * (a::real)" shows"∃l. (λn. u n / n) <---- l ∧ (∀n>0. u n ≥ n * l)" proof - have B: "bdd_below {u n/n | n. n>0}" apply (rule bdd_belowI[of _ a]) using assms(2) apply (auto simp add: divide_simps) apply (metis mult.commute mult_left_le_imp_le of_nat_0_less_iff) done
define l where"l = Inf {u n/n | n. n>0}" have *: "u n / n ≥ l"if"n > 0"for n unfolding l_def using that by (auto intro!: cInf_lower[OF _ B]) show ?thesis apply (rule exI[of _ l], auto) using subadditive_converges_bounded[OF assms(1) B] apply (simp add: l_def) using * by (simp add: divide_simps algebra_simps) qed
lemma subadditive_converges_unbounded': assumes"eventually_subadditive u N0" "¬ (bdd_below {u n/n | n. n>N0})" shows"(λn. ereal(u n/n)) <---- -∞" proof - have *: "(λn. ereal(u n /n)) <---- Inf {ereal(u n/n)|n. n > N0}" by (simp add: assms(1) subadditive_converges_ereal')
define V where"V = {u n/n | n. n>N0}" thenhave"¬ bdd_below V"using assms by simp have"Inf {ereal(t) | t. t∈V} = -∞" by (rule ereal_bot, metis (mono_tags, lifting) ‹¬ bdd_below V› bdd_below_def
leI Inf_lower2 ereal_less_eq(3) le_less mem_Collect_eq) moreoverhave"{ereal(t)| t. t∈V} = {ereal(u n/n)|n. n > N0}"using V_def by blast ultimatelyhave"Inf {ereal(u n/n)|n. n > N0} = -∞"by auto thenshow ?thesis using * by simp qed
text‹While most applications involve subadditive sequences, one sometimes encounters superadditive
. We reformulate quickly some of the above results in this setting.›
definition superadditive::"(nat==>real) ==> bool" where"superadditive u = (∀m n. u (m+n) ≥ u m + u n)"
lemma subadditive_of_superadditive: assumes"superadditive u" shows"subadditive (λn. -u n)" using assms unfolding superadditive_def subadditive_def by (auto simp add: algebra_simps)
lemma superadditive_un_ge_nu1: assumes"superadditive u" "n > 0" shows"u n ≥ n * u 1" using subadditive_un_le_nu1[OF subadditive_of_superadditive[OF assms(1)] assms(2)] byauto
lemma superadditive_converges_bounded'': assumes"superadditive u" "∧n. n > 0 ==> u n ≤ n * (a::real)" shows"∃l. (λn. u n / n) <---- l ∧ (∀n>0. u n ≤ n * l)" proof - have"∃l. (λn. -u n / n) <---- l ∧ (∀n>0. -u n ≥ n * l)" apply (rule subadditive_converges_bounded''[OF subadditive_of_superadditive[OF assms(1)], of "-a"]) using assms(2) by auto thenobtain l where l: "(λn. -u n / n) <---- l""(∀n>0. -u n ≥ n * l)"by blast have"(λn. -((-u n)/n)) <---- -l" by (intro tendsto_intros l) moreoverhave"∀n>0. u n ≤ n * (-l)" using l(2) by (auto simp add: algebra_simps) (metis minus_equation_iff neg_le_iff_le) ultimatelyshow ?thesis by auto qed
subsection‹Almost additive sequences›
text‹One often encounters sequences which are both subadditive and superadditive, but only up
an additive constant. Adding or subtracting this constant, one can make the sequence
subadditive or superadditive, and thus deduce results about its convergence, as follows.
sequences appear notably when dealing with quasimorphisms.›
lemma almost_additive_converges: fixes u::"nat ==> real" assumes"∧m n. abs(u(m+n) - u m - u n) ≤ C" shows"convergent (λn. u n/n)" "abs(u k - k * lim (λn. u n / n)) ≤ C" proof - have"(abs (u 0)) ≤ C"using assms[of 00] by auto thenhave"C ≥ 0"by auto
define v where"v = (λn. u n + C)" have"subadditive v" unfolding subadditive_def v_def using assms by (auto simp add: algebra_simps abs_diff_le_iff) thenhave vle: "v n ≤ n * v 1"if"n > 0"for n using subadditive_un_le_nu1 that by auto
define w where"w = (λn. u n - C)" have"superadditive w" unfolding superadditive_def w_def using assms by (auto simp add: algebra_simps abs_diff_le_iff) thenhave wge: "w n ≥ n * w 1"if"n > 0"for n using superadditive_un_ge_nu1 that by auto
have I: "v n ≥ w n"for n unfolding v_def w_def using‹C ≥ 0›by auto thenhave *: "v n ≥ n * w 1"if"n > 0"for n using order_trans[OF wge[OF that]] by auto thenobtain lv where lv: "(λn. v n/n) <---- lv""∧n. n > 0 ==> v n ≥ n * lv" using subadditive_converges_bounded''[OF ‹subadditive v› *] by auto have *: "w n ≤ n * v 1"if"n > 0"for n using order_trans[OF _ vle[OF that]] I by auto thenobtain lw where lw: "(λn. w n/n) <---- lw""∧n. n > 0 ==> w n ≤ n * lw" using superadditive_converges_bounded''[OF ‹superadditive w› *] by auto
have *: "v n/n = w n /n + 2*C*(1/n)"for n unfolding v_def w_def by (auto simp add: algebra_simps divide_simps) have"(λn. w n /n + 2*C*(1/n)) <---- lw + 2*C*0" by (intro tendsto_add tendsto_mult lim_1_over_n lw, auto) thenhave"lw = lv" unfolding *[symmetric] using lv(1) LIMSEQ_unique by auto
have *: "u n/n = w n /n + C*(1/n)"for n unfolding w_def by (auto simp add: algebra_simps divide_simps) have"(λn. u n /n) <---- lw + C*0" unfolding * by (intro tendsto_add tendsto_mult lim_1_over_n lw, auto) thenhave lu: "convergent (λn. u n/n)""lim (λn. u n/n) = lw" by (auto simp add: convergentI limI) thenshow"convergent (λn. u n/n)"by simp
show"abs(u k - k * lim (λn. u n / n)) ≤ C" proof (cases "k>0") case False thenshow ?thesis using assms[of 00] by auto next case True have"u k - k * lim (λn. u n/n) = v k - C - k * lv"unfolding lu(2) ‹lw = lv› v_def byauto alsohave"... ≥ -C"using lv(2)[OF True] by auto finallyhave A: "u k - k * lim (λn. u n/n) ≥ - C"by simp have"u k - k * lim (λn. u n/n) = w k + C - k * lw"unfolding lu(2) w_def by auto alsohave"... ≤ C"using lw(2)[OF True] by auto finallyshow ?thesis using A by auto qed qed
subsection‹Submultiplicative sequences, application to the spectral radius›
text‹In the same way as subadditive sequences, one may define submultiplicative sequences.
, a sequence is submultiplicative if its logarithm is subadditive. A difference is
we allow a submultiplicative sequence to take the value $0$, as this shows up in applications.
implies that we have to distinguish in the proofs the situations where the value $0$
taken or not. In the latter situation, we can use directly the results from the
case to deduce convergence. In the former situation, convergence to $0$ is obvious
the sequence vanishes eventually.›
lemma submultiplicative_converges: fixes u::"nat==>real" assumes"∧n. u n ≥ 0" "∧m n. u (m+n) ≤ u m * u n" shows"(λn. root n (u n))<---- Inf {root n (u n) | n. n>0}" proof -
define v where"v = (λ n. root n (u n))"
define V where"V = {v n | n. n>0}" thenhave"V ≠ {}"by blast have"t ≥ 0"if"t ∈ V"for t using that V_def v_def assms(1) by auto thenhave"Inf V ≥ 0"by (simp add: ‹V ≠ {}› cInf_greatest) have"bdd_below V"by (meson ‹∧t. t ∈ V ==> 0 ≤ t› bdd_below_def)
show ?thesis proof cases assume"∃n. u n = 0" thenobtain n where"u n = 0"by auto thenhave"u m = 0"if"m ≥ n"for m by (metis that antisym_conv assms(1) assms(2) le_Suc_ex mult_zero_left) thenhave *: "v m = 0"if"m ≥ n"for m using v_def that by simp thenhave"v <---- 0"using lim_explicit by force
have"v (Suc n) ∈ V"using V_def by blast moreoverhave"v (Suc n) = 0"using * by auto ultimatelyhave"Inf V ≤ 0"by (simp add: ‹bdd_below V› cInf_lower) thenhave"Inf V = 0"using‹0 ≤ Inf V›by auto thenshow ?thesis using V_def v_def ‹v <---- 0›by auto next assume"¬ (∃n. u n = 0)" thenhave"u n > 0"for n by (metis assms(1) less_eq_real_def)
define w where"w n = ln (u n)"for n have express_vn: "v n = exp(w n/n)"if"n>0"for n proof - have"(exp(w n/n))^n = exp(n*(w n/n))"by (metis exp_of_nat_mult) alsohave"... = exp(w n)"by (simp add: ‹0 < n›) alsohave"... = u n"by (simp add: ‹∧n. 0 < u n› w_def) finallyhave"exp(w n/n) = root n (u n)"by (metis ‹0 < n› exp_ge_zero real_root_power_cancel) thenshow ?thesis unfolding v_def by simp qed
have"eventually_subadditive w 0" proof (rule eventually_subadditiveI) fix m n have"w (m+n) = ln (u (m+n))"by (simp add: w_def) alsohave"... ≤ ln(u m * u n)" by (meson ‹∧n. 0 < u n› assms(2) zero_less_mult_iff ln_le_cancel_iff) alsohave"... = ln(u m) + ln(u n)" by (meson ‹∧n. 0 < u n› ln_mult_pos) alsohave"... = w m + w n"by (simp add: w_def) finallyshow"w (m+n) ≤ w m + w n". qed
define l where"l = Inf V" thenhave"v n≥l"if"n > 0"for n using V_def that by (metis (mono_tags, lifting) ‹bdd_below V› cInf_lower mem_Collect_eq) thenhave lower: "eventually (λn. a < v n) sequentially"if"a < l"for a by (meson that dual_order.strict_trans1 eventually_at_top_dense)
have upper: "eventually (λn. a > v n) sequentially"if"a > l"for a proof - obtain t where"t∈V""t < a"using‹V ≠ {}› cInf_lessD l_def ‹a>l›by blast thenhave"t > 0"using V_def ‹∧n. 0 < u n› v_def by auto thenhave"a/t > 1"using‹t<a\›by simp
define e where"e = ln(a/t)/2" have"e > 0""e < ln(a/t)"unfolding e_def by (simp_all add: ‹1 < a / t› ln_gt_zero) thenhave"exp(e) < a/t"by (metis ‹1 < a / t› exp_less_cancel_iff exp_ln less_trans zero_less_one)
obtain n where"n>0""t = v n"using V_def v_def ‹t ∈ V›by blast with‹0 < t›have"v n * exp(e) < a"using‹exp(e) < a/t› by (auto simp add: field_simps)
obtain N where *: "N>0""∧m. m≥N ==> w m/m < w n/n + e" using eventually_subadditive_ineq[OF ‹eventually_subadditive w 0›] ‹0 < n›‹e>0›by blast have"v m < a"if"m ≥ N"for m proof - have"m>0"using that ‹N>0›by simp have"w m/m < w n/n + e"by (simp add: ‹N ≤ m› *) thenhave"exp(w m/m) < exp(w n/n + e)"by simp alsohave"... = exp(w n/n) * exp(e)"by (simp add: mult_exp_exp) finallyhave"v m < v n * exp(e)"using express_vn ‹m>0›‹n>0›by simp thenshow"v m < a"using‹v n * exp(e) < a›by simp qed thenshow ?thesis using eventually_at_top_linorder by auto qed
show ?thesis using lower upper unfolding v_def l_def V_def by (simp add: order_tendsto_iff) qed qed
text‹An important application of submultiplicativity is to prove the existence of the
radius of a matrix, as the limit of $\|A^n\|^{1/n}$.›
definition spectral_radius::"'a::real_normed_algebra_1 ==> real" where"spectral_radius x = Inf {root n (norm(x^n))| n. n>0}"
lemma spectral_radius_aux: fixes x::"'a::real_normed_algebra_1" defines"V ≡ {root n (norm(x^n))| n. n>0}" shows"∧t. t∈V ==> t ≥ spectral_radius x" "∧t. t∈V ==> t ≥ 0" "bdd_below V" "V ≠ {}" "Inf V ≥ 0" proof - show"V≠{}"using V_def by blast show *: "t ≥ 0"if"t ∈ V"for t using that unfolding V_def using real_root_pos_pos_le by auto thenshow"bdd_below V"by (meson bdd_below_def) thenshow"Inf V ≥ 0"by (simp add: ‹V ≠ {}› * cInf_greatest) show"∧t. t∈V ==> t ≥ spectral_radius x"by (metis (mono_tags, lifting) ‹bdd_below V›assms cInf_lower spectral_radius_def) qed
lemma spectral_radius_nonneg [simp]: "spectral_radius x ≥ 0" by (simp add: spectral_radius_aux(5) spectral_radius_def)
lemma spectral_radius_upper_bound [simp]: "(spectral_radius x)^n ≤ norm(x^n)" proof (cases) assume"¬(n = 0)" have"root n (norm(x^n)) ≥ spectral_radius x" using spectral_radius_aux ‹n ≠ 0›by auto thenshow ?thesis by (metis ‹n ≠ 0› spectral_radius_nonneg norm_ge_zero not_gr0 power_mono real_root_pow_pos2) qed (simp)
lemma spectral_radius_limit: "(λn. root n (norm(x^n))) <---- spectral_radius x" proof - have"norm(x^(m+n)) ≤ norm(x^m) * norm(x^n)"for m n by (simp add: power_add norm_mult_ineq) thenshow ?thesis unfolding spectral_radius_def using submultiplicative_converges by auto qed
end(*of Fekete.thy*)
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-06-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.