src/HOL/Euclidean_Division.thy
changeset 76141 e7497a1de8b9
parent 76053 3310317cc484
child 76224 64e8d4afcf10
equal deleted inserted replaced
76140:19837257fd89 76141:e7497a1de8b9
   965   qed
   965   qed
   966 qed simp_all
   966 qed simp_all
   967 
   967 
   968 end
   968 end
   969 
   969 
       
   970 lemma euclidean_relation_natI [case_names by0 divides euclidean_relation]:
       
   971   \<open>(m div n, m mod n) = (q, r)\<close>
       
   972     if by0: \<open>n = 0 \<Longrightarrow> q = 0 \<and> r = m\<close>
       
   973     and divides: \<open>n > 0 \<Longrightarrow> n dvd m \<Longrightarrow> r = 0 \<and> m = q * n\<close>
       
   974     and euclidean_relation: \<open>n > 0 \<Longrightarrow> \<not> n dvd m \<Longrightarrow> r < n \<and> m = q * n + r\<close> for m n q r :: nat
       
   975   by (rule euclidean_relationI) (use that in simp_all)
       
   976 
   970 lemma div_nat_eqI:
   977 lemma div_nat_eqI:
   971   \<open>m div n = q\<close> if \<open>n * q \<le> m\<close> and \<open>m < n * Suc q\<close> for m n q :: nat
   978   \<open>m div n = q\<close> if \<open>n * q \<le> m\<close> and \<open>m < n * Suc q\<close> for m n q :: nat
   972 proof -
   979 proof -
   973   have \<open>(m div n, m mod n) = (q, m - n * q)\<close>
   980   have \<open>(m div n, m mod n) = (q, m - n * q)\<close>
   974   proof (cases n q \<open>m - n * q\<close>  m rule: euclidean_relationI)
   981   proof (cases n q \<open>m - n * q\<close>  m rule: euclidean_relation_natI)
   975     case by0
   982     case by0
   976     with that show ?case
   983     with that show ?case
   977       by simp
   984       by simp
   978   next
   985   next
   979     case divides
   986     case divides
   980     from \<open>n dvd m\<close> obtain s where \<open>m = n * s\<close> ..
   987     from \<open>n dvd m\<close> obtain s where \<open>m = n * s\<close> ..
   981     with \<open>n \<noteq> 0\<close> that have \<open>s < Suc q\<close>
   988     with \<open>n > 0\<close> that have \<open>s < Suc q\<close>
   982       by (simp only: mult_less_cancel1)
   989       by (simp only: mult_less_cancel1)
   983     with \<open>m = n * s\<close> \<open>n \<noteq> 0\<close> that have \<open>q = s\<close>
   990     with \<open>m = n * s\<close> \<open>n > 0\<close> that have \<open>q = s\<close>
   984       by simp
   991       by simp
   985     with \<open>m = n * s\<close> show ?case
   992     with \<open>m = n * s\<close> show ?case
   986       by (simp add: ac_simps)
   993       by (simp add: ac_simps)
   987   next
   994   next
   988     case euclidean_relation
   995     case euclidean_relation
   995 
  1002 
   996 lemma mod_nat_eqI:
  1003 lemma mod_nat_eqI:
   997   \<open>m mod n = r\<close> if \<open>r < n\<close> and \<open>r \<le> m\<close> and \<open>n dvd m - r\<close> for m n r :: nat
  1004   \<open>m mod n = r\<close> if \<open>r < n\<close> and \<open>r \<le> m\<close> and \<open>n dvd m - r\<close> for m n r :: nat
   998 proof -
  1005 proof -
   999   have \<open>(m div n, m mod n) = ((m - r) div n, r)\<close>
  1006   have \<open>(m div n, m mod n) = ((m - r) div n, r)\<close>
  1000   proof (cases n \<open>(m - r) div n\<close> r  m rule: euclidean_relationI)
  1007   proof (cases n \<open>(m - r) div n\<close> r  m rule: euclidean_relation_natI)
  1001     case by0
  1008     case by0
  1002     with that show ?case
  1009     with that show ?case
  1003       by simp
  1010       by simp
  1004   next
  1011   next
  1005     case divides
  1012     case divides
  1008       by simp
  1015       by simp
  1009     with divides have \<open>n dvd n - r\<close>
  1016     with divides have \<open>n dvd n - r\<close>
  1010       by (simp add: dvd_add_right_iff)
  1017       by (simp add: dvd_add_right_iff)
  1011     then have \<open>n \<le> n - r\<close>
  1018     then have \<open>n \<le> n - r\<close>
  1012       by (rule dvd_imp_le) (use \<open>r < n\<close> in simp)
  1019       by (rule dvd_imp_le) (use \<open>r < n\<close> in simp)
  1013     with \<open>n \<noteq> 0\<close> have \<open>r = 0\<close>
  1020     with \<open>n > 0\<close> have \<open>r = 0\<close>
  1014       by simp
  1021       by simp
  1015     with \<open>n \<noteq> 0\<close> that show ?case
  1022     with \<open>n > 0\<close> that show ?case
  1016       by simp
  1023       by simp
  1017   next
  1024   next
  1018     case euclidean_relation
  1025     case euclidean_relation
  1019     with that show ?case
  1026     with that show ?case
  1020       by (simp add: ac_simps)
  1027       by (simp add: ac_simps)
  1259   and mod_mult2_eq:
  1266   and mod_mult2_eq:
  1260     \<open>m mod (n * q) = n * (m div n mod q) + m mod n\<close> (is ?R)
  1267     \<open>m mod (n * q) = n * (m div n mod q) + m mod n\<close> (is ?R)
  1261   for m n q :: nat
  1268   for m n q :: nat
  1262 proof -
  1269 proof -
  1263   have \<open>(m div (n * q), m mod (n * q)) = ((m div n) div q, n * (m div n mod q) + m mod n)\<close>
  1270   have \<open>(m div (n * q), m mod (n * q)) = ((m div n) div q, n * (m div n mod q) + m mod n)\<close>
  1264   proof (cases \<open>n * q\<close> \<open>(m div n) div q\<close> \<open>n * (m div n mod q) + m mod n\<close> m rule: euclidean_relationI)
  1271   proof (cases \<open>n * q\<close> \<open>(m div n) div q\<close> \<open>n * (m div n mod q) + m mod n\<close> m rule: euclidean_relation_natI)
  1265     case by0
  1272     case by0
  1266     then show ?case
  1273     then show ?case
  1267       by auto
  1274       by auto
  1268   next
  1275   next
  1269     case divides
  1276     case divides
  1270     from \<open>n * q dvd m\<close> obtain t where \<open>m = n * q * t\<close> ..
  1277     from \<open>n * q dvd m\<close> obtain t where \<open>m = n * q * t\<close> ..
  1271     with \<open>n * q \<noteq> 0\<close> show ?case
  1278     with \<open>n * q > 0\<close> show ?case
  1272       by (simp add: algebra_simps)
  1279       by (simp add: algebra_simps)
  1273   next
  1280   next
  1274     case euclidean_relation
  1281     case euclidean_relation
  1275     then have \<open>n > 0\<close> \<open>q > 0\<close>
  1282     then have \<open>n > 0\<close> \<open>q > 0\<close>
  1276       by simp_all
  1283       by simp_all
  1810   qed
  1817   qed
  1811 qed (use mult_le_mono2 [of 1] in \<open>auto simp add: division_segment_int_def not_le zero_less_mult_iff mult_less_0_iff abs_mult sgn_mult abs_mod_less sgn_mod nat_mult_distrib\<close>)
  1818 qed (use mult_le_mono2 [of 1] in \<open>auto simp add: division_segment_int_def not_le zero_less_mult_iff mult_less_0_iff abs_mult sgn_mult abs_mod_less sgn_mod nat_mult_distrib\<close>)
  1812 
  1819 
  1813 end
  1820 end
  1814 
  1821 
       
  1822 lemma euclidean_relation_intI [case_names by0 divides euclidean_relation]:
       
  1823   \<open>(k div l, k mod l) = (q, r)\<close>
       
  1824     if by0': \<open>l = 0 \<Longrightarrow> q = 0 \<and> r = k\<close>
       
  1825     and divides': \<open>l \<noteq> 0 \<Longrightarrow> l dvd k \<Longrightarrow> r = 0 \<and> k = q * l\<close>
       
  1826     and euclidean_relation': \<open>l \<noteq> 0 \<Longrightarrow> \<not> l dvd k \<Longrightarrow> sgn r = sgn l
       
  1827       \<and> \<bar>r\<bar> < \<bar>l\<bar> \<and> k = q * l + r\<close> for k l :: int
       
  1828 proof (cases l q r k rule: euclidean_relationI)
       
  1829   case by0
       
  1830   then show ?case
       
  1831     by (rule by0')
       
  1832 next
       
  1833   case divides
       
  1834   then show ?case
       
  1835     by (rule divides')
       
  1836 next
       
  1837   case euclidean_relation
       
  1838   with euclidean_relation' have \<open>sgn r = sgn l\<close> \<open>\<bar>r\<bar> < \<bar>l\<bar>\<close> \<open>k = q * l + r\<close>
       
  1839     by simp_all
       
  1840   from \<open>sgn r = sgn l\<close> \<open>l \<noteq> 0\<close> have \<open>division_segment r = division_segment l\<close>
       
  1841     by (simp add: division_segment_int_def sgn_if split: if_splits)
       
  1842   with \<open>\<bar>r\<bar> < \<bar>l\<bar>\<close> \<open>k = q * l + r\<close>
       
  1843   show ?case
       
  1844     by simp
       
  1845 qed
       
  1846 
  1815 
  1847 
  1816 subsection \<open>Special case: euclidean rings containing the natural numbers\<close>
  1848 subsection \<open>Special case: euclidean rings containing the natural numbers\<close>
  1817 
  1849 
  1818 class unique_euclidean_semiring_with_nat = semidom + semiring_char_0 + unique_euclidean_semiring +
  1850 class unique_euclidean_semiring_with_nat = semidom + semiring_char_0 + unique_euclidean_semiring +
  1819   assumes of_nat_div: "of_nat (m div n) = of_nat m div of_nat n"
  1851   assumes of_nat_div: "of_nat (m div n) = of_nat m div of_nat n"