| author | wenzelm | 
| Sat, 10 Aug 2024 12:12:53 +0200 | |
| changeset 80678 | c5c9b4470d06 | 
| 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: 
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  | 
|
| 
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  |