| author | wenzelm | 
| Wed, 28 Aug 2024 19:40:07 +0200 | |
| changeset 80784 | 3d9e7746d9db | 
| parent 80061 | 4c1347e172b1 | 
| child 80914 | d97fdabd9e2b | 
| permissions | -rw-r--r-- | 
| 79936 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 1 | (* | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 2 | File: HOL/Library/Real_Mod.thy | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 3 | Authors: Manuel Eberl, University of Innsbruck | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 4 | *) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 5 | section \<open>Modulo and congruence on the reals\<close> | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 6 | theory Real_Mod | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 7 | imports Complex_Main | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 8 | begin | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 9 | |
| 80061 
4c1347e172b1
moved over material from AFP; most importantly on algebraic numbers and algebraically closed fields
 Manuel Eberl <eberlm@in.tum.de> parents: 
79936diff
changeset | 10 | (* MOVED TO HOL-Library ON 20.03.2024 *) | 
| 
4c1347e172b1
moved over material from AFP; most importantly on algebraic numbers and algebraically closed fields
 Manuel Eberl <eberlm@in.tum.de> parents: 
79936diff
changeset | 11 | |
| 79936 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 12 | definition rmod :: "real \<Rightarrow> real \<Rightarrow> real" (infixl "rmod" 70) where | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 13 | "x rmod y = x - \<bar>y\<bar> * of_int \<lfloor>x / \<bar>y\<bar>\<rfloor>" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 14 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 15 | lemma rmod_conv_frac: "y \<noteq> 0 \<Longrightarrow> x rmod y = frac (x / \<bar>y\<bar>) * \<bar>y\<bar>" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 16 | by (simp add: rmod_def frac_def algebra_simps) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 17 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 18 | lemma rmod_conv_frac': "x rmod y = (if y = 0 then x else frac (x / \<bar>y\<bar>) * \<bar>y\<bar>)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 19 | by (simp add: rmod_def frac_def algebra_simps) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 20 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 21 | lemma rmod_rmod [simp]: "(x rmod y) rmod y = x rmod y" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 22 | by (simp add: rmod_conv_frac') | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 23 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 24 | lemma rmod_0_right [simp]: "x rmod 0 = x" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 25 | by (simp add: rmod_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 26 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 27 | lemma rmod_less: "m > 0 \<Longrightarrow> x rmod m < m" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 28 | by (simp add: rmod_conv_frac' frac_lt_1) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 29 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 30 | lemma rmod_less_abs: "m \<noteq> 0 \<Longrightarrow> x rmod m < \<bar>m\<bar>" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 31 | by (simp add: rmod_conv_frac' frac_lt_1) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 32 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 33 | lemma rmod_le: "m > 0 \<Longrightarrow> x rmod m \<le> m" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 34 | by (intro less_imp_le rmod_less) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 35 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 36 | lemma rmod_nonneg: "m \<noteq> 0 \<Longrightarrow> x rmod m \<ge> 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 37 | unfolding rmod_def | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 38 | by (metis abs_le_zero_iff diff_ge_0_iff_ge floor_divide_lower linorder_not_le mult.commute) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 39 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 40 | lemma rmod_unique: | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 41 |   assumes "z \<in> {0..<\<bar>y\<bar>}" "x = z + of_int n * y"
 | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 42 | shows "x rmod y = z" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 43 | proof - | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 44 | have "(x - z) / y = of_int n" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 45 | using assms by auto | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 46 | hence "(x - z) / \<bar>y\<bar> = of_int ((if y > 0 then 1 else -1) * n)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 47 | using assms(1) by (cases y "0 :: real" rule: linorder_cases) (auto split: if_splits) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 48 | also have "\<dots> \<in> \<int>" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 49 | by auto | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 50 | finally have "frac (x / \<bar>y\<bar>) = z / \<bar>y\<bar>" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 51 | using assms(1) by (subst frac_unique_iff) (auto simp: field_simps) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 52 | thus ?thesis | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 53 | using assms(1) by (auto simp: rmod_conv_frac') | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 54 | qed | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 55 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 56 | lemma rmod_0 [simp]: "0 rmod z = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 57 | by (simp add: rmod_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 58 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 59 | lemma rmod_add: "(x rmod z + y rmod z) rmod z = (x + y) rmod z" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 60 | proof (cases "z = 0") | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 61 | case [simp]: False | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 62 | show ?thesis | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 63 | proof (rule sym, rule rmod_unique) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 64 | define n where "n = (if z > 0 then 1 else -1) * (\<lfloor>x / \<bar>z\<bar>\<rfloor> + \<lfloor>y / \<bar>z\<bar>\<rfloor> + | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 65 | \<lfloor>(x + y - (\<bar>z\<bar> * real_of_int \<lfloor>x / \<bar>z\<bar>\<rfloor> + \<bar>z\<bar> * real_of_int \<lfloor>y / \<bar>z\<bar>\<rfloor>)) / \<bar>z\<bar>\<rfloor>)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 66 | show "x + y = (x rmod z + y rmod z) rmod z + real_of_int n * z" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 67 | by (simp add: rmod_def algebra_simps n_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 68 | qed (auto simp: rmod_less_abs rmod_nonneg) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 69 | qed auto | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 70 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 71 | lemma rmod_diff: "(x rmod z - y rmod z) rmod z = (x - y) rmod z" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 72 | proof (cases "z = 0") | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 73 | case [simp]: False | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 74 | show ?thesis | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 75 | proof (rule sym, rule rmod_unique) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 76 | define n where "n = (if z > 0 then 1 else -1) * (\<lfloor>x / \<bar>z\<bar>\<rfloor> + | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 77 | \<lfloor>(x + \<bar>z\<bar> * real_of_int \<lfloor>y / \<bar>z\<bar>\<rfloor> - (y + \<bar>z\<bar> * real_of_int \<lfloor>x / \<bar>z\<bar>\<rfloor>)) / \<bar>z\<bar>\<rfloor> - \<lfloor>y / \<bar>z\<bar>\<rfloor>)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 78 | show "x - y = (x rmod z - y rmod z) rmod z + real_of_int n * z" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 79 | by (simp add: rmod_def algebra_simps n_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 80 | qed (auto simp: rmod_less_abs rmod_nonneg) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 81 | qed auto | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 82 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 83 | lemma rmod_self [simp]: "x rmod x = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 84 | by (cases x "0 :: real" rule: linorder_cases) (auto simp: rmod_conv_frac) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 85 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 86 | lemma rmod_self_multiple_int [simp]: "(of_int n * x) rmod x = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 87 | by (cases x "0 :: real" rule: linorder_cases) (auto simp: rmod_conv_frac) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 88 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 89 | lemma rmod_self_multiple_nat [simp]: "(of_nat n * x) rmod x = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 90 | by (cases x "0 :: real" rule: linorder_cases) (auto simp: rmod_conv_frac) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 91 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 92 | lemma rmod_self_multiple_numeral [simp]: "(numeral n * x) rmod x = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 93 | by (cases x "0 :: real" rule: linorder_cases) (auto simp: rmod_conv_frac) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 94 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 95 | lemma rmod_self_multiple_int' [simp]: "(x * of_int n) rmod x = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 96 | by (cases x "0 :: real" rule: linorder_cases) (auto simp: rmod_conv_frac) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 97 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 98 | lemma rmod_self_multiple_nat' [simp]: "(x * of_nat n) rmod x = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 99 | by (cases x "0 :: real" rule: linorder_cases) (auto simp: rmod_conv_frac) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 100 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 101 | lemma rmod_self_multiple_numeral' [simp]: "(x * numeral n) rmod x = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 102 | by (cases x "0 :: real" rule: linorder_cases) (auto simp: rmod_conv_frac) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 103 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 104 | lemma rmod_idem [simp]: "x \<in> {0..<\<bar>y\<bar>} \<Longrightarrow> x rmod y = x"
 | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 105 | by (rule rmod_unique[of _ _ _ 0]) auto | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 106 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 107 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 108 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 109 | definition rcong :: "real \<Rightarrow> real \<Rightarrow> real \<Rightarrow> bool" (\<open>(1[_ = _] '(' rmod _'))\<close>) where
 | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 110 | "[x = y] (rmod m) \<longleftrightarrow> x rmod m = y rmod m" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 111 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 112 | named_theorems rcong_intros | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 113 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 114 | lemma rcong_0_right [simp]: "[x = y] (rmod 0) \<longleftrightarrow> x = y" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 115 | by (simp add: rcong_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 116 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 117 | lemma rcong_0_iff: "[x = 0] (rmod m) \<longleftrightarrow> x rmod m = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 118 | and rcong_0_iff': "[0 = x] (rmod m) \<longleftrightarrow> x rmod m = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 119 | by (simp_all add: rcong_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 120 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 121 | lemma rcong_refl [simp, intro!, rcong_intros]: "[x = x] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 122 | by (simp add: rcong_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 123 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 124 | lemma rcong_sym: "[y = x] (rmod m) \<Longrightarrow> [x = y] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 125 | by (simp add: rcong_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 126 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 127 | lemma rcong_sym_iff: "[y = x] (rmod m) \<longleftrightarrow> [x = y] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 128 | unfolding rcong_def by (simp add: eq_commute del: rmod_idem) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 129 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 130 | lemma rcong_trans [trans]: "[x = y] (rmod m) \<Longrightarrow> [y = z] (rmod m) \<Longrightarrow> [x = z] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 131 | by (simp add: rcong_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 132 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 133 | lemma rcong_add [rcong_intros]: | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 134 | "[a = b] (rmod m) \<Longrightarrow> [c = d] (rmod m) \<Longrightarrow> [a + c = b + d] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 135 | unfolding rcong_def using rmod_add by metis | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 136 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 137 | lemma rcong_diff [rcong_intros]: | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 138 | "[a = b] (rmod m) \<Longrightarrow> [c = d] (rmod m) \<Longrightarrow> [a - c = b - d] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 139 | unfolding rcong_def using rmod_diff by metis | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 140 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 141 | lemma rcong_uminus [rcong_intros]: | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 142 | "[a = b] (rmod m) \<Longrightarrow> [-a = -b] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 143 | using rcong_diff[of 0 0 m a b] by simp | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 144 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 145 | lemma rcong_uminus_uminus_iff [simp]: "[-x = -y] (rmod m) \<longleftrightarrow> [x = y] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 146 | using rcong_uminus minus_minus by metis | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 147 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 148 | lemma rcong_uminus_left_iff: "[-x = y] (rmod m) \<longleftrightarrow> [x = -y] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 149 | using rcong_uminus minus_minus by metis | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 150 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 151 | lemma rcong_add_right_cancel [simp]: "[a + c = b + c] (rmod m) \<longleftrightarrow> [a = b] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 152 | using rcong_add[of a b m c c] rcong_add[of "a + c" "b + c" m "-c" "-c"] by auto | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 153 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 154 | lemma rcong_add_left_cancel [simp]: "[c + a = c + b] (rmod m) \<longleftrightarrow> [a = b] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 155 | by (subst (1 2) add.commute) simp | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 156 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 157 | lemma rcong_diff_right_cancel [simp]: "[a - c = b - c] (rmod m) \<longleftrightarrow> [a = b] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 158 | by (metis rcong_add_left_cancel uminus_add_conv_diff) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 159 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 160 | lemma rcong_diff_left_cancel [simp]: "[c - a = c - b] (rmod m) \<longleftrightarrow> [a = b] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 161 | by (metis minus_diff_eq rcong_diff_right_cancel rcong_uminus_uminus_iff) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 162 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 163 | lemma rcong_rmod_right_iff [simp]: "[a = (b rmod m)] (rmod m) \<longleftrightarrow> [a = b] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 164 | and rcong_rmod_left_iff [simp]: "[(a rmod m) = b] (rmod m) \<longleftrightarrow> [a = b] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 165 | by (simp_all add: rcong_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 166 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 167 | lemma rcong_rmod_left [rcong_intros]: "[a = b] (rmod m) \<Longrightarrow> [(a rmod m) = b] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 168 | and rcong_rmod_right [rcong_intros]: "[a = b] (rmod m) \<Longrightarrow> [a = (b rmod m)] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 169 | by simp_all | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 170 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 171 | lemma rcong_mult_of_int_0_left_left [rcong_intros]: "[0 = of_int n * m] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 172 | and rcong_mult_of_int_0_right_left [rcong_intros]: "[0 = m * of_int n] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 173 | and rcong_mult_of_int_0_left_right [rcong_intros]: "[of_int n * m = 0] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 174 | and rcong_mult_of_int_0_right_right [rcong_intros]: "[m * of_int n = 0] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 175 | by (simp_all add: rcong_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 176 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 177 | lemma rcong_altdef: "[a = b] (rmod m) \<longleftrightarrow> (\<exists>n. b = a + of_int n * m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 178 | proof (cases "m = 0") | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 179 | case False | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 180 | show ?thesis | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 181 | proof | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 182 | assume "[a = b] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 183 | hence "[a - b = b - b] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 184 | by (intro rcong_intros) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 185 | hence "(a - b) rmod m = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 186 | by (simp add: rcong_def) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 187 | then obtain n where "of_int n = (a - b) / \<bar>m\<bar>" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 188 | using False by (auto simp: rmod_conv_frac elim!: Ints_cases) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 189 | thus "\<exists>n. b = a + of_int n * m" using False | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 190 | by (intro exI[of _ "if m > 0 then -n else n"]) (auto simp: field_simps) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 191 | next | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 192 | assume "\<exists>n. b = a + of_int n * m" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 193 | then obtain n where n: "b = a + of_int n * m" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 194 | by auto | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 195 | have "[a + 0 = a + of_int n * m] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 196 | by (intro rcong_intros) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 197 | with n show "[a = b] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 198 | by simp | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 199 | qed | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 200 | qed auto | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 201 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 202 | lemma rcong_conv_diff_rmod_eq_0: "[x = y] (rmod m) \<longleftrightarrow> (x - y) rmod m = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 203 | by (metis cancel_comm_monoid_add_class.diff_cancel rcong_0_iff rcong_diff_right_cancel) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 204 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 205 | lemma rcong_imp_eq: | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 206 | assumes "[x = y] (rmod m)" "\<bar>x - y\<bar> < \<bar>m\<bar>" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 207 | shows "x = y" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 208 | proof - | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 209 | from assms obtain n where n: "y = x + of_int n * m" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 210 | unfolding rcong_altdef by blast | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 211 | have "of_int \<bar>n\<bar> * \<bar>m\<bar> = \<bar>x - y\<bar>" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 212 | by (simp add: n abs_mult) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 213 | also have "\<dots> < 1 * \<bar>m\<bar>" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 214 | using assms(2) by simp | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 215 | finally have "n = 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 216 | by (subst (asm) mult_less_cancel_right) auto | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 217 | with n show ?thesis | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 218 | by simp | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 219 | qed | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 220 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 221 | lemma rcong_mult_modulus: | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 222 | assumes "[a = b] (rmod (m / c))" "c \<noteq> 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 223 | shows "[a * c = b * c] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 224 | proof - | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 225 | from assms obtain k where k: "b = a + of_int k * (m / c)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 226 | by (auto simp: rcong_altdef) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 227 | have "b * c = (a + of_int k * (m / c)) * c" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 228 | by (simp only: k) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 229 | also have "\<dots> = a * c + of_int k * m" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 230 | using assms(2) by (auto simp: divide_simps) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 231 | finally show ?thesis | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 232 | unfolding rcong_altdef by blast | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 233 | qed | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 234 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 235 | lemma rcong_divide_modulus: | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 236 | assumes "[a = b] (rmod (m * c))" "c \<noteq> 0" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 237 | shows "[a / c = b / c] (rmod m)" | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 238 | using rcong_mult_modulus[of a b m "1 / c"] assms by (auto simp: field_simps) | 
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 239 | |
| 
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
 Manuel Eberl <eberlm@in.tum.de> parents: diff
changeset | 240 | end |