--- a/src/HOL/Computational_Algebra/Formal_Power_Series.thy Sun Feb 19 13:51:49 2023 +0100
+++ b/src/HOL/Computational_Algebra/Formal_Power_Series.thy Sun Feb 19 21:21:19 2023 +0000
@@ -59,12 +59,9 @@
by (rule LeastI_ex)
moreover have "\<forall>m<?n. f $ m = 0"
by (auto dest: not_less_Least)
- ultimately have "f $ ?n \<noteq> 0 \<and> (\<forall>m<?n. f $ m = 0)" ..
- then show ?thesis ..
+ ultimately show ?thesis by metis
qed
- show ?lhs if ?rhs
- using that by (auto simp add: expand_fps_eq)
-qed
+qed (auto simp: expand_fps_eq)
lemma fps_nonzeroI: "f$n \<noteq> 0 \<Longrightarrow> f \<noteq> 0"
by auto
@@ -165,71 +162,36 @@
lemma subdegreeI:
assumes "f $ d \<noteq> 0" and "\<And>i. i < d \<Longrightarrow> f $ i = 0"
shows "subdegree f = d"
-proof-
- from assms(1) have "f \<noteq> 0" by auto
- moreover from assms(1) have "(LEAST i. f $ i \<noteq> 0) = d"
- proof (rule Least_equality)
- fix e assume "f $ e \<noteq> 0"
- with assms(2) have "\<not>(e < d)" by blast
- thus "e \<ge> d" by simp
- qed
- ultimately show ?thesis unfolding subdegree_def by simp
-qed
+ by (smt (verit) LeastI_ex assms fps_zero_nth linorder_cases not_less_Least subdegree_def)
lemma nth_subdegree_nonzero [simp,intro]: "f \<noteq> 0 \<Longrightarrow> f $ subdegree f \<noteq> 0"
-proof-
- assume "f \<noteq> 0"
- hence "subdegree f = (LEAST n. f $ n \<noteq> 0)" by (simp add: subdegree_def)
- also from \<open>f \<noteq> 0\<close> have "\<exists>n. f$n \<noteq> 0" using fps_nonzero_nth by blast
- from LeastI_ex[OF this] have "f $ (LEAST n. f $ n \<noteq> 0) \<noteq> 0" .
- finally show ?thesis .
-qed
+ using fps_nonzero_nth_minimal subdegreeI by blast
lemma nth_less_subdegree_zero [dest]: "n < subdegree f \<Longrightarrow> f $ n = 0"
-proof (cases "f = 0")
- assume "f \<noteq> 0" and less: "n < subdegree f"
- note less
- also from \<open>f \<noteq> 0\<close> have "subdegree f = (LEAST n. f $ n \<noteq> 0)" by (simp add: subdegree_def)
- finally show "f $ n = 0" using not_less_Least by blast
-qed simp_all
+ by (metis fps_nonzero_nth_minimal fps_zero_nth subdegreeI)
lemma subdegree_geI:
assumes "f \<noteq> 0" "\<And>i. i < n \<Longrightarrow> f$i = 0"
shows "subdegree f \<ge> n"
-proof (rule ccontr)
- assume "\<not>(subdegree f \<ge> n)"
- with assms(2) have "f $ subdegree f = 0" by simp
- moreover from assms(1) have "f $ subdegree f \<noteq> 0" by simp
- ultimately show False by contradiction
-qed
+ by (meson assms leI nth_subdegree_nonzero)
lemma subdegree_greaterI:
assumes "f \<noteq> 0" "\<And>i. i \<le> n \<Longrightarrow> f$i = 0"
shows "subdegree f > n"
-proof (rule ccontr)
- assume "\<not>(subdegree f > n)"
- with assms(2) have "f $ subdegree f = 0" by simp
- moreover from assms(1) have "f $ subdegree f \<noteq> 0" by simp
- ultimately show False by contradiction
-qed
+ by (meson assms leI nth_subdegree_nonzero)
lemma subdegree_leI:
"f $ n \<noteq> 0 \<Longrightarrow> subdegree f \<le> n"
- by (rule leI) auto
+ using linorder_not_less by blast
lemma subdegree_0 [simp]: "subdegree 0 = 0"
by (simp add: subdegree_def)
lemma subdegree_1 [simp]: "subdegree 1 = 0"
- by (cases "(1::'a) = 0")
- (auto intro: subdegreeI fps_ext simp: subdegree_def)
+ by (metis fps_one_nth nth_subdegree_nonzero subdegree_0)
lemma subdegree_eq_0_iff: "subdegree f = 0 \<longleftrightarrow> f = 0 \<or> f $ 0 \<noteq> 0"
-proof (cases "f = 0")
- assume "f \<noteq> 0"
- thus ?thesis
- using nth_subdegree_nonzero[OF \<open>f \<noteq> 0\<close>] by (fastforce intro!: subdegreeI)
-qed simp_all
+ using nth_subdegree_nonzero subdegree_leI by fastforce
lemma subdegree_eq_0 [simp]: "f $ 0 \<noteq> 0 \<Longrightarrow> subdegree f = 0"
by (simp add: subdegree_eq_0_iff)
@@ -247,12 +209,11 @@
qed simp
lemma subdegree_minus_commute [simp]:
- "subdegree (f-(g::('a::group_add) fps)) = subdegree (g - f)"
-proof (-, cases "g-f=0")
- case True
- have "\<And>n. (f - g) $ n = -((g - f) $ n)" by simp
- with True have "f - g = 0" by (intro fps_ext) simp
- with True show ?thesis by simp
+ fixes f :: "'a::group_add fps"
+ shows "subdegree (f-g) = subdegree (g - f)"
+proof (cases "g-f=0")
+ case True then show ?thesis
+ by (metis fps_sub_nth nth_subdegree_nonzero right_minus_eq)
next
case False show ?thesis
using nth_subdegree_nonzero[OF False] by (fastforce intro: subdegreeI)
@@ -273,12 +234,7 @@
proof-
assume fg: "f + g = 0"
have "\<And>n. f $ n = - g $ n"
- proof-
- fix n
- from fg have "(f + g) $ n = 0" by simp
- hence "f $ n + g $ n - g $ n = - g $ n" by simp
- thus "f $ n = - g $ n" by simp
- qed
+ by (metis add_eq_0_iff equation_minus_iff fg fps_add_nth fps_neg_nth fps_zero_nth)
with assms show False by (auto intro: fps_ext)
qed
thus "f + g \<noteq> 0" by fast
@@ -288,43 +244,38 @@
assumes "f \<noteq> 0"
and "subdegree f < subdegree (g :: 'a::monoid_add fps)"
shows "subdegree (f + g) = subdegree f"
- using assms
- by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
+ using assms by(auto intro: subdegreeI simp: nth_less_subdegree_zero)
lemma subdegree_add_eq2:
assumes "g \<noteq> 0"
and "subdegree g < subdegree (f :: 'a :: monoid_add fps)"
shows "subdegree (f + g) = subdegree g"
- using assms
- by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
+ using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
lemma subdegree_diff_eq1:
assumes "f \<noteq> 0"
and "subdegree f < subdegree (g :: 'a :: group_add fps)"
shows "subdegree (f - g) = subdegree f"
- using assms
- by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
+ using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
lemma subdegree_diff_eq1_cancel:
assumes "f \<noteq> 0"
and "subdegree f < subdegree (g :: 'a :: cancel_comm_monoid_add fps)"
shows "subdegree (f - g) = subdegree f"
- using assms
- by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
+ using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
lemma subdegree_diff_eq2:
assumes "g \<noteq> 0"
and "subdegree g < subdegree (f :: 'a :: group_add fps)"
shows "subdegree (f - g) = subdegree g"
- using assms
- by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
+ using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
lemma subdegree_diff_ge [simp]:
assumes "f \<noteq> (g :: 'a :: group_add fps)"
shows "subdegree (f - g) \<ge> min (subdegree f) (subdegree g)"
proof-
- from assms have "f = - (- g) \<Longrightarrow> False" using expand_fps_eq by fastforce
- hence "f \<noteq> - (- g)" by fast
+ have "f \<noteq> - (- g)"
+ using assms expand_fps_eq by fastforce
moreover have "f + - g = f - g" by (simp add: fps_ext)
ultimately show ?thesis
using subdegree_add_ge[of f "-g"] by simp
@@ -334,8 +285,7 @@
fixes f g :: "'a :: comm_monoid_diff fps"
assumes "f - g \<noteq> 0"
shows "subdegree (f - g) \<ge> subdegree f"
- using assms
- by (auto intro: subdegree_geI simp: nth_less_subdegree_zero)
+ using assms by (auto intro: subdegree_geI simp: nth_less_subdegree_zero)
lemma nth_subdegree_mult_left [simp]:
fixes f g :: "('a :: {mult_zero,comm_monoid_add}) fps"
--- a/src/HOL/Computational_Algebra/Fundamental_Theorem_Algebra.thy Sun Feb 19 13:51:49 2023 +0100
+++ b/src/HOL/Computational_Algebra/Fundamental_Theorem_Algebra.thy Sun Feb 19 21:21:19 2023 +0000
@@ -39,11 +39,9 @@
using norm_ge_zero[of z] by arith
have "norm (poly (pCons c cs) z) \<le> norm c + norm (z * poly cs z)"
using norm_triangle_ineq[of c "z* poly cs z"] by simp
- also have "\<dots> \<le> norm c + r * m"
+ also have "\<dots> \<le> ?k"
using mult_mono[OF H th rp norm_ge_zero[of "poly cs z"]]
by (simp add: norm_mult)
- also have "\<dots> \<le> ?k"
- by simp
finally show ?thesis .
qed
with kp show ?case by blast
@@ -133,19 +131,17 @@
by (simp add: cmod_def)
have False if "cmod (z + 1) \<ge> 1" "cmod (z - 1) \<ge> 1" "cmod (z + \<i>) \<ge> 1" "cmod (z - \<i>) \<ge> 1"
proof -
- from that z xy have "2 * x \<le> 1" "2 * x \<ge> -1" "2 * y \<le> 1" "2 * y \<ge> -1"
+ from that z xy have *: "2 * x \<le> 1" "2 * x \<ge> -1" "2 * y \<le> 1" "2 * y \<ge> -1"
by (simp_all add: cmod_def power2_eq_square algebra_simps)
then have "\<bar>2 * x\<bar> \<le> 1" "\<bar>2 * y\<bar> \<le> 1"
by simp_all
then have "\<bar>2 * x\<bar>\<^sup>2 \<le> 1\<^sup>2" "\<bar>2 * y\<bar>\<^sup>2 \<le> 1\<^sup>2"
by (metis abs_square_le_1 one_power2 power2_abs)+
- then have th0: "4 * x\<^sup>2 \<le> 1" "4 * y\<^sup>2 \<le> 1"
- by (simp_all add: power_mult_distrib)
- from add_mono[OF th0] xy show ?thesis
- by simp
+ with xy * show ?thesis
+ by (smt (verit, best) four_x_squared square_le_1)
qed
then show ?thesis
- unfolding linorder_not_le[symmetric] by blast
+ by force
qed
text \<open>Hence we can always reduce modulus of \<open>1 + b z^n\<close> if nonzero\<close>
@@ -175,7 +171,7 @@
by presburger+
then obtain m where m: "n = Suc (2 * m)"
by blast
- have th0: "cmod (complex_of_real (cmod b) / b) = 1"
+ have 0: "cmod (complex_of_real (cmod b) / b) = 1"
using b by (simp add: norm_divide)
have "\<exists>v. cmod (complex_of_real (cmod b) / b + v^n) < 1"
proof (cases "cmod (complex_of_real (cmod b) / b + 1) < 1")
@@ -183,20 +179,17 @@
then show ?thesis
by (metis power_one)
next
- case False
- note F1 = False
+ case F1: False
show ?thesis
proof (cases "cmod (complex_of_real (cmod b) / b - 1) < 1")
case True
with \<open>odd n\<close> show ?thesis
by (metis add_uminus_conv_diff neg_one_odd_power)
next
- case False
- note F2 = False
+ case F2: False
show ?thesis
proof (cases "cmod (complex_of_real (cmod b) / b + \<i>) < 1")
- case True
- note T1 = True
+ case T1: True
show ?thesis
proof (cases "even m")
case True
@@ -209,10 +202,10 @@
qed
next
case False
- with F1 F2 m unimodular_reduce_norm[OF th0] \<open>odd n\<close> show ?thesis
+ with F1 F2 m unimodular_reduce_norm[OF 0] \<open>odd n\<close> show ?thesis
apply (cases "even m")
apply (rule_tac x="- \<i>" in exI)
- apply (simp add: power_mult)
+ apply (simp add: power_mult)
apply (rule_tac x="\<i>" in exI)
apply (auto simp add: m power_mult)
done
@@ -223,21 +216,21 @@
by blast
let ?w = "v / complex_of_real (root n (cmod b))"
from odd_real_root_pow[OF \<open>odd n\<close>, of "cmod b"]
- have th1: "?w ^ n = v^n / complex_of_real (cmod b)"
+ have 1: "?w ^ n = v^n / complex_of_real (cmod b)"
by (simp add: power_divide of_real_power[symmetric])
- have th2:"cmod (complex_of_real (cmod b) / b) = 1"
+ have 2:"cmod (complex_of_real (cmod b) / b) = 1"
using b by (simp add: norm_divide)
- then have th3: "cmod (complex_of_real (cmod b) / b) \<ge> 0"
+ then have 3: "cmod (complex_of_real (cmod b) / b) \<ge> 0"
by simp
- have th4: "cmod (complex_of_real (cmod b) / b) *
+ have 4: "cmod (complex_of_real (cmod b) / b) *
cmod (1 + b * (v ^ n / complex_of_real (cmod b))) <
cmod (complex_of_real (cmod b) / b) * 1"
apply (simp only: norm_mult[symmetric] distrib_left)
using b v
- apply (simp add: th2)
+ apply (simp add: 2)
done
show ?thesis
- by (metis th1 mult_left_less_imp_less[OF th4 th3])
+ by (metis 1 mult_left_less_imp_less[OF 4 3])
qed
qed
@@ -258,26 +251,21 @@
obtain g where g: "strict_mono g" "monoseq (\<lambda>n. Im (s (f (g n))))"
unfolding o_def by blast
let ?h = "f \<circ> g"
- from r[rule_format, of 0] have rp: "r \<ge> 0"
- using norm_ge_zero[of "s 0"] by arith
- have th: "\<forall>n. r + 1 \<ge> \<bar>Re (s n)\<bar>"
+ have "r \<ge> 0"
+ by (meson norm_ge_zero order_trans r)
+ have "\<forall>n. r + 1 \<ge> \<bar>Re (s n)\<bar>"
by (smt (verit, ccfv_threshold) abs_Re_le_cmod r)
- have conv1: "convergent (\<lambda>n. Re (s (f n)))"
- by (metis Bseq_monoseq_convergent f(2) BseqI' real_norm_def th)
- have th: "\<forall>n. r + 1 \<ge> \<bar>Im (s n)\<bar>"
+ then have conv1: "convergent (\<lambda>n. Re (s (f n)))"
+ by (metis Bseq_monoseq_convergent f(2) BseqI' real_norm_def)
+ have "\<forall>n. r + 1 \<ge> \<bar>Im (s n)\<bar>"
by (smt (verit) abs_Im_le_cmod r)
+ then have conv2: "convergent (\<lambda>n. Im (s (f (g n))))"
+ by (metis Bseq_monoseq_convergent g(2) BseqI' real_norm_def)
- have conv2: "convergent (\<lambda>n. Im (s (f (g n))))"
- by (metis Bseq_monoseq_convergent g(2) BseqI' real_norm_def th)
-
- from conv1[unfolded convergent_def] obtain x where "LIMSEQ (\<lambda>n. Re (s (f n))) x"
- by blast
- then have x: "\<forall>r>0. \<exists>n0. \<forall>n\<ge>n0. \<bar>Re (s (f n)) - x\<bar> < r"
- unfolding LIMSEQ_iff real_norm_def .
-
- from conv2[unfolded convergent_def]
+ obtain x where x: "\<forall>r>0. \<exists>n0. \<forall>n\<ge>n0. \<bar>Re (s (f n)) - x\<bar> < r"
+ using conv1[unfolded convergent_def] LIMSEQ_iff real_norm_def by metis
obtain y where y: "\<forall>r>0. \<exists>n0. \<forall>n\<ge>n0. \<bar>Im (s (f (g n))) - y\<bar> < r"
- unfolding LIMSEQ_iff real_norm_def by blast
+ using conv2[unfolded convergent_def] LIMSEQ_iff real_norm_def by metis
let ?w = "Complex x y"
from f(1) g(1) have hs: "strict_mono ?h"
unfolding strict_mono_def by auto
@@ -322,7 +310,7 @@
from poly_bound_exists[of 1 "cs"]
obtain m where m: "m > 0" "norm z \<le> 1 \<Longrightarrow> norm (poly cs z) \<le> m" for z
by blast
- from ep m(1) have em0: "e/m > 0"
+ with ep have em0: "e/m > 0"
by (simp add: field_simps)
have one0: "1 > (0::real)"
by arith
@@ -358,31 +346,26 @@
by (metis norm_ge_zero order.trans)
next
case True
- then have "cmod 0 \<le> r \<and> cmod (poly p 0) = - (- cmod (poly p 0))"
- by simp
then have mth1: "\<exists>x z. cmod z \<le> r \<and> cmod (poly p z) = - x"
- by blast
+ by (metis add.inverse_inverse norm_zero)
have False if "cmod (poly p z) = - x" "\<not> x < 1" for x z
by (smt (verit, del_insts) norm_ge_zero that)
- then have mth2: "\<exists>z. \<forall>x. (\<exists>z. cmod z \<le> r \<and> cmod (poly p z) = - x) \<longrightarrow> x < z"
- by blast
- from real_sup_exists[OF mth1 mth2] obtain s where
- s: "\<forall>y. (\<exists>x. (\<exists>z. cmod z \<le> r \<and> cmod (poly p z) = - x) \<and> y < x) \<longleftrightarrow> y < s"
- by blast
+ with real_sup_exists[OF mth1]
+ obtain s where s: "\<forall>y. (\<exists>x. (\<exists>z. cmod z \<le> r \<and> cmod (poly p z) = - x) \<and> y < x) \<longleftrightarrow> y < s"
+ by auto
+
let ?m = "- s"
- have s1[unfolded minus_minus]:
- "(\<exists>z x. cmod z \<le> r \<and> - (- cmod (poly p z)) < y) \<longleftrightarrow> ?m < y" for y
+ have s1: "(\<exists>z x. cmod z \<le> r \<and> - (- cmod (poly p z)) < y) \<longleftrightarrow> ?m < y" for y
by (metis add.inverse_inverse minus_less_iff s)
from s1[of ?m] have s1m: "\<And>z x. cmod z \<le> r \<Longrightarrow> cmod (poly p z) \<ge> ?m"
by auto
have "\<exists>z. cmod z \<le> r \<and> cmod (poly p z) < - s + 1 / real (Suc n)" for n
using s1[rule_format, of "?m + 1/real (Suc n)"] by simp
- then have th: "\<forall>n. \<exists>z. cmod z \<le> r \<and> cmod (poly p z) < - s + 1 / real (Suc n)" ..
- from choice[OF th] obtain g where
- g: "\<forall>n. cmod (g n) \<le> r" "\<forall>n. cmod (poly p (g n)) <?m + 1 /real(Suc n)"
- by blast
+ then obtain g where g: "\<forall>n. cmod (g n) \<le> r" "\<forall>n. cmod (poly p (g n)) <?m + 1 /real(Suc n)"
+ by metis
from Bolzano_Weierstrass_complex_disc[OF g(1)]
- obtain f z where fz: "strict_mono (f :: nat \<Rightarrow> nat)" "\<forall>e>0. \<exists>N. \<forall>n\<ge>N. cmod (g (f n) - z) < e"
+ obtain f::"nat \<Rightarrow> nat" and z
+ where fz: "strict_mono f" "\<forall>e>0. \<exists>N. \<forall>n\<ge>N. cmod (g (f n) - z) < e"
by blast
{
fix w
@@ -395,41 +378,28 @@
from poly_cont[OF e2, of z p] obtain d where
d: "d > 0" "\<forall>w. 0<cmod (w - z)\<and> cmod(w - z) < d \<longrightarrow> cmod(poly p w - poly p z) < ?e/2"
by blast
- have th1: "cmod(poly p w - poly p z) < ?e / 2" if w: "cmod (w - z) < d" for w
+ have 1: "cmod(poly p w - poly p z) < ?e / 2" if w: "cmod (w - z) < d" for w
using d(2)[rule_format, of w] w e by (cases "w = z") simp_all
from fz(2) d(1) obtain N1 where N1: "\<forall>n\<ge>N1. cmod (g (f n) - z) < d"
by blast
- from reals_Archimedean2[of "2/?e"] obtain N2 :: nat where N2: "2/?e < real N2"
+ from reals_Archimedean2 obtain N2 :: nat where N2: "2/?e < real N2"
by blast
- have th2: "cmod (poly p (g (f (N1 + N2))) - poly p z) < ?e/2"
- using N1[rule_format, of "N1 + N2"] th1 by simp
- have th0: "a < e2 \<Longrightarrow> \<bar>b - m\<bar> < e2 \<Longrightarrow> 2 * e2 \<le> \<bar>b - m\<bar> + a \<Longrightarrow> False"
+ have 2: "cmod (poly p (g (f (N1 + N2))) - poly p z) < ?e/2"
+ using N1 1 by auto
+ have 0: "a < e2 \<Longrightarrow> \<bar>b - m\<bar> < e2 \<Longrightarrow> 2 * e2 \<le> \<bar>b - m\<bar> + a \<Longrightarrow> False"
for a b e2 m :: real
by arith
- have ath: "m \<le> x \<Longrightarrow> x < m + e \<Longrightarrow> \<bar>x - m\<bar> < e" for m x e :: real
- by arith
from seq_suble[OF fz(1), of "N1 + N2"]
- have th00: "real (Suc (N1 + N2)) \<le> real (Suc (f (N1 + N2)))"
- by simp
- have th000: "0 \<le> (1::real)" "(1::real) \<le> 1" "real (Suc (N1 + N2)) > 0"
- using N2 by auto
- from frac_le[OF th000 th00]
- have th00: "?m + 1 / real (Suc (f (N1 + N2))) \<le> ?m + 1 / real (Suc (N1 + N2))"
- by simp
- from g(2)[rule_format, of "f (N1 + N2)"]
- have th01:"cmod (poly p (g (f (N1 + N2)))) < - s + 1 / real (Suc (f (N1 + N2)))" .
- from N2 have "2/?e < real (Suc (N1 + N2))"
- by arith
- with e2 less_imp_inverse_less[of "2/?e" "real (Suc (N1 + N2))"]
+ have 00: "?m + 1 / real (Suc (f (N1 + N2))) \<le> ?m + 1 / real (Suc (N1 + N2))"
+ by (simp add: frac_le)
+ from N2 e2 less_imp_inverse_less[of "2/?e" "real (Suc (N1 + N2))"]
have "?e/2 > 1/ real (Suc (N1 + N2))"
by (simp add: inverse_eq_divide)
- with ath[OF _ order_less_le_trans[OF th01 th00]]
- have thc1: "\<bar>cmod (poly p (g (f (N1 + N2)))) - ?m\<bar> < ?e/2"
- by (simp add: g(1) s1m)
- have thc2: "2 * (?e/2) \<le>
- \<bar>cmod(poly p (g (f (N1 + N2)))) - ?m\<bar> + cmod (poly p (g (f (N1 + N2))) - poly p z)"
+ with order_less_le_trans[OF _ 00]
+ have 1: "\<bar>cmod (poly p (g (f (N1 + N2)))) - ?m\<bar> < ?e/2"
+ using g s1m by (smt (verit))
+ with 0[OF 2] have False
by (smt (verit) field_sum_of_halves norm_triangle_ineq3)
- from th0[OF th2 thc1 thc2] have False .
}
then have "?e = 0"
by auto
@@ -460,37 +430,24 @@
let ?r = "1 + \<bar>r\<bar>"
have "d \<le> norm (poly (pCons a (pCons c cs)) z)" if "1 + \<bar>r\<bar> \<le> norm z" for z
proof -
- have r0: "r \<le> norm z"
- using that by arith
- from r[rule_format, OF r0] have th0: "d + norm a \<le> 1 * norm(poly (pCons c cs) z)"
- by arith
- from that have z1: "norm z \<ge> 1"
- by arith
- from order_trans[OF th0 mult_right_mono[OF z1 norm_ge_zero[of "poly (pCons c cs) z"]]]
have "d \<le> norm(z * poly (pCons c cs) z) - norm a"
- unfolding norm_mult by (simp add: algebra_simps)
- with norm_diff_ineq[of "z * poly (pCons c cs) z" a]
- show ?thesis
- by (simp add: algebra_simps)
+ by (smt (verit, best) norm_ge_zero mult_less_cancel_right2 norm_mult r that)
+ with norm_diff_ineq add.commute
+ show ?thesis
+ by (metis order.trans poly_pCons)
qed
then show ?thesis by blast
next
case True
- with pCons.prems have c0: "c \<noteq> 0"
- by simp
have "d \<le> norm (poly (pCons a (pCons c cs)) z)"
- if h: "(\<bar>d\<bar> + norm a) / norm c \<le> norm z" for z :: 'a
+ if "(\<bar>d\<bar> + norm a) / norm c \<le> norm z" for z :: 'a
proof -
- from c0 have "norm c > 0"
- by simp
- from h c0 have th0: "\<bar>d\<bar> + norm a \<le> norm (z * c)"
- by (simp add: field_simps norm_mult)
- have ath: "\<And>mzh mazh ma. mzh \<le> mazh + ma \<Longrightarrow> \<bar>d\<bar> + ma \<le> mzh \<Longrightarrow> d \<le> mazh"
- by arith
- from norm_diff_ineq[of "z * c" a] have th1: "norm (z * c) \<le> norm (a + z * c) + norm a"
- by (simp add: algebra_simps)
- from ath[OF th1 th0] show ?thesis
- using True by simp
+ have "\<bar>d\<bar> + norm a \<le> norm (z * c)"
+ by (metis that True norm_mult pCons.hyps(1) pos_divide_le_eq zero_less_norm_iff)
+ also have "\<dots> \<le> norm (a + z * c) + norm a"
+ by (simp add: add.commute norm_add_leD)
+ finally show ?thesis
+ using True by auto
qed
then show ?thesis by blast
qed
@@ -510,10 +467,8 @@
obtain r where r: "cmod (poly (pCons c cs) 0) \<le> cmod (poly (pCons c cs) z)"
if "r \<le> cmod z" for z
by blast
- have ath: "\<And>z r. r \<le> cmod z \<or> cmod z \<le> \<bar>r\<bar>"
- by arith
from poly_minimum_modulus_disc[of "\<bar>r\<bar>" "pCons c cs"] show ?thesis
- by (metis ath dual_order.trans norm_ge_zero norm_zero r)
+ by (smt (verit, del_insts) order.trans linorder_linear r)
qed (use pCons.hyps in auto)
qed
@@ -549,18 +504,15 @@
apply (rule_tac x="q" in exI)
apply auto
done
- next
- case False
- show ?thesis
- using False by force
- qed
+ qed force
qed
lemma poly_decompose:
+ fixes p :: "'a::idom poly"
assumes nc: "\<not> constant (poly p)"
- shows "\<exists>k a q. a \<noteq> (0::'a::idom) \<and> k \<noteq> 0 \<and>
+ shows "\<exists>k a q. a \<noteq> 0 \<and> k \<noteq> 0 \<and>
psize q + k + 1 = psize p \<and>
- (\<forall>z. poly p z = poly p 0 + z^k * poly (pCons a q) z)"
+ (\<forall>z. poly p z = poly p 0 + z^k * poly (pCons a q) z)"
using nc
proof (induct p)
case 0
@@ -571,14 +523,13 @@
have "\<not> (\<forall>z. z \<noteq> 0 \<longrightarrow> poly cs z = 0)"
by (smt (verit) constant_def mult_eq_0_iff pCons.prems poly_pCons)
from poly_decompose_lemma[OF this]
- show ?case
- apply clarsimp
- apply (rule_tac x="k+1" in exI)
- apply (rule_tac x="a" in exI)
- apply simp
- apply (rule_tac x="q" in exI)
- apply (auto simp add: psize_def split: if_splits)
- done
+ obtain k a q where *: "a \<noteq> 0 \<and>
+ Suc (psize q + k) = psize cs \<and> (\<forall>z. poly cs z = z ^ k * poly (pCons a q) z)"
+ by blast
+ then have "psize q + k + 2 = psize (pCons c cs)"
+ by (auto simp add: psize_def split: if_splits)
+ then show ?case
+ using "*" by force
qed
text \<open>Fundamental theorem of algebra\<close>
@@ -602,27 +553,10 @@
then show ?thesis by blast
next
case False
- from poly_offset[of p c] obtain q where q: "psize q = psize p" "\<forall>x. poly q x = ?p (c + x)"
- by blast
- have False if h: "constant (poly q)"
- proof -
- from q(2) have th: "\<forall>x. poly q (x - c) = ?p x"
- by auto
- have "?p x = ?p y" for x y
- proof -
- from th have "?p x = poly q (x - c)"
- by auto
- also have "\<dots> = poly q (y - c)"
- using h unfolding constant_def by blast
- also have "\<dots> = ?p y"
- using th by auto
- finally show ?thesis .
- qed
- with less(2) show ?thesis
- unfolding constant_def by blast
- qed
+ obtain q where q: "psize q = psize p" "\<forall>x. poly q x = ?p (c + x)"
+ using poly_offset[of p c] by blast
then have qnc: "\<not> constant (poly q)"
- by blast
+ by (metis (no_types, opaque_lifting) add.commute constant_def diff_add_cancel less.prems)
from q(2) have pqc0: "?p c = poly q 0"
by simp
from c pqc0 have cq0: "\<forall>w. cmod (poly q 0) \<le> cmod (?p w)"
@@ -635,12 +569,10 @@
let ?r = "smult (inverse ?a0) q"
have lgqr: "psize q = psize ?r"
by (simp add: a00 psize_def)
- have False if h: "\<And>x y. poly ?r x = poly ?r y"
- using constant_def qnc qr that by fastforce
- then have rnc: "\<not> constant (poly ?r)"
- unfolding constant_def by blast
- from qr[rule_format, of 0] a00 have r01: "poly ?r 0 = 1"
- by auto
+ have rnc: "\<not> constant (poly ?r)"
+ using constant_def qnc qr by fastforce
+ have r01: "poly ?r 0 = 1"
+ by (simp add: a00)
have mrmq_eq: "cmod (poly ?r w) < 1 \<longleftrightarrow> cmod (poly q w) < cmod ?a0" for w
by (smt (verit, del_insts) a00 mult_less_cancel_right2 norm_mult qr zero_less_norm_iff)
from poly_decompose[OF rnc] obtain k a s where
@@ -651,34 +583,28 @@
case True
with kas(3) lgqr[symmetric] q(1) have s0: "s = 0"
by auto
- have hth[symmetric]: "cmod (poly ?r w) = cmod (1 + a * w ^ k)" for w
- using kas(4)[rule_format, of w] s0 r01 by (simp add: algebra_simps)
- from reduce_poly_simple[OF kas(1,2)] show ?thesis
- unfolding hth by blast
+ with reduce_poly_simple kas show ?thesis
+ by (metis mult.commute mult.right_neutral poly_1 poly_smult r01 smult_one)
next
case False note kn = this
from kn kas(3) q(1) lgqr have k1n: "k + 1 < psize p"
by simp
- have th01: "\<not> constant (poly (pCons 1 (monom a (k - 1))))"
+ have 01: "\<not> constant (poly (pCons 1 (monom a (k - 1))))"
unfolding constant_def poly_pCons poly_monom
by (metis add_cancel_left_right kas(1) mult.commute mult_cancel_right2 power_one)
- from kas(1) kas(2) have th02: "k + 1 = psize (pCons 1 (monom a (k - 1)))"
+ from kas(1) kas(2) have 02: "k + 1 = psize (pCons 1 (monom a (k - 1)))"
by (simp add: psize_def degree_monom_eq)
- from less(1) [OF k1n [simplified th02] th01]
+ from less(1) [OF k1n [simplified 02] 01]
obtain w where w: "1 + w^k * a = 0"
- unfolding poly_pCons poly_monom
- using kas(2) by (cases k) (auto simp add: algebra_simps)
+ by (metis kas(2) mult.commute mult.left_commute poly_monom poly_pCons power_eq_if)
from poly_bound_exists[of "cmod w" s] obtain m where
m: "m > 0" "\<forall>z. cmod z \<le> cmod w \<longrightarrow> cmod (poly s z) \<le> m" by blast
- have w0: "w \<noteq> 0"
+ have "w \<noteq> 0"
using kas(2) w by (auto simp add: power_0_left)
- from w have "(1 + w ^ k * a) - 1 = 0 - 1"
- by simp
- then have wm1: "w^k * a = - 1"
- by simp
+ from w have wm1: "w^k * a = - 1"
+ by (simp add: add_eq_0_iff)
have inv0: "0 < inverse (cmod w ^ (k + 1) * m)"
- using norm_ge_zero[of w] w0 m(1)
- by (simp add: inverse_eq_divide zero_less_mult_iff)
+ by (simp add: \<open>w \<noteq> 0\<close> m(1))
with field_lbound_gt_zero[OF zero_less_one] obtain t where
t: "t > 0" "t < 1" "t < inverse (cmod w ^ (k + 1) * m)" by blast
let ?ct = "complex_of_real t"
@@ -691,37 +617,29 @@
cmod (complex_of_real (1 - t^k) + ?w^k * ?w * poly s ?w)"
by metis
with norm_triangle_ineq[of "complex_of_real (1 - t^k)" "?w^k * ?w * poly s ?w"]
- have th11: "cmod (1 + ?w^k * (a + ?w * poly s ?w)) \<le> \<bar>1 - t^k\<bar> + cmod (?w^k * ?w * poly s ?w)"
+ have 11: "cmod (1 + ?w^k * (a + ?w * poly s ?w)) \<le> \<bar>1 - t^k\<bar> + cmod (?w^k * ?w * poly s ?w)"
unfolding norm_of_real by simp
have ath: "\<And>x t::real. 0 \<le> x \<Longrightarrow> x < t \<Longrightarrow> t \<le> 1 \<Longrightarrow> \<bar>1 - t\<bar> + x < 1"
by arith
- have "t * cmod w \<le> 1 * cmod w"
- using t(2) w0 by auto
- then have tw: "cmod ?w \<le> cmod w"
- using t(1) by (simp add: norm_mult)
- from t inv0 have "t * (cmod w ^ (k + 1) * m) < 1"
- by (simp add: field_simps)
- with zero_less_power[OF t(1), of k] have th30: "t^k * (t* (cmod w ^ (k + 1) * m)) < t^k * 1"
+ have tw: "cmod ?w \<le> cmod w"
+ by (smt (verit) mult_le_cancel_right2 norm_ge_zero norm_mult norm_of_real t)
+ have "t * (cmod w ^ (k + 1) * m) < 1"
+ by (smt (verit, best) inv0 inverse_positive_iff_positive left_inverse mult_strict_right_mono t(3))
+ with zero_less_power[OF t(1), of k] have 30: "t^k * (t* (cmod w ^ (k + 1) * m)) < t^k * 1"
by simp
have "cmod (?w^k * ?w * poly s ?w) = t^k * (t* (cmod w ^ (k + 1) * cmod (poly s ?w)))"
- using w0 t(1)
- by (simp add: algebra_simps norm_power norm_mult)
- then have "cmod (?w^k * ?w * poly s ?w) \<le> t^k * (t* (cmod w ^ (k + 1) * m))"
- using t(1,2) m(2)[rule_format, OF tw] w0
+ using \<open>w \<noteq> 0\<close> t(1) by (simp add: algebra_simps norm_power norm_mult)
+ with 30 have 120: "cmod (?w^k * ?w * poly s ?w) < t^k"
+ by (smt (verit, ccfv_SIG) m(2) mult_left_mono norm_ge_zero t(1) tw zero_le_power)
+ from power_strict_mono[OF t(2), of k] t(1) kas(2) have 121: "t^k \<le> 1"
by auto
- with th30 have th120: "cmod (?w^k * ?w * poly s ?w) < t^k"
- by simp
- from power_strict_mono[OF t(2), of k] t(1) kas(2) have th121: "t^k \<le> 1"
- by auto
- from ath[OF norm_ge_zero[of "?w^k * ?w * poly s ?w"] th120 th121]
- have th12: "\<bar>1 - t^k\<bar> + cmod (?w^k * ?w * poly s ?w) < 1" .
- from th11 th12 have "cmod (1 + ?w^k * (a + ?w * poly s ?w)) < 1"
- by arith
+ from ath[OF norm_ge_zero[of "?w^k * ?w * poly s ?w"] 120 121]
+ have 12: "\<bar>1 - t^k\<bar> + cmod (?w^k * ?w * poly s ?w) < 1" .
then show ?thesis
- by (metis kas(4) poly_pCons r01)
+ by (smt (verit) "11" kas(4) poly_pCons r01)
qed
with cq0 q(2) show ?thesis
- unfolding mrmq_eq not_less[symmetric] by auto
+ by (smt (verit) mrmq_eq)
qed
qed
@@ -745,8 +663,8 @@
have "\<not> constant (poly (pCons c cs))"
proof
assume nc: "constant (poly (pCons c cs))"
- from nc[unfolded constant_def, rule_format, of 0]
- have "\<forall>w. w \<noteq> 0 \<longrightarrow> poly cs w = 0" by auto
+ have "\<forall>w. w \<noteq> 0 \<longrightarrow> poly cs w = 0"
+ by (metis add_cancel_right_right constant_def mult_eq_0_iff nc poly_pCons)
then have "cs = 0"
proof (induct cs)
case 0
@@ -764,20 +682,18 @@
m: "m > 0" "\<forall>z. \<forall>z. cmod z \<le> 1 \<longrightarrow> cmod (poly ds z) \<le> m" by blast
have dm: "cmod d / m > 0"
using False m(1) by (simp add: field_simps)
- from field_lbound_gt_zero[OF dm zero_less_one]
- obtain x where x: "x > 0" "x < cmod d / m" "x < 1"
- by blast
+ then obtain x where x: "x > 0" "x < cmod d / m" "x < 1"
+ by (meson field_lbound_gt_zero zero_less_one)
let ?x = "complex_of_real x"
from x have cx: "?x \<noteq> 0" "cmod ?x \<le> 1"
by simp_all
- from pCons.prems[rule_format, OF cx(1)]
have cth: "cmod (?x*poly ds ?x) = cmod d"
- by (simp add: eq_diff_eq[symmetric])
- have th0: "cmod (?x*poly ds ?x) \<le> x*m"
+ by (metis add_eq_0_iff cx(1) norm_minus_cancel pCons.prems poly_pCons)
+ have 0: "cmod (?x*poly ds ?x) \<le> x*m"
by (smt (verit) cx(2) m(2) mult_left_mono norm_mult norm_of_real x(1))
from x(2) m(1) have "x * m < cmod d"
by (simp add: field_simps)
- with th0 cth show ?thesis
+ with 0 cth show ?thesis
by force
qed
qed
@@ -873,9 +789,8 @@
with r xa show ?thesis
by auto
qed
- with IH[rule_format, OF dsn, of s r] False have "s dvd (r ^ (degree s))"
+ with False IH dsn obtain u where u: "r ^ (degree s) = s * u"
by blast
- then obtain u where u: "r ^ (degree s) = s * u" ..
then have u': "\<And>x. poly s x * poly u x = poly r x ^ degree s"
by (simp only: poly_mult[symmetric] poly_power[symmetric])
let ?w = "(u * ([:-a,1:] ^ (n - ?op))) * (r ^ (n - degree s))"
@@ -914,20 +829,14 @@
then show ?thesis
proof cases
case p: 1
- then have eq: "(\<forall>x. poly p x = (0::complex) \<longrightarrow> poly q x = 0) \<longleftrightarrow> q = 0"
+ then have "(\<forall>x. poly p x = (0::complex) \<longrightarrow> poly q x = 0) \<longleftrightarrow> q = 0"
by (auto simp add: poly_all_0_iff_0)
- {
- assume "p dvd (q ^ (degree p))"
- then obtain r where r: "q ^ (degree p) = p * r" ..
- from r p have False by simp
- }
- with eq p show ?thesis by blast
+ with p show ?thesis
+ by force
next
case dp: 2
- then obtain k where k: "p = [:k:]" "k \<noteq> 0"
- by (cases p) (simp split: if_splits)
then show ?thesis
- by (simp add: is_unit_pCons_iff)
+ by (meson dvd_trans is_unit_iff_degree poly_eq_0_iff_dvd unit_imp_dvd)
next
case dp: 3
have False if "p dvd (q ^ (Suc n))" "poly p x = 0" "poly q x \<noteq> 0" for x
@@ -951,12 +860,8 @@
by (metis degree_pCons_0 poly_eq_poly_eq_iff)
qed
show ?lhs if ?rhs
- proof -
- from that obtain k where "p = [:k:]"
- by (cases p) (simp split: if_splits)
- then show ?thesis
- unfolding constant_def by auto
- qed
+ unfolding constant_def
+ by (metis degree_eq_zeroE pcompose_const poly_0 poly_pcompose that)
qed
text \<open>Arithmetic operations on multivariate polynomials.\<close>