170 |
172 |
171 lemma prime_dvd_power_nat: "prime (p::nat) \<Longrightarrow> p dvd x^n \<Longrightarrow> p dvd x" |
173 lemma prime_dvd_power_nat: "prime (p::nat) \<Longrightarrow> p dvd x^n \<Longrightarrow> p dvd x" |
172 by (induct n) auto |
174 by (induct n) auto |
173 |
175 |
174 lemma prime_dvd_power_int: "prime (p::int) \<Longrightarrow> p dvd x^n \<Longrightarrow> p dvd x" |
176 lemma prime_dvd_power_int: "prime (p::int) \<Longrightarrow> p dvd x^n \<Longrightarrow> p dvd x" |
175 apply (induct n) |
177 by (induct n) (auto simp: prime_ge_0_int) |
176 apply (frule prime_ge_0_int) |
|
177 apply auto |
|
178 done |
|
179 |
178 |
180 lemma prime_dvd_power_nat_iff: "prime (p::nat) \<Longrightarrow> n > 0 \<Longrightarrow> |
179 lemma prime_dvd_power_nat_iff: "prime (p::nat) \<Longrightarrow> n > 0 \<Longrightarrow> |
181 p dvd x^n \<longleftrightarrow> p dvd x" |
180 p dvd x^n \<longleftrightarrow> p dvd x" |
182 by (cases n) (auto elim: prime_dvd_power_nat) |
181 by (cases n) (auto elim: prime_dvd_power_nat) |
183 |
182 |
196 |
195 |
197 lemma one_not_prime_nat [simp]: "~prime (1::nat)" |
196 lemma one_not_prime_nat [simp]: "~prime (1::nat)" |
198 by (simp add: prime_nat_def) |
197 by (simp add: prime_nat_def) |
199 |
198 |
200 lemma Suc_0_not_prime_nat [simp]: "~prime (Suc 0)" |
199 lemma Suc_0_not_prime_nat [simp]: "~prime (Suc 0)" |
201 by (simp add: prime_nat_def One_nat_def) |
200 by (simp add: prime_nat_def) |
202 |
201 |
203 lemma one_not_prime_int [simp]: "~prime (1::int)" |
202 lemma one_not_prime_int [simp]: "~prime (1::int)" |
204 by (simp add: prime_int_def) |
203 by (simp add: prime_int_def) |
205 |
204 |
206 lemma prime_nat_code [code]: |
205 lemma prime_nat_code [code]: |
207 "prime (p::nat) \<longleftrightarrow> p > 1 \<and> (\<forall>n \<in> {1<..<p}. ~ n dvd p)" |
206 "prime (p::nat) \<longleftrightarrow> p > 1 \<and> (\<forall>n \<in> {1<..<p}. ~ n dvd p)" |
208 apply (simp add: Ball_def) |
207 apply (simp add: Ball_def) |
209 apply (metis less_not_refl prime_nat_def dvd_triv_right not_prime_eq_prod_nat) |
208 apply (metis One_nat_def less_not_refl prime_nat_def dvd_triv_right not_prime_eq_prod_nat) |
210 done |
209 done |
211 |
210 |
212 lemma prime_nat_simp: |
211 lemma prime_nat_simp: |
213 "prime (p::nat) \<longleftrightarrow> p > 1 \<and> (\<forall>n \<in> set [2..<p]. \<not> n dvd p)" |
212 "prime (p::nat) \<longleftrightarrow> p > 1 \<and> (\<forall>n \<in> set [2..<p]. \<not> n dvd p)" |
214 by (auto simp add: prime_nat_code) |
213 by (auto simp add: prime_nat_code) |
244 lemma "prime(997::nat)" by eval |
243 lemma "prime(997::nat)" by eval |
245 lemma "prime(997::int)" by eval |
244 lemma "prime(997::int)" by eval |
246 |
245 |
247 |
246 |
248 lemma prime_imp_power_coprime_nat: "prime (p::nat) \<Longrightarrow> ~ p dvd a \<Longrightarrow> coprime a (p^m)" |
247 lemma prime_imp_power_coprime_nat: "prime (p::nat) \<Longrightarrow> ~ p dvd a \<Longrightarrow> coprime a (p^m)" |
249 apply (rule coprime_exp_nat) |
248 by (metis coprime_exp_nat gcd_nat.commute prime_imp_coprime_nat) |
250 apply (subst gcd_commute_nat) |
|
251 apply (erule (1) prime_imp_coprime_nat) |
|
252 done |
|
253 |
249 |
254 lemma prime_imp_power_coprime_int: "prime (p::int) \<Longrightarrow> ~ p dvd a \<Longrightarrow> coprime a (p^m)" |
250 lemma prime_imp_power_coprime_int: "prime (p::int) \<Longrightarrow> ~ p dvd a \<Longrightarrow> coprime a (p^m)" |
255 apply (rule coprime_exp_int) |
251 by (metis coprime_exp_int gcd_int.commute prime_imp_coprime_int) |
256 apply (subst gcd_commute_int) |
|
257 apply (erule (1) prime_imp_coprime_int) |
|
258 done |
|
259 |
252 |
260 lemma primes_coprime_nat: "prime (p::nat) \<Longrightarrow> prime q \<Longrightarrow> p \<noteq> q \<Longrightarrow> coprime p q" |
253 lemma primes_coprime_nat: "prime (p::nat) \<Longrightarrow> prime q \<Longrightarrow> p \<noteq> q \<Longrightarrow> coprime p q" |
261 apply (rule prime_imp_coprime_nat, assumption) |
254 by (metis gcd_nat.absorb1 gcd_nat.absorb2 prime_imp_coprime_nat) |
262 apply (unfold prime_nat_def) |
|
263 apply auto |
|
264 done |
|
265 |
255 |
266 lemma primes_coprime_int: "prime (p::int) \<Longrightarrow> prime q \<Longrightarrow> p \<noteq> q \<Longrightarrow> coprime p q" |
256 lemma primes_coprime_int: "prime (p::int) \<Longrightarrow> prime q \<Longrightarrow> p \<noteq> q \<Longrightarrow> coprime p q" |
267 apply (rule prime_imp_coprime_int, assumption) |
257 by (metis leD linear prime_gt_0_int prime_imp_coprime_int prime_int_altdef) |
268 apply (unfold prime_int_altdef) |
|
269 apply (metis int_one_le_iff_zero_less less_le) |
|
270 done |
|
271 |
258 |
272 lemma primes_imp_powers_coprime_nat: |
259 lemma primes_imp_powers_coprime_nat: |
273 "prime (p::nat) \<Longrightarrow> prime q \<Longrightarrow> p ~= q \<Longrightarrow> coprime (p^m) (q^n)" |
260 "prime (p::nat) \<Longrightarrow> prime q \<Longrightarrow> p ~= q \<Longrightarrow> coprime (p^m) (q^n)" |
274 by (rule coprime_exp2_nat, rule primes_coprime_nat) |
261 by (rule coprime_exp2_nat, rule primes_coprime_nat) |
275 |
262 |
283 using two_is_prime_nat |
270 using two_is_prime_nat |
284 apply blast |
271 apply blast |
285 apply (metis One_nat_def dvd.order_trans dvd_refl less_Suc0 linorder_neqE_nat |
272 apply (metis One_nat_def dvd.order_trans dvd_refl less_Suc0 linorder_neqE_nat |
286 nat_dvd_not_less neq0_conv prime_nat_def) |
273 nat_dvd_not_less neq0_conv prime_nat_def) |
287 done |
274 done |
288 |
|
289 (* An Isar version: |
|
290 |
|
291 lemma prime_factor_b_nat: |
|
292 fixes n :: nat |
|
293 assumes "n \<noteq> 1" |
|
294 shows "\<exists>p. prime p \<and> p dvd n" |
|
295 |
|
296 using `n ~= 1` |
|
297 proof (induct n rule: less_induct_nat) |
|
298 fix n :: nat |
|
299 assume "n ~= 1" and |
|
300 ih: "\<forall>m<n. m \<noteq> 1 \<longrightarrow> (\<exists>p. prime p \<and> p dvd m)" |
|
301 then show "\<exists>p. prime p \<and> p dvd n" |
|
302 proof - |
|
303 { |
|
304 assume "n = 0" |
|
305 moreover note two_is_prime_nat |
|
306 ultimately have ?thesis |
|
307 by (auto simp del: two_is_prime_nat) |
|
308 } |
|
309 moreover |
|
310 { |
|
311 assume "prime n" |
|
312 then have ?thesis by auto |
|
313 } |
|
314 moreover |
|
315 { |
|
316 assume "n ~= 0" and "~ prime n" |
|
317 with `n ~= 1` have "n > 1" by auto |
|
318 with `~ prime n` and not_prime_eq_prod_nat obtain m k where |
|
319 "n = m * k" and "1 < m" and "m < n" by blast |
|
320 with ih obtain p where "prime p" and "p dvd m" by blast |
|
321 with `n = m * k` have ?thesis by auto |
|
322 } |
|
323 ultimately show ?thesis by blast |
|
324 qed |
|
325 qed |
|
326 |
|
327 *) |
|
328 |
275 |
329 text {* One property of coprimality is easier to prove via prime factors. *} |
276 text {* One property of coprimality is easier to prove via prime factors. *} |
330 |
277 |
331 lemma prime_divprod_pow_nat: |
278 lemma prime_divprod_pow_nat: |
332 assumes p: "prime (p::nat)" and ab: "coprime a b" and pab: "p^n dvd a * b" |
279 assumes p: "prime (p::nat)" and ab: "coprime a b" and pab: "p^n dvd a * b" |