src/HOL/Number_Theory/Primes.thy
changeset 57512 cc97b347b301
parent 55337 5d45fb978d5a
child 58623 2db1df2c8467
equal deleted inserted replaced
57511:de51a86fc903 57512:cc97b347b301
   104   by (rule iffI, rule prime_dvd_mult_int, auto)
   104   by (rule iffI, rule prime_dvd_mult_int, auto)
   105 
   105 
   106 lemma not_prime_eq_prod_nat: "(n::nat) > 1 \<Longrightarrow> ~ prime n \<Longrightarrow>
   106 lemma not_prime_eq_prod_nat: "(n::nat) > 1 \<Longrightarrow> ~ prime n \<Longrightarrow>
   107     EX m k. n = m * k & 1 < m & m < n & 1 < k & k < n"
   107     EX m k. n = m * k & 1 < m & m < n & 1 < k & k < n"
   108   unfolding prime_nat_def dvd_def apply auto
   108   unfolding prime_nat_def dvd_def apply auto
   109   by (metis mult_commute linorder_neq_iff linorder_not_le mult_1
   109   by (metis mult.commute linorder_neq_iff linorder_not_le mult_1
   110       n_less_n_mult_m one_le_mult_iff less_imp_le_nat)
   110       n_less_n_mult_m one_le_mult_iff less_imp_le_nat)
   111 
   111 
   112 lemma prime_dvd_power_nat: "prime p \<Longrightarrow> p dvd x^n \<Longrightarrow> p dvd x"
   112 lemma prime_dvd_power_nat: "prime p \<Longrightarrow> p dvd x^n \<Longrightarrow> p dvd x"
   113   by (induct n) auto
   113   by (induct n) auto
   114 
   114 
   207       then have pnb: "coprime (p^n) b"
   207       then have pnb: "coprime (p^n) b"
   208         by (subst gcd_commute_nat, rule coprime_exp_nat)
   208         by (subst gcd_commute_nat, rule coprime_exp_nat)
   209       from coprime_dvd_mult_nat[OF pnb pab] have ?thesis by blast }
   209       from coprime_dvd_mult_nat[OF pnb pab] have ?thesis by blast }
   210     moreover
   210     moreover
   211     { assume pb: "p dvd b"
   211     { assume pb: "p dvd b"
   212       have pnba: "p^n dvd b*a" using pab by (simp add: mult_commute)
   212       have pnba: "p^n dvd b*a" using pab by (simp add: mult.commute)
   213       from coprime_common_divisor_nat [OF ab, of p] pb p have "\<not> p dvd a"
   213       from coprime_common_divisor_nat [OF ab, of p] pb p have "\<not> p dvd a"
   214         by auto
   214         by auto
   215       with p have "coprime a p"
   215       with p have "coprime a p"
   216         by (subst gcd_commute_nat, intro prime_imp_coprime_nat)
   216         by (subst gcd_commute_nat, intro prime_imp_coprime_nat)
   217       then have pna: "coprime (p^n) a"
   217       then have pna: "coprime (p^n) a"
   321     with d have "x = p^Suc i" by simp 
   321     with d have "x = p^Suc i" by simp 
   322     with ij(2) have ?case by blast}
   322     with ij(2) have ?case by blast}
   323   moreover 
   323   moreover 
   324   {assume px: "p dvd y"
   324   {assume px: "p dvd y"
   325     then obtain d where d: "y = p*d" unfolding dvd_def by blast
   325     then obtain d where d: "y = p*d" unfolding dvd_def by blast
   326     from Suc.prems d  have "p*d*x = p^Suc k" by (simp add: mult_commute)
   326     from Suc.prems d  have "p*d*x = p^Suc k" by (simp add: mult.commute)
   327     hence th: "d*x = p^k" using p0 by simp
   327     hence th: "d*x = p^k" using p0 by simp
   328     from Suc.hyps[OF th] obtain i j where ij: "d = p^i" "x = p^j" by blast
   328     from Suc.hyps[OF th] obtain i j where ij: "d = p^i" "x = p^j" by blast
   329     with d have "y = p^Suc i" by simp 
   329     with d have "y = p^Suc i" by simp 
   330     with ij(2) have ?case by blast}
   330     with ij(2) have ?case by blast}
   331   ultimately show ?case  using pxyc by blast
   331   ultimately show ?case  using pxyc by blast
   353   fixes p::nat
   353   fixes p::nat
   354   assumes p: "prime p" 
   354   assumes p: "prime p" 
   355   shows "d dvd p^k \<longleftrightarrow> (\<exists> i. i \<le> k \<and> d = p ^i)"
   355   shows "d dvd p^k \<longleftrightarrow> (\<exists> i. i \<le> k \<and> d = p ^i)"
   356 proof
   356 proof
   357   assume H: "d dvd p^k" then obtain e where e: "d*e = p^k" 
   357   assume H: "d dvd p^k" then obtain e where e: "d*e = p^k" 
   358     unfolding dvd_def  apply (auto simp add: mult_commute) by blast
   358     unfolding dvd_def  apply (auto simp add: mult.commute) by blast
   359   from prime_power_mult[OF p e] obtain i j where ij: "d = p^i" "e=p^j" by blast
   359   from prime_power_mult[OF p e] obtain i j where ij: "d = p^i" "e=p^j" by blast
   360   from e ij have "p^(i + j) = p^k" by (simp add: power_add)
   360   from e ij have "p^(i + j) = p^k" by (simp add: power_add)
   361   hence "i + j = k" using p prime_gt_1_nat power_inject_exp[of p "i+j" k] by simp 
   361   hence "i + j = k" using p prime_gt_1_nat power_inject_exp[of p "i+j" k] by simp 
   362   hence "i \<le> k" by arith
   362   hence "i \<le> k" by arith
   363   with ij(1) show "\<exists>i\<le>k. d = p ^ i" by blast
   363   with ij(1) show "\<exists>i\<le>k. d = p ^ i" by blast