author | nipkow |
Thu, 10 May 2001 17:28:40 +0200 | |
changeset 11295 | 66925f23ac7f |
parent 11049 | 7eef34adb852 |
permissions | -rw-r--r-- |
10142 | 1 |
(* Title: HOL/NumberTheory/Primes.thy |
9944 | 2 |
ID: $Id$ |
3 |
Author: Christophe Tabacznyj and Lawrence C Paulson |
|
4 |
Copyright 1996 University of Cambridge |
|
5 |
*) |
|
6 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
7 |
header {* The Greatest Common Divisor and Euclid's algorithm *} |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
8 |
|
9944 | 9 |
theory Primes = Main: |
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
10 |
|
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
11 |
text {* |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
12 |
(See H. Davenport, "The Higher Arithmetic". 6th edition. (CUP, 1992)) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
13 |
|
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
14 |
\bigskip |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
15 |
*} |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
16 |
|
9944 | 17 |
consts |
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
18 |
gcd :: "nat * nat => nat" -- {* Euclid's algorithm *} |
9944 | 19 |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
20 |
recdef gcd "measure ((\<lambda>(m, n). n) :: nat * nat => nat)" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
21 |
"gcd (m, n) = (if n = 0 then m else gcd (n, m mod n))" |
9944 | 22 |
|
23 |
constdefs |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
24 |
is_gcd :: "nat => nat => nat => bool" -- {* @{term gcd} as a relation *} |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
25 |
"is_gcd p m n == p dvd m \<and> p dvd n \<and> |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
26 |
(\<forall>d. d dvd m \<and> d dvd n --> d dvd p)" |
9944 | 27 |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
28 |
coprime :: "nat => nat => bool" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
29 |
"coprime m n == gcd (m, n) = 1" |
9944 | 30 |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
31 |
prime :: "nat set" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
32 |
"prime == {p. 1 < p \<and> (\<forall>m. m dvd p --> m = 1 \<or> m = p)}" |
9944 | 33 |
|
34 |
||
35 |
lemma gcd_induct: |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
36 |
"(!!m. P m 0) ==> |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
37 |
(!!m n. 0 < n ==> P n (m mod n) ==> P m n) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
38 |
==> P (m::nat) (n::nat)" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
39 |
apply (induct m n rule: gcd.induct) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
40 |
apply (case_tac "n = 0") |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
41 |
apply simp_all |
9944 | 42 |
done |
43 |
||
44 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
45 |
lemma gcd_0 [simp]: "gcd (m, 0) = m" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
46 |
apply simp |
9944 | 47 |
done |
48 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
49 |
lemma gcd_non_0: "0 < n ==> gcd (m, n) = gcd (n, m mod n)" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
50 |
apply simp |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
51 |
done |
9944 | 52 |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
53 |
declare gcd.simps [simp del] |
9944 | 54 |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
55 |
lemma gcd_1 [simp]: "gcd (m, 1) = 1" |
9944 | 56 |
apply (simp add: gcd_non_0) |
57 |
done |
|
58 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
59 |
text {* |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
60 |
\medskip @{term "gcd (m, n)"} divides @{text m} and @{text n}. The |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
61 |
conjunctions don't seem provable separately. |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
62 |
*} |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
63 |
|
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
64 |
lemma gcd_dvd_both: "gcd (m, n) dvd m \<and> gcd (m, n) dvd n" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
65 |
apply (induct m n rule: gcd_induct) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
66 |
apply (simp_all add: gcd_non_0) |
9944 | 67 |
apply (blast dest: dvd_mod_imp_dvd) |
68 |
done |
|
69 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
70 |
lemmas gcd_dvd1 [iff] = gcd_dvd_both [THEN conjunct1, standard] |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
71 |
lemmas gcd_dvd2 [iff] = gcd_dvd_both [THEN conjunct2, standard] |
9944 | 72 |
|
73 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
74 |
text {* |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
75 |
\medskip Maximality: for all @{term m}, @{term n}, @{term k} |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
76 |
naturals, if @{term k} divides @{term m} and @{term k} divides |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
77 |
@{term n} then @{term k} divides @{term "gcd (m, n)"}. |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
78 |
*} |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
79 |
|
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
80 |
lemma gcd_greatest: "k dvd m ==> k dvd n ==> k dvd gcd (m, n)" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
81 |
apply (induct m n rule: gcd_induct) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
82 |
apply (simp_all add: gcd_non_0 dvd_mod) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
83 |
done |
9944 | 84 |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
85 |
lemma gcd_greatest_iff [iff]: "(k dvd gcd (m, n)) = (k dvd m \<and> k dvd n)" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
86 |
apply (blast intro!: gcd_greatest intro: dvd_trans) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
87 |
done |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
88 |
|
9944 | 89 |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
90 |
text {* |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
91 |
\medskip Function gcd yields the Greatest Common Divisor. |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
92 |
*} |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
93 |
|
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
94 |
lemma is_gcd: "is_gcd (gcd (m, n)) m n" |
9944 | 95 |
apply (simp add: is_gcd_def gcd_greatest) |
96 |
done |
|
97 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
98 |
text {* |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
99 |
\medskip Uniqueness of GCDs. |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
100 |
*} |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
101 |
|
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
102 |
lemma is_gcd_unique: "is_gcd m a b ==> is_gcd n a b ==> m = n" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
103 |
apply (simp add: is_gcd_def) |
9944 | 104 |
apply (blast intro: dvd_anti_sym) |
105 |
done |
|
106 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
107 |
lemma is_gcd_dvd: "is_gcd m a b ==> k dvd a ==> k dvd b ==> k dvd m" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
108 |
apply (auto simp add: is_gcd_def) |
9944 | 109 |
done |
110 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
111 |
|
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
112 |
text {* |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
113 |
\medskip Commutativity |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
114 |
*} |
9944 | 115 |
|
116 |
lemma is_gcd_commute: "is_gcd k m n = is_gcd k n m" |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
117 |
apply (auto simp add: is_gcd_def) |
9944 | 118 |
done |
119 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
120 |
lemma gcd_commute: "gcd (m, n) = gcd (n, m)" |
9944 | 121 |
apply (rule is_gcd_unique) |
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
122 |
apply (rule is_gcd) |
9944 | 123 |
apply (subst is_gcd_commute) |
124 |
apply (simp add: is_gcd) |
|
125 |
done |
|
126 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
127 |
lemma gcd_assoc: "gcd (gcd (k, m), n) = gcd (k, gcd (m, n))" |
9944 | 128 |
apply (rule is_gcd_unique) |
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
129 |
apply (rule is_gcd) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
130 |
apply (simp add: is_gcd_def) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
131 |
apply (blast intro: dvd_trans) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
132 |
done |
9944 | 133 |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
134 |
lemma gcd_0_left [simp]: "gcd (0, m) = m" |
9944 | 135 |
apply (simp add: gcd_commute [of 0]) |
136 |
done |
|
137 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
138 |
lemma gcd_1_left [simp]: "gcd (1, m) = 1" |
9944 | 139 |
apply (simp add: gcd_commute [of 1]) |
140 |
done |
|
141 |
||
142 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
143 |
text {* |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
144 |
\medskip Multiplication laws |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
145 |
*} |
9944 | 146 |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
147 |
lemma gcd_mult_distrib2: "k * gcd (m, n) = gcd (k * m, k * n)" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
148 |
-- {* Davenport, page 27 *} |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
149 |
apply (induct m n rule: gcd_induct) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
150 |
apply simp |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
151 |
apply (case_tac "k = 0") |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
152 |
apply (simp_all add: mod_geq gcd_non_0 mod_mult_distrib2) |
9944 | 153 |
done |
154 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
155 |
lemma gcd_mult [simp]: "gcd (k, k * n) = k" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
156 |
apply (rule gcd_mult_distrib2 [of k 1 n, simplified, symmetric]) |
9944 | 157 |
done |
158 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
159 |
lemma gcd_self [simp]: "gcd (k, k) = k" |
9944 | 160 |
apply (rule gcd_mult [of k 1, simplified]) |
161 |
done |
|
162 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
163 |
lemma relprime_dvd_mult: "gcd (k, n) = 1 ==> k dvd m * n ==> k dvd m" |
9944 | 164 |
apply (insert gcd_mult_distrib2 [of m k n]) |
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
165 |
apply simp |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
166 |
apply (erule_tac t = m in ssubst) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
167 |
apply simp |
9944 | 168 |
done |
169 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
170 |
lemma relprime_dvd_mult_iff: "gcd (k, n) = 1 ==> (k dvd m * n) = (k dvd m)" |
9944 | 171 |
apply (blast intro: relprime_dvd_mult dvd_trans) |
172 |
done |
|
173 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
174 |
lemma prime_imp_relprime: "p \<in> prime ==> \<not> p dvd n ==> gcd (p, n) = 1" |
9944 | 175 |
apply (auto simp add: prime_def) |
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
176 |
apply (drule_tac x = "gcd (p, n)" in spec) |
9944 | 177 |
apply auto |
178 |
apply (insert gcd_dvd2 [of p n]) |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
179 |
apply simp |
9944 | 180 |
done |
181 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
182 |
text {* |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
183 |
This theorem leads immediately to a proof of the uniqueness of |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
184 |
factorization. If @{term p} divides a product of primes then it is |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
185 |
one of those primes. |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
186 |
*} |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
187 |
|
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
188 |
lemma prime_dvd_mult: "p \<in> prime ==> p dvd m * n ==> p dvd m \<or> p dvd n" |
9944 | 189 |
apply (blast intro: relprime_dvd_mult prime_imp_relprime) |
190 |
done |
|
191 |
||
192 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
193 |
text {* \medskip Addition laws *} |
9944 | 194 |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
195 |
lemma gcd_add1 [simp]: "gcd (m + n, n) = gcd (m, n)" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
196 |
apply (case_tac "n = 0") |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
197 |
apply (simp_all add: gcd_non_0) |
9944 | 198 |
done |
199 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
200 |
lemma gcd_add2 [simp]: "gcd (m, m + n) = gcd (m, n)" |
9944 | 201 |
apply (rule gcd_commute [THEN trans]) |
202 |
apply (subst add_commute) |
|
203 |
apply (simp add: gcd_add1) |
|
204 |
apply (rule gcd_commute) |
|
205 |
done |
|
206 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
207 |
lemma gcd_add2' [simp]: "gcd (m, n + m) = gcd (m, n)" |
9944 | 208 |
apply (subst add_commute) |
209 |
apply (rule gcd_add2) |
|
210 |
done |
|
211 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
212 |
lemma gcd_add_mult: "gcd (m, k * m + n) = gcd (m, n)" |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
213 |
apply (induct k) |
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
214 |
apply (simp_all add: gcd_add2 add_assoc) |
9944 | 215 |
done |
216 |
||
217 |
||
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
218 |
text {* \medskip More multiplication laws *} |
9944 | 219 |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
220 |
lemma gcd_mult_cancel: "gcd (k, n) = 1 ==> gcd (k * m, n) = gcd (m, n)" |
9944 | 221 |
apply (rule dvd_anti_sym) |
222 |
apply (rule gcd_greatest) |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
223 |
apply (rule_tac n = k in relprime_dvd_mult) |
9944 | 224 |
apply (simp add: gcd_assoc) |
225 |
apply (simp add: gcd_commute) |
|
226 |
apply (simp_all add: mult_commute gcd_dvd1 gcd_dvd2) |
|
11049
7eef34adb852
HOL-NumberTheory: converted to new-style format and proper document setup;
wenzelm
parents:
10789
diff
changeset
|
227 |
apply (blast intro: gcd_dvd1 dvd_trans) |
9944 | 228 |
done |
229 |
||
230 |
end |