author | Manuel Eberl <eberlm@in.tum.de> |
Wed, 23 Apr 2025 17:32:06 +0200 | |
changeset 82543 | d96623e4defe |
parent 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 |
|
81142 | 109 |
definition rcong :: "real \<Rightarrow> real \<Rightarrow> real \<Rightarrow> bool" |
110 |
(\<open>(\<open>indent=1 notation=\<open>mixfix rcong\<close>\<close>[_ = _] '(' rmod _'))\<close>) |
|
111 |
where "[x = y] (rmod m) \<longleftrightarrow> x rmod m = y rmod m" |
|
79936
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
112 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
113 |
named_theorems rcong_intros |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
114 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
115 |
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
|
116 |
by (simp add: rcong_def) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
117 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
118 |
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
|
119 |
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
|
120 |
by (simp_all add: rcong_def) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
121 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
122 |
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
|
123 |
by (simp add: rcong_def) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
124 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
125 |
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
|
126 |
by (simp add: rcong_def) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
127 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
128 |
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
|
129 |
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
|
130 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
131 |
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
|
132 |
by (simp add: rcong_def) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
133 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
134 |
lemma rcong_add [rcong_intros]: |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
135 |
"[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
|
136 |
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
|
137 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
138 |
lemma rcong_diff [rcong_intros]: |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
139 |
"[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
|
140 |
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
|
141 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
142 |
lemma rcong_uminus [rcong_intros]: |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
143 |
"[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
|
144 |
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
|
145 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
146 |
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
|
147 |
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
|
148 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
149 |
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
|
150 |
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
|
151 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
152 |
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
|
153 |
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
|
154 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
155 |
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
|
156 |
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
|
157 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
158 |
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
|
159 |
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
|
160 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
161 |
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
|
162 |
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
|
163 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
164 |
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
|
165 |
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
|
166 |
by (simp_all add: rcong_def) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
167 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
168 |
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
|
169 |
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
|
170 |
by simp_all |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
171 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
172 |
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
|
173 |
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
|
174 |
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
|
175 |
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
|
176 |
by (simp_all add: rcong_def) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
177 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
178 |
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
|
179 |
proof (cases "m = 0") |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
180 |
case False |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
181 |
show ?thesis |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
182 |
proof |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
183 |
assume "[a = b] (rmod m)" |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
184 |
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
|
185 |
by (intro rcong_intros) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
186 |
hence "(a - b) rmod m = 0" |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
187 |
by (simp add: rcong_def) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
188 |
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
|
189 |
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
|
190 |
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
|
191 |
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
|
192 |
next |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
193 |
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
|
194 |
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
|
195 |
by auto |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
196 |
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
|
197 |
by (intro rcong_intros) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
198 |
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
|
199 |
by simp |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
200 |
qed |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
201 |
qed auto |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
202 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
203 |
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
|
204 |
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
|
205 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
206 |
lemma rcong_imp_eq: |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
207 |
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
|
208 |
shows "x = y" |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
209 |
proof - |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
210 |
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
|
211 |
unfolding rcong_altdef by blast |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
212 |
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
|
213 |
by (simp add: n abs_mult) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
214 |
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
|
215 |
using assms(2) by simp |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
216 |
finally have "n = 0" |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
217 |
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
|
218 |
with n show ?thesis |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
219 |
by simp |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
220 |
qed |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
221 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
222 |
lemma rcong_mult_modulus: |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
223 |
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
|
224 |
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
|
225 |
proof - |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
226 |
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
|
227 |
by (auto simp: rcong_altdef) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
228 |
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
|
229 |
by (simp only: k) |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
230 |
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
|
231 |
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
|
232 |
finally show ?thesis |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
233 |
unfolding rcong_altdef by blast |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
234 |
qed |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
235 |
|
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
236 |
lemma rcong_divide_modulus: |
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
237 |
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
|
238 |
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
|
239 |
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
|
240 |
|
82543
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
241 |
lemma sin_rmod [simp]: "sin (x rmod (2*pi)) = sin x" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
242 |
and cos_rmod [simp]: "cos (x rmod (2*pi)) = cos x" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
243 |
by (simp_all add: rmod_def sin_diff cos_diff) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
244 |
|
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
245 |
lemma tan_rmod [simp]: "tan (x rmod (2*pi)) = tan x" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
246 |
and cot_rmod [simp]: "cot (x rmod (2*pi)) = cot x" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
247 |
and cis_rmod [simp]: "cis (x rmod (2*pi)) = cis x" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
248 |
and rcis_rmod [simp]: "rcis r (x rmod (2*pi)) = rcis r x" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
249 |
by (simp_all add: tan_def cot_def complex_eq_iff) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
250 |
|
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
251 |
lemma cis_eq_iff: "cis a = cis b \<longleftrightarrow> [a = b] (rmod (2 * pi))" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
252 |
proof - |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
253 |
have "cis a = cis b \<longleftrightarrow> sin a = sin b \<and> cos a = cos b" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
254 |
by (auto simp: complex_eq_iff) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
255 |
also have "\<dots> \<longleftrightarrow> (\<exists>x. a = b + 2 * pi * real_of_int x)" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
256 |
by (rule sin_cos_eq_iff) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
257 |
also have "\<dots> \<longleftrightarrow> [b = a] (rmod (2 * pi))" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
258 |
by (simp add: rcong_altdef mult_ac) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
259 |
finally show ?thesis |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
260 |
by (simp add: rcong_sym_iff) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
261 |
qed |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
262 |
|
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
263 |
lemma cis_eq_1_iff: "cis a = 1 \<longleftrightarrow> (\<exists>n. a = of_int n * (2 * pi))" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
264 |
proof - |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
265 |
have "cis 0 = cis a \<longleftrightarrow> [0 = a] (rmod (2 * pi))" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
266 |
by (rule cis_eq_iff) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
267 |
also have "\<dots> \<longleftrightarrow> (\<exists>n. a = of_int n * (2 * pi))" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
268 |
unfolding rcong_altdef by simp |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
269 |
finally show ?thesis |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
270 |
by simp |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
271 |
qed |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
272 |
|
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
273 |
lemma cis_cong: |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
274 |
assumes "[a = b] (rmod 2 * pi)" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
275 |
shows "cis a = cis b" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
276 |
using cis_eq_iff assms by blast |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
277 |
|
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
278 |
lemma rcis_cong: |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
279 |
assumes "[a = b] (rmod 2 * pi)" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
280 |
shows "rcis r a = rcis r b" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
281 |
using assms by (auto simp: rcis_def intro!: cis_cong) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
282 |
|
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
283 |
lemma sin_rcong: "[x = y] (rmod (2 * pi)) \<Longrightarrow> sin x = sin y" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
284 |
and cos_rcong: "[x = y] (rmod (2 * pi)) \<Longrightarrow> cos x = cos y" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
285 |
using cis_cong[of x y] by (simp_all add: complex_eq_iff) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
286 |
|
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
287 |
lemma sin_eq_sin_conv_rmod: |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
288 |
assumes "sin x = sin y" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
289 |
shows "[x = y] (rmod 2 * pi) \<or> [x = pi - y] (rmod 2 * pi)" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
290 |
proof - |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
291 |
have "0 = sin y - sin x" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
292 |
using assms by simp |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
293 |
hence "sin ((y - x) / 2) = 0 \<or> cos ((y + x) / 2) = 0" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
294 |
unfolding sin_diff_sin by simp |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
295 |
hence "(\<exists>i. y = x + real_of_int i * (2 * pi)) \<or> |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
296 |
(\<exists>i. pi - y = x + real_of_int (-i) * (2 * pi))" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
297 |
unfolding sin_zero_iff_int2 cos_zero_iff_int2 |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
298 |
by (auto simp: algebra_simps) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
299 |
thus ?thesis |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
300 |
unfolding rcong_altdef by blast |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
301 |
qed |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
302 |
|
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
303 |
lemma cos_eq_cos_conv_rmod: |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
304 |
assumes "cos x = cos y" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
305 |
shows "[x = y] (rmod 2 * pi) \<or> [x = -y] (rmod 2 * pi)" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
306 |
proof - |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
307 |
have "0 = cos y - cos x" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
308 |
using assms by simp |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
309 |
hence "sin ((y + x) / 2) = 0 \<or> sin ((x - y) / 2) = 0" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
310 |
unfolding cos_diff_cos by simp |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
311 |
hence "(\<exists>i. -y = x + real_of_int (-i) * (2 * pi)) \<or> |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
312 |
(\<exists>i. y = x + real_of_int (-i) * (2 * pi))" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
313 |
unfolding sin_zero_iff_int2 |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
314 |
by (auto simp: algebra_simps) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
315 |
thus ?thesis |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
316 |
unfolding rcong_altdef by blast |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
317 |
qed |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
318 |
|
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
319 |
lemma sin_eq_sin_conv_rmod_iff: |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
320 |
"sin x = sin y \<longleftrightarrow> [x = y] (rmod 2 * pi) \<or> [x = pi - y] (rmod 2 * pi)" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
321 |
by (metis sin_eq_sin_conv_rmod sin_pi_minus sin_rcong) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
322 |
|
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
323 |
lemma cos_eq_cos_conv_rmod_iff: |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
324 |
"cos x = cos y \<longleftrightarrow> [x = y] (rmod 2 * pi) \<or> [x = -y] (rmod 2 * pi)" |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
325 |
by (metis cos_eq_cos_conv_rmod cos_minus cos_rcong) |
d96623e4defe
injectivity results about sin, cos, cis
Manuel Eberl <eberlm@in.tum.de>
parents:
81142
diff
changeset
|
326 |
|
79936
eb753708e85b
HOL-Library: added modulo/congruence for real numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
327 |
end |