src/HOL/Divides.thy
changeset 29667 53103fc8ffa3
parent 29509 1ff0f3f08a7b
child 29925 17d1e32ef867
equal deleted inserted replaced
29549:7187373c6cb1 29667:53103fc8ffa3
    36 lemma mod_div_equality': "a mod b + a div b * b = a"
    36 lemma mod_div_equality': "a mod b + a div b * b = a"
    37   using mod_div_equality [of a b]
    37   using mod_div_equality [of a b]
    38   by (simp only: add_ac)
    38   by (simp only: add_ac)
    39 
    39 
    40 lemma div_mod_equality: "((a div b) * b + a mod b) + c = a + c"
    40 lemma div_mod_equality: "((a div b) * b + a mod b) + c = a + c"
    41   by (simp add: mod_div_equality)
    41 by (simp add: mod_div_equality)
    42 
    42 
    43 lemma div_mod_equality2: "(b * (a div b) + a mod b) + c = a + c"
    43 lemma div_mod_equality2: "(b * (a div b) + a mod b) + c = a + c"
    44   by (simp add: mod_div_equality2)
    44 by (simp add: mod_div_equality2)
    45 
    45 
    46 lemma mod_by_0 [simp]: "a mod 0 = a"
    46 lemma mod_by_0 [simp]: "a mod 0 = a"
    47   using mod_div_equality [of a zero] by simp
    47   using mod_div_equality [of a zero] by simp
    48 
    48 
    49 lemma mod_0 [simp]: "0 mod a = 0"
    49 lemma mod_0 [simp]: "0 mod a = 0"
    61   case False
    61   case False
    62   have "a + c * b = (a + c * b) div b * b + (a + c * b) mod b"
    62   have "a + c * b = (a + c * b) div b * b + (a + c * b) mod b"
    63     by (simp add: mod_div_equality)
    63     by (simp add: mod_div_equality)
    64   also from False div_mult_self1 [of b a c] have
    64   also from False div_mult_self1 [of b a c] have
    65     "\<dots> = (c + a div b) * b + (a + c * b) mod b"
    65     "\<dots> = (c + a div b) * b + (a + c * b) mod b"
    66       by (simp add: left_distrib add_ac)
    66       by (simp add: algebra_simps)
    67   finally have "a = a div b * b + (a + c * b) mod b"
    67   finally have "a = a div b * b + (a + c * b) mod b"
    68     by (simp add: add_commute [of a] add_assoc left_distrib)
    68     by (simp add: add_commute [of a] add_assoc left_distrib)
    69   then have "a div b * b + (a + c * b) mod b = a div b * b + a mod b"
    69   then have "a div b * b + (a + c * b) mod b = a div b * b + a mod b"
    70     by (simp add: mod_div_equality)
    70     by (simp add: mod_div_equality)
    71   then show ?thesis by simp
    71   then show ?thesis by simp
    72 qed
    72 qed
    73 
    73 
    74 lemma mod_mult_self2 [simp]: "(a + b * c) mod b = a mod b"
    74 lemma mod_mult_self2 [simp]: "(a + b * c) mod b = a mod b"
    75   by (simp add: mult_commute [of b])
    75 by (simp add: mult_commute [of b])
    76 
    76 
    77 lemma div_mult_self1_is_id [simp]: "b \<noteq> 0 \<Longrightarrow> b * a div b = a"
    77 lemma div_mult_self1_is_id [simp]: "b \<noteq> 0 \<Longrightarrow> b * a div b = a"
    78   using div_mult_self2 [of b 0 a] by simp
    78   using div_mult_self2 [of b 0 a] by simp
    79 
    79 
    80 lemma div_mult_self2_is_id [simp]: "b \<noteq> 0 \<Longrightarrow> a * b div b = a"
    80 lemma div_mult_self2_is_id [simp]: "b \<noteq> 0 \<Longrightarrow> a * b div b = a"
   215 lemma mod_mult_left_eq: "(a * b) mod c = ((a mod c) * b) mod c"
   215 lemma mod_mult_left_eq: "(a * b) mod c = ((a mod c) * b) mod c"
   216 proof -
   216 proof -
   217   have "(a * b) mod c = ((a div c * c + a mod c) * b) mod c"
   217   have "(a * b) mod c = ((a div c * c + a mod c) * b) mod c"
   218     by (simp only: mod_div_equality)
   218     by (simp only: mod_div_equality)
   219   also have "\<dots> = (a mod c * b + a div c * b * c) mod c"
   219   also have "\<dots> = (a mod c * b + a div c * b * c) mod c"
   220     by (simp only: left_distrib right_distrib add_ac mult_ac)
   220     by (simp only: algebra_simps)
   221   also have "\<dots> = (a mod c * b) mod c"
   221   also have "\<dots> = (a mod c * b) mod c"
   222     by (rule mod_mult_self1)
   222     by (rule mod_mult_self1)
   223   finally show ?thesis .
   223   finally show ?thesis .
   224 qed
   224 qed
   225 
   225 
   226 lemma mod_mult_right_eq: "(a * b) mod c = (a * (b mod c)) mod c"
   226 lemma mod_mult_right_eq: "(a * b) mod c = (a * (b mod c)) mod c"
   227 proof -
   227 proof -
   228   have "(a * b) mod c = (a * (b div c * c + b mod c)) mod c"
   228   have "(a * b) mod c = (a * (b div c * c + b mod c)) mod c"
   229     by (simp only: mod_div_equality)
   229     by (simp only: mod_div_equality)
   230   also have "\<dots> = (a * (b mod c) + a * (b div c) * c) mod c"
   230   also have "\<dots> = (a * (b mod c) + a * (b div c) * c) mod c"
   231     by (simp only: left_distrib right_distrib add_ac mult_ac)
   231     by (simp only: algebra_simps)
   232   also have "\<dots> = (a * (b mod c)) mod c"
   232   also have "\<dots> = (a * (b mod c)) mod c"
   233     by (rule mod_mult_self1)
   233     by (rule mod_mult_self1)
   234   finally show ?thesis .
   234   finally show ?thesis .
   235 qed
   235 qed
   236 
   236 
   550 
   550 
   551 text {* code generator setup *}
   551 text {* code generator setup *}
   552 
   552 
   553 lemma divmod_if [code]: "divmod m n = (if n = 0 \<or> m < n then (0, m) else
   553 lemma divmod_if [code]: "divmod m n = (if n = 0 \<or> m < n then (0, m) else
   554   let (q, r) = divmod (m - n) n in (Suc q, r))"
   554   let (q, r) = divmod (m - n) n in (Suc q, r))"
   555   by (simp add: divmod_zero divmod_base divmod_step)
   555 by (simp add: divmod_zero divmod_base divmod_step)
   556     (simp add: divmod_div_mod)
   556     (simp add: divmod_div_mod)
   557 
   557 
   558 code_modulename SML
   558 code_modulename SML
   559   Divides Nat
   559   Divides Nat
   560 
   560 
   566 
   566 
   567 
   567 
   568 subsubsection {* Quotient *}
   568 subsubsection {* Quotient *}
   569 
   569 
   570 lemma div_geq: "0 < n \<Longrightarrow>  \<not> m < n \<Longrightarrow> m div n = Suc ((m - n) div n)"
   570 lemma div_geq: "0 < n \<Longrightarrow>  \<not> m < n \<Longrightarrow> m div n = Suc ((m - n) div n)"
   571   by (simp add: le_div_geq linorder_not_less)
   571 by (simp add: le_div_geq linorder_not_less)
   572 
   572 
   573 lemma div_if: "0 < n \<Longrightarrow> m div n = (if m < n then 0 else Suc ((m - n) div n))"
   573 lemma div_if: "0 < n \<Longrightarrow> m div n = (if m < n then 0 else Suc ((m - n) div n))"
   574   by (simp add: div_geq)
   574 by (simp add: div_geq)
   575 
   575 
   576 lemma div_mult_self_is_m [simp]: "0<n ==> (m*n) div n = (m::nat)"
   576 lemma div_mult_self_is_m [simp]: "0<n ==> (m*n) div n = (m::nat)"
   577   by simp
   577 by simp
   578 
   578 
   579 lemma div_mult_self1_is_m [simp]: "0<n ==> (n*m) div n = (m::nat)"
   579 lemma div_mult_self1_is_m [simp]: "0<n ==> (n*m) div n = (m::nat)"
   580   by simp
   580 by simp
   581 
   581 
   582 
   582 
   583 subsubsection {* Remainder *}
   583 subsubsection {* Remainder *}
   584 
   584 
   585 lemma mod_less_divisor [simp]:
   585 lemma mod_less_divisor [simp]:
   595   from mod_div_equality have "m div n * n + m mod n = m" .
   595   from mod_div_equality have "m div n * n + m mod n = m" .
   596   then show "m div n * n + m mod n \<le> m" by auto
   596   then show "m div n * n + m mod n \<le> m" by auto
   597 qed
   597 qed
   598 
   598 
   599 lemma mod_geq: "\<not> m < (n\<Colon>nat) \<Longrightarrow> m mod n = (m - n) mod n"
   599 lemma mod_geq: "\<not> m < (n\<Colon>nat) \<Longrightarrow> m mod n = (m - n) mod n"
   600   by (simp add: le_mod_geq linorder_not_less)
   600 by (simp add: le_mod_geq linorder_not_less)
   601 
   601 
   602 lemma mod_if: "m mod (n\<Colon>nat) = (if m < n then m else (m - n) mod n)"
   602 lemma mod_if: "m mod (n\<Colon>nat) = (if m < n then m else (m - n) mod n)"
   603   by (simp add: le_mod_geq)
   603 by (simp add: le_mod_geq)
   604 
   604 
   605 lemma mod_1 [simp]: "m mod Suc 0 = 0"
   605 lemma mod_1 [simp]: "m mod Suc 0 = 0"
   606   by (induct m) (simp_all add: mod_geq)
   606 by (induct m) (simp_all add: mod_geq)
   607 
   607 
   608 lemma mod_mult_distrib: "(m mod n) * (k\<Colon>nat) = (m * k) mod (n * k)"
   608 lemma mod_mult_distrib: "(m mod n) * (k\<Colon>nat) = (m * k) mod (n * k)"
   609   apply (cases "n = 0", simp)
   609   apply (cases "n = 0", simp)
   610   apply (cases "k = 0", simp)
   610   apply (cases "k = 0", simp)
   611   apply (induct m rule: nat_less_induct)
   611   apply (induct m rule: nat_less_induct)
   612   apply (subst mod_if, simp)
   612   apply (subst mod_if, simp)
   613   apply (simp add: mod_geq diff_mult_distrib)
   613   apply (simp add: mod_geq diff_mult_distrib)
   614   done
   614   done
   615 
   615 
   616 lemma mod_mult_distrib2: "(k::nat) * (m mod n) = (k*m) mod (k*n)"
   616 lemma mod_mult_distrib2: "(k::nat) * (m mod n) = (k*m) mod (k*n)"
   617   by (simp add: mult_commute [of k] mod_mult_distrib)
   617 by (simp add: mult_commute [of k] mod_mult_distrib)
   618 
   618 
   619 (* a simple rearrangement of mod_div_equality: *)
   619 (* a simple rearrangement of mod_div_equality: *)
   620 lemma mult_div_cancel: "(n::nat) * (m div n) = m - (m mod n)"
   620 lemma mult_div_cancel: "(n::nat) * (m div n) = m - (m mod n)"
   621   by (cut_tac a = m and b = n in mod_div_equality2, arith)
   621 by (cut_tac a = m and b = n in mod_div_equality2, arith)
   622 
   622 
   623 lemma mod_le_divisor[simp]: "0 < n \<Longrightarrow> m mod n \<le> (n::nat)"
   623 lemma mod_le_divisor[simp]: "0 < n \<Longrightarrow> m mod n \<le> (n::nat)"
   624   apply (drule mod_less_divisor [where m = m])
   624   apply (drule mod_less_divisor [where m = m])
   625   apply simp
   625   apply simp
   626   done
   626   done
   628 subsubsection {* Quotient and Remainder *}
   628 subsubsection {* Quotient and Remainder *}
   629 
   629 
   630 lemma divmod_rel_mult1_eq:
   630 lemma divmod_rel_mult1_eq:
   631   "[| divmod_rel b c q r; c > 0 |]
   631   "[| divmod_rel b c q r; c > 0 |]
   632    ==> divmod_rel (a*b) c (a*q + a*r div c) (a*r mod c)"
   632    ==> divmod_rel (a*b) c (a*q + a*r div c) (a*r mod c)"
   633 by (auto simp add: split_ifs mult_ac divmod_rel_def add_mult_distrib2)
   633 by (auto simp add: split_ifs divmod_rel_def algebra_simps)
   634 
   634 
   635 lemma div_mult1_eq: "(a*b) div c = a*(b div c) + a*(b mod c) div (c::nat)"
   635 lemma div_mult1_eq: "(a*b) div c = a*(b div c) + a*(b mod c) div (c::nat)"
   636 apply (cases "c = 0", simp)
   636 apply (cases "c = 0", simp)
   637 apply (blast intro: divmod_rel [THEN divmod_rel_mult1_eq, THEN div_eq])
   637 apply (blast intro: divmod_rel [THEN divmod_rel_mult1_eq, THEN div_eq])
   638 done
   638 done
   639 
   639 
   640 lemma mod_mult1_eq: "(a*b) mod c = a*(b mod c) mod (c::nat)"
   640 lemma mod_mult1_eq: "(a*b) mod c = a*(b mod c) mod (c::nat)"
   641   by (rule mod_mult_right_eq)
   641 by (rule mod_mult_right_eq)
   642 
   642 
   643 lemma mod_mult1_eq': "(a*b) mod (c::nat) = ((a mod c) * b) mod c"
   643 lemma mod_mult1_eq': "(a*b) mod (c::nat) = ((a mod c) * b) mod c"
   644   by (rule mod_mult_left_eq)
   644 by (rule mod_mult_left_eq)
   645 
   645 
   646 lemma mod_mult_distrib_mod:
   646 lemma mod_mult_distrib_mod:
   647   "(a*b) mod (c::nat) = ((a mod c) * (b mod c)) mod c"
   647   "(a*b) mod (c::nat) = ((a mod c) * (b mod c)) mod c"
   648   by (rule mod_mult_eq)
   648 by (rule mod_mult_eq)
   649 
   649 
   650 lemma divmod_rel_add1_eq:
   650 lemma divmod_rel_add1_eq:
   651   "[| divmod_rel a c aq ar; divmod_rel b c bq br;  c > 0 |]
   651   "[| divmod_rel a c aq ar; divmod_rel b c bq br;  c > 0 |]
   652    ==> divmod_rel (a + b) c (aq + bq + (ar+br) div c) ((ar + br) mod c)"
   652    ==> divmod_rel (a + b) c (aq + bq + (ar+br) div c) ((ar + br) mod c)"
   653 by (auto simp add: split_ifs mult_ac divmod_rel_def add_mult_distrib2)
   653 by (auto simp add: split_ifs divmod_rel_def algebra_simps)
   654 
   654 
   655 (*NOT suitable for rewriting: the RHS has an instance of the LHS*)
   655 (*NOT suitable for rewriting: the RHS has an instance of the LHS*)
   656 lemma div_add1_eq:
   656 lemma div_add1_eq:
   657   "(a+b) div (c::nat) = a div c + b div c + ((a mod c + b mod c) div c)"
   657   "(a+b) div (c::nat) = a div c + b div c + ((a mod c + b mod c) div c)"
   658 apply (cases "c = 0", simp)
   658 apply (cases "c = 0", simp)
   659 apply (blast intro: divmod_rel_add1_eq [THEN div_eq] divmod_rel)
   659 apply (blast intro: divmod_rel_add1_eq [THEN div_eq] divmod_rel)
   660 done
   660 done
   661 
   661 
   662 lemma mod_add1_eq: "(a+b) mod (c::nat) = (a mod c + b mod c) mod c"
   662 lemma mod_add1_eq: "(a+b) mod (c::nat) = (a mod c + b mod c) mod c"
   663   by (rule mod_add_eq)
   663 by (rule mod_add_eq)
   664 
   664 
   665 lemma mod_lemma: "[| (0::nat) < c; r < b |] ==> b * (q mod c) + r < b * c"
   665 lemma mod_lemma: "[| (0::nat) < c; r < b |] ==> b * (q mod c) + r < b * c"
   666   apply (cut_tac m = q and n = c in mod_less_divisor)
   666   apply (cut_tac m = q and n = c in mod_less_divisor)
   667   apply (drule_tac [2] m = "q mod c" in less_imp_Suc_add, auto)
   667   apply (drule_tac [2] m = "q mod c" in less_imp_Suc_add, auto)
   668   apply (erule_tac P = "%x. ?lhs < ?rhs x" in ssubst)
   668   apply (erule_tac P = "%x. ?lhs < ?rhs x" in ssubst)
   669   apply (simp add: add_mult_distrib2)
   669   apply (simp add: add_mult_distrib2)
   670   done
   670   done
   671 
   671 
   672 lemma divmod_rel_mult2_eq: "[| divmod_rel a b q r;  0 < b;  0 < c |]
   672 lemma divmod_rel_mult2_eq: "[| divmod_rel a b q r;  0 < b;  0 < c |]
   673       ==> divmod_rel a (b*c) (q div c) (b*(q mod c) + r)"
   673       ==> divmod_rel a (b*c) (q div c) (b*(q mod c) + r)"
   674   by (auto simp add: mult_ac divmod_rel_def add_mult_distrib2 [symmetric] mod_lemma)
   674 by (auto simp add: mult_ac divmod_rel_def add_mult_distrib2 [symmetric] mod_lemma)
   675 
   675 
   676 lemma div_mult2_eq: "a div (b*c) = (a div b) div (c::nat)"
   676 lemma div_mult2_eq: "a div (b*c) = (a div b) div (c::nat)"
   677   apply (cases "b = 0", simp)
   677   apply (cases "b = 0", simp)
   678   apply (cases "c = 0", simp)
   678   apply (cases "c = 0", simp)
   679   apply (force simp add: divmod_rel [THEN divmod_rel_mult2_eq, THEN div_eq])
   679   apply (force simp add: divmod_rel [THEN divmod_rel_mult2_eq, THEN div_eq])
   688 
   688 
   689 subsubsection{*Cancellation of Common Factors in Division*}
   689 subsubsection{*Cancellation of Common Factors in Division*}
   690 
   690 
   691 lemma div_mult_mult_lemma:
   691 lemma div_mult_mult_lemma:
   692     "[| (0::nat) < b;  0 < c |] ==> (c*a) div (c*b) = a div b"
   692     "[| (0::nat) < b;  0 < c |] ==> (c*a) div (c*b) = a div b"
   693   by (auto simp add: div_mult2_eq)
   693 by (auto simp add: div_mult2_eq)
   694 
   694 
   695 lemma div_mult_mult1 [simp]: "(0::nat) < c ==> (c*a) div (c*b) = a div b"
   695 lemma div_mult_mult1 [simp]: "(0::nat) < c ==> (c*a) div (c*b) = a div b"
   696   apply (cases "b = 0")
   696   apply (cases "b = 0")
   697   apply (auto simp add: linorder_neq_iff [of b] div_mult_mult_lemma)
   697   apply (auto simp add: linorder_neq_iff [of b] div_mult_mult_lemma)
   698   done
   698   done
   704 
   704 
   705 
   705 
   706 subsubsection{*Further Facts about Quotient and Remainder*}
   706 subsubsection{*Further Facts about Quotient and Remainder*}
   707 
   707 
   708 lemma div_1 [simp]: "m div Suc 0 = m"
   708 lemma div_1 [simp]: "m div Suc 0 = m"
   709   by (induct m) (simp_all add: div_geq)
   709 by (induct m) (simp_all add: div_geq)
   710 
   710 
   711 
   711 
   712 (* Monotonicity of div in first argument *)
   712 (* Monotonicity of div in first argument *)
   713 lemma div_le_mono [rule_format (no_asm)]:
   713 lemma div_le_mono [rule_format (no_asm)]:
   714     "\<forall>m::nat. m \<le> n --> (m div k) \<le> (n div k)"
   714     "\<forall>m::nat. m \<le> n --> (m div k) \<le> (n div k)"
   778 apply (simp add: linorder_not_less le_Suc_eq mod_geq)
   778 apply (simp add: linorder_not_less le_Suc_eq mod_geq)
   779 apply (auto simp add: Suc_diff_le le_mod_geq)
   779 apply (auto simp add: Suc_diff_le le_mod_geq)
   780 done
   780 done
   781 
   781 
   782 lemma nat_mod_div_trivial: "m mod n div n = (0 :: nat)"
   782 lemma nat_mod_div_trivial: "m mod n div n = (0 :: nat)"
   783   by simp
   783 by simp
   784 
   784 
   785 lemma nat_mod_mod_trivial: "m mod n mod n = (m mod n :: nat)"
   785 lemma nat_mod_mod_trivial: "m mod n mod n = (m mod n :: nat)"
   786   by simp
   786 by simp
   787 
   787 
   788 
   788 
   789 subsubsection {* The Divides Relation *}
   789 subsubsection {* The Divides Relation *}
   790 
   790 
   791 lemma dvd_1_left [iff]: "Suc 0 dvd k"
   791 lemma dvd_1_left [iff]: "Suc 0 dvd k"
   792   unfolding dvd_def by simp
   792   unfolding dvd_def by simp
   793 
   793 
   794 lemma dvd_1_iff_1 [simp]: "(m dvd Suc 0) = (m = Suc 0)"
   794 lemma dvd_1_iff_1 [simp]: "(m dvd Suc 0) = (m = Suc 0)"
   795   by (simp add: dvd_def)
   795 by (simp add: dvd_def)
   796 
   796 
   797 lemma dvd_anti_sym: "[| m dvd n; n dvd m |] ==> m = (n::nat)"
   797 lemma dvd_anti_sym: "[| m dvd n; n dvd m |] ==> m = (n::nat)"
   798   unfolding dvd_def
   798   unfolding dvd_def
   799   by (force dest: mult_eq_self_implies_10 simp add: mult_assoc mult_eq_1_iff)
   799   by (force dest: mult_eq_self_implies_10 simp add: mult_assoc mult_eq_1_iff)
   800 
   800 
   811   apply (erule linorder_not_less [THEN iffD2, THEN add_diff_inverse, THEN subst])
   811   apply (erule linorder_not_less [THEN iffD2, THEN add_diff_inverse, THEN subst])
   812   apply (blast intro: dvd_add)
   812   apply (blast intro: dvd_add)
   813   done
   813   done
   814 
   814 
   815 lemma dvd_diffD1: "[| k dvd m-n; k dvd m; n\<le>m |] ==> k dvd (n::nat)"
   815 lemma dvd_diffD1: "[| k dvd m-n; k dvd m; n\<le>m |] ==> k dvd (n::nat)"
   816   by (drule_tac m = m in dvd_diff, auto)
   816 by (drule_tac m = m in dvd_diff, auto)
   817 
   817 
   818 lemma dvd_reduce: "(k dvd n + k) = (k dvd (n::nat))"
   818 lemma dvd_reduce: "(k dvd n + k) = (k dvd (n::nat))"
   819   apply (rule iffI)
   819   apply (rule iffI)
   820    apply (erule_tac [2] dvd_add)
   820    apply (erule_tac [2] dvd_add)
   821    apply (rule_tac [2] dvd_refl)
   821    apply (rule_tac [2] dvd_refl)
   837    apply (simp add: mod_div_equality)
   837    apply (simp add: mod_div_equality)
   838   apply (simp only: dvd_add dvd_mult)
   838   apply (simp only: dvd_add dvd_mult)
   839   done
   839   done
   840 
   840 
   841 lemma dvd_mod_iff: "k dvd n ==> ((k::nat) dvd m mod n) = (k dvd m)"
   841 lemma dvd_mod_iff: "k dvd n ==> ((k::nat) dvd m mod n) = (k dvd m)"
   842   by (blast intro: dvd_mod_imp_dvd dvd_mod)
   842 by (blast intro: dvd_mod_imp_dvd dvd_mod)
   843 
   843 
   844 lemma dvd_mult_cancel: "!!k::nat. [| k*m dvd k*n; 0<k |] ==> m dvd n"
   844 lemma dvd_mult_cancel: "!!k::nat. [| k*m dvd k*n; 0<k |] ==> m dvd n"
   845   unfolding dvd_def
   845   unfolding dvd_def
   846   apply (erule exE)
   846   apply (erule exE)
   847   apply (simp add: mult_ac)
   847   apply (simp add: mult_ac)
   892   apply (rule power_le_imp_le_exp, assumption)
   892   apply (rule power_le_imp_le_exp, assumption)
   893   apply (erule dvd_imp_le, simp)
   893   apply (erule dvd_imp_le, simp)
   894   done
   894   done
   895 
   895 
   896 lemma mod_eq_0_iff: "(m mod d = 0) = (\<exists>q::nat. m = d*q)"
   896 lemma mod_eq_0_iff: "(m mod d = 0) = (\<exists>q::nat. m = d*q)"
   897   by (auto simp add: dvd_eq_mod_eq_0 [symmetric] dvd_def)
   897 by (auto simp add: dvd_eq_mod_eq_0 [symmetric] dvd_def)
   898 
   898 
   899 lemmas mod_eq_0D [dest!] = mod_eq_0_iff [THEN iffD1]
   899 lemmas mod_eq_0D [dest!] = mod_eq_0_iff [THEN iffD1]
   900 
   900 
   901 (*Loses information, namely we also have r<d provided d is nonzero*)
   901 (*Loses information, namely we also have r<d provided d is nonzero*)
   902 lemma mod_eqD: "(m mod d = r) ==> \<exists>q::nat. m = r + q*d"
   902 lemma mod_eqD: "(m mod d = r) ==> \<exists>q::nat. m = r + q*d"