src/HOL/Divides.thy
changeset 64242 93c6f0da5c70
parent 64240 eabf80376aab
child 64243 aee949f6642d
equal deleted inserted replaced
64241:430d74089d4d 64242:93c6f0da5c70
    27 qed (simp add: div_by_0)
    27 qed (simp add: div_by_0)
    28 
    28 
    29 text \<open>@{const divide} and @{const modulo}\<close>
    29 text \<open>@{const divide} and @{const modulo}\<close>
    30 
    30 
    31 lemma div_mod_equality: "((a div b) * b + a mod b) + c = a + c"
    31 lemma div_mod_equality: "((a div b) * b + a mod b) + c = a + c"
    32   by (simp add: mod_div_equality)
    32   by (simp add: div_mult_mod_eq)
    33 
    33 
    34 lemma div_mod_equality2: "(b * (a div b) + a mod b) + c = a + c"
    34 lemma div_mod_equality2: "(b * (a div b) + a mod b) + c = a + c"
    35   by (simp add: mod_div_equality2)
    35   by (simp add: mult_div_mod_eq)
    36 
    36 
    37 lemma mod_by_0 [simp]: "a mod 0 = a"
    37 lemma mod_by_0 [simp]: "a mod 0 = a"
    38   using mod_div_equality [of a zero] by simp
    38   using div_mult_mod_eq [of a zero] by simp
    39 
    39 
    40 lemma mod_0 [simp]: "0 mod a = 0"
    40 lemma mod_0 [simp]: "0 mod a = 0"
    41   using mod_div_equality [of zero a] div_0 by simp
    41   using div_mult_mod_eq [of zero a] div_0 by simp
    42 
    42 
    43 lemma div_mult_self2 [simp]:
    43 lemma div_mult_self2 [simp]:
    44   assumes "b \<noteq> 0"
    44   assumes "b \<noteq> 0"
    45   shows "(a + b * c) div b = c + a div b"
    45   shows "(a + b * c) div b = c + a div b"
    46   using assms div_mult_self1 [of b a c] by (simp add: mult.commute)
    46   using assms div_mult_self1 [of b a c] by (simp add: mult.commute)
    59 proof (cases "b = 0")
    59 proof (cases "b = 0")
    60   case True then show ?thesis by simp
    60   case True then show ?thesis by simp
    61 next
    61 next
    62   case False
    62   case False
    63   have "a + c * b = (a + c * b) div b * b + (a + c * b) mod b"
    63   have "a + c * b = (a + c * b) div b * b + (a + c * b) mod b"
    64     by (simp add: mod_div_equality)
    64     by (simp add: div_mult_mod_eq)
    65   also from False div_mult_self1 [of b a c] have
    65   also from False div_mult_self1 [of b a c] have
    66     "\<dots> = (c + a div b) * b + (a + c * b) mod b"
    66     "\<dots> = (c + a div b) * b + (a + c * b) mod b"
    67       by (simp add: algebra_simps)
    67       by (simp add: algebra_simps)
    68   finally have "a = a div b * b + (a + c * b) mod b"
    68   finally have "a = a div b * b + (a + c * b) mod b"
    69     by (simp add: add.commute [of a] add.assoc distrib_right)
    69     by (simp add: add.commute [of a] add.assoc distrib_right)
    70   then have "a div b * b + (a + c * b) mod b = a div b * b + a mod b"
    70   then have "a div b * b + (a + c * b) mod b = a div b * b + a mod b"
    71     by (simp add: mod_div_equality)
    71     by (simp add: div_mult_mod_eq)
    72   then show ?thesis by simp
    72   then show ?thesis by simp
    73 qed
    73 qed
    74 
    74 
    75 lemma mod_mult_self2 [simp]:
    75 lemma mod_mult_self2 [simp]:
    76   "(a + b * c) mod b = a mod b"
    76   "(a + b * c) mod b = a mod b"
    93   using mod_mult_self1 [of 0 a b] by simp
    93   using mod_mult_self1 [of 0 a b] by simp
    94 
    94 
    95 lemma mod_by_1 [simp]:
    95 lemma mod_by_1 [simp]:
    96   "a mod 1 = 0"
    96   "a mod 1 = 0"
    97 proof -
    97 proof -
    98   from mod_div_equality [of a one] div_by_1 have "a + a mod 1 = a" by simp
    98   from div_mult_mod_eq [of a one] div_by_1 have "a + a mod 1 = a" by simp
    99   then have "a + a mod 1 = a + 0" by simp
    99   then have "a + a mod 1 = a + 0" by simp
   100   then show ?thesis by (rule add_left_imp_eq)
   100   then show ?thesis by (rule add_left_imp_eq)
   101 qed
   101 qed
   102 
   102 
   103 lemma mod_self [simp]:
   103 lemma mod_self [simp]:
   136 proof
   136 proof
   137   assume "b dvd a"
   137   assume "b dvd a"
   138   then show "a mod b = 0" by simp
   138   then show "a mod b = 0" by simp
   139 next
   139 next
   140   assume "a mod b = 0"
   140   assume "a mod b = 0"
   141   with mod_div_equality [of a b] have "a div b * b = a" by simp
   141   with div_mult_mod_eq [of a b] have "a div b * b = a" by simp
   142   then have "a = b * (a div b)" by (simp add: ac_simps)
   142   then have "a = b * (a div b)" by (simp add: ac_simps)
   143   then show "b dvd a" ..
   143   then show "b dvd a" ..
   144 qed
   144 qed
   145 
   145 
   146 lemma dvd_eq_mod_eq_0 [nitpick_unfold, code]:
   146 lemma dvd_eq_mod_eq_0 [nitpick_unfold, code]:
   155 next
   155 next
   156   assume "b \<noteq> 0"
   156   assume "b \<noteq> 0"
   157   hence "a div b + a mod b div b = (a mod b + a div b * b) div b"
   157   hence "a div b + a mod b div b = (a mod b + a div b * b) div b"
   158     by (rule div_mult_self1 [symmetric])
   158     by (rule div_mult_self1 [symmetric])
   159   also have "\<dots> = a div b"
   159   also have "\<dots> = a div b"
   160     by (simp only: mod_div_equality3)
   160     by (simp only: mod_div_mult_eq)
   161   also have "\<dots> = a div b + 0"
   161   also have "\<dots> = a div b + 0"
   162     by simp
   162     by simp
   163   finally show ?thesis
   163   finally show ?thesis
   164     by (rule add_left_imp_eq)
   164     by (rule add_left_imp_eq)
   165 qed
   165 qed
   168   "a mod b mod b = a mod b"
   168   "a mod b mod b = a mod b"
   169 proof -
   169 proof -
   170   have "a mod b mod b = (a mod b + a div b * b) mod b"
   170   have "a mod b mod b = (a mod b + a div b * b) mod b"
   171     by (simp only: mod_mult_self1)
   171     by (simp only: mod_mult_self1)
   172   also have "\<dots> = a mod b"
   172   also have "\<dots> = a mod b"
   173     by (simp only: mod_div_equality3)
   173     by (simp only: mod_div_mult_eq)
   174   finally show ?thesis .
   174   finally show ?thesis .
   175 qed
   175 qed
   176 
   176 
   177 lemma dvd_mod_imp_dvd:
   177 lemma dvd_mod_imp_dvd:
   178   assumes "k dvd m mod n" and "k dvd n"
   178   assumes "k dvd m mod n" and "k dvd n"
   179   shows "k dvd m"
   179   shows "k dvd m"
   180 proof -
   180 proof -
   181   from assms have "k dvd (m div n) * n + m mod n"
   181   from assms have "k dvd (m div n) * n + m mod n"
   182     by (simp only: dvd_add dvd_mult)
   182     by (simp only: dvd_add dvd_mult)
   183   then show ?thesis by (simp add: mod_div_equality)
   183   then show ?thesis by (simp add: div_mult_mod_eq)
   184 qed
   184 qed
   185 
   185 
   186 text \<open>Addition respects modular equivalence.\<close>
   186 text \<open>Addition respects modular equivalence.\<close>
   187 
   187 
   188 lemma mod_add_left_eq: \<comment> \<open>FIXME reorient\<close>
   188 lemma mod_add_left_eq: \<comment> \<open>FIXME reorient\<close>
   189   "(a + b) mod c = (a mod c + b) mod c"
   189   "(a + b) mod c = (a mod c + b) mod c"
   190 proof -
   190 proof -
   191   have "(a + b) mod c = (a div c * c + a mod c + b) mod c"
   191   have "(a + b) mod c = (a div c * c + a mod c + b) mod c"
   192     by (simp only: mod_div_equality)
   192     by (simp only: div_mult_mod_eq)
   193   also have "\<dots> = (a mod c + b + a div c * c) mod c"
   193   also have "\<dots> = (a mod c + b + a div c * c) mod c"
   194     by (simp only: ac_simps)
   194     by (simp only: ac_simps)
   195   also have "\<dots> = (a mod c + b) mod c"
   195   also have "\<dots> = (a mod c + b) mod c"
   196     by (rule mod_mult_self1)
   196     by (rule mod_mult_self1)
   197   finally show ?thesis .
   197   finally show ?thesis .
   199 
   199 
   200 lemma mod_add_right_eq: \<comment> \<open>FIXME reorient\<close>
   200 lemma mod_add_right_eq: \<comment> \<open>FIXME reorient\<close>
   201   "(a + b) mod c = (a + b mod c) mod c"
   201   "(a + b) mod c = (a + b mod c) mod c"
   202 proof -
   202 proof -
   203   have "(a + b) mod c = (a + (b div c * c + b mod c)) mod c"
   203   have "(a + b) mod c = (a + (b div c * c + b mod c)) mod c"
   204     by (simp only: mod_div_equality)
   204     by (simp only: div_mult_mod_eq)
   205   also have "\<dots> = (a + b mod c + b div c * c) mod c"
   205   also have "\<dots> = (a + b mod c + b div c * c) mod c"
   206     by (simp only: ac_simps)
   206     by (simp only: ac_simps)
   207   also have "\<dots> = (a + b mod c) mod c"
   207   also have "\<dots> = (a + b mod c) mod c"
   208     by (rule mod_mult_self1)
   208     by (rule mod_mult_self1)
   209   finally show ?thesis .
   209   finally show ?thesis .
   228 
   228 
   229 lemma mod_mult_left_eq: \<comment> \<open>FIXME reorient\<close>
   229 lemma mod_mult_left_eq: \<comment> \<open>FIXME reorient\<close>
   230   "(a * b) mod c = ((a mod c) * b) mod c"
   230   "(a * b) mod c = ((a mod c) * b) mod c"
   231 proof -
   231 proof -
   232   have "(a * b) mod c = ((a div c * c + a mod c) * b) mod c"
   232   have "(a * b) mod c = ((a div c * c + a mod c) * b) mod c"
   233     by (simp only: mod_div_equality)
   233     by (simp only: div_mult_mod_eq)
   234   also have "\<dots> = (a mod c * b + a div c * b * c) mod c"
   234   also have "\<dots> = (a mod c * b + a div c * b * c) mod c"
   235     by (simp only: algebra_simps)
   235     by (simp only: algebra_simps)
   236   also have "\<dots> = (a mod c * b) mod c"
   236   also have "\<dots> = (a mod c * b) mod c"
   237     by (rule mod_mult_self1)
   237     by (rule mod_mult_self1)
   238   finally show ?thesis .
   238   finally show ?thesis .
   240 
   240 
   241 lemma mod_mult_right_eq: \<comment> \<open>FIXME reorient\<close>
   241 lemma mod_mult_right_eq: \<comment> \<open>FIXME reorient\<close>
   242   "(a * b) mod c = (a * (b mod c)) mod c"
   242   "(a * b) mod c = (a * (b mod c)) mod c"
   243 proof -
   243 proof -
   244   have "(a * b) mod c = (a * (b div c * c + b mod c)) mod c"
   244   have "(a * b) mod c = (a * (b div c * c + b mod c)) mod c"
   245     by (simp only: mod_div_equality)
   245     by (simp only: div_mult_mod_eq)
   246   also have "\<dots> = (a * (b mod c) + a * (b div c) * c) mod c"
   246   also have "\<dots> = (a * (b mod c) + a * (b div c) * c) mod c"
   247     by (simp only: algebra_simps)
   247     by (simp only: algebra_simps)
   248   also have "\<dots> = (a * (b mod c)) mod c"
   248   also have "\<dots> = (a * (b mod c)) mod c"
   249     by (rule mod_mult_self1)
   249     by (rule mod_mult_self1)
   250   finally show ?thesis .
   250   finally show ?thesis .
   285   also have "\<dots> = (a mod (c * k) + a div (c * k) * k * c) mod c"
   285   also have "\<dots> = (a mod (c * k) + a div (c * k) * k * c) mod c"
   286     by (simp only: mod_mult_self1)
   286     by (simp only: mod_mult_self1)
   287   also have "\<dots> = (a div (c * k) * (c * k) + a mod (c * k)) mod c"
   287   also have "\<dots> = (a div (c * k) * (c * k) + a mod (c * k)) mod c"
   288     by (simp only: ac_simps)
   288     by (simp only: ac_simps)
   289   also have "\<dots> = a mod c"
   289   also have "\<dots> = a mod c"
   290     by (simp only: mod_div_equality)
   290     by (simp only: div_mult_mod_eq)
   291   finally show ?thesis .
   291   finally show ?thesis .
   292 qed
   292 qed
   293 
   293 
   294 lemma div_mult_mult2 [simp]:
   294 lemma div_mult_mult2 [simp]:
   295   "c \<noteq> 0 \<Longrightarrow> (a * c) div (b * c) = a div b"
   295   "c \<noteq> 0 \<Longrightarrow> (a * c) div (b * c) = a div b"
   303   "(c * a) mod (c * b) = c * (a mod b)"
   303   "(c * a) mod (c * b) = c * (a mod b)"
   304 proof (cases "c = 0")
   304 proof (cases "c = 0")
   305   case True then show ?thesis by simp
   305   case True then show ?thesis by simp
   306 next
   306 next
   307   case False
   307   case False
   308   from mod_div_equality
   308   from div_mult_mod_eq
   309   have "((c * a) div (c * b)) * (c * b) + (c * a) mod (c * b) = c * a" .
   309   have "((c * a) div (c * b)) * (c * b) + (c * a) mod (c * b) = c * a" .
   310   with False have "c * ((a div b) * b + a mod b) + (c * a) mod (c * b)
   310   with False have "c * ((a div b) * b + a mod b) + (c * a) mod (c * b)
   311     = c * a + c * (a mod b)" by (simp add: algebra_simps)
   311     = c * a + c * (a mod b)" by (simp add: algebra_simps)
   312   with mod_div_equality show ?thesis by simp
   312   with div_mult_mod_eq show ?thesis by simp
   313 qed
   313 qed
   314 
   314 
   315 lemma mod_mult_mult2:
   315 lemma mod_mult_mult2:
   316   "(a * c) mod (b * c) = (a mod b) * c"
   316   "(a * c) mod (b * c) = (a mod b) * c"
   317   using mod_mult_mult1 [of c a b] by (simp add: mult.commute)
   317   using mod_mult_mult1 [of c a b] by (simp add: mult.commute)
   355 text \<open>Negation respects modular equivalence.\<close>
   355 text \<open>Negation respects modular equivalence.\<close>
   356 
   356 
   357 lemma mod_minus_eq: "(- a) mod b = (- (a mod b)) mod b"
   357 lemma mod_minus_eq: "(- a) mod b = (- (a mod b)) mod b"
   358 proof -
   358 proof -
   359   have "(- a) mod b = (- (a div b * b + a mod b)) mod b"
   359   have "(- a) mod b = (- (a div b * b + a mod b)) mod b"
   360     by (simp only: mod_div_equality)
   360     by (simp only: div_mult_mod_eq)
   361   also have "\<dots> = (- (a mod b) + - (a div b) * b) mod b"
   361   also have "\<dots> = (- (a mod b) + - (a div b) * b) mod b"
   362     by (simp add: ac_simps)
   362     by (simp add: ac_simps)
   363   also have "\<dots> = (- (a mod b)) mod b"
   363   also have "\<dots> = (- (a mod b)) mod b"
   364     by (rule mod_mult_self1)
   364     by (rule mod_mult_self1)
   365   finally show ?thesis .
   365   finally show ?thesis .
   465   "1 div 2 = 0"
   465   "1 div 2 = 0"
   466 proof (cases "2 = 0")
   466 proof (cases "2 = 0")
   467   case True then show ?thesis by simp
   467   case True then show ?thesis by simp
   468 next
   468 next
   469   case False
   469   case False
   470   from mod_div_equality have "1 div 2 * 2 + 1 mod 2 = 1" .
   470   from div_mult_mod_eq have "1 div 2 * 2 + 1 mod 2 = 1" .
   471   with one_mod_two_eq_one have "1 div 2 * 2 + 1 = 1" by simp
   471   with one_mod_two_eq_one have "1 div 2 * 2 + 1 = 1" by simp
   472   then have "1 div 2 * 2 = 0" by (simp add: ac_simps add_left_imp_eq del: mult_eq_0_iff)
   472   then have "1 div 2 * 2 = 0" by (simp add: ac_simps add_left_imp_eq del: mult_eq_0_iff)
   473   then have "1 div 2 = 0 \<or> 2 = 0" by simp
   473   then have "1 div 2 = 0 \<or> 2 = 0" by simp
   474   with False show ?thesis by auto
   474   with False show ?thesis by auto
   475 qed
   475 qed
   500   then show "a mod 2 = 0 \<or> b mod 2 = 0"
   500   then show "a mod 2 = 0 \<or> b mod 2 = 0"
   501     by (rule divisors_zero)
   501     by (rule divisors_zero)
   502 next
   502 next
   503   fix a
   503   fix a
   504   assume "a mod 2 = 1"
   504   assume "a mod 2 = 1"
   505   then have "a = a div 2 * 2 + 1" using mod_div_equality [of a 2] by simp
   505   then have "a = a div 2 * 2 + 1" using div_mult_mod_eq [of a 2] by simp
   506   then show "\<exists>b. a = b + 1" ..
   506   then show "\<exists>b. a = b + 1" ..
   507 qed
   507 qed
   508 
   508 
   509 lemma even_iff_mod_2_eq_zero:
   509 lemma even_iff_mod_2_eq_zero:
   510   "even a \<longleftrightarrow> a mod 2 = 0"
   510   "even a \<longleftrightarrow> a mod 2 = 0"
   526   "even a \<Longrightarrow> 2 * (a div 2) = a"
   526   "even a \<Longrightarrow> 2 * (a div 2) = a"
   527   by (fact dvd_mult_div_cancel)
   527   by (fact dvd_mult_div_cancel)
   528 
   528 
   529 lemma odd_two_times_div_two_succ [simp]:
   529 lemma odd_two_times_div_two_succ [simp]:
   530   "odd a \<Longrightarrow> 2 * (a div 2) + 1 = a"
   530   "odd a \<Longrightarrow> 2 * (a div 2) + 1 = a"
   531   using mod_div_equality2 [of 2 a] by (simp add: even_iff_mod_2_eq_zero)
   531   using mult_div_mod_eq [of 2 a] by (simp add: even_iff_mod_2_eq_zero)
   532  
   532  
   533 end
   533 end
   534 
   534 
   535 
   535 
   536 subsection \<open>Generic numeral division with a pragmatic type class\<close>
   536 subsection \<open>Generic numeral division with a pragmatic type class\<close>
   567 
   567 
   568 lemma mult_div_cancel:
   568 lemma mult_div_cancel:
   569   "b * (a div b) = a - a mod b"
   569   "b * (a div b) = a - a mod b"
   570 proof -
   570 proof -
   571   have "b * (a div b) + a mod b = a"
   571   have "b * (a div b) + a mod b = a"
   572     using mod_div_equality [of a b] by (simp add: ac_simps)
   572     using div_mult_mod_eq [of a b] by (simp add: ac_simps)
   573   then have "b * (a div b) + a mod b - a mod b = a - a mod b"
   573   then have "b * (a div b) + a mod b - a mod b = a - a mod b"
   574     by simp
   574     by simp
   575   then show ?thesis
   575   then show ?thesis
   576     by simp
   576     by simp
   577 qed
   577 qed
  1105 
  1105 
  1106 lemma mod_less_eq_dividend [simp]:
  1106 lemma mod_less_eq_dividend [simp]:
  1107   fixes m n :: nat
  1107   fixes m n :: nat
  1108   shows "m mod n \<le> m"
  1108   shows "m mod n \<le> m"
  1109 proof (rule add_leD2)
  1109 proof (rule add_leD2)
  1110   from mod_div_equality have "m div n * n + m mod n = m" .
  1110   from div_mult_mod_eq have "m div n * n + m mod n = m" .
  1111   then show "m div n * n + m mod n \<le> m" by auto
  1111   then show "m div n * n + m mod n \<le> m" by auto
  1112 qed
  1112 qed
  1113 
  1113 
  1114 lemma mod_geq: "\<not> m < (n::nat) \<Longrightarrow> m mod n = (m - n) mod n"
  1114 lemma mod_geq: "\<not> m < (n::nat) \<Longrightarrow> m mod n = (m - n) mod n"
  1115 by (simp add: le_mod_geq linorder_not_less)
  1115 by (simp add: le_mod_geq linorder_not_less)
  1118 by (simp add: le_mod_geq)
  1118 by (simp add: le_mod_geq)
  1119 
  1119 
  1120 lemma mod_1 [simp]: "m mod Suc 0 = 0"
  1120 lemma mod_1 [simp]: "m mod Suc 0 = 0"
  1121 by (induct m) (simp_all add: mod_geq)
  1121 by (induct m) (simp_all add: mod_geq)
  1122 
  1122 
  1123 (* a simple rearrangement of mod_div_equality: *)
  1123 (* a simple rearrangement of div_mult_mod_eq: *)
  1124 lemma mult_div_cancel: "(n::nat) * (m div n) = m - (m mod n)"
  1124 lemma mult_div_cancel: "(n::nat) * (m div n) = m - (m mod n)"
  1125   using mod_div_equality2 [of n m] by arith
  1125   using mult_div_mod_eq [of n m] by arith
  1126 
  1126 
  1127 lemma mod_le_divisor[simp]: "0 < n \<Longrightarrow> m mod n \<le> (n::nat)"
  1127 lemma mod_le_divisor[simp]: "0 < n \<Longrightarrow> m mod n \<le> (n::nat)"
  1128   apply (drule mod_less_divisor [where m = m])
  1128   apply (drule mod_less_divisor [where m = m])
  1129   apply simp
  1129   apply simp
  1130   done
  1130   done
  1277 lemma mod_eqD:
  1277 lemma mod_eqD:
  1278   fixes m d r q :: nat
  1278   fixes m d r q :: nat
  1279   assumes "m mod d = r"
  1279   assumes "m mod d = r"
  1280   shows "\<exists>q. m = r + q * d"
  1280   shows "\<exists>q. m = r + q * d"
  1281 proof -
  1281 proof -
  1282   from mod_div_equality obtain q where "q * d + m mod d = m" by blast
  1282   from div_mult_mod_eq obtain q where "q * d + m mod d = m" by blast
  1283   with assms have "m = r + q * d" by simp
  1283   with assms have "m = r + q * d" by simp
  1284   then show ?thesis ..
  1284   then show ?thesis ..
  1285 qed
  1285 qed
  1286 
  1286 
  1287 lemma split_div:
  1287 lemma split_div:
  1385     from not0 R[THEN spec,of "n div k",THEN spec, of "n mod k"]
  1385     from not0 R[THEN spec,of "n div k",THEN spec, of "n mod k"]
  1386     show ?P by simp
  1386     show ?P by simp
  1387   qed
  1387   qed
  1388 qed
  1388 qed
  1389 
  1389 
  1390 theorem mod_div_equality' [nitpick_unfold]: "(m::nat) mod n = m - (m div n) * n"
  1390 theorem div_mult_mod_eq' [nitpick_unfold]: "(m::nat) mod n = m - (m div n) * n"
  1391   using mod_div_equality [of m n] by arith
  1391   using div_mult_mod_eq [of m n] by arith
  1392 
  1392 
  1393 lemma div_mod_equality': "(m::nat) div n * n = m - m mod n"
  1393 lemma div_mod_equality': "(m::nat) div n * n = m - m mod n"
  1394   using mod_div_equality [of m n] by arith
  1394   using div_mult_mod_eq [of m n] by arith
  1395 (* FIXME: very similar to mult_div_cancel *)
  1395 (* FIXME: very similar to mult_div_cancel *)
  1396 
  1396 
  1397 lemma div_eq_dividend_iff: "a \<noteq> 0 \<Longrightarrow> (a :: nat) div b = a \<longleftrightarrow> b = 1"
  1397 lemma div_eq_dividend_iff: "a \<noteq> 0 \<Longrightarrow> (a :: nat) div b = a \<longleftrightarrow> b = 1"
  1398   apply rule
  1398   apply rule
  1399   apply (cases "b = 0")
  1399   apply (cases "b = 0")
  1810 end
  1810 end
  1811   
  1811   
  1812 text\<open>Basic laws about division and remainder\<close>
  1812 text\<open>Basic laws about division and remainder\<close>
  1813 
  1813 
  1814 lemma zmod_zdiv_equality: "(a::int) = b * (a div b) + (a mod b)"
  1814 lemma zmod_zdiv_equality: "(a::int) = b * (a div b) + (a mod b)"
  1815   by (fact mod_div_equality2 [symmetric])
  1815   by (fact mult_div_mod_eq [symmetric])
  1816 
  1816 
  1817 lemma zdiv_int: "int (a div b) = int a div int b"
  1817 lemma zdiv_int: "int (a div b) = int a div int b"
  1818   by (simp add: divide_int_def)
  1818   by (simp add: divide_int_def)
  1819 
  1819 
  1820 lemma zmod_int: "int (a mod b) = int a mod int b"
  1820 lemma zmod_int: "int (a mod b) = int a mod int b"
  2049 (* REVISIT: should this be generalized to all semiring_div types? *)
  2049 (* REVISIT: should this be generalized to all semiring_div types? *)
  2050 lemmas zmod_eq_0D [dest!] = zmod_eq_0_iff [THEN iffD1]
  2050 lemmas zmod_eq_0D [dest!] = zmod_eq_0_iff [THEN iffD1]
  2051 
  2051 
  2052 lemma zmod_zdiv_equality' [nitpick_unfold]:
  2052 lemma zmod_zdiv_equality' [nitpick_unfold]:
  2053   "(m::int) mod n = m - (m div n) * n"
  2053   "(m::int) mod n = m - (m div n) * n"
  2054   using mod_div_equality [of m n] by arith
  2054   using div_mult_mod_eq [of m n] by arith
  2055 
  2055 
  2056 
  2056 
  2057 subsubsection \<open>Proving  @{term "a div (b * c) = (a div b) div c"}\<close>
  2057 subsubsection \<open>Proving  @{term "a div (b * c) = (a div b) div c"}\<close>
  2058 
  2058 
  2059 (*The condition c>0 seems necessary.  Consider that 7 div ~6 = ~2 but
  2059 (*The condition c>0 seems necessary.  Consider that 7 div ~6 = ~2 but
  2280 lemma zmod_trival_iff:
  2280 lemma zmod_trival_iff:
  2281   fixes i k :: int
  2281   fixes i k :: int
  2282   shows "i mod k = i \<longleftrightarrow> k = 0 \<or> 0 \<le> i \<and> i < k \<or> i \<le> 0 \<and> k < i"
  2282   shows "i mod k = i \<longleftrightarrow> k = 0 \<or> 0 \<le> i \<and> i < k \<or> i \<le> 0 \<and> k < i"
  2283 proof -
  2283 proof -
  2284   have "i mod k = i \<longleftrightarrow> i div k = 0"
  2284   have "i mod k = i \<longleftrightarrow> i div k = 0"
  2285     by safe (insert mod_div_equality [of i k], auto)
  2285     by safe (insert div_mult_mod_eq [of i k], auto)
  2286   with zdiv_eq_0_iff
  2286   with zdiv_eq_0_iff
  2287   show ?thesis
  2287   show ?thesis
  2288     by simp
  2288     by simp
  2289 qed
  2289 qed
  2290 
  2290