src/HOL/Library/Function_Growth.thy
changeset 53015 a1119cf551e8
parent 51542 738598beeb26
child 56544 b60d5d119489
equal deleted inserted replaced
53009:bb18eed53ed6 53015:a1119cf551e8
    71 subsection {* The @{text "\<approx>"} relation, the equivalence relation induced by @{text "\<lesssim>"} *}
    71 subsection {* The @{text "\<approx>"} relation, the equivalence relation induced by @{text "\<lesssim>"} *}
    72 
    72 
    73 definition equiv_fun :: "(nat \<Rightarrow> nat) \<Rightarrow> (nat \<Rightarrow> nat) \<Rightarrow> bool" (infix "\<cong>" 50)
    73 definition equiv_fun :: "(nat \<Rightarrow> nat) \<Rightarrow> (nat \<Rightarrow> nat) \<Rightarrow> bool" (infix "\<cong>" 50)
    74 where
    74 where
    75   "f \<cong> g \<longleftrightarrow>
    75   "f \<cong> g \<longleftrightarrow>
    76     (\<exists>c\<^isub>1>0. \<exists>c\<^isub>2>0. \<exists>n. \<forall>m>n. f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m)"
    76     (\<exists>c\<^sub>1>0. \<exists>c\<^sub>2>0. \<exists>n. \<forall>m>n. f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m)"
    77 
    77 
    78 text {*
    78 text {*
    79   This yields @{text "f \<cong> g \<longleftrightarrow> f \<in> \<Theta>(g)"}.  Concerning @{text "c\<^isub>1"} and @{text "c\<^isub>2"}
    79   This yields @{text "f \<cong> g \<longleftrightarrow> f \<in> \<Theta>(g)"}.  Concerning @{text "c\<^sub>1"} and @{text "c\<^sub>2"}
    80   restricted to @{typ nat}, see note above on @{text "(\<lesssim>)"}.
    80   restricted to @{typ nat}, see note above on @{text "(\<lesssim>)"}.
    81 *}
    81 *}
    82 
    82 
    83 lemma equiv_funI [intro?]:
    83 lemma equiv_funI [intro?]:
    84   assumes "\<exists>c\<^isub>1>0. \<exists>c\<^isub>2>0. \<exists>n. \<forall>m>n. f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m"
    84   assumes "\<exists>c\<^sub>1>0. \<exists>c\<^sub>2>0. \<exists>n. \<forall>m>n. f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m"
    85   shows "f \<cong> g"
    85   shows "f \<cong> g"
    86   unfolding equiv_fun_def by (rule assms)
    86   unfolding equiv_fun_def by (rule assms)
    87 
    87 
    88 lemma not_equiv_funI:
    88 lemma not_equiv_funI:
    89   assumes "\<And>c\<^isub>1 c\<^isub>2 n. c\<^isub>1 > 0 \<Longrightarrow> c\<^isub>2 > 0 \<Longrightarrow>
    89   assumes "\<And>c\<^sub>1 c\<^sub>2 n. c\<^sub>1 > 0 \<Longrightarrow> c\<^sub>2 > 0 \<Longrightarrow>
    90     \<exists>m>n. c\<^isub>1 * f m < g m \<or> c\<^isub>2 * g m < f m"
    90     \<exists>m>n. c\<^sub>1 * f m < g m \<or> c\<^sub>2 * g m < f m"
    91   shows "\<not> f \<cong> g"
    91   shows "\<not> f \<cong> g"
    92   using assms unfolding equiv_fun_def linorder_not_le [symmetric] by blast
    92   using assms unfolding equiv_fun_def linorder_not_le [symmetric] by blast
    93 
    93 
    94 lemma equiv_funE [elim?]:
    94 lemma equiv_funE [elim?]:
    95   assumes "f \<cong> g"
    95   assumes "f \<cong> g"
    96   obtains n c\<^isub>1 c\<^isub>2 where "c\<^isub>1 > 0" and "c\<^isub>2 > 0"
    96   obtains n c\<^sub>1 c\<^sub>2 where "c\<^sub>1 > 0" and "c\<^sub>2 > 0"
    97     and "\<And>m. m > n \<Longrightarrow> f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m"
    97     and "\<And>m. m > n \<Longrightarrow> f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m"
    98   using assms unfolding equiv_fun_def by blast
    98   using assms unfolding equiv_fun_def by blast
    99 
    99 
   100 lemma not_equiv_funE:
   100 lemma not_equiv_funE:
   101   fixes n c\<^isub>1 c\<^isub>2
   101   fixes n c\<^sub>1 c\<^sub>2
   102   assumes "\<not> f \<cong> g" and "c\<^isub>1 > 0" and "c\<^isub>2 > 0"
   102   assumes "\<not> f \<cong> g" and "c\<^sub>1 > 0" and "c\<^sub>2 > 0"
   103   obtains m where "m > n"
   103   obtains m where "m > n"
   104     and "c\<^isub>1 * f m < g m \<or> c\<^isub>2 * g m < f m"
   104     and "c\<^sub>1 * f m < g m \<or> c\<^sub>2 * g m < f m"
   105   using assms unfolding equiv_fun_def linorder_not_le [symmetric] by blast
   105   using assms unfolding equiv_fun_def linorder_not_le [symmetric] by blast
   106 
   106 
   107 
   107 
   108 subsection {* The @{text "\<prec>"} relation, the strict part of @{text "\<lesssim>"} *}
   108 subsection {* The @{text "\<prec>"} relation, the strict part of @{text "\<lesssim>"} *}
   109 
   109 
   205     show "f \<prec> g \<longleftrightarrow> f \<lesssim> g \<and> \<not> g \<lesssim> f"
   205     show "f \<prec> g \<longleftrightarrow> f \<lesssim> g \<and> \<not> g \<lesssim> f"
   206       by (fact less_fun_def)
   206       by (fact less_fun_def)
   207     assume "f \<lesssim> g" and "g \<lesssim> h"
   207     assume "f \<lesssim> g" and "g \<lesssim> h"
   208     show "f \<lesssim> h"
   208     show "f \<lesssim> h"
   209     proof
   209     proof
   210       from `f \<lesssim> g` obtain n\<^isub>1 c\<^isub>1
   210       from `f \<lesssim> g` obtain n\<^sub>1 c\<^sub>1
   211         where "c\<^isub>1 > 0" and P\<^isub>1: "\<And>m. m > n\<^isub>1 \<Longrightarrow> f m \<le> c\<^isub>1 * g m"
   211         where "c\<^sub>1 > 0" and P\<^sub>1: "\<And>m. m > n\<^sub>1 \<Longrightarrow> f m \<le> c\<^sub>1 * g m"
   212         by rule blast
   212         by rule blast
   213       from `g \<lesssim> h` obtain n\<^isub>2 c\<^isub>2
   213       from `g \<lesssim> h` obtain n\<^sub>2 c\<^sub>2
   214         where "c\<^isub>2 > 0" and P\<^isub>2: "\<And>m. m > n\<^isub>2 \<Longrightarrow> g m \<le> c\<^isub>2 * h m"
   214         where "c\<^sub>2 > 0" and P\<^sub>2: "\<And>m. m > n\<^sub>2 \<Longrightarrow> g m \<le> c\<^sub>2 * h m"
   215         by rule blast
   215         by rule blast
   216       have "\<forall>m>max n\<^isub>1 n\<^isub>2. f m \<le> (c\<^isub>1 * c\<^isub>2) * h m"
   216       have "\<forall>m>max n\<^sub>1 n\<^sub>2. f m \<le> (c\<^sub>1 * c\<^sub>2) * h m"
   217       proof (rule allI, rule impI)
   217       proof (rule allI, rule impI)
   218         fix m
   218         fix m
   219         assume Q: "m > max n\<^isub>1 n\<^isub>2"
   219         assume Q: "m > max n\<^sub>1 n\<^sub>2"
   220         from P\<^isub>1 Q have *: "f m \<le> c\<^isub>1 * g m" by simp
   220         from P\<^sub>1 Q have *: "f m \<le> c\<^sub>1 * g m" by simp
   221         from P\<^isub>2 Q have "g m \<le> c\<^isub>2 * h m" by simp
   221         from P\<^sub>2 Q have "g m \<le> c\<^sub>2 * h m" by simp
   222         with `c\<^isub>1 > 0` have "c\<^isub>1 * g m \<le> (c\<^isub>1 * c\<^isub>2) * h m" by simp
   222         with `c\<^sub>1 > 0` have "c\<^sub>1 * g m \<le> (c\<^sub>1 * c\<^sub>2) * h m" by simp
   223         with * show "f m \<le> (c\<^isub>1 * c\<^isub>2) * h m" by (rule order_trans)
   223         with * show "f m \<le> (c\<^sub>1 * c\<^sub>2) * h m" by (rule order_trans)
   224       qed
   224       qed
   225       then have "\<exists>n. \<forall>m>n. f m \<le> (c\<^isub>1 * c\<^isub>2) * h m" by rule
   225       then have "\<exists>n. \<forall>m>n. f m \<le> (c\<^sub>1 * c\<^sub>2) * h m" by rule
   226       moreover from `c\<^isub>1 > 0` `c\<^isub>2 > 0` have "c\<^isub>1 * c\<^isub>2 > 0" by (rule mult_pos_pos)
   226       moreover from `c\<^sub>1 > 0` `c\<^sub>2 > 0` have "c\<^sub>1 * c\<^sub>2 > 0" by (rule mult_pos_pos)
   227       ultimately show "\<exists>c>0. \<exists>n. \<forall>m>n. f m \<le> c * h m" by blast
   227       ultimately show "\<exists>c>0. \<exists>n. \<forall>m>n. f m \<le> c * h m" by blast
   228     qed
   228     qed
   229   qed
   229   qed
   230   from preorder.preorder_equiv_axioms show "class.preorder_equiv less_eq_fun less_fun" .
   230   from preorder.preorder_equiv_axioms show "class.preorder_equiv less_eq_fun less_fun" .
   231   show "preorder_equiv.equiv less_eq_fun = equiv_fun"
   231   show "preorder_equiv.equiv less_eq_fun = equiv_fun"
   232   proof (rule ext, rule ext, unfold preorder.equiv_def)
   232   proof (rule ext, rule ext, unfold preorder.equiv_def)
   233     fix f g
   233     fix f g
   234     show "f \<lesssim> g \<and> g \<lesssim> f \<longleftrightarrow> f \<cong> g"
   234     show "f \<lesssim> g \<and> g \<lesssim> f \<longleftrightarrow> f \<cong> g"
   235     proof
   235     proof
   236       assume "f \<cong> g"
   236       assume "f \<cong> g"
   237       then obtain n c\<^isub>1 c\<^isub>2 where "c\<^isub>1 > 0" and "c\<^isub>2 > 0"
   237       then obtain n c\<^sub>1 c\<^sub>2 where "c\<^sub>1 > 0" and "c\<^sub>2 > 0"
   238         and *: "\<And>m. m > n \<Longrightarrow> f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m"
   238         and *: "\<And>m. m > n \<Longrightarrow> f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m"
   239         by rule blast
   239         by rule blast
   240       have "\<forall>m>n. f m \<le> c\<^isub>1 * g m"
   240       have "\<forall>m>n. f m \<le> c\<^sub>1 * g m"
   241       proof (rule allI, rule impI)
   241       proof (rule allI, rule impI)
   242         fix m
   242         fix m
   243         assume "m > n"
   243         assume "m > n"
   244         with * show "f m \<le> c\<^isub>1 * g m" by simp
   244         with * show "f m \<le> c\<^sub>1 * g m" by simp
   245       qed
   245       qed
   246       with `c\<^isub>1 > 0` have "\<exists>c>0. \<exists>n. \<forall>m>n. f m \<le> c * g m" by blast
   246       with `c\<^sub>1 > 0` have "\<exists>c>0. \<exists>n. \<forall>m>n. f m \<le> c * g m" by blast
   247       then have "f \<lesssim> g" ..
   247       then have "f \<lesssim> g" ..
   248       have "\<forall>m>n. g m \<le> c\<^isub>2 * f m"
   248       have "\<forall>m>n. g m \<le> c\<^sub>2 * f m"
   249       proof (rule allI, rule impI)
   249       proof (rule allI, rule impI)
   250         fix m
   250         fix m
   251         assume "m > n"
   251         assume "m > n"
   252         with * show "g m \<le> c\<^isub>2 * f m" by simp
   252         with * show "g m \<le> c\<^sub>2 * f m" by simp
   253       qed
   253       qed
   254       with `c\<^isub>2 > 0` have "\<exists>c>0. \<exists>n. \<forall>m>n. g m \<le> c * f m" by blast
   254       with `c\<^sub>2 > 0` have "\<exists>c>0. \<exists>n. \<forall>m>n. g m \<le> c * f m" by blast
   255       then have "g \<lesssim> f" ..
   255       then have "g \<lesssim> f" ..
   256       from `f \<lesssim> g` and `g \<lesssim> f` show "f \<lesssim> g \<and> g \<lesssim> f" ..
   256       from `f \<lesssim> g` and `g \<lesssim> f` show "f \<lesssim> g \<and> g \<lesssim> f" ..
   257     next
   257     next
   258       assume "f \<lesssim> g \<and> g \<lesssim> f"
   258       assume "f \<lesssim> g \<and> g \<lesssim> f"
   259       then have "f \<lesssim> g" and "g \<lesssim> f" by auto
   259       then have "f \<lesssim> g" and "g \<lesssim> f" by auto
   260       from `f \<lesssim> g` obtain n\<^isub>1 c\<^isub>1 where "c\<^isub>1 > 0"
   260       from `f \<lesssim> g` obtain n\<^sub>1 c\<^sub>1 where "c\<^sub>1 > 0"
   261         and P\<^isub>1: "\<And>m. m > n\<^isub>1 \<Longrightarrow> f m \<le> c\<^isub>1 * g m" by rule blast
   261         and P\<^sub>1: "\<And>m. m > n\<^sub>1 \<Longrightarrow> f m \<le> c\<^sub>1 * g m" by rule blast
   262       from `g \<lesssim> f` obtain n\<^isub>2 c\<^isub>2 where "c\<^isub>2 > 0"
   262       from `g \<lesssim> f` obtain n\<^sub>2 c\<^sub>2 where "c\<^sub>2 > 0"
   263         and P\<^isub>2: "\<And>m. m > n\<^isub>2 \<Longrightarrow> g m \<le> c\<^isub>2 * f m" by rule blast
   263         and P\<^sub>2: "\<And>m. m > n\<^sub>2 \<Longrightarrow> g m \<le> c\<^sub>2 * f m" by rule blast
   264       have "\<forall>m>max n\<^isub>1 n\<^isub>2. f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m"
   264       have "\<forall>m>max n\<^sub>1 n\<^sub>2. f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m"
   265       proof (rule allI, rule impI)
   265       proof (rule allI, rule impI)
   266         fix m
   266         fix m
   267         assume Q: "m > max n\<^isub>1 n\<^isub>2"
   267         assume Q: "m > max n\<^sub>1 n\<^sub>2"
   268         from P\<^isub>1 Q have "f m \<le> c\<^isub>1 * g m" by simp
   268         from P\<^sub>1 Q have "f m \<le> c\<^sub>1 * g m" by simp
   269         moreover from P\<^isub>2 Q have "g m \<le> c\<^isub>2 * f m" by simp
   269         moreover from P\<^sub>2 Q have "g m \<le> c\<^sub>2 * f m" by simp
   270         ultimately show "f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m" ..
   270         ultimately show "f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m" ..
   271       qed
   271       qed
   272       with `c\<^isub>1 > 0` `c\<^isub>2 > 0` have "\<exists>c\<^isub>1>0. \<exists>c\<^isub>2>0. \<exists>n.
   272       with `c\<^sub>1 > 0` `c\<^sub>2 > 0` have "\<exists>c\<^sub>1>0. \<exists>c\<^sub>2>0. \<exists>n.
   273         \<forall>m>n. f m \<le> c\<^isub>1 * g m \<and> g m \<le> c\<^isub>2 * f m" by blast
   273         \<forall>m>n. f m \<le> c\<^sub>1 * g m \<and> g m \<le> c\<^sub>2 * f m" by blast
   274       then show "f \<cong> g" ..
   274       then show "f \<cong> g" ..
   275     qed
   275     qed
   276   qed
   276   qed
   277 qed
   277 qed
   278 
   278 
   316 
   316 
   317 lemma "Discrete.sqrt \<prec> id"
   317 lemma "Discrete.sqrt \<prec> id"
   318 proof (rule less_fun_strongI)
   318 proof (rule less_fun_strongI)
   319   fix c :: nat
   319   fix c :: nat
   320   assume "0 < c"
   320   assume "0 < c"
   321   have "\<forall>m>(Suc c)\<twosuperior>. c * Discrete.sqrt m < id m"
   321   have "\<forall>m>(Suc c)\<^sup>2. c * Discrete.sqrt m < id m"
   322   proof (rule allI, rule impI)
   322   proof (rule allI, rule impI)
   323     fix m
   323     fix m
   324     assume "(Suc c)\<twosuperior> < m"
   324     assume "(Suc c)\<^sup>2 < m"
   325     then have "(Suc c)\<twosuperior> \<le> m" by simp
   325     then have "(Suc c)\<^sup>2 \<le> m" by simp
   326     with mono_sqrt have "Discrete.sqrt ((Suc c)\<twosuperior>) \<le> Discrete.sqrt m" by (rule monoE)
   326     with mono_sqrt have "Discrete.sqrt ((Suc c)\<^sup>2) \<le> Discrete.sqrt m" by (rule monoE)
   327     then have "Suc c \<le> Discrete.sqrt m" by simp
   327     then have "Suc c \<le> Discrete.sqrt m" by simp
   328     then have "c < Discrete.sqrt m" by simp
   328     then have "c < Discrete.sqrt m" by simp
   329     moreover from `(Suc c)\<twosuperior> < m` have "Discrete.sqrt m > 0" by simp
   329     moreover from `(Suc c)\<^sup>2 < m` have "Discrete.sqrt m > 0" by simp
   330     ultimately have "c * Discrete.sqrt m < Discrete.sqrt m * Discrete.sqrt m" by simp
   330     ultimately have "c * Discrete.sqrt m < Discrete.sqrt m * Discrete.sqrt m" by simp
   331     also have "\<dots> \<le> m" by (simp add: power2_eq_square [symmetric])
   331     also have "\<dots> \<le> m" by (simp add: power2_eq_square [symmetric])
   332     finally show "c * Discrete.sqrt m < id m" by simp
   332     finally show "c * Discrete.sqrt m < id m" by simp
   333   qed
   333   qed
   334   then show "\<exists>n. \<forall>m>n. c * Discrete.sqrt m < id m" ..
   334   then show "\<exists>n. \<forall>m>n. c * Discrete.sqrt m < id m" ..
   335 qed
   335 qed
   336 
   336 
   337 lemma "id \<prec> (\<lambda>n. n\<twosuperior>)"
   337 lemma "id \<prec> (\<lambda>n. n\<^sup>2)"
   338   by (rule less_fun_strongI) (auto simp add: power2_eq_square)
   338   by (rule less_fun_strongI) (auto simp add: power2_eq_square)
   339 
   339 
   340 lemma "(\<lambda>n. n ^ k) \<prec> (\<lambda>n. n ^ Suc k)"
   340 lemma "(\<lambda>n. n ^ k) \<prec> (\<lambda>n. n ^ Suc k)"
   341   by (rule less_fun_strongI) auto
   341   by (rule less_fun_strongI) auto
   342 
   342