src/HOL/Rings.thy
changeset 70146 9839da71621f
parent 70145 f07b8fb99818
child 70147 1657688a6406
equal deleted inserted replaced
70145:f07b8fb99818 70146:9839da71621f
   158 lemma dvd_trans [trans]:
   158 lemma dvd_trans [trans]:
   159   assumes "a dvd b" and "b dvd c"
   159   assumes "a dvd b" and "b dvd c"
   160   shows "a dvd c"
   160   shows "a dvd c"
   161 proof -
   161 proof -
   162   from assms obtain v where "b = a * v"
   162   from assms obtain v where "b = a * v"
   163     by (auto elim!: dvdE)
   163     by auto
   164   moreover from assms obtain w where "c = b * w"
   164   moreover from assms obtain w where "c = b * w"
   165     by (auto elim!: dvdE)
   165     by auto
   166   ultimately have "c = a * (v * w)"
   166   ultimately have "c = a * (v * w)"
   167     by (simp add: mult.assoc)
   167     by (simp add: mult.assoc)
   168   then show ?thesis ..
   168   then show ?thesis ..
   169 qed
   169 qed
   170 
   170 
   173 
   173 
   174 lemma strict_subset_divisors_dvd: "{c. c dvd a} \<subset> {c. c dvd b} \<longleftrightarrow> a dvd b \<and> \<not> b dvd a"
   174 lemma strict_subset_divisors_dvd: "{c. c dvd a} \<subset> {c. c dvd b} \<longleftrightarrow> a dvd b \<and> \<not> b dvd a"
   175   by (auto simp add: subset_iff intro: dvd_trans)
   175   by (auto simp add: subset_iff intro: dvd_trans)
   176 
   176 
   177 lemma one_dvd [simp]: "1 dvd a"
   177 lemma one_dvd [simp]: "1 dvd a"
   178   by (auto intro!: dvdI)
   178   by (auto intro: dvdI)
   179 
   179 
   180 lemma dvd_mult [simp]: "a dvd c \<Longrightarrow> a dvd (b * c)"
   180 lemma dvd_mult [simp]: "a dvd (b * c)" if "a dvd c"
   181   by (auto intro!: mult.left_commute dvdI elim!: dvdE)
   181   using that by rule (auto intro: mult.left_commute dvdI)
   182 
   182 
   183 lemma dvd_mult2 [simp]: "a dvd b \<Longrightarrow> a dvd (b * c)"
   183 lemma dvd_mult2 [simp]: "a dvd (b * c)" if "a dvd b"
   184   using dvd_mult [of a b c] by (simp add: ac_simps)
   184   using that dvd_mult [of a b c] by (simp add: ac_simps)
   185 
   185 
   186 lemma dvd_triv_right [simp]: "a dvd b * a"
   186 lemma dvd_triv_right [simp]: "a dvd b * a"
   187   by (rule dvd_mult) (rule dvd_refl)
   187   by (rule dvd_mult) (rule dvd_refl)
   188 
   188 
   189 lemma dvd_triv_left [simp]: "a dvd a * b"
   189 lemma dvd_triv_left [simp]: "a dvd a * b"
   213 begin
   213 begin
   214 
   214 
   215 subclass semiring_1 ..
   215 subclass semiring_1 ..
   216 
   216 
   217 lemma dvd_0_left_iff [simp]: "0 dvd a \<longleftrightarrow> a = 0"
   217 lemma dvd_0_left_iff [simp]: "0 dvd a \<longleftrightarrow> a = 0"
   218   by (auto intro: dvd_refl elim!: dvdE)
   218   by auto
   219 
   219 
   220 lemma dvd_0_right [iff]: "a dvd 0"
   220 lemma dvd_0_right [iff]: "a dvd 0"
   221 proof
   221 proof
   222   show "0 = a * 0" by simp
   222   show "0 = a * 0" by simp
   223 qed
   223 qed
   373 class comm_ring_1 = comm_ring + zero_neq_one + comm_monoid_mult
   373 class comm_ring_1 = comm_ring + zero_neq_one + comm_monoid_mult
   374 begin
   374 begin
   375 
   375 
   376 subclass ring_1 ..
   376 subclass ring_1 ..
   377 subclass comm_semiring_1_cancel
   377 subclass comm_semiring_1_cancel
   378   by unfold_locales (simp add: algebra_simps)
   378   by standard (simp add: algebra_simps)
   379 
   379 
   380 lemma dvd_minus_iff [simp]: "x dvd - y \<longleftrightarrow> x dvd y"
   380 lemma dvd_minus_iff [simp]: "x dvd - y \<longleftrightarrow> x dvd y"
   381 proof
   381 proof
   382   assume "x dvd - y"
   382   assume "x dvd - y"
   383   then have "x dvd - 1 * - y" by (rule dvd_mult)
   383   then have "x dvd - 1 * - y" by (rule dvd_mult)
   511 
   511 
   512 subclass semidom ..
   512 subclass semidom ..
   513 
   513 
   514 subclass ring_1_no_zero_divisors ..
   514 subclass ring_1_no_zero_divisors ..
   515 
   515 
   516 lemma dvd_mult_cancel_right [simp]: "a * c dvd b * c \<longleftrightarrow> c = 0 \<or> a dvd b"
   516 lemma dvd_mult_cancel_right [simp]:
       
   517   "a * c dvd b * c \<longleftrightarrow> c = 0 \<or> a dvd b"
   517 proof -
   518 proof -
   518   have "a * c dvd b * c \<longleftrightarrow> (\<exists>k. b * c = (a * k) * c)"
   519   have "a * c dvd b * c \<longleftrightarrow> (\<exists>k. b * c = (a * k) * c)"
   519     unfolding dvd_def by (simp add: ac_simps)
   520     by (auto simp add: ac_simps)
   520   also have "(\<exists>k. b * c = (a * k) * c) \<longleftrightarrow> c = 0 \<or> a dvd b"
   521   also have "(\<exists>k. b * c = (a * k) * c) \<longleftrightarrow> c = 0 \<or> a dvd b"
   521     unfolding dvd_def by simp
   522     by auto
   522   finally show ?thesis .
   523   finally show ?thesis .
   523 qed
   524 qed
   524 
   525 
   525 lemma dvd_mult_cancel_left [simp]: "c * a dvd c * b \<longleftrightarrow> c = 0 \<or> a dvd b"
   526 lemma dvd_mult_cancel_left [simp]:
   526 proof -
   527   "c * a dvd c * b \<longleftrightarrow> c = 0 \<or> a dvd b"
   527   have "c * a dvd c * b \<longleftrightarrow> (\<exists>k. b * c = (a * k) * c)"
   528   using dvd_mult_cancel_right [of a c b] by (simp add: ac_simps)
   528     unfolding dvd_def by (simp add: ac_simps)
       
   529   also have "(\<exists>k. b * c = (a * k) * c) \<longleftrightarrow> c = 0 \<or> a dvd b"
       
   530     unfolding dvd_def by simp
       
   531   finally show ?thesis .
       
   532 qed
       
   533 
   529 
   534 lemma square_eq_iff: "a * a = b * b \<longleftrightarrow> a = b \<or> a = - b"
   530 lemma square_eq_iff: "a * a = b * b \<longleftrightarrow> a = b \<or> a = - b"
   535 proof
   531 proof
   536   assume "a * a = b * b"
   532   assume "a * a = b * b"
   537   then have "(a - b) * (a + b) = 0"
   533   then have "(a - b) * (a + b) = 0"
   903   case True
   899   case True
   904   with assms show ?thesis by simp
   900   with assms show ?thesis by simp
   905 next
   901 next
   906   case False
   902   case False
   907   moreover from assms obtain k l where "b = a * k" and "c = a * l"
   903   moreover from assms obtain k l where "b = a * k" and "c = a * l"
   908     by (auto elim!: dvdE)
   904     by blast
   909   ultimately show ?thesis by simp
   905   ultimately show ?thesis by simp
   910 qed
   906 qed
   911 
   907 
   912 lemma div_add [simp]:
   908 lemma div_add [simp]:
   913   assumes "c dvd a" and "c dvd b"
   909   assumes "c dvd a" and "c dvd b"
   916   case True
   912   case True
   917   then show ?thesis by simp
   913   then show ?thesis by simp
   918 next
   914 next
   919   case False
   915   case False
   920   moreover from assms obtain k l where "a = c * k" and "b = c * l"
   916   moreover from assms obtain k l where "a = c * k" and "b = c * l"
   921     by (auto elim!: dvdE)
   917     by blast
   922   moreover have "c * k + c * l = c * (k + l)"
   918   moreover have "c * k + c * l = c * (k + l)"
   923     by (simp add: algebra_simps)
   919     by (simp add: algebra_simps)
   924   ultimately show ?thesis
   920   ultimately show ?thesis
   925     by simp
   921     by simp
   926 qed
   922 qed
   932   case True
   928   case True
   933   with assms show ?thesis by auto
   929   with assms show ?thesis by auto
   934 next
   930 next
   935   case False
   931   case False
   936   moreover from assms obtain k l where "a = b * k" and "c = d * l"
   932   moreover from assms obtain k l where "a = b * k" and "c = d * l"
   937     by (auto elim!: dvdE)
   933     by blast
   938   moreover have "b * k * (d * l) div (b * d) = (b * d) * (k * l) div (b * d)"
   934   moreover have "b * k * (d * l) div (b * d) = (b * d) * (k * l) div (b * d)"
   939     by (simp add: ac_simps)
   935     by (simp add: ac_simps)
   940   ultimately show ?thesis by simp
   936   ultimately show ?thesis by simp
   941 qed
   937 qed
   942 
   938 
   949   then show ?lhs by (simp add: assms)
   945   then show ?lhs by (simp add: assms)
   950 next
   946 next
   951   assume ?lhs
   947   assume ?lhs
   952   then have "b div a * a = c * a" by simp
   948   then have "b div a * a = c * a" by simp
   953   moreover from assms have "b div a * a = b"
   949   moreover from assms have "b div a * a = b"
   954     by (auto elim!: dvdE simp add: ac_simps)
   950     by (auto simp add: ac_simps)
   955   ultimately show ?rhs by simp
   951   ultimately show ?rhs by simp
   956 qed
   952 qed
   957 
   953 
   958 lemma dvd_div_mult_self [simp]: "a dvd b \<Longrightarrow> b div a * a = b"
   954 lemma dvd_div_mult_self [simp]: "a dvd b \<Longrightarrow> b div a * a = b"
   959   by (cases "a = 0") (auto elim: dvdE simp add: ac_simps)
   955   by (cases "a = 0") (auto simp add: ac_simps)
   960 
   956 
   961 lemma dvd_mult_div_cancel [simp]: "a dvd b \<Longrightarrow> a * (b div a) = b"
   957 lemma dvd_mult_div_cancel [simp]: "a dvd b \<Longrightarrow> a * (b div a) = b"
   962   using dvd_div_mult_self [of a b] by (simp add: ac_simps)
   958   using dvd_div_mult_self [of a b] by (simp add: ac_simps)
   963 
   959 
   964 lemma div_mult_swap:
   960 lemma div_mult_swap:
  1024   then show ?thesis
  1020   then show ?thesis
  1025     by auto
  1021     by auto
  1026 next
  1022 next
  1027   case False
  1023   case False
  1028   from assms obtain r s where "b = c * r" and "a = c * r * s"
  1024   from assms obtain r s where "b = c * r" and "a = c * r * s"
  1029     by (blast elim: dvdE)
  1025     by blast
  1030   moreover with False have "r \<noteq> 0"
  1026   moreover with False have "r \<noteq> 0"
  1031     by auto
  1027     by auto
  1032   ultimately show ?thesis using False
  1028   ultimately show ?thesis using False
  1033     by simp (simp add: mult.commute [of _ r] mult.assoc mult.commute [of c])
  1029     by simp (simp add: mult.commute [of _ r] mult.assoc mult.commute [of c])
  1034 qed
  1030 qed
  1042     by auto
  1038     by auto
  1043 next
  1039 next
  1044   case False
  1040   case False
  1045   from assms obtain r s
  1041   from assms obtain r s
  1046     where "a = d * r * s" and "b = d * r"
  1042     where "a = d * r * s" and "b = d * r"
  1047     by (blast elim: dvdE)
  1043     by blast
  1048   with False show ?thesis
  1044   with False show ?thesis
  1049     by simp (simp add: ac_simps)
  1045     by simp (simp add: ac_simps)
  1050 qed
  1046 qed
  1051 
  1047 
  1052 
  1048