src/HOL/Number_Theory/Euclidean_Algorithm.thy
changeset 64848 c50db2128048
parent 64786 340db65fd2c1
child 64850 fc9265882329
equal deleted inserted replaced
64847:54f5afc9c413 64848:c50db2128048
    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