src/HOL/Divides.thy
changeset 30837 3d4832d9f7e4
parent 30729 461ee3e49ad3
child 30840 98809b3f5e3c
equal deleted inserted replaced
30829:d64a293f23ba 30837:3d4832d9f7e4
   235   have "(a mod c + b mod c) mod c = (a' mod c + b' mod c) mod c"
   235   have "(a mod c + b mod c) mod c = (a' mod c + b' mod c) mod c"
   236     unfolding assms ..
   236     unfolding assms ..
   237   thus ?thesis
   237   thus ?thesis
   238     by (simp only: mod_add_eq [symmetric])
   238     by (simp only: mod_add_eq [symmetric])
   239 qed
   239 qed
       
   240 
       
   241 lemma div_add[simp]: "z dvd x \<Longrightarrow> z dvd y
       
   242   \<Longrightarrow> (x + y) div z = x div z + y div z"
       
   243 by(cases "z=0", simp, unfold dvd_def, auto simp add: algebra_simps)
   240 
   244 
   241 text {* Multiplication respects modular equivalence. *}
   245 text {* Multiplication respects modular equivalence. *}
   242 
   246 
   243 lemma mod_mult_left_eq: "(a * b) mod c = ((a mod c) * b) mod c"
   247 lemma mod_mult_left_eq: "(a * b) mod c = ((a mod c) * b) mod c"
   244 proof -
   248 proof -
   763 lemma div_1 [simp]: "m div Suc 0 = m"
   767 lemma div_1 [simp]: "m div Suc 0 = m"
   764 by (induct m) (simp_all add: div_geq)
   768 by (induct m) (simp_all add: div_geq)
   765 
   769 
   766 
   770 
   767 (* Monotonicity of div in first argument *)
   771 (* Monotonicity of div in first argument *)
   768 lemma div_le_mono [rule_format (no_asm)]:
   772 lemma div_le_mono [rule_format]:
   769     "\<forall>m::nat. m \<le> n --> (m div k) \<le> (n div k)"
   773     "\<forall>m::nat. m \<le> n --> (m div k) \<le> (n div k)"
   770 apply (case_tac "k=0", simp)
   774 apply (case_tac "k=0", simp)
   771 apply (induct "n" rule: nat_less_induct, clarify)
   775 apply (induct "n" rule: nat_less_induct, clarify)
   772 apply (case_tac "n<k")
   776 apply (case_tac "n<k")
   773 (* 1  case n<k *)
   777 (* 1  case n<k *)
   818   apply (rule impI less_trans_Suc)+
   822   apply (rule impI less_trans_Suc)+
   819 apply assumption
   823 apply assumption
   820   apply (simp_all)
   824   apply (simp_all)
   821 done
   825 done
   822 
   826 
       
   827 lemma nat_div_eq_0 [simp]: "(n::nat) > 0 ==> ((m div n) = 0) = (m < n)"
       
   828 by(auto, subst mod_div_equality [of m n, symmetric], auto)
       
   829 
   823 declare div_less_dividend [simp]
   830 declare div_less_dividend [simp]
   824 
   831 
   825 text{*A fact for the mutilated chess board*}
   832 text{*A fact for the mutilated chess board*}
   826 lemma mod_Suc: "Suc(m) mod n = (if Suc(m mod n) = n then 0 else Suc(m mod n))"
   833 lemma mod_Suc: "Suc(m) mod n = (if Suc(m mod n) = n then 0 else Suc(m mod n))"
   827 apply (case_tac "n=0", simp)
   834 apply (case_tac "n=0", simp)
   903   apply (subst mult_commute)
   910   apply (subst mult_commute)
   904   apply (erule dvd_mult_cancel1)
   911   apply (erule dvd_mult_cancel1)
   905   done
   912   done
   906 
   913 
   907 lemma dvd_imp_le: "[| k dvd n; 0 < n |] ==> k \<le> (n::nat)"
   914 lemma dvd_imp_le: "[| k dvd n; 0 < n |] ==> k \<le> (n::nat)"
   908   apply (unfold dvd_def, clarify)
   915 by (auto elim!: dvdE) (auto simp add: gr0_conv_Suc)
   909   apply (simp_all (no_asm_use) add: zero_less_mult_iff)
   916 
   910   apply (erule conjE)
   917 lemma nat_dvd_not_less: "(0::nat) < m \<Longrightarrow> m < n \<Longrightarrow> \<not> n dvd m"
   911   apply (rule le_trans)
   918 by (auto elim!: dvdE) (auto simp add: gr0_conv_Suc)
   912    apply (rule_tac [2] le_refl [THEN mult_le_mono])
       
   913    apply (erule_tac [2] Suc_leI, simp)
       
   914   done
       
   915 
   919 
   916 lemma dvd_mult_div_cancel: "n dvd m ==> n * (m div n) = (m::nat)"
   920 lemma dvd_mult_div_cancel: "n dvd m ==> n * (m div n) = (m::nat)"
   917   apply (subgoal_tac "m mod n = 0")
   921   apply (subgoal_tac "m mod n = 0")
   918    apply (simp add: mult_div_cancel)
   922    apply (simp add: mult_div_cancel)
   919   apply (simp only: dvd_eq_mod_eq_0)
   923   apply (simp only: dvd_eq_mod_eq_0)
  1146     qed
  1150     qed
  1147   qed
  1151   qed
  1148   with j show ?thesis by blast
  1152   with j show ?thesis by blast
  1149 qed
  1153 qed
  1150 
  1154 
  1151 lemma nat_dvd_not_less:
       
  1152   fixes m n :: nat
       
  1153   shows "0 < m \<Longrightarrow> m < n \<Longrightarrow> \<not> n dvd m"
       
  1154 by (auto elim!: dvdE) (auto simp add: gr0_conv_Suc)
       
  1155 
       
  1156 end
  1155 end