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