author | haftmann |
Thu, 16 Oct 2014 19:26:13 +0200 | |
changeset 58687 | 5469874b0228 |
parent 58681 | a478a0742a8e |
child 58688 | ddd124805260 |
permissions | -rw-r--r-- |
41959 | 1 |
(* Title: HOL/Parity.thy |
2 |
Author: Jeremy Avigad |
|
3 |
Author: Jacques D. Fleuriot |
|
21256 | 4 |
*) |
5 |
||
6 |
header {* Even and Odd for int and nat *} |
|
7 |
||
8 |
theory Parity |
|
30738 | 9 |
imports Main |
21256 | 10 |
begin |
11 |
||
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
12 |
subsection {* Preliminaries about divisibility on @{typ nat} and @{typ int} *} |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
13 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
14 |
lemma two_dvd_Suc_Suc_iff [simp]: |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
15 |
"2 dvd Suc (Suc n) \<longleftrightarrow> 2 dvd n" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
16 |
using dvd_add_triv_right_iff [of 2 n] by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
17 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
18 |
lemma two_dvd_Suc_iff: |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
19 |
"2 dvd Suc n \<longleftrightarrow> \<not> 2 dvd n" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
20 |
by (induct n) auto |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
21 |
|
58687 | 22 |
lemma two_dvd_diff_nat_iff: |
23 |
fixes m n :: nat |
|
24 |
shows "2 dvd m - n \<longleftrightarrow> m < n \<or> 2 dvd m + n" |
|
25 |
proof (cases "n \<le> m") |
|
26 |
case True |
|
27 |
then have "m - n + n * 2 = m + n" by simp |
|
28 |
moreover have "2 dvd m - n \<longleftrightarrow> 2 dvd m - n + n * 2" by simp |
|
29 |
ultimately have "2 dvd m - n \<longleftrightarrow> 2 dvd m + n" by (simp only:) |
|
30 |
then show ?thesis by auto |
|
31 |
next |
|
32 |
case False |
|
33 |
then show ?thesis by simp |
|
34 |
qed |
|
35 |
||
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
36 |
lemma two_dvd_diff_iff: |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
37 |
fixes k l :: int |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
38 |
shows "2 dvd k - l \<longleftrightarrow> 2 dvd k + l" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
39 |
using dvd_add_times_triv_right_iff [of 2 "k - l" l] by (simp add: ac_simps) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
40 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
41 |
lemma two_dvd_abs_add_iff: |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
42 |
fixes k l :: int |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
43 |
shows "2 dvd \<bar>k\<bar> + l \<longleftrightarrow> 2 dvd k + l" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
44 |
by (cases "k \<ge> 0") (simp_all add: two_dvd_diff_iff ac_simps) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
45 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
46 |
lemma two_dvd_add_abs_iff: |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
47 |
fixes k l :: int |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
48 |
shows "2 dvd k + \<bar>l\<bar> \<longleftrightarrow> 2 dvd k + l" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
49 |
using two_dvd_abs_add_iff [of l k] by (simp add: ac_simps) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
50 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
51 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
52 |
subsection {* Ring structures with parity *} |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
53 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
54 |
class semiring_parity = semiring_dvd + semiring_numeral + |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
55 |
assumes two_not_dvd_one [simp]: "\<not> 2 dvd 1" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
56 |
assumes not_dvd_not_dvd_dvd_add: "\<not> 2 dvd a \<Longrightarrow> \<not> 2 dvd b \<Longrightarrow> 2 dvd a + b" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
57 |
assumes two_is_prime: "2 dvd a * b \<Longrightarrow> 2 dvd a \<or> 2 dvd b" |
58680 | 58 |
assumes not_dvd_ex_decrement: "\<not> 2 dvd a \<Longrightarrow> \<exists>b. a = b + 1" |
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
59 |
begin |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
60 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
61 |
lemma two_dvd_plus_one_iff [simp]: |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
62 |
"2 dvd a + 1 \<longleftrightarrow> \<not> 2 dvd a" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
63 |
by (auto simp add: dvd_add_right_iff intro: not_dvd_not_dvd_dvd_add) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
64 |
|
58680 | 65 |
lemma not_two_dvdE [elim?]: |
66 |
assumes "\<not> 2 dvd a" |
|
67 |
obtains b where "a = 2 * b + 1" |
|
68 |
proof - |
|
69 |
from assms obtain b where *: "a = b + 1" |
|
70 |
by (blast dest: not_dvd_ex_decrement) |
|
71 |
with assms have "2 dvd b + 2" by simp |
|
72 |
then have "2 dvd b" by simp |
|
73 |
then obtain c where "b = 2 * c" .. |
|
74 |
with * have "a = 2 * c + 1" by simp |
|
75 |
with that show thesis . |
|
76 |
qed |
|
77 |
||
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
78 |
end |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
79 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
80 |
instance nat :: semiring_parity |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
81 |
proof |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
82 |
show "\<not> (2 :: nat) dvd 1" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
83 |
by (rule notI, erule dvdE) simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
84 |
next |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
85 |
fix m n :: nat |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
86 |
assume "\<not> 2 dvd m" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
87 |
moreover assume "\<not> 2 dvd n" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
88 |
ultimately have *: "2 dvd Suc m \<and> 2 dvd Suc n" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
89 |
by (simp add: two_dvd_Suc_iff) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
90 |
then have "2 dvd Suc m + Suc n" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
91 |
by (blast intro: dvd_add) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
92 |
also have "Suc m + Suc n = m + n + 2" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
93 |
by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
94 |
finally show "2 dvd m + n" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
95 |
using dvd_add_triv_right_iff [of 2 "m + n"] by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
96 |
next |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
97 |
fix m n :: nat |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
98 |
assume *: "2 dvd m * n" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
99 |
show "2 dvd m \<or> 2 dvd n" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
100 |
proof (rule disjCI) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
101 |
assume "\<not> 2 dvd n" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
102 |
then have "2 dvd Suc n" by (simp add: two_dvd_Suc_iff) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
103 |
then obtain r where "Suc n = 2 * r" .. |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
104 |
moreover from * obtain s where "m * n = 2 * s" .. |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
105 |
then have "2 * s + m = m * Suc n" by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
106 |
ultimately have " 2 * s + m = 2 * (m * r)" by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
107 |
then have "m = 2 * (m * r - s)" by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
108 |
then show "2 dvd m" .. |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
109 |
qed |
58680 | 110 |
next |
111 |
fix n :: nat |
|
112 |
assume "\<not> 2 dvd n" |
|
113 |
then show "\<exists>m. n = m + 1" |
|
114 |
by (cases n) simp_all |
|
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
115 |
qed |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
116 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
117 |
class ring_parity = comm_ring_1 + semiring_parity |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
118 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
119 |
instance int :: ring_parity |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
120 |
proof |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
121 |
show "\<not> (2 :: int) dvd 1" by (simp add: dvd_int_unfold_dvd_nat) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
122 |
fix k l :: int |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
123 |
assume "\<not> 2 dvd k" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
124 |
moreover assume "\<not> 2 dvd l" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
125 |
ultimately have "2 dvd nat \<bar>k\<bar> + nat \<bar>l\<bar>" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
126 |
by (auto simp add: dvd_int_unfold_dvd_nat intro: not_dvd_not_dvd_dvd_add) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
127 |
then have "2 dvd \<bar>k\<bar> + \<bar>l\<bar>" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
128 |
by (simp add: dvd_int_unfold_dvd_nat nat_add_distrib) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
129 |
then show "2 dvd k + l" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
130 |
by (simp add: two_dvd_abs_add_iff two_dvd_add_abs_iff) |
58680 | 131 |
next |
132 |
fix k l :: int |
|
133 |
assume "2 dvd k * l" |
|
134 |
then show "2 dvd k \<or> 2 dvd l" |
|
135 |
by (simp add: dvd_int_unfold_dvd_nat two_is_prime nat_abs_mult_distrib) |
|
136 |
next |
|
137 |
fix k :: int |
|
138 |
have "k = (k - 1) + 1" by simp |
|
139 |
then show "\<exists>l. k = l + 1" .. |
|
140 |
qed |
|
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
141 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
142 |
context semiring_div_parity |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
143 |
begin |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
144 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
145 |
subclass semiring_parity |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
146 |
proof (unfold_locales, unfold dvd_eq_mod_eq_0 not_mod_2_eq_0_eq_1) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
147 |
fix a b c |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
148 |
show "(c * a + b) mod a = 0 \<longleftrightarrow> b mod a = 0" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
149 |
by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
150 |
next |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
151 |
fix a b c |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
152 |
assume "(b + c) mod a = 0" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
153 |
with mod_add_eq [of b c a] |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
154 |
have "(b mod a + c mod a) mod a = 0" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
155 |
by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
156 |
moreover assume "b mod a = 0" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
157 |
ultimately show "c mod a = 0" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
158 |
by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
159 |
next |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
160 |
show "1 mod 2 = 1" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
161 |
by (fact one_mod_two_eq_one) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
162 |
next |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
163 |
fix a b |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
164 |
assume "a mod 2 = 1" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
165 |
moreover assume "b mod 2 = 1" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
166 |
ultimately show "(a + b) mod 2 = 0" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
167 |
using mod_add_eq [of a b 2] by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
168 |
next |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
169 |
fix a b |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
170 |
assume "(a * b) mod 2 = 0" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
171 |
then have "(a mod 2) * (b mod 2) = 0" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
172 |
by (cases "a mod 2 = 0") (simp_all add: mod_mult_eq [of a b 2]) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
173 |
then show "a mod 2 = 0 \<or> b mod 2 = 0" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
174 |
by (rule divisors_zero) |
58680 | 175 |
next |
176 |
fix a |
|
177 |
assume "a mod 2 = 1" |
|
178 |
then have "a = a div 2 * 2 + 1" using mod_div_equality [of a 2] by simp |
|
179 |
then show "\<exists>b. a = b + 1" .. |
|
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
180 |
qed |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
181 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
182 |
end |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
183 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
184 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
185 |
subsection {* Dedicated @{text even}/@{text odd} predicate *} |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
186 |
|
58680 | 187 |
subsubsection {* Properties *} |
188 |
||
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
189 |
context semiring_parity |
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
190 |
begin |
21256 | 191 |
|
54228 | 192 |
definition even :: "'a \<Rightarrow> bool" |
193 |
where |
|
58645 | 194 |
[algebra]: "even a \<longleftrightarrow> 2 dvd a" |
54228 | 195 |
|
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
196 |
abbreviation odd :: "'a \<Rightarrow> bool" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
197 |
where |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
198 |
"odd a \<equiv> \<not> even a" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
199 |
|
58681 | 200 |
lemma oddE [elim?]: |
58680 | 201 |
assumes "odd a" |
202 |
obtains b where "a = 2 * b + 1" |
|
203 |
proof - |
|
204 |
from assms have "\<not> 2 dvd a" by (simp add: even_def) |
|
205 |
then show thesis using that by (rule not_two_dvdE) |
|
206 |
qed |
|
207 |
||
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
208 |
lemma even_times_iff [simp, presburger, algebra]: |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
209 |
"even (a * b) \<longleftrightarrow> even a \<or> even b" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
210 |
by (auto simp add: even_def dest: two_is_prime) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
211 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
212 |
lemma even_zero [simp]: |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
213 |
"even 0" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
214 |
by (simp add: even_def) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
215 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
216 |
lemma odd_one [simp]: |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
217 |
"odd 1" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
218 |
by (simp add: even_def) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
219 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
220 |
lemma even_numeral [simp]: |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
221 |
"even (numeral (Num.Bit0 n))" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
222 |
proof - |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
223 |
have "even (2 * numeral n)" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
224 |
unfolding even_times_iff by (simp add: even_def) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
225 |
then have "even (numeral n + numeral n)" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
226 |
unfolding mult_2 . |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
227 |
then show ?thesis |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
228 |
unfolding numeral.simps . |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
229 |
qed |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
230 |
|
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
231 |
lemma odd_numeral [simp]: |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
232 |
"odd (numeral (Num.Bit1 n))" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
233 |
proof |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
234 |
assume "even (numeral (num.Bit1 n))" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
235 |
then have "even (numeral n + numeral n + 1)" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
236 |
unfolding numeral.simps . |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
237 |
then have "even (2 * numeral n + 1)" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
238 |
unfolding mult_2 . |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
239 |
then have "2 dvd numeral n * 2 + 1" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
240 |
unfolding even_def by (simp add: ac_simps) |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
241 |
with dvd_add_times_triv_left_iff [of 2 "numeral n" 1] |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
242 |
have "2 dvd 1" |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
243 |
by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
244 |
then show False by simp |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
245 |
qed |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
246 |
|
58680 | 247 |
lemma even_add [simp]: |
248 |
"even (a + b) \<longleftrightarrow> (even a \<longleftrightarrow> even b)" |
|
249 |
by (auto simp add: even_def dvd_add_right_iff dvd_add_left_iff not_dvd_not_dvd_dvd_add) |
|
250 |
||
251 |
lemma odd_add [simp]: |
|
252 |
"odd (a + b) \<longleftrightarrow> (\<not> (odd a \<longleftrightarrow> odd b))" |
|
253 |
by simp |
|
254 |
||
255 |
lemma even_power [simp, presburger]: |
|
256 |
"even (a ^ n) \<longleftrightarrow> even a \<and> n \<noteq> 0" |
|
257 |
by (induct n) auto |
|
258 |
||
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
259 |
end |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
260 |
|
58679 | 261 |
context ring_parity |
262 |
begin |
|
263 |
||
264 |
lemma even_minus [simp, presburger, algebra]: |
|
265 |
"even (- a) \<longleftrightarrow> even a" |
|
266 |
by (simp add: even_def) |
|
267 |
||
58680 | 268 |
lemma even_diff [simp]: |
269 |
"even (a - b) \<longleftrightarrow> even (a + b)" |
|
270 |
using even_add [of a "- b"] by simp |
|
271 |
||
58679 | 272 |
end |
273 |
||
58678
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
274 |
context semiring_div_parity |
398e05aa84d4
purely algebraic characterization of even and odd
haftmann
parents:
58645
diff
changeset
|
275 |
begin |
58645 | 276 |
|
277 |
lemma even_iff_mod_2_eq_zero [presburger]: |
|
278 |
"even a \<longleftrightarrow> a mod 2 = 0" |
|
54228 | 279 |
by (simp add: even_def dvd_eq_mod_eq_0) |
280 |
||
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
281 |
end |
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
282 |
|
58680 | 283 |
|
58687 | 284 |
subsubsection {* Particularities for @{typ nat} and @{typ int} *} |
285 |
||
286 |
lemma even_Suc [simp, presburger, algebra]: |
|
287 |
"even (Suc n) = odd n" |
|
288 |
by (simp add: even_def two_dvd_Suc_iff) |
|
289 |
||
290 |
lemma even_diff_nat [simp]: |
|
291 |
fixes m n :: nat |
|
292 |
shows "even (m - n) \<longleftrightarrow> m < n \<or> even (m + n)" |
|
293 |
by (simp add: even_def two_dvd_diff_nat_iff) |
|
58680 | 294 |
|
58679 | 295 |
lemma even_int_iff: |
296 |
"even (int n) \<longleftrightarrow> even n" |
|
297 |
by (simp add: even_def dvd_int_iff) |
|
33318
ddd97d9dfbfb
moved Nat_Transfer before Divides; distributed Nat_Transfer setup accordingly
haftmann
parents:
31718
diff
changeset
|
298 |
|
58687 | 299 |
lemma even_nat_iff: |
300 |
"0 \<le> k \<Longrightarrow> even (nat k) \<longleftrightarrow> even k" |
|
301 |
by (simp add: even_int_iff [symmetric]) |
|
302 |
||
303 |
||
304 |
subsubsection {* Tools setup *} |
|
305 |
||
58679 | 306 |
declare transfer_morphism_int_nat [transfer add return: |
307 |
even_int_iff |
|
33318
ddd97d9dfbfb
moved Nat_Transfer before Divides; distributed Nat_Transfer setup accordingly
haftmann
parents:
31718
diff
changeset
|
308 |
] |
21256 | 309 |
|
58679 | 310 |
lemma [presburger]: |
311 |
"even n \<longleftrightarrow> even (int n)" |
|
312 |
using even_int_iff [of n] by simp |
|
25600 | 313 |
|
58687 | 314 |
lemma (in semiring_parity) [presburger]: |
58680 | 315 |
"even (a + b) \<longleftrightarrow> even a \<and> even b \<or> odd a \<and> odd b" |
316 |
by auto |
|
21256 | 317 |
|
58687 | 318 |
lemma [presburger, algebra]: |
319 |
fixes m n :: nat |
|
320 |
shows "even (m - n) \<longleftrightarrow> m < n \<or> even m \<and> even n \<or> odd m \<and> odd n" |
|
321 |
by auto |
|
322 |
||
323 |
lemma [presburger, algebra]: |
|
324 |
fixes m n :: nat |
|
325 |
shows "even (m ^ n) \<longleftrightarrow> even m \<and> 0 < n" |
|
326 |
by simp |
|
327 |
||
328 |
lemma [presburger]: |
|
329 |
fixes k :: int |
|
330 |
shows "(k + 1) div 2 = k div 2 \<longleftrightarrow> even k" |
|
331 |
by presburger |
|
332 |
||
333 |
lemma [presburger]: |
|
334 |
fixes k :: int |
|
335 |
shows "(k + 1) div 2 = k div 2 + 1 \<longleftrightarrow> odd k" |
|
336 |
by presburger |
|
337 |
||
338 |
lemma [presburger]: |
|
339 |
"Suc n div Suc (Suc 0) = n div Suc (Suc 0) \<longleftrightarrow> even n" |
|
340 |
by presburger |
|
341 |
||
21256 | 342 |
|
58680 | 343 |
subsubsection {* Legacy cruft *} |
344 |
||
345 |
||
346 |
subsubsection {* Equivalent definitions *} |
|
347 |
||
58687 | 348 |
lemma even_nat_mod_two_eq_zero: |
349 |
"even (x::nat) ==> x mod Suc (Suc 0) = 0" |
|
58680 | 350 |
by presburger |
21256 | 351 |
|
58687 | 352 |
lemma odd_nat_mod_two_eq_one: |
353 |
"odd (x::nat) ==> x mod Suc (Suc 0) = Suc 0" |
|
58680 | 354 |
by presburger |
21256 | 355 |
|
58687 | 356 |
lemma even_nat_equiv_def: |
357 |
"even (x::nat) = (x mod Suc (Suc 0) = 0)" |
|
58680 | 358 |
by presburger |
21256 | 359 |
|
58687 | 360 |
lemma odd_nat_equiv_def: |
361 |
"odd (x::nat) = (x mod Suc (Suc 0) = Suc 0)" |
|
362 |
by presburger |
|
21256 | 363 |
|
58687 | 364 |
lemma even_nat_div_two_times_two: |
365 |
"even (x::nat) ==> Suc (Suc 0) * (x div Suc (Suc 0)) = x" |
|
366 |
by presburger |
|
21256 | 367 |
|
58687 | 368 |
lemma odd_nat_div_two_times_two_plus_one: |
369 |
"odd (x::nat) ==> Suc (Suc (Suc 0) * (x div Suc (Suc 0))) = x" |
|
370 |
by presburger |
|
21256 | 371 |
|
25600 | 372 |
|
58680 | 373 |
subsubsection {* Parity and powers *} |
21256 | 374 |
|
54228 | 375 |
lemma (in comm_ring_1) neg_power_if: |
376 |
"(- a) ^ n = (if even n then (a ^ n) else - (a ^ n))" |
|
377 |
by (induct n) simp_all |
|
21256 | 378 |
|
54228 | 379 |
lemma (in comm_ring_1) |
54489
03ff4d1e6784
eliminiated neg_numeral in favour of - (numeral _)
haftmann
parents:
54228
diff
changeset
|
380 |
shows neg_one_even_power [simp]: "even n \<Longrightarrow> (- 1) ^ n = 1" |
03ff4d1e6784
eliminiated neg_numeral in favour of - (numeral _)
haftmann
parents:
54228
diff
changeset
|
381 |
and neg_one_odd_power [simp]: "odd n \<Longrightarrow> (- 1) ^ n = - 1" |
03ff4d1e6784
eliminiated neg_numeral in favour of - (numeral _)
haftmann
parents:
54228
diff
changeset
|
382 |
by (simp_all add: neg_power_if) |
21256 | 383 |
|
21263 | 384 |
lemma zero_le_even_power: "even n ==> |
35631
0b8a5fd339ab
generalize some lemmas from class linordered_ring_strict to linordered_ring
huffman
parents:
35216
diff
changeset
|
385 |
0 <= (x::'a::{linordered_ring,monoid_mult}) ^ n" |
58680 | 386 |
apply (simp add: even_def) |
387 |
apply (erule dvdE) |
|
21256 | 388 |
apply (erule ssubst) |
58680 | 389 |
unfolding mult.commute [of 2] |
390 |
unfolding power_mult power2_eq_square |
|
21256 | 391 |
apply (rule zero_le_square) |
392 |
done |
|
393 |
||
58681 | 394 |
lemma zero_le_odd_power: |
395 |
"odd n \<Longrightarrow> 0 \<le> (x::'a::{linordered_idom}) ^ n \<longleftrightarrow> 0 \<le> x" |
|
396 |
by (erule oddE) (auto simp: power_add zero_le_mult_iff mult_2 order_antisym_conv) |
|
21256 | 397 |
|
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
398 |
lemma zero_le_power_eq [presburger]: "(0 <= (x::'a::{linordered_idom}) ^ n) = |
21256 | 399 |
(even n | (odd n & 0 <= x))" |
400 |
apply auto |
|
21263 | 401 |
apply (subst zero_le_odd_power [symmetric]) |
21256 | 402 |
apply assumption+ |
403 |
apply (erule zero_le_even_power) |
|
21263 | 404 |
done |
21256 | 405 |
|
35028
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents:
33358
diff
changeset
|
406 |
lemma zero_less_power_eq[presburger]: "(0 < (x::'a::{linordered_idom}) ^ n) = |
21256 | 407 |
(n = 0 | (even n & x ~= 0) | (odd n & 0 < x))" |
27668 | 408 |
unfolding order_less_le zero_le_power_eq by auto |
21256 | 409 |
|
35028
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents:
33358
diff
changeset
|
410 |
lemma power_less_zero_eq[presburger]: "((x::'a::{linordered_idom}) ^ n < 0) = |
27668 | 411 |
(odd n & x < 0)" |
21263 | 412 |
apply (subst linorder_not_le [symmetric])+ |
21256 | 413 |
apply (subst zero_le_power_eq) |
414 |
apply auto |
|
21263 | 415 |
done |
21256 | 416 |
|
35028
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents:
33358
diff
changeset
|
417 |
lemma power_le_zero_eq[presburger]: "((x::'a::{linordered_idom}) ^ n <= 0) = |
21256 | 418 |
(n ~= 0 & ((odd n & x <= 0) | (even n & x = 0)))" |
21263 | 419 |
apply (subst linorder_not_less [symmetric])+ |
21256 | 420 |
apply (subst zero_less_power_eq) |
421 |
apply auto |
|
21263 | 422 |
done |
21256 | 423 |
|
21263 | 424 |
lemma power_even_abs: "even n ==> |
35028
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents:
33358
diff
changeset
|
425 |
(abs (x::'a::{linordered_idom}))^n = x^n" |
21263 | 426 |
apply (subst power_abs [symmetric]) |
21256 | 427 |
apply (simp add: zero_le_even_power) |
21263 | 428 |
done |
21256 | 429 |
|
21263 | 430 |
lemma power_minus_even [simp]: "even n ==> |
31017 | 431 |
(- x)^n = (x^n::'a::{comm_ring_1})" |
21256 | 432 |
apply (subst power_minus) |
433 |
apply simp |
|
21263 | 434 |
done |
21256 | 435 |
|
21263 | 436 |
lemma power_minus_odd [simp]: "odd n ==> |
31017 | 437 |
(- x)^n = - (x^n::'a::{comm_ring_1})" |
21256 | 438 |
apply (subst power_minus) |
439 |
apply simp |
|
21263 | 440 |
done |
21256 | 441 |
|
35028
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents:
33358
diff
changeset
|
442 |
lemma power_mono_even: fixes x y :: "'a :: {linordered_idom}" |
29803
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
443 |
assumes "even n" and "\<bar>x\<bar> \<le> \<bar>y\<bar>" |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
444 |
shows "x^n \<le> y^n" |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
445 |
proof - |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
446 |
have "0 \<le> \<bar>x\<bar>" by auto |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
447 |
with `\<bar>x\<bar> \<le> \<bar>y\<bar>` |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
448 |
have "\<bar>x\<bar>^n \<le> \<bar>y\<bar>^n" by (rule power_mono) |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
449 |
thus ?thesis unfolding power_even_abs[OF `even n`] . |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
450 |
qed |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
451 |
|
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
452 |
lemma odd_pos: "odd (n::nat) \<Longrightarrow> 0 < n" by presburger |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
453 |
|
35028
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents:
33358
diff
changeset
|
454 |
lemma power_mono_odd: fixes x y :: "'a :: {linordered_idom}" |
29803
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
455 |
assumes "odd n" and "x \<le> y" |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
456 |
shows "x^n \<le> y^n" |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
457 |
proof (cases "y < 0") |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
458 |
case True with `x \<le> y` have "-y \<le> -x" and "0 \<le> -y" by auto |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
459 |
hence "(-y)^n \<le> (-x)^n" by (rule power_mono) |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
460 |
thus ?thesis unfolding power_minus_odd[OF `odd n`] by auto |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
461 |
next |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
462 |
case False |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
463 |
show ?thesis |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
464 |
proof (cases "x < 0") |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
465 |
case True hence "n \<noteq> 0" and "x \<le> 0" using `odd n`[THEN odd_pos] by auto |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
466 |
hence "x^n \<le> 0" unfolding power_le_zero_eq using `odd n` by auto |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
467 |
moreover |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
468 |
from `\<not> y < 0` have "0 \<le> y" by auto |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
469 |
hence "0 \<le> y^n" by auto |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
470 |
ultimately show ?thesis by auto |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
471 |
next |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
472 |
case False hence "0 \<le> x" by auto |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
473 |
with `x \<le> y` show ?thesis using power_mono by auto |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
474 |
qed |
c56a5571f60a
Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents:
29654
diff
changeset
|
475 |
qed |
21263 | 476 |
|
25600 | 477 |
|
58680 | 478 |
subsubsection {* More Even/Odd Results *} |
25600 | 479 |
|
27668 | 480 |
lemma even_mult_two_ex: "even(n) = (\<exists>m::nat. n = 2*m)" by presburger |
481 |
lemma odd_Suc_mult_two_ex: "odd(n) = (\<exists>m. n = Suc (2*m))" by presburger |
|
25600 | 482 |
|
58687 | 483 |
lemma lemma_even_div2 [simp]: "even (n::nat) ==> (n + 1) div 2 = n div 2" |
484 |
by presburger |
|
25600 | 485 |
|
58687 | 486 |
lemma lemma_odd_div2 [simp]: "odd n ==> (n + 1) div 2 = Suc (n div 2)" |
487 |
by presburger |
|
25600 | 488 |
|
58687 | 489 |
lemma even_num_iff: "0 < n ==> even n = (odd (n - 1 :: nat))" by presburger |
27668 | 490 |
lemma even_even_mod_4_iff: "even (n::nat) = even (n mod 4)" by presburger |
25600 | 491 |
|
27668 | 492 |
lemma lemma_odd_mod_4_div_2: "n mod 4 = (3::nat) ==> odd((n - 1) div 2)" by presburger |
25600 | 493 |
|
494 |
lemma lemma_even_mod_4_div_2: "n mod 4 = (1::nat) ==> even ((n - 1) div 2)" |
|
27668 | 495 |
by presburger |
25600 | 496 |
|
21263 | 497 |
text {* Simplify, when the exponent is a numeral *} |
21256 | 498 |
|
47108
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
huffman
parents:
45607
diff
changeset
|
499 |
lemmas zero_le_power_eq_numeral [simp] = |
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
500 |
zero_le_power_eq [of _ "numeral w"] for w |
21256 | 501 |
|
47108
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
huffman
parents:
45607
diff
changeset
|
502 |
lemmas zero_less_power_eq_numeral [simp] = |
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
503 |
zero_less_power_eq [of _ "numeral w"] for w |
21256 | 504 |
|
47108
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
huffman
parents:
45607
diff
changeset
|
505 |
lemmas power_le_zero_eq_numeral [simp] = |
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
506 |
power_le_zero_eq [of _ "numeral w"] for w |
21256 | 507 |
|
47108
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
huffman
parents:
45607
diff
changeset
|
508 |
lemmas power_less_zero_eq_numeral [simp] = |
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
509 |
power_less_zero_eq [of _ "numeral w"] for w |
21256 | 510 |
|
47108
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
huffman
parents:
45607
diff
changeset
|
511 |
lemmas zero_less_power_nat_eq_numeral [simp] = |
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
512 |
nat_zero_less_power_iff [of _ "numeral w"] for w |
21256 | 513 |
|
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
514 |
lemmas power_eq_0_iff_numeral [simp] = |
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
515 |
power_eq_0_iff [of _ "numeral w"] for w |
21256 | 516 |
|
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
517 |
lemmas power_even_abs_numeral [simp] = |
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
518 |
power_even_abs [of "numeral w" _] for w |
21256 | 519 |
|
520 |
||
58680 | 521 |
subsubsection {* An Equivalence for @{term [source] "0 \<le> a^n"} *} |
21256 | 522 |
|
23522 | 523 |
lemma zero_le_power_iff[presburger]: |
35028
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
haftmann
parents:
33358
diff
changeset
|
524 |
"(0 \<le> a^n) = (0 \<le> (a::'a::{linordered_idom}) | even n)" |
21256 | 525 |
proof cases |
526 |
assume even: "even n" |
|
58680 | 527 |
then have "2 dvd n" by (simp add: even_def) |
528 |
then obtain k where "n = 2 * k" .. |
|
21263 | 529 |
thus ?thesis by (simp add: zero_le_even_power even) |
21256 | 530 |
next |
531 |
assume odd: "odd n" |
|
58681 | 532 |
then obtain k where "n = 2 * k + 1" .. |
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
533 |
moreover have "a ^ (2 * k) \<le> 0 \<Longrightarrow> a = 0" |
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
534 |
by (induct k) (auto simp add: zero_le_mult_iff mult_le_0_iff) |
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
535 |
ultimately show ?thesis |
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
536 |
by (auto simp add: zero_le_mult_iff zero_le_even_power) |
21263 | 537 |
qed |
538 |
||
21256 | 539 |
|
58680 | 540 |
subsubsection {* Miscellaneous *} |
21256 | 541 |
|
58687 | 542 |
lemma even_nat_plus_one_div_two: |
543 |
"even (x::nat) ==> (Suc x) div Suc (Suc 0) = x div Suc (Suc 0)" |
|
544 |
by presburger |
|
21256 | 545 |
|
58687 | 546 |
lemma odd_nat_plus_one_div_two: |
547 |
"odd (x::nat) ==> (Suc x) div Suc (Suc 0) = Suc (x div Suc (Suc 0))" |
|
548 |
by presburger |
|
21256 | 549 |
|
550 |
end |
|
54227
63b441f49645
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
haftmann
parents:
47225
diff
changeset
|
551 |