author | wenzelm |
Fri, 20 Sep 2024 19:51:08 +0200 | |
changeset 80914 | d97fdabd9e2b |
parent 80061 | 4c1347e172b1 |
child 81142 | 6ad2c917dd2e |
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:
79936
diff
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:
79936
diff
changeset
|
11 |
|
80914
d97fdabd9e2b
standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents:
80061
diff
changeset
|
12 |
definition rmod :: "real \<Rightarrow> real \<Rightarrow> real" (infixl \<open>rmod\<close> 70) where |
79936
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 |