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" |