src/HOL/IntDiv.thy
changeset 30034 60f64f112174
parent 30031 bd786c37af84
child 30042 31039ee583fa
equal deleted inserted replaced
30031:bd786c37af84 30034:60f64f112174
   745     by simp
   745     by simp
   746   from divmod_rel_div [OF this `l \<noteq> 0`] divmod_rel_mod [OF this `l \<noteq> 0`]
   746   from divmod_rel_div [OF this `l \<noteq> 0`] divmod_rel_mod [OF this `l \<noteq> 0`]
   747   show ?thesis by simp
   747   show ?thesis by simp
   748 qed
   748 qed
   749 
   749 
   750 lemma zdiv_zadd_self1: "a \<noteq> (0::int) ==> (a+b) div a = b div a + 1"
       
   751 by (rule div_add_self1) (* already declared [simp] *)
       
   752 
       
   753 lemma zdiv_zadd_self2: "a \<noteq> (0::int) ==> (b+a) div a = b div a + 1"
       
   754 by (rule div_add_self2) (* already declared [simp] *)
       
   755 
       
   756 lemma zdiv_zmult_self2: "b \<noteq> (0::int) ==> (b*a) div b = a"
       
   757 by (rule div_mult_self1_is_id) (* already declared [simp] *)
       
   758 
       
   759 lemma zmod_zmult_self1: "(a*b) mod b = (0::int)"
       
   760 by (rule mod_mult_self2_is_0) (* already declared [simp] *)
       
   761 
       
   762 lemma zmod_zmult_self2: "(b*a) mod b = (0::int)"
       
   763 by (rule mod_mult_self1_is_0) (* already declared [simp] *)
       
   764 
       
   765 lemma zmod_eq_0_iff: "(m mod d = 0) = (EX q::int. m = d*q)"
   750 lemma zmod_eq_0_iff: "(m mod d = 0) = (EX q::int. m = d*q)"
   766 by (simp add: dvd_eq_mod_eq_0 [symmetric] dvd_def)
   751 by (simp add: dvd_eq_mod_eq_0 [symmetric] dvd_def)
   767 
   752 
   768 (* REVISIT: should this be generalized to all semiring_div types? *)
   753 (* REVISIT: should this be generalized to all semiring_div types? *)
   769 lemmas zmod_eq_0D [dest!] = zmod_eq_0_iff [THEN iffD1]
   754 lemmas zmod_eq_0D [dest!] = zmod_eq_0_iff [THEN iffD1]
   770 
   755 
   771 lemma zmod_zadd_left_eq: "(a+b) mod (c::int) = ((a mod c) + b) mod c"
       
   772 by (rule mod_add_left_eq)
       
   773 
       
   774 lemma zmod_zadd_right_eq: "(a+b) mod (c::int) = (a + (b mod c)) mod c"
       
   775 by (rule mod_add_right_eq)
       
   776 
       
   777 lemma zmod_zadd_self1: "(a+b) mod a = b mod (a::int)"
       
   778 by (rule mod_add_self1) (* already declared [simp] *)
       
   779 
       
   780 lemma zmod_zadd_self2: "(b+a) mod a = b mod (a::int)"
       
   781 by (rule mod_add_self2) (* already declared [simp] *)
       
   782 
       
   783 lemma zmod_zdiff1_eq: "(a - b) mod c = (a mod c - b mod c) mod (c::int)"
       
   784 by (rule mod_diff_eq)
       
   785 
   756 
   786 subsection{*Proving  @{term "a div (b*c) = (a div b) div c"} *}
   757 subsection{*Proving  @{term "a div (b*c) = (a div b) div c"} *}
   787 
   758 
   788 (*The condition c>0 seems necessary.  Consider that 7 div ~6 = ~2 but
   759 (*The condition c>0 seems necessary.  Consider that 7 div ~6 = ~2 but
   789   7 div 2 div ~3 = 3 div ~3 = ~1.  The subcase (a div b) mod c = 0 seems
   760   7 div 2 div ~3 = 3 div ~3 = ~1.  The subcase (a div b) mod c = 0 seems
   893 
   864 
   894 lemma zmod_zmult_zmult2: "(a*c) mod (b*c) = (a mod b) * (c::int)"
   865 lemma zmod_zmult_zmult2: "(a*c) mod (b*c) = (a mod b) * (c::int)"
   895 apply (cut_tac c = c in zmod_zmult_zmult1)
   866 apply (cut_tac c = c in zmod_zmult_zmult1)
   896 apply (auto simp add: mult_commute)
   867 apply (auto simp add: mult_commute)
   897 done
   868 done
   898 
       
   899 lemma zmod_zmod_cancel: "n dvd m \<Longrightarrow> (k::int) mod m mod n = k mod n"
       
   900 by (rule mod_mod_cancel)
       
   901 
   869 
   902 
   870 
   903 subsection {*Splitting Rules for div and mod*}
   871 subsection {*Splitting Rules for div and mod*}
   904 
   872 
   905 text{*The proofs of the two lemmas below are essentially identical*}
   873 text{*The proofs of the two lemmas below are essentially identical*}
  1348 
  1316 
  1349 lemma zdiff_zmod_right: "(x - y mod m) mod m = (x - y) mod (m::int)"
  1317 lemma zdiff_zmod_right: "(x - y mod m) mod m = (x - y) mod (m::int)"
  1350 by (rule mod_diff_right_eq [symmetric])
  1318 by (rule mod_diff_right_eq [symmetric])
  1351 
  1319 
  1352 lemmas zmod_simps =
  1320 lemmas zmod_simps =
  1353   IntDiv.zmod_zadd_left_eq  [symmetric]
  1321   mod_add_left_eq  [symmetric]
  1354   IntDiv.zmod_zadd_right_eq [symmetric]
  1322   mod_add_right_eq [symmetric]
  1355   IntDiv.zmod_zmult1_eq     [symmetric]
  1323   IntDiv.zmod_zmult1_eq     [symmetric]
  1356   mod_mult_left_eq          [symmetric]
  1324   mod_mult_left_eq          [symmetric]
  1357   IntDiv.zpower_zmod
  1325   IntDiv.zpower_zmod
  1358   zminus_zmod zdiff_zmod_left zdiff_zmod_right
  1326   zminus_zmod zdiff_zmod_left zdiff_zmod_right
  1359 
  1327 
  1424 lemma zmod_eq_dvd_iff: "(x::int) mod n = y mod n \<longleftrightarrow> n dvd x - y"
  1392 lemma zmod_eq_dvd_iff: "(x::int) mod n = y mod n \<longleftrightarrow> n dvd x - y"
  1425 proof
  1393 proof
  1426   assume H: "x mod n = y mod n"
  1394   assume H: "x mod n = y mod n"
  1427   hence "x mod n - y mod n = 0" by simp
  1395   hence "x mod n - y mod n = 0" by simp
  1428   hence "(x mod n - y mod n) mod n = 0" by simp 
  1396   hence "(x mod n - y mod n) mod n = 0" by simp 
  1429   hence "(x - y) mod n = 0" by (simp add: zmod_zdiff1_eq[symmetric])
  1397   hence "(x - y) mod n = 0" by (simp add: mod_diff_eq[symmetric])
  1430   thus "n dvd x - y" by (simp add: zdvd_iff_zmod_eq_0)
  1398   thus "n dvd x - y" by (simp add: zdvd_iff_zmod_eq_0)
  1431 next
  1399 next
  1432   assume H: "n dvd x - y"
  1400   assume H: "n dvd x - y"
  1433   then obtain k where k: "x-y = n*k" unfolding dvd_def by blast
  1401   then obtain k where k: "x-y = n*k" unfolding dvd_def by blast
  1434   hence "x = n*k + y" by simp
  1402   hence "x = n*k + y" by simp
  1435   hence "x mod n = (n*k + y) mod n" by simp
  1403   hence "x mod n = (n*k + y) mod n" by simp
  1436   thus "x mod n = y mod n" by (simp add: zmod_zadd_left_eq)
  1404   thus "x mod n = y mod n" by (simp add: mod_add_left_eq)
  1437 qed
  1405 qed
  1438 
  1406 
  1439 lemma nat_mod_eq_lemma: assumes xyn: "(x::nat) mod n = y  mod n" and xy:"y \<le> x"
  1407 lemma nat_mod_eq_lemma: assumes xyn: "(x::nat) mod n = y  mod n" and xy:"y \<le> x"
  1440   shows "\<exists>q. x = y + n * q"
  1408   shows "\<exists>q. x = y + n * q"
  1441 proof-
  1409 proof-