equal
deleted
inserted
replaced
69 |
69 |
70 end |
70 end |
71 |
71 |
72 lemma semiring_gcd: |
72 lemma semiring_gcd: |
73 "class.semiring_gcd one zero times gcd lcm |
73 "class.semiring_gcd one zero times gcd lcm |
74 divide plus minus normalize unit_factor" |
74 divide plus minus unit_factor normalize" |
75 proof |
75 proof |
76 show "gcd a b dvd a" |
76 show "gcd a b dvd a" |
77 and "gcd a b dvd b" for a b |
77 and "gcd a b dvd b" for a b |
78 by (induct a b rule: eucl_induct) |
78 by (induct a b rule: eucl_induct) |
79 (simp_all add: local.gcd_0 local.gcd_mod dvd_mod_iff) |
79 (simp_all add: local.gcd_0 local.gcd_mod dvd_mod_iff) |
95 show "lcm a b = normalize (a * b) div gcd a b" for a b |
95 show "lcm a b = normalize (a * b) div gcd a b" for a b |
96 by (fact local.lcm_def) |
96 by (fact local.lcm_def) |
97 qed |
97 qed |
98 |
98 |
99 interpretation semiring_gcd one zero times gcd lcm |
99 interpretation semiring_gcd one zero times gcd lcm |
100 divide plus minus normalize unit_factor |
100 divide plus minus unit_factor normalize |
101 by (fact semiring_gcd) |
101 by (fact semiring_gcd) |
102 |
102 |
103 lemma semiring_Gcd: |
103 lemma semiring_Gcd: |
104 "class.semiring_Gcd one zero times gcd lcm Gcd Lcm |
104 "class.semiring_Gcd one zero times gcd lcm Gcd Lcm |
105 divide plus minus normalize unit_factor" |
105 divide plus minus unit_factor normalize" |
106 proof - |
106 proof - |
107 show ?thesis |
107 show ?thesis |
108 proof |
108 proof |
109 have "(\<forall>a\<in>A. a dvd Lcm A) \<and> (\<forall>b. (\<forall>a\<in>A. a dvd b) \<longrightarrow> Lcm A dvd b)" for A |
109 have "(\<forall>a\<in>A. a dvd Lcm A) \<and> (\<forall>b. (\<forall>a\<in>A. a dvd b) \<longrightarrow> Lcm A dvd b)" for A |
110 proof (cases "\<exists>l. l \<noteq> 0 \<and> (\<forall>a\<in>A. a dvd l)") |
110 proof (cases "\<exists>l. l \<noteq> 0 \<and> (\<forall>a\<in>A. a dvd l)") |
178 by (simp add: local.Gcd_def) |
178 by (simp add: local.Gcd_def) |
179 qed |
179 qed |
180 qed |
180 qed |
181 |
181 |
182 interpretation semiring_Gcd one zero times gcd lcm Gcd Lcm |
182 interpretation semiring_Gcd one zero times gcd lcm Gcd Lcm |
183 divide plus minus normalize unit_factor |
183 divide plus minus unit_factor normalize |
184 by (fact semiring_Gcd) |
184 by (fact semiring_Gcd) |
185 |
185 |
186 subclass factorial_semiring |
186 subclass factorial_semiring |
187 proof - |
187 proof - |
188 show "class.factorial_semiring divide plus minus zero times one |
188 show "class.factorial_semiring divide plus minus zero times one |
189 normalize unit_factor" |
189 unit_factor normalize" |
190 proof (standard, rule factorial_semiring_altI_aux) -- \<open>FIXME rule\<close> |
190 proof (standard, rule factorial_semiring_altI_aux) -- \<open>FIXME rule\<close> |
191 fix x assume "x \<noteq> 0" |
191 fix x assume "x \<noteq> 0" |
192 thus "finite {p. p dvd x \<and> normalize p = p}" |
192 thus "finite {p. p dvd x \<and> normalize p = p}" |
193 proof (induction "euclidean_size x" arbitrary: x rule: less_induct) |
193 proof (induction "euclidean_size x" arbitrary: x rule: less_induct) |
194 case (less x) |
194 case (less x) |
404 "OFCLASS('a::{factorial_semiring_gcd, euclidean_semiring}, euclidean_semiring_gcd_class)" |
404 "OFCLASS('a::{factorial_semiring_gcd, euclidean_semiring}, euclidean_semiring_gcd_class)" |
405 proof |
405 proof |
406 interpret semiring_Gcd 1 0 times |
406 interpret semiring_Gcd 1 0 times |
407 Euclidean_Algorithm.gcd Euclidean_Algorithm.lcm |
407 Euclidean_Algorithm.gcd Euclidean_Algorithm.lcm |
408 Euclidean_Algorithm.Gcd Euclidean_Algorithm.Lcm |
408 Euclidean_Algorithm.Gcd Euclidean_Algorithm.Lcm |
409 divide plus minus normalize unit_factor |
409 divide plus minus unit_factor normalize |
410 rewrites "dvd.dvd op * = Rings.dvd" |
410 rewrites "dvd.dvd op * = Rings.dvd" |
411 by (fact semiring_Gcd) (simp add: dvd.dvd_def dvd_def fun_eq_iff) |
411 by (fact semiring_Gcd) (simp add: dvd.dvd_def dvd_def fun_eq_iff) |
412 show [simp]: "Euclidean_Algorithm.gcd = (gcd :: 'a \<Rightarrow> _)" |
412 show [simp]: "Euclidean_Algorithm.gcd = (gcd :: 'a \<Rightarrow> _)" |
413 proof (rule ext)+ |
413 proof (rule ext)+ |
414 fix a b :: 'a |
414 fix a b :: 'a |
556 instance nat :: euclidean_semiring_gcd |
556 instance nat :: euclidean_semiring_gcd |
557 proof |
557 proof |
558 interpret semiring_Gcd 1 0 times |
558 interpret semiring_Gcd 1 0 times |
559 "Euclidean_Algorithm.gcd" "Euclidean_Algorithm.lcm" |
559 "Euclidean_Algorithm.gcd" "Euclidean_Algorithm.lcm" |
560 "Euclidean_Algorithm.Gcd" "Euclidean_Algorithm.Lcm" |
560 "Euclidean_Algorithm.Gcd" "Euclidean_Algorithm.Lcm" |
561 divide plus minus normalize unit_factor |
561 divide plus minus unit_factor normalize |
562 rewrites "dvd.dvd op * = Rings.dvd" |
562 rewrites "dvd.dvd op * = Rings.dvd" |
563 by (fact semiring_Gcd) (simp add: dvd.dvd_def dvd_def fun_eq_iff) |
563 by (fact semiring_Gcd) (simp add: dvd.dvd_def dvd_def fun_eq_iff) |
564 show [simp]: "(Euclidean_Algorithm.gcd :: nat \<Rightarrow> _) = gcd" |
564 show [simp]: "(Euclidean_Algorithm.gcd :: nat \<Rightarrow> _) = gcd" |
565 proof (rule ext)+ |
565 proof (rule ext)+ |
566 fix m n :: nat |
566 fix m n :: nat |
588 instance int :: euclidean_ring_gcd |
588 instance int :: euclidean_ring_gcd |
589 proof |
589 proof |
590 interpret semiring_Gcd 1 0 times |
590 interpret semiring_Gcd 1 0 times |
591 "Euclidean_Algorithm.gcd" "Euclidean_Algorithm.lcm" |
591 "Euclidean_Algorithm.gcd" "Euclidean_Algorithm.lcm" |
592 "Euclidean_Algorithm.Gcd" "Euclidean_Algorithm.Lcm" |
592 "Euclidean_Algorithm.Gcd" "Euclidean_Algorithm.Lcm" |
593 divide plus minus normalize unit_factor |
593 divide plus minus unit_factor normalize |
594 rewrites "dvd.dvd op * = Rings.dvd" |
594 rewrites "dvd.dvd op * = Rings.dvd" |
595 by (fact semiring_Gcd) (simp add: dvd.dvd_def dvd_def fun_eq_iff) |
595 by (fact semiring_Gcd) (simp add: dvd.dvd_def dvd_def fun_eq_iff) |
596 show [simp]: "(Euclidean_Algorithm.gcd :: int \<Rightarrow> _) = gcd" |
596 show [simp]: "(Euclidean_Algorithm.gcd :: int \<Rightarrow> _) = gcd" |
597 proof (rule ext)+ |
597 proof (rule ext)+ |
598 fix k l :: int |
598 fix k l :: int |