equal
deleted
inserted
replaced
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 |