| author | nipkow | 
| Sat, 26 Aug 2017 17:52:00 +0200 | |
| changeset 66516 | 97c2d3846e10 | 
| parent 66453 | cc19f7ca2ed6 | 
| child 66837 | 6ba663ff2b1c | 
| permissions | -rw-r--r-- | 
| 65435 | 1 | (* Title: HOL/Computational_Algebra/Primes.thy | 
| 2 | Author: Christophe Tabacznyj | |
| 3 | Author: Lawrence C. Paulson | |
| 4 | Author: Amine Chaieb | |
| 5 | Author: Thomas M. Rasmussen | |
| 6 | Author: Jeremy Avigad | |
| 7 | Author: Tobias Nipkow | |
| 8 | Author: Manuel Eberl | |
| 31706 | 9 | |
| 65435 | 10 | This theory deals with properties of primes. Definitions and lemmas are | 
| 32479 | 11 | proved uniformly for the natural numbers and integers. | 
| 31706 | 12 | |
| 13 | This file combines and revises a number of prior developments. | |
| 14 | ||
| 15 | The original theories "GCD" and "Primes" were by Christophe Tabacznyj | |
| 58623 | 16 | and Lawrence C. Paulson, based on @{cite davenport92}. They introduced
 | 
| 31706 | 17 | gcd, lcm, and prime for the natural numbers. | 
| 18 | ||
| 19 | The original theory "IntPrimes" was by Thomas M. Rasmussen, and | |
| 20 | extended gcd, lcm, primes to the integers. Amine Chaieb provided | |
| 21 | another extension of the notions to the integers, and added a number | |
| 22 | of results to "Primes" and "GCD". IntPrimes also defined and developed | |
| 23 | the congruence relations on the integers. The notion was extended to | |
| 33718 | 24 | the natural numbers by Chaieb. | 
| 31706 | 25 | |
| 32036 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 26 | Jeremy Avigad combined all of these, made everything uniform for the | 
| 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 27 | natural numbers and the integers, and added a number of new theorems. | 
| 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 28 | |
| 31798 | 29 | Tobias Nipkow cleaned up a lot. | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 30 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 31 | Florian Haftmann and Manuel Eberl put primality and prime factorisation | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 32 | onto an algebraic foundation and thus generalised these concepts to | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 33 | other rings, such as polynomials. (see also the Factorial_Ring theory). | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 34 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 35 | There were also previous formalisations of unique factorisation by | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 36 | Thomas Marthedal Rasmussen, Jeremy Avigad, and David Gray. | 
| 21256 | 37 | *) | 
| 38 | ||
| 60526 | 39 | section \<open>Primes\<close> | 
| 21256 | 40 | |
| 32479 | 41 | theory Primes | 
| 66453 
cc19f7ca2ed6
session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
 wenzelm parents: 
65583diff
changeset | 42 | imports HOL.Binomial Euclidean_Algorithm | 
| 31706 | 43 | begin | 
| 44 | ||
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 45 | (* As a simp or intro rule, | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 46 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 47 | prime p \<Longrightarrow> p > 0 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 48 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 49 | wreaks havoc here. When the premise includes \<forall>x \<in># M. prime x, it | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 50 | leads to the backchaining | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 51 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 52 | x > 0 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 53 | prime x | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 54 | x \<in># M which is, unfortunately, | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 55 | count M x > 0 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 56 | *) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 57 | |
| 55242 
413ec965f95d
Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
 paulson <lp15@cam.ac.uk> parents: 
55238diff
changeset | 58 | declare [[coercion int]] | 
| 
413ec965f95d
Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
 paulson <lp15@cam.ac.uk> parents: 
55238diff
changeset | 59 | declare [[coercion_enabled]] | 
| 31706 | 60 | |
| 63633 | 61 | lemma prime_elem_nat_iff: | 
| 62 | "prime_elem (n :: nat) \<longleftrightarrow> (1 < n \<and> (\<forall>m. m dvd n \<longrightarrow> m = 1 \<or> m = n))" | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 63 | proof safe | 
| 63633 | 64 | assume *: "prime_elem n" | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 65 | from * have "n \<noteq> 0" "n \<noteq> 1" by (intro notI, simp del: One_nat_def)+ | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 66 | thus "n > 1" by (cases n) simp_all | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 67 | fix m assume m: "m dvd n" "m \<noteq> n" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 68 | from * \<open>m dvd n\<close> have "n dvd m \<or> is_unit m" | 
| 63633 | 69 | by (intro irreducibleD' prime_elem_imp_irreducible) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 70 | with m show "m = 1" by (auto dest: dvd_antisym) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 71 | next | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 72 | assume "n > 1" "\<forall>m. m dvd n \<longrightarrow> m = 1 \<or> m = n" | 
| 63633 | 73 | thus "prime_elem n" | 
| 74 | by (auto simp: prime_elem_iff_irreducible irreducible_altdef) | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 75 | qed | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 76 | |
| 63633 | 77 | lemma prime_nat_iff_prime_elem: "prime (n :: nat) \<longleftrightarrow> prime_elem n" | 
| 78 | by (simp add: prime_def) | |
| 31706 | 79 | |
| 63633 | 80 | lemma prime_nat_iff: | 
| 81 | "prime (n :: nat) \<longleftrightarrow> (1 < n \<and> (\<forall>m. m dvd n \<longrightarrow> m = 1 \<or> m = n))" | |
| 82 | by (simp add: prime_nat_iff_prime_elem prime_elem_nat_iff) | |
| 31706 | 83 | |
| 63633 | 84 | lemma prime_elem_int_nat_transfer: "prime_elem (n::int) \<longleftrightarrow> prime_elem (nat (abs n))" | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 85 | proof | 
| 63633 | 86 | assume "prime_elem n" | 
| 87 | thus "prime_elem (nat (abs n))" by (auto simp: prime_elem_def nat_dvd_iff) | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 88 | next | 
| 63633 | 89 | assume "prime_elem (nat (abs n))" | 
| 90 | thus "prime_elem n" | |
| 91 | by (auto simp: dvd_int_unfold_dvd_nat prime_elem_def abs_mult nat_mult_distrib) | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 92 | qed | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 93 | |
| 63633 | 94 | lemma prime_elem_nat_int_transfer [simp]: "prime_elem (int n) \<longleftrightarrow> prime_elem n" | 
| 95 | by (auto simp: prime_elem_int_nat_transfer) | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 96 | |
| 63633 | 97 | lemma prime_nat_int_transfer [simp]: "prime (int n) \<longleftrightarrow> prime n" | 
| 98 | by (auto simp: prime_elem_int_nat_transfer prime_def) | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 99 | |
| 63633 | 100 | lemma prime_int_nat_transfer: "prime (n::int) \<longleftrightarrow> n \<ge> 0 \<and> prime (nat n)" | 
| 101 | by (auto simp: prime_elem_int_nat_transfer prime_def) | |
| 31706 | 102 | |
| 63633 | 103 | lemma prime_int_iff: | 
| 104 | "prime (n::int) \<longleftrightarrow> (1 < n \<and> (\<forall>m. m \<ge> 0 \<and> m dvd n \<longrightarrow> m = 1 \<or> m = n))" | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 105 | proof (intro iffI conjI allI impI; (elim conjE)?) | 
| 63633 | 106 | assume *: "prime n" | 
| 107 | hence irred: "irreducible n" by (simp add: prime_elem_imp_irreducible) | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 108 | from * have "n \<ge> 0" "n \<noteq> 0" "n \<noteq> 1" | 
| 63633 | 109 | by (auto simp: prime_def zabs_def not_less split: if_splits) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 110 | thus "n > 1" by presburger | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 111 | fix m assume "m dvd n" \<open>m \<ge> 0\<close> | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 112 | with irred have "m dvd 1 \<or> n dvd m" by (auto simp: irreducible_altdef) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 113 | with \<open>m dvd n\<close> \<open>m \<ge> 0\<close> \<open>n > 1\<close> show "m = 1 \<or> m = n" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 114 | using associated_iff_dvd[of m n] by auto | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 115 | next | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 116 | assume n: "1 < n" "\<forall>m. m \<ge> 0 \<and> m dvd n \<longrightarrow> m = 1 \<or> m = n" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 117 | hence "nat n > 1" by simp | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 118 | moreover have "\<forall>m. m dvd nat n \<longrightarrow> m = 1 \<or> m = nat n" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 119 | proof (intro allI impI) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 120 | fix m assume "m dvd nat n" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 121 | with \<open>n > 1\<close> have "int m dvd n" by (auto simp: int_dvd_iff) | 
| 65583 
8d53b3bebab4
Further new material. The simprule status of some exp and ln identities was reverted.
 paulson <lp15@cam.ac.uk> parents: 
65435diff
changeset | 122 | with n(2) have "int m = 1 \<or> int m = n" | 
| 
8d53b3bebab4
Further new material. The simprule status of some exp and ln identities was reverted.
 paulson <lp15@cam.ac.uk> parents: 
65435diff
changeset | 123 | using of_nat_0_le_iff by blast | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 124 | thus "m = 1 \<or> m = nat n" by auto | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 125 | qed | 
| 63633 | 126 | ultimately show "prime n" | 
| 127 | unfolding prime_int_nat_transfer prime_nat_iff by auto | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 128 | qed | 
| 22027 
e4a08629c4bd
A few lemmas about relative primes when dividing trough gcd
 chaieb parents: 
21404diff
changeset | 129 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 130 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 131 | lemma prime_nat_not_dvd: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 132 | assumes "prime p" "p > n" "n \<noteq> (1::nat)" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 133 | shows "\<not>n dvd p" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 134 | proof | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 135 | assume "n dvd p" | 
| 63633 | 136 | from assms(1) have "irreducible p" by (simp add: prime_elem_imp_irreducible) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 137 | from irreducibleD'[OF this \<open>n dvd p\<close>] \<open>n dvd p\<close> \<open>p > n\<close> assms show False | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 138 | by (cases "n = 0") (auto dest!: dvd_imp_le) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 139 | qed | 
| 22027 
e4a08629c4bd
A few lemmas about relative primes when dividing trough gcd
 chaieb parents: 
21404diff
changeset | 140 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 141 | lemma prime_int_not_dvd: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 142 | assumes "prime p" "p > n" "n > (1::int)" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 143 | shows "\<not>n dvd p" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 144 | proof | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 145 | assume "n dvd p" | 
| 63633 | 146 | from assms(1) have "irreducible p" by (simp add: prime_elem_imp_irreducible) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 147 | from irreducibleD'[OF this \<open>n dvd p\<close>] \<open>n dvd p\<close> \<open>p > n\<close> assms show False | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 148 | by (auto dest!: zdvd_imp_le) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 149 | qed | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 150 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 151 | lemma prime_odd_nat: "prime p \<Longrightarrow> p > (2::nat) \<Longrightarrow> odd p" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 152 | by (intro prime_nat_not_dvd) auto | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 153 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 154 | lemma prime_odd_int: "prime p \<Longrightarrow> p > (2::int) \<Longrightarrow> odd p" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 155 | by (intro prime_int_not_dvd) auto | 
| 22367 | 156 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 157 | lemma prime_ge_0_int: "prime p \<Longrightarrow> p \<ge> (0::int)" | 
| 63633 | 158 | unfolding prime_int_iff by auto | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 159 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 160 | lemma prime_gt_0_nat: "prime p \<Longrightarrow> p > (0::nat)" | 
| 63633 | 161 | unfolding prime_nat_iff by auto | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 162 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 163 | lemma prime_gt_0_int: "prime p \<Longrightarrow> p > (0::int)" | 
| 63633 | 164 | unfolding prime_int_iff by auto | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 165 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 166 | lemma prime_ge_1_nat: "prime p \<Longrightarrow> p \<ge> (1::nat)" | 
| 63633 | 167 | unfolding prime_nat_iff by auto | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 168 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 169 | lemma prime_ge_Suc_0_nat: "prime p \<Longrightarrow> p \<ge> Suc 0" | 
| 63633 | 170 | unfolding prime_nat_iff by auto | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 171 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 172 | lemma prime_ge_1_int: "prime p \<Longrightarrow> p \<ge> (1::int)" | 
| 63633 | 173 | unfolding prime_int_iff by auto | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 174 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 175 | lemma prime_gt_1_nat: "prime p \<Longrightarrow> p > (1::nat)" | 
| 63633 | 176 | unfolding prime_nat_iff by auto | 
| 31706 | 177 | |
| 61762 
d50b993b4fb9
Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
 paulson <lp15@cam.ac.uk> parents: 
60804diff
changeset | 178 | lemma prime_gt_Suc_0_nat: "prime p \<Longrightarrow> p > Suc 0" | 
| 63633 | 179 | unfolding prime_nat_iff by auto | 
| 31706 | 180 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 181 | lemma prime_gt_1_int: "prime p \<Longrightarrow> p > (1::int)" | 
| 63633 | 182 | unfolding prime_int_iff by auto | 
| 31706 | 183 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 184 | lemma prime_ge_2_nat: "prime p \<Longrightarrow> p \<ge> (2::nat)" | 
| 63633 | 185 | unfolding prime_nat_iff by auto | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 186 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 187 | lemma prime_ge_2_int: "prime p \<Longrightarrow> p \<ge> (2::int)" | 
| 63633 | 188 | unfolding prime_int_iff by auto | 
| 31706 | 189 | |
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 190 | lemma prime_int_altdef: | 
| 55242 
413ec965f95d
Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
 paulson <lp15@cam.ac.uk> parents: 
55238diff
changeset | 191 | "prime p = (1 < p \<and> (\<forall>m::int. m \<ge> 0 \<longrightarrow> m dvd p \<longrightarrow> | 
| 
413ec965f95d
Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
 paulson <lp15@cam.ac.uk> parents: 
55238diff
changeset | 192 | m = 1 \<or> m = p))" | 
| 63633 | 193 | unfolding prime_int_iff by blast | 
| 27568 
9949dc7a24de
Theorem names as in IntPrimes.thy, also several theorems moved from there
 chaieb parents: 
27556diff
changeset | 194 | |
| 62481 
b5d8e57826df
tuned bootstrap order to provide type classes in a more sensible order
 haftmann parents: 
62429diff
changeset | 195 | lemma not_prime_eq_prod_nat: | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 196 | assumes "m > 1" "\<not>prime (m::nat)" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 197 | shows "\<exists>n k. n = m * k \<and> 1 < m \<and> m < n \<and> 1 < k \<and> k < n" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 198 | using assms irreducible_altdef[of m] | 
| 63633 | 199 | by (auto simp: prime_elem_iff_irreducible prime_def irreducible_altdef) | 
| 53598 
2bd8d459ebae
remove unneeded assumption from prime_dvd_power lemmas;
 huffman parents: 
47108diff
changeset | 200 | |
| 64773 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 201 | |
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 202 | subsection\<open>Largest exponent of a prime factor\<close> | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 203 | text\<open>Possibly duplicates other material, but avoid the complexities of multisets.\<close> | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 204 | |
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 205 | lemma prime_power_cancel_less: | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 206 | assumes "prime p" and eq: "m * (p ^ k) = m' * (p ^ k')" and less: "k < k'" and "\<not> p dvd m" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 207 | shows False | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 208 | proof - | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 209 | obtain l where l: "k' = k + l" and "l > 0" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 210 | using less less_imp_add_positive by auto | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 211 | have "m = m * (p ^ k) div (p ^ k)" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 212 | using \<open>prime p\<close> by simp | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 213 | also have "\<dots> = m' * (p ^ k') div (p ^ k)" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 214 | using eq by simp | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 215 | also have "\<dots> = m' * (p ^ l) * (p ^ k) div (p ^ k)" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 216 | by (simp add: l mult.commute mult.left_commute power_add) | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 217 | also have "... = m' * (p ^ l)" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 218 | using \<open>prime p\<close> by simp | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 219 | finally have "p dvd m" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 220 | using \<open>l > 0\<close> by simp | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 221 | with assms show False | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 222 | by simp | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 223 | qed | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 224 | |
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 225 | lemma prime_power_cancel: | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 226 | assumes "prime p" and eq: "m * (p ^ k) = m' * (p ^ k')" and "\<not> p dvd m" "\<not> p dvd m'" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 227 | shows "k = k'" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 228 | using prime_power_cancel_less [OF \<open>prime p\<close>] assms | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 229 | by (metis linorder_neqE_nat) | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 230 | |
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 231 | lemma prime_power_cancel2: | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 232 | assumes "prime p" "m * (p ^ k) = m' * (p ^ k')" "\<not> p dvd m" "\<not> p dvd m'" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 233 | obtains "m = m'" "k = k'" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 234 | using prime_power_cancel [OF assms] assms by auto | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 235 | |
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 236 | lemma prime_power_canonical: | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 237 | fixes m::nat | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 238 | assumes "prime p" "m > 0" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 239 | shows "\<exists>k n. \<not> p dvd n \<and> m = n * p^k" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 240 | using \<open>m > 0\<close> | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 241 | proof (induction m rule: less_induct) | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 242 | case (less m) | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 243 | show ?case | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 244 | proof (cases "p dvd m") | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 245 | case True | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 246 | then obtain m' where m': "m = p * m'" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 247 | using dvdE by blast | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 248 | with \<open>prime p\<close> have "0 < m'" "m' < m" | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 249 | using less.prems prime_nat_iff by auto | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 250 | with m' less show ?thesis | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 251 | by (metis power_Suc mult.left_commute) | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 252 | next | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 253 | case False | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 254 | then show ?thesis | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 255 | by (metis mult.right_neutral power_0) | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 256 | qed | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 257 | qed | 
| 
223b2ebdda79
Many new theorems, and more tidying
 paulson <lp15@cam.ac.uk> parents: 
64590diff
changeset | 258 | |
| 53598 
2bd8d459ebae
remove unneeded assumption from prime_dvd_power lemmas;
 huffman parents: 
47108diff
changeset | 259 | |
| 60526 | 260 | subsubsection \<open>Make prime naively executable\<close> | 
| 32007 | 261 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 262 | lemma Suc_0_not_prime_nat [simp]: "~prime (Suc 0)" | 
| 63633 | 263 | unfolding One_nat_def [symmetric] by (rule not_prime_1) | 
| 32007 | 264 | |
| 63633 | 265 | lemma prime_nat_iff': | 
| 65025 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 266 |   "prime (p :: nat) \<longleftrightarrow> p > 1 \<and> (\<forall>n \<in> {2..<p}. ~ n dvd p)"
 | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 267 | proof safe | 
| 65025 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 268 |   assume "p > 1" and *: "\<forall>n\<in>{2..<p}. \<not>n dvd p"
 | 
| 63633 | 269 | show "prime p" unfolding prime_nat_iff | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 270 | proof (intro conjI allI impI) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 271 | fix m assume "m dvd p" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 272 | with \<open>p > 1\<close> have "m \<noteq> 0" by (intro notI) auto | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 273 | hence "m \<ge> 1" by simp | 
| 65025 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 274 |     moreover from \<open>m dvd p\<close> and * have "m \<notin> {2..<p}" by blast
 | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 275 | with \<open>m dvd p\<close> and \<open>p > 1\<close> have "m \<le> 1 \<or> m = p" by (auto dest: dvd_imp_le) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 276 | ultimately show "m = 1 \<or> m = p" by simp | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 277 | qed fact+ | 
| 63633 | 278 | qed (auto simp: prime_nat_iff) | 
| 32007 | 279 | |
| 63633 | 280 | lemma prime_int_iff': | 
| 65025 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 281 |   "prime (p :: int) \<longleftrightarrow> p > 1 \<and> (\<forall>n \<in> {2..<p}. ~ n dvd p)" (is "?lhs = ?rhs")
 | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 282 | proof | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 283 | assume "?lhs" | 
| 65025 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 284 | thus "?rhs" | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 285 | by (auto simp: prime_int_nat_transfer dvd_int_unfold_dvd_nat prime_nat_iff') | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 286 | next | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 287 | assume "?rhs" | 
| 65025 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 288 | thus "?lhs" | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 289 | by (auto simp: prime_int_nat_transfer zdvd_int prime_nat_iff') | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 290 | qed | 
| 32007 | 291 | |
| 64590 
6621d91d3c8a
streamlined computation rules for primality of numerals: no need to go via explicit conversion to nat
 haftmann parents: 
64272diff
changeset | 292 | lemma prime_int_numeral_eq [simp]: | 
| 
6621d91d3c8a
streamlined computation rules for primality of numerals: no need to go via explicit conversion to nat
 haftmann parents: 
64272diff
changeset | 293 | "prime (numeral m :: int) \<longleftrightarrow> prime (numeral m :: nat)" | 
| 
6621d91d3c8a
streamlined computation rules for primality of numerals: no need to go via explicit conversion to nat
 haftmann parents: 
64272diff
changeset | 294 | by (simp add: prime_int_nat_transfer) | 
| 32007 | 295 | |
| 63635 | 296 | lemma two_is_prime_nat [simp]: "prime (2::nat)" | 
| 65025 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 297 | by (simp add: prime_nat_iff') | 
| 32007 | 298 | |
| 64590 
6621d91d3c8a
streamlined computation rules for primality of numerals: no need to go via explicit conversion to nat
 haftmann parents: 
64272diff
changeset | 299 | lemma prime_nat_numeral_eq [simp]: | 
| 
6621d91d3c8a
streamlined computation rules for primality of numerals: no need to go via explicit conversion to nat
 haftmann parents: 
64272diff
changeset | 300 | "prime (numeral m :: nat) \<longleftrightarrow> | 
| 
6621d91d3c8a
streamlined computation rules for primality of numerals: no need to go via explicit conversion to nat
 haftmann parents: 
64272diff
changeset | 301 | (1::nat) < numeral m \<and> | 
| 65025 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 302 | (\<forall>n::nat \<in> set [2..<numeral m]. \<not> n dvd numeral m)" | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 303 | by (simp only: prime_nat_iff' set_upt) \<comment> \<open>TODO Sieve Of Erathosthenes might speed this up\<close> | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 304 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 305 | |
| 60526 | 306 | text\<open>A bit of regression testing:\<close> | 
| 32111 | 307 | |
| 58954 
18750e86d5b8
reverted 1ebf0a1f12a4 after successful re-tuning of simp rules for divisibility
 haftmann parents: 
58898diff
changeset | 308 | lemma "prime(97::nat)" by simp | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 309 | lemma "prime(97::int)" by simp | 
| 31706 | 310 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 311 | lemma prime_factor_nat: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 312 | "n \<noteq> (1::nat) \<Longrightarrow> \<exists>p. prime p \<and> p dvd n" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 313 | using prime_divisor_exists[of n] | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 314 | by (cases "n = 0") (auto intro: exI[of _ "2::nat"]) | 
| 23983 | 315 | |
| 44872 | 316 | |
| 60526 | 317 | subsection \<open>Infinitely many primes\<close> | 
| 32036 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 318 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 319 | lemma next_prime_bound: "\<exists>p::nat. prime p \<and> n < p \<and> p \<le> fact n + 1" | 
| 32036 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 320 | proof- | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59669diff
changeset | 321 | have f1: "fact n + 1 \<noteq> (1::nat)" using fact_ge_1 [of n, where 'a=nat] by arith | 
| 32036 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 322 | from prime_factor_nat [OF f1] | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 323 | obtain p :: nat where "prime p" and "p dvd fact n + 1" by auto | 
| 44872 | 324 | then have "p \<le> fact n + 1" apply (intro dvd_imp_le) apply auto done | 
| 325 |   { assume "p \<le> n"
 | |
| 60526 | 326 | from \<open>prime p\<close> have "p \<ge> 1" | 
| 32036 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 327 | by (cases p, simp_all) | 
| 60526 | 328 | with \<open>p <= n\<close> have "p dvd fact n" | 
| 59730 
b7c394c7a619
The factorial function, "fact", now has type "nat => 'a"
 paulson <lp15@cam.ac.uk> parents: 
59669diff
changeset | 329 | by (intro dvd_fact) | 
| 60526 | 330 | with \<open>p dvd fact n + 1\<close> have "p dvd fact n + 1 - fact n" | 
| 32036 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 331 | by (rule dvd_diff_nat) | 
| 44872 | 332 | then have "p dvd 1" by simp | 
| 333 | then have "p <= 1" by auto | |
| 61762 
d50b993b4fb9
Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
 paulson <lp15@cam.ac.uk> parents: 
60804diff
changeset | 334 | moreover from \<open>prime p\<close> have "p > 1" | 
| 63633 | 335 | using prime_nat_iff by blast | 
| 32036 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 336 | ultimately have False by auto} | 
| 44872 | 337 | then have "n < p" by presburger | 
| 60526 | 338 | with \<open>prime p\<close> and \<open>p <= fact n + 1\<close> show ?thesis by auto | 
| 32036 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 339 | qed | 
| 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 340 | |
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 341 | lemma bigger_prime: "\<exists>p. prime p \<and> p > (n::nat)" | 
| 44872 | 342 | using next_prime_bound by auto | 
| 32036 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 343 | |
| 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 344 | lemma primes_infinite: "\<not> (finite {(p::nat). prime p})"
 | 
| 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 345 | proof | 
| 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 346 |   assume "finite {(p::nat). prime p}"
 | 
| 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 347 |   with Max_ge have "(EX b. (ALL x : {(p::nat). prime p}. x <= b))"
 | 
| 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 348 | by auto | 
| 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 349 | then obtain b where "ALL (x::nat). prime x \<longrightarrow> x <= b" | 
| 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 350 | by auto | 
| 44872 | 351 | with bigger_prime [of b] show False | 
| 352 | by auto | |
| 32036 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 353 | qed | 
| 
8a9228872fbd
Moved factorial lemmas from Binomial.thy to Fact.thy and merged.
 avigad parents: 
31952diff
changeset | 354 | |
| 60526 | 355 | subsection\<open>Powers of Primes\<close> | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 356 | |
| 60526 | 357 | text\<open>Versions for type nat only\<close> | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 358 | |
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 359 | lemma prime_product: | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 360 | fixes p::nat | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 361 | assumes "prime (p * q)" | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 362 | shows "p = 1 \<or> q = 1" | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 363 | proof - | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 364 | from assms have | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 365 | "1 < p * q" and P: "\<And>m. m dvd p * q \<Longrightarrow> m = 1 \<or> m = p * q" | 
| 63633 | 366 | unfolding prime_nat_iff by auto | 
| 60526 | 367 | from \<open>1 < p * q\<close> have "p \<noteq> 0" by (cases p) auto | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 368 | then have Q: "p = p * q \<longleftrightarrow> q = 1" by auto | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 369 | have "p dvd p * q" by simp | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 370 | then have "p = 1 \<or> p = p * q" by (rule P) | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 371 | then show ?thesis by (simp add: Q) | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 372 | qed | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 373 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 374 | (* TODO: Generalise? *) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 375 | lemma prime_power_mult_nat: | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 376 | fixes p::nat | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 377 | assumes p: "prime p" and xy: "x * y = p ^ k" | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 378 | shows "\<exists>i j. x = p ^i \<and> y = p^ j" | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 379 | using xy | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 380 | proof(induct k arbitrary: x y) | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 381 | case 0 thus ?case apply simp by (rule exI[where x="0"], simp) | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 382 | next | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 383 | case (Suc k x y) | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 384 | from Suc.prems have pxy: "p dvd x*y" by auto | 
| 63633 | 385 | from prime_dvd_multD [OF p pxy] have pxyc: "p dvd x \<or> p dvd y" . | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 386 | from p have p0: "p \<noteq> 0" by - (rule ccontr, simp) | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 387 |   {assume px: "p dvd x"
 | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 388 | then obtain d where d: "x = p*d" unfolding dvd_def by blast | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 389 | from Suc.prems d have "p*d*y = p^Suc k" by simp | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 390 | hence th: "d*y = p^k" using p0 by simp | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 391 | from Suc.hyps[OF th] obtain i j where ij: "d = p^i" "y = p^j" by blast | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 392 | with d have "x = p^Suc i" by simp | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 393 | with ij(2) have ?case by blast} | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 394 | moreover | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 395 |   {assume px: "p dvd y"
 | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 396 | then obtain d where d: "y = p*d" unfolding dvd_def by blast | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
55337diff
changeset | 397 | from Suc.prems d have "p*d*x = p^Suc k" by (simp add: mult.commute) | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 398 | hence th: "d*x = p^k" using p0 by simp | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 399 | from Suc.hyps[OF th] obtain i j where ij: "d = p^i" "x = p^j" by blast | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 400 | with d have "y = p^Suc i" by simp | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 401 | with ij(2) have ?case by blast} | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 402 | ultimately show ?case using pxyc by blast | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 403 | qed | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 404 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 405 | lemma prime_power_exp_nat: | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 406 | fixes p::nat | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 407 | assumes p: "prime p" and n: "n \<noteq> 0" | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 408 | and xn: "x^n = p^k" shows "\<exists>i. x = p^i" | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 409 | using n xn | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 410 | proof(induct n arbitrary: k) | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 411 | case 0 thus ?case by simp | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 412 | next | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 413 | case (Suc n k) hence th: "x*x^n = p^k" by simp | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 414 |   {assume "n = 0" with Suc have ?case by simp (rule exI[where x="k"], simp)}
 | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 415 | moreover | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 416 |   {assume n: "n \<noteq> 0"
 | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 417 | from prime_power_mult_nat[OF p th] | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 418 | obtain i j where ij: "x = p^i" "x^n = p^j"by blast | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 419 | from Suc.hyps[OF n ij(2)] have ?case .} | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 420 | ultimately show ?case by blast | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 421 | qed | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 422 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 423 | lemma divides_primepow_nat: | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 424 | fixes p::nat | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 425 | assumes p: "prime p" | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 426 | shows "d dvd p^k \<longleftrightarrow> (\<exists> i. i \<le> k \<and> d = p ^i)" | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 427 | proof | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 428 | assume H: "d dvd p^k" then obtain e where e: "d*e = p^k" | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
55337diff
changeset | 429 | unfolding dvd_def apply (auto simp add: mult.commute) by blast | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 430 | from prime_power_mult_nat[OF p e] obtain i j where ij: "d = p^i" "e=p^j" by blast | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 431 | from e ij have "p^(i + j) = p^k" by (simp add: power_add) | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 432 | hence "i + j = k" using p prime_gt_1_nat power_inject_exp[of p "i+j" k] by simp | 
| 55215 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 433 | hence "i \<le> k" by arith | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 434 | with ij(1) show "\<exists>i\<le>k. d = p ^ i" by blast | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 435 | next | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 436 |   {fix i assume H: "i \<le> k" "d = p^i"
 | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 437 | then obtain j where j: "k = i + j" | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 438 | by (metis le_add_diff_inverse) | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 439 | hence "p^k = p^j*d" using H(2) by (simp add: power_add) | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 440 | hence "d dvd p^k" unfolding dvd_def by auto} | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 441 | thus "\<exists>i\<le>k. d = p ^ i \<Longrightarrow> d dvd p ^ k" by blast | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 442 | qed | 
| 
b6c926e67350
Restoring some proofs from the equivalent file in Old_Number_Theory.
 paulson <lp15@cam.ac.uk> parents: 
55130diff
changeset | 443 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 444 | |
| 60526 | 445 | subsection \<open>Chinese Remainder Theorem Variants\<close> | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 446 | |
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 447 | lemma bezout_gcd_nat: | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 448 | fixes a::nat shows "\<exists>x y. a * x - b * y = gcd a b \<or> b * x - a * y = gcd a b" | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 449 | using bezout_nat[of a b] | 
| 62429 
25271ff79171
Tuned Euclidean Rings/GCD rings
 Manuel Eberl <eberlm@in.tum.de> parents: 
62410diff
changeset | 450 | by (metis bezout_nat diff_add_inverse gcd_add_mult gcd.commute | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 451 | gcd_nat.right_neutral mult_0) | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 452 | |
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 453 | lemma gcd_bezout_sum_nat: | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 454 | fixes a::nat | 
| 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 455 | assumes "a * x + b * y = d" | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 456 | shows "gcd a b dvd d" | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 457 | proof- | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 458 | let ?g = "gcd a b" | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 459 | have dv: "?g dvd a*x" "?g dvd b * y" | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 460 | by simp_all | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 461 | from dvd_add[OF dv] assms | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 462 | show ?thesis by auto | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 463 | qed | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 464 | |
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 465 | |
| 60526 | 466 | text \<open>A binary form of the Chinese Remainder Theorem.\<close> | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 467 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 468 | (* TODO: Generalise? *) | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 469 | lemma chinese_remainder: | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 470 | fixes a::nat assumes ab: "coprime a b" and a: "a \<noteq> 0" and b: "b \<noteq> 0" | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 471 | shows "\<exists>x q1 q2. x = u + q1 * a \<and> x = v + q2 * b" | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 472 | proof- | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 473 | from bezout_add_strong_nat[OF a, of b] bezout_add_strong_nat[OF b, of a] | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 474 | obtain d1 x1 y1 d2 x2 y2 where dxy1: "d1 dvd a" "d1 dvd b" "a * x1 = b * y1 + d1" | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 475 | and dxy2: "d2 dvd b" "d2 dvd a" "b * x2 = a * y2 + d2" by blast | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 476 | then have d12: "d1 = 1" "d2 =1" | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 477 | by (metis ab coprime_nat)+ | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 478 | let ?x = "v * a * x1 + u * b * x2" | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 479 | let ?q1 = "v * x1 + u * y2" | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 480 | let ?q2 = "v * y1 + u * x2" | 
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 481 | from dxy2(3)[simplified d12] dxy1(3)[simplified d12] | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 482 | have "?x = u + ?q1 * a" "?x = v + ?q2 * b" | 
| 55337 
5d45fb978d5a
Number_Theory no longer introduces One_nat_def as a simprule. Tidied some proofs.
 paulson <lp15@cam.ac.uk> parents: 
55242diff
changeset | 483 | by algebra+ | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 484 | thus ?thesis by blast | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 485 | qed | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 486 | |
| 60526 | 487 | text \<open>Primality\<close> | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 488 | |
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 489 | lemma coprime_bezout_strong: | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 490 | fixes a::nat assumes "coprime a b" "b \<noteq> 1" | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 491 | shows "\<exists>x y. a * x = b * y + 1" | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 492 | by (metis assms bezout_nat gcd_nat.left_neutral) | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 493 | |
| 59669 
de7792ea4090
renaming HOL/Fact.thy -> Binomial.thy
 paulson <lp15@cam.ac.uk> parents: 
59667diff
changeset | 494 | lemma bezout_prime: | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 495 | assumes p: "prime p" and pa: "\<not> p dvd a" | 
| 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 496 | shows "\<exists>x y. a*x = Suc (p*y)" | 
| 62349 
7c23469b5118
cleansed junk-producing interpretations for gcd/lcm on nat altogether
 haftmann parents: 
62348diff
changeset | 497 | proof - | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 498 | have ap: "coprime a p" | 
| 63633 | 499 | by (metis gcd.commute p pa prime_imp_coprime) | 
| 62349 
7c23469b5118
cleansed junk-producing interpretations for gcd/lcm on nat altogether
 haftmann parents: 
62348diff
changeset | 500 | moreover from p have "p \<noteq> 1" by auto | 
| 
7c23469b5118
cleansed junk-producing interpretations for gcd/lcm on nat altogether
 haftmann parents: 
62348diff
changeset | 501 | ultimately have "\<exists>x y. a * x = p * y + 1" | 
| 
7c23469b5118
cleansed junk-producing interpretations for gcd/lcm on nat altogether
 haftmann parents: 
62348diff
changeset | 502 | by (rule coprime_bezout_strong) | 
| 
7c23469b5118
cleansed junk-producing interpretations for gcd/lcm on nat altogether
 haftmann parents: 
62348diff
changeset | 503 | then show ?thesis by simp | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 504 | qed | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 505 | (* END TODO *) | 
| 55238 
7ddb889e23bd
Added material from Old_Number_Theory related to the Chinese Remainder Theorem
 paulson <lp15@cam.ac.uk> parents: 
55215diff
changeset | 506 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 507 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 508 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 509 | subsection \<open>Multiplicity and primality for natural numbers and integers\<close> | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 510 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 511 | lemma prime_factors_gt_0_nat: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 512 | "p \<in> prime_factors x \<Longrightarrow> p > (0::nat)" | 
| 63905 | 513 | by (simp add: in_prime_factors_imp_prime prime_gt_0_nat) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 514 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 515 | lemma prime_factors_gt_0_int: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 516 | "p \<in> prime_factors x \<Longrightarrow> p > (0::int)" | 
| 63905 | 517 | by (simp add: in_prime_factors_imp_prime prime_gt_0_int) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 518 | |
| 63905 | 519 | lemma prime_factors_ge_0_int [elim]: (* FIXME !? *) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 520 | fixes n :: int | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 521 | shows "p \<in> prime_factors n \<Longrightarrow> p \<ge> 0" | 
| 63905 | 522 | by (drule prime_factors_gt_0_int) simp | 
| 523 | ||
| 63830 | 524 | lemma prod_mset_prime_factorization_int: | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 525 | fixes n :: int | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 526 | assumes "n > 0" | 
| 63830 | 527 | shows "prod_mset (prime_factorization n) = n" | 
| 528 | using assms by (simp add: prod_mset_prime_factorization) | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 529 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 530 | lemma prime_factorization_exists_nat: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 531 | "n > 0 \<Longrightarrow> (\<exists>M. (\<forall>p::nat \<in> set_mset M. prime p) \<and> n = (\<Prod>i \<in># M. i))" | 
| 63633 | 532 | using prime_factorization_exists[of n] by (auto simp: prime_def) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 533 | |
| 63830 | 534 | lemma prod_mset_prime_factorization_nat [simp]: | 
| 535 | "(n::nat) > 0 \<Longrightarrow> prod_mset (prime_factorization n) = n" | |
| 536 | by (subst prod_mset_prime_factorization) simp_all | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 537 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 538 | lemma prime_factorization_nat: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 539 | "n > (0::nat) \<Longrightarrow> n = (\<Prod>p \<in> prime_factors n. p ^ multiplicity p n)" | 
| 64272 | 540 | by (simp add: prod_prime_factors) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 541 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 542 | lemma prime_factorization_int: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 543 | "n > (0::int) \<Longrightarrow> n = (\<Prod>p \<in> prime_factors n. p ^ multiplicity p n)" | 
| 64272 | 544 | by (simp add: prod_prime_factors) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 545 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 546 | lemma prime_factorization_unique_nat: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 547 | fixes f :: "nat \<Rightarrow> _" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 548 |   assumes S_eq: "S = {p. 0 < f p}"
 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 549 | and "finite S" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 550 | and S: "\<forall>p\<in>S. prime p" "n = (\<Prod>p\<in>S. p ^ f p)" | 
| 63633 | 551 | shows "S = prime_factors n \<and> (\<forall>p. prime p \<longrightarrow> f p = multiplicity p n)" | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 552 | using assms by (intro prime_factorization_unique'') auto | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 553 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 554 | lemma prime_factorization_unique_int: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 555 | fixes f :: "int \<Rightarrow> _" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 556 |   assumes S_eq: "S = {p. 0 < f p}"
 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 557 | and "finite S" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 558 | and S: "\<forall>p\<in>S. prime p" "abs n = (\<Prod>p\<in>S. p ^ f p)" | 
| 63633 | 559 | shows "S = prime_factors n \<and> (\<forall>p. prime p \<longrightarrow> f p = multiplicity p n)" | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 560 | using assms by (intro prime_factorization_unique'') auto | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 561 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 562 | lemma prime_factors_characterization_nat: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 563 |   "S = {p. 0 < f (p::nat)} \<Longrightarrow>
 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 564 | finite S \<Longrightarrow> \<forall>p\<in>S. prime p \<Longrightarrow> n = (\<Prod>p\<in>S. p ^ f p) \<Longrightarrow> prime_factors n = S" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 565 | by (rule prime_factorization_unique_nat [THEN conjunct1, symmetric]) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 566 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 567 | lemma prime_factors_characterization'_nat: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 568 |   "finite {p. 0 < f (p::nat)} \<Longrightarrow>
 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 569 | (\<forall>p. 0 < f p \<longrightarrow> prime p) \<Longrightarrow> | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 570 |       prime_factors (\<Prod>p | 0 < f p. p ^ f p) = {p. 0 < f p}"
 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 571 | by (rule prime_factors_characterization_nat) auto | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 572 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 573 | lemma prime_factors_characterization_int: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 574 |   "S = {p. 0 < f (p::int)} \<Longrightarrow> finite S \<Longrightarrow>
 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 575 | \<forall>p\<in>S. prime p \<Longrightarrow> abs n = (\<Prod>p\<in>S. p ^ f p) \<Longrightarrow> prime_factors n = S" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 576 | by (rule prime_factorization_unique_int [THEN conjunct1, symmetric]) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 577 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 578 | (* TODO Move *) | 
| 64272 | 579 | lemma abs_prod: "abs (prod f A :: 'a :: linordered_idom) = prod (\<lambda>x. abs (f x)) A" | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 580 | by (cases "finite A", induction A rule: finite_induct) (simp_all add: abs_mult) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 581 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 582 | lemma primes_characterization'_int [rule_format]: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 583 |   "finite {p. p \<ge> 0 \<and> 0 < f (p::int)} \<Longrightarrow> \<forall>p. 0 < f p \<longrightarrow> prime p \<Longrightarrow>
 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 584 |       prime_factors (\<Prod>p | p \<ge> 0 \<and> 0 < f p. p ^ f p) = {p. p \<ge> 0 \<and> 0 < f p}"
 | 
| 64272 | 585 | by (rule prime_factors_characterization_int) (auto simp: abs_prod prime_ge_0_int) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 586 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 587 | lemma multiplicity_characterization_nat: | 
| 63633 | 588 |   "S = {p. 0 < f (p::nat)} \<Longrightarrow> finite S \<Longrightarrow> \<forall>p\<in>S. prime p \<Longrightarrow> prime p \<Longrightarrow>
 | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 589 | n = (\<Prod>p\<in>S. p ^ f p) \<Longrightarrow> multiplicity p n = f p" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 590 | by (frule prime_factorization_unique_nat [of S f n, THEN conjunct2, rule_format, symmetric]) auto | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 591 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 592 | lemma multiplicity_characterization'_nat: "finite {p. 0 < f (p::nat)} \<longrightarrow>
 | 
| 63633 | 593 | (\<forall>p. 0 < f p \<longrightarrow> prime p) \<longrightarrow> prime p \<longrightarrow> | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 594 | multiplicity p (\<Prod>p | 0 < f p. p ^ f p) = f p" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 595 | by (intro impI, rule multiplicity_characterization_nat) auto | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 596 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 597 | lemma multiplicity_characterization_int: "S = {p. 0 < f (p::int)} \<Longrightarrow>
 | 
| 63633 | 598 | finite S \<Longrightarrow> \<forall>p\<in>S. prime p \<Longrightarrow> prime p \<Longrightarrow> n = (\<Prod>p\<in>S. p ^ f p) \<Longrightarrow> multiplicity p n = f p" | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 599 | by (frule prime_factorization_unique_int [of S f n, THEN conjunct2, rule_format, symmetric]) | 
| 64272 | 600 | (auto simp: abs_prod power_abs prime_ge_0_int intro!: prod.cong) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 601 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 602 | lemma multiplicity_characterization'_int [rule_format]: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 603 |   "finite {p. p \<ge> 0 \<and> 0 < f (p::int)} \<Longrightarrow>
 | 
| 63633 | 604 | (\<forall>p. 0 < f p \<longrightarrow> prime p) \<Longrightarrow> prime p \<Longrightarrow> | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 605 | multiplicity p (\<Prod>p | p \<ge> 0 \<and> 0 < f p. p ^ f p) = f p" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 606 | by (rule multiplicity_characterization_int) (auto simp: prime_ge_0_int) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 607 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 608 | lemma multiplicity_one_nat [simp]: "multiplicity p (Suc 0) = 0" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 609 | unfolding One_nat_def [symmetric] by (rule multiplicity_one) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 610 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 611 | lemma multiplicity_eq_nat: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 612 | fixes x and y::nat | 
| 63633 | 613 | assumes "x > 0" "y > 0" "\<And>p. prime p \<Longrightarrow> multiplicity p x = multiplicity p y" | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 614 | shows "x = y" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 615 | using multiplicity_eq_imp_eq[of x y] assms by simp | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 616 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 617 | lemma multiplicity_eq_int: | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 618 | fixes x y :: int | 
| 63633 | 619 | assumes "x > 0" "y > 0" "\<And>p. prime p \<Longrightarrow> multiplicity p x = multiplicity p y" | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 620 | shows "x = y" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 621 | using multiplicity_eq_imp_eq[of x y] assms by simp | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 622 | |
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 623 | lemma multiplicity_prod_prime_powers: | 
| 63633 | 624 | assumes "finite S" "\<And>x. x \<in> S \<Longrightarrow> prime x" "prime p" | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 625 | shows "multiplicity p (\<Prod>p \<in> S. p ^ f p) = (if p \<in> S then f p else 0)" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 626 | proof - | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 627 | define g where "g = (\<lambda>x. if x \<in> S then f x else 0)" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 628 | define A where "A = Abs_multiset g" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 629 |   have "{x. g x > 0} \<subseteq> S" by (auto simp: g_def)
 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 630 | from finite_subset[OF this assms(1)] have [simp]: "g : multiset" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 631 | by (simp add: multiset_def) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 632 | from assms have count_A: "count A x = g x" for x unfolding A_def | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 633 | by simp | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 634 |   have set_mset_A: "set_mset A = {x\<in>S. f x > 0}"
 | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 635 | unfolding set_mset_def count_A by (auto simp: g_def) | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 636 | with assms have prime: "prime x" if "x \<in># A" for x using that by auto | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 637 | from set_mset_A assms have "(\<Prod>p \<in> S. p ^ f p) = (\<Prod>p \<in> S. p ^ g p) " | 
| 64272 | 638 | by (intro prod.cong) (auto simp: g_def) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 639 | also from set_mset_A assms have "\<dots> = (\<Prod>p \<in> set_mset A. p ^ g p)" | 
| 64272 | 640 | by (intro prod.mono_neutral_right) (auto simp: g_def set_mset_A) | 
| 63830 | 641 | also have "\<dots> = prod_mset A" | 
| 64272 | 642 | by (auto simp: prod_mset_multiplicity count_A set_mset_A intro!: prod.cong) | 
| 63830 | 643 | also from assms have "multiplicity p \<dots> = sum_mset (image_mset (multiplicity p) A)" | 
| 644 | by (subst prime_elem_multiplicity_prod_mset_distrib) (auto dest: prime) | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 645 | also from assms have "image_mset (multiplicity p) A = image_mset (\<lambda>x. if x = p then 1 else 0) A" | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 646 | by (intro image_mset_cong) (auto simp: prime_multiplicity_other dest: prime) | 
| 63830 | 647 | also have "sum_mset \<dots> = (if p \<in> S then f p else 0)" by (simp add: sum_mset_delta count_A g_def) | 
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 648 | finally show ?thesis . | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 649 | qed | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 650 | |
| 63904 | 651 | lemma prime_factorization_prod_mset: | 
| 652 | assumes "0 \<notin># A" | |
| 653 | shows "prime_factorization (prod_mset A) = \<Union>#(image_mset prime_factorization A)" | |
| 654 | using assms by (induct A) (auto simp add: prime_factorization_mult) | |
| 655 | ||
| 64272 | 656 | lemma prime_factors_prod: | 
| 63904 | 657 | assumes "finite A" and "0 \<notin> f ` A" | 
| 64272 | 658 | shows "prime_factors (prod f A) = UNION A (prime_factors \<circ> f)" | 
| 659 | using assms by (simp add: prod_unfold_prod_mset prime_factorization_prod_mset) | |
| 63904 | 660 | |
| 661 | lemma prime_factors_fact: | |
| 662 |   "prime_factors (fact n) = {p \<in> {2..n}. prime p}" (is "?M = ?N")
 | |
| 663 | proof (rule set_eqI) | |
| 664 | fix p | |
| 665 |   { fix m :: nat
 | |
| 666 | assume "p \<in> prime_factors m" | |
| 667 | then have "prime p" and "p dvd m" by auto | |
| 668 | moreover assume "m > 0" | |
| 669 | ultimately have "2 \<le> p" and "p \<le> m" | |
| 670 | by (auto intro: prime_ge_2_nat dest: dvd_imp_le) | |
| 671 | moreover assume "m \<le> n" | |
| 672 | ultimately have "2 \<le> p" and "p \<le> n" | |
| 673 | by (auto intro: order_trans) | |
| 674 | } note * = this | |
| 675 | show "p \<in> ?M \<longleftrightarrow> p \<in> ?N" | |
| 64272 | 676 | by (auto simp add: fact_prod prime_factors_prod Suc_le_eq dest!: prime_prime_factors intro: *) | 
| 63904 | 677 | qed | 
| 678 | ||
| 63766 
695d60817cb1
Some facts about factorial and binomial coefficients
 Manuel Eberl <eberlm@in.tum.de> parents: 
63635diff
changeset | 679 | lemma prime_dvd_fact_iff: | 
| 
695d60817cb1
Some facts about factorial and binomial coefficients
 Manuel Eberl <eberlm@in.tum.de> parents: 
63635diff
changeset | 680 | assumes "prime p" | 
| 63904 | 681 | shows "p dvd fact n \<longleftrightarrow> p \<le> n" | 
| 682 | using assms | |
| 683 | by (auto simp add: prime_factorization_subset_iff_dvd [symmetric] | |
| 63905 | 684 | prime_factorization_prime prime_factors_fact prime_ge_2_nat) | 
| 63766 
695d60817cb1
Some facts about factorial and binomial coefficients
 Manuel Eberl <eberlm@in.tum.de> parents: 
63635diff
changeset | 685 | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 686 | (* TODO Legacy names *) | 
| 63633 | 687 | lemmas prime_imp_coprime_nat = prime_imp_coprime[where ?'a = nat] | 
| 688 | lemmas prime_imp_coprime_int = prime_imp_coprime[where ?'a = int] | |
| 689 | lemmas prime_dvd_mult_nat = prime_dvd_mult_iff[where ?'a = nat] | |
| 690 | lemmas prime_dvd_mult_int = prime_dvd_mult_iff[where ?'a = int] | |
| 691 | lemmas prime_dvd_mult_eq_nat = prime_dvd_mult_iff[where ?'a = nat] | |
| 692 | lemmas prime_dvd_mult_eq_int = prime_dvd_mult_iff[where ?'a = int] | |
| 693 | lemmas prime_dvd_power_nat = prime_dvd_power[where ?'a = nat] | |
| 694 | lemmas prime_dvd_power_int = prime_dvd_power[where ?'a = int] | |
| 695 | lemmas prime_dvd_power_nat_iff = prime_dvd_power_iff[where ?'a = nat] | |
| 696 | lemmas prime_dvd_power_int_iff = prime_dvd_power_iff[where ?'a = int] | |
| 697 | lemmas prime_imp_power_coprime_nat = prime_imp_power_coprime[where ?'a = nat] | |
| 698 | lemmas prime_imp_power_coprime_int = prime_imp_power_coprime[where ?'a = int] | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 699 | lemmas primes_coprime_nat = primes_coprime[where ?'a = nat] | 
| 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 700 | lemmas primes_coprime_int = primes_coprime[where ?'a = nat] | 
| 63633 | 701 | lemmas prime_divprod_pow_nat = prime_elem_divprod_pow[where ?'a = nat] | 
| 702 | lemmas prime_exp = prime_elem_power_iff[where ?'a = nat] | |
| 63534 
523b488b15c9
Overhaul of prime/multiplicity/prime_factors
 eberlm <eberlm@in.tum.de> parents: 
62481diff
changeset | 703 | |
| 65025 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 704 | text \<open>Code generation\<close> | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 705 | |
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 706 | context | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 707 | begin | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 708 | |
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 709 | qualified definition prime_nat :: "nat \<Rightarrow> bool" | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 710 | where [simp, code_abbrev]: "prime_nat = prime" | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 711 | |
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 712 | lemma prime_nat_naive [code]: | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 713 |   "prime_nat p \<longleftrightarrow> p > 1 \<and> (\<forall>n \<in>{1<..<p}. \<not> n dvd p)"
 | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 714 | by (auto simp add: prime_nat_iff') | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 715 | |
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 716 | qualified definition prime_int :: "int \<Rightarrow> bool" | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 717 | where [simp, code_abbrev]: "prime_int = prime" | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 718 | |
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 719 | lemma prime_int_naive [code]: | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 720 |   "prime_int p \<longleftrightarrow> p > 1 \<and> (\<forall>n \<in>{1<..<p}. \<not> n dvd p)"
 | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 721 | by (auto simp add: prime_int_iff') | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 722 | |
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 723 | lemma "prime(997::nat)" by eval | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 724 | |
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 725 | lemma "prime(997::int)" by eval | 
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 726 | |
| 63635 | 727 | end | 
| 65025 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 728 | |
| 
8c32ce2a01c6
explicit operations for executable primality checks
 haftmann parents: 
64911diff
changeset | 729 | end |