# HG changeset patch # User haftmann # Date 1486850013 -3600 # Node ID 8c32ce2a01c6de248fadfd7b6f1ce76f0c54f2a0 # Parent 3cb8013913538527ca44e44376b2d9f4c6a7f5c0 explicit operations for executable primality checks diff -r 3cb801391353 -r 8c32ce2a01c6 src/HOL/Number_Theory/Primes.thy --- a/src/HOL/Number_Theory/Primes.thy Sat Feb 11 22:53:31 2017 +0100 +++ b/src/HOL/Number_Theory/Primes.thy Sat Feb 11 22:53:33 2017 +0100 @@ -259,66 +259,50 @@ unfolding One_nat_def [symmetric] by (rule not_prime_1) lemma prime_nat_iff': - "prime (p :: nat) \ p > 1 \ (\n \ {1<.. p > 1 \ (\n \ {2.. 1" and *: "\n\{1<..n dvd p" + assume "p > 1" and *: "\n\{2..n dvd p" show "prime p" unfolding prime_nat_iff proof (intro conjI allI impI) fix m assume "m dvd p" with \p > 1\ have "m \ 0" by (intro notI) auto hence "m \ 1" by simp - moreover from \m dvd p\ and * have "m \ {1<..m dvd p\ and * have "m \ {2..m dvd p\ and \p > 1\ have "m \ 1 \ m = p" by (auto dest: dvd_imp_le) ultimately show "m = 1 \ m = p" by simp qed fact+ qed (auto simp: prime_nat_iff) -lemma prime_nat_code [code_unfold]: - "(prime :: nat \ bool) = (\p. p > 1 \ (\n \ {1<.. p > 1 \ (\n \ {1<.. p > 1 \ (\n \ {2.. bool) = (\p. p > 1 \ (\n \ {1<.. p > 1 \ (\n \ set [2.. n dvd p)" - by (auto simp add: prime_nat_code) - -lemma prime_int_simp: - "prime (p::int) \ p > 1 \ (\n \ {2.. n dvd p)" - by (auto simp add: prime_int_code) - lemma prime_int_numeral_eq [simp]: "prime (numeral m :: int) \ prime (numeral m :: nat)" by (simp add: prime_int_nat_transfer) lemma two_is_prime_nat [simp]: "prime (2::nat)" - by (simp add: prime_nat_simp) + by (simp add: prime_nat_iff') lemma prime_nat_numeral_eq [simp]: "prime (numeral m :: nat) \ (1::nat) < numeral m \ - (\n::nat\set [2.. n dvd numeral m)" - by (fact prime_nat_simp) \ \TODO Sieve Of Erathosthenes might speed this up\ + (\n::nat \ set [2.. n dvd numeral m)" + by (simp only: prime_nat_iff' set_upt) \ \TODO Sieve Of Erathosthenes might speed this up\ text\A bit of regression testing:\ lemma "prime(97::nat)" by simp -lemma "prime(997::nat)" by eval lemma "prime(97::int)" by simp -lemma "prime(997::int)" by eval lemma prime_factor_nat: "n \ (1::nat) \ \p. prime p \ p dvd n" @@ -713,4 +697,29 @@ lemmas prime_divprod_pow_nat = prime_elem_divprod_pow[where ?'a = nat] lemmas prime_exp = prime_elem_power_iff[where ?'a = nat] +text \Code generation\ + +context +begin + +qualified definition prime_nat :: "nat \ bool" + where [simp, code_abbrev]: "prime_nat = prime" + +lemma prime_nat_naive [code]: + "prime_nat p \ p > 1 \ (\n \{1<.. n dvd p)" + by (auto simp add: prime_nat_iff') + +qualified definition prime_int :: "int \ bool" + where [simp, code_abbrev]: "prime_int = prime" + +lemma prime_int_naive [code]: + "prime_int p \ p > 1 \ (\n \{1<.. n dvd p)" + by (auto simp add: prime_int_iff') + +lemma "prime(997::nat)" by eval + +lemma "prime(997::int)" by eval + end + +end