src/HOL/Algebra/IntRing.thy
changeset 55157 06897ea77f78
parent 49962 a8cc904a6820
child 55242 413ec965f95d
equal deleted inserted replaced
55131:9808f186795c 55157:06897ea77f78
     2     Author:     Stephan Hohe, TU Muenchen
     2     Author:     Stephan Hohe, TU Muenchen
     3     Author:     Clemens Ballarin
     3     Author:     Clemens Ballarin
     4 *)
     4 *)
     5 
     5 
     6 theory IntRing
     6 theory IntRing
     7 imports QuotRing Lattice Int "~~/src/HOL/Old_Number_Theory/Primes"
     7 imports QuotRing Lattice Int "~~/src/HOL/Number_Theory/Primes"
     8 begin
     8 begin
     9 
     9 
    10 section {* The Ring of Integers *}
    10 section {* The Ring of Integers *}
    11 
    11 
    12 subsection {* Some properties of @{typ int} *}
    12 subsection {* Some properties of @{typ int} *}
   255  apply clarsimp defer 1
   255  apply clarsimp defer 1
   256  apply (simp add: int.cgenideal_eq_genideal[symmetric] cgenideal_def)
   256  apply (simp add: int.cgenideal_eq_genideal[symmetric] cgenideal_def)
   257  apply (elim exE)
   257  apply (elim exE)
   258 proof -
   258 proof -
   259   fix a b x
   259   fix a b x
   260 
   260   have ppos: "0 <= p"
   261   from prime
   261     by (metis prime linear nat_0_iff zero_not_prime_nat)
   262       have ppos: "0 <= p" by (simp add: prime_def)
       
   263   have unnat: "!!x. nat p dvd nat (abs x) ==> p dvd x"
   262   have unnat: "!!x. nat p dvd nat (abs x) ==> p dvd x"
   264   proof -
   263   proof -
   265     fix x
   264     fix x
   266     assume "nat p dvd nat (abs x)"
   265     assume "nat p dvd nat (abs x)"
   267     hence "int (nat p) dvd x" by (simp add: int_dvd_iff[symmetric])
   266     hence "int (nat p) dvd x" by (simp add: int_dvd_iff[symmetric])
   268     thus "p dvd x" by (simp add: ppos)
   267     thus "p dvd x" by (simp add: ppos)
   269   qed
   268   qed
   270 
       
   271 
       
   272   assume "a * b = x * p"
   269   assume "a * b = x * p"
   273   hence "p dvd a * b" by simp
   270   hence "p dvd a * b" by simp
   274   hence "nat p dvd nat (abs (a * b))" using ppos by (simp add: nat_dvd_iff)
   271   hence "nat p dvd nat (abs (a * b))" using ppos by (simp add: nat_dvd_iff)
   275   hence "nat p dvd (nat (abs a) * nat (abs b))" by (simp add: nat_abs_mult_distrib)
   272   hence "nat p dvd (nat (abs a) * nat (abs b))" by (simp add: nat_abs_mult_distrib)
   276   hence "nat p dvd nat (abs a) | nat p dvd nat (abs b)" by (rule prime_dvd_mult[OF prime])
   273   hence "nat p dvd nat (abs a) | nat p dvd nat (abs b)"
       
   274     by (metis prime prime_dvd_mult_eq_nat) 
   277   hence "p dvd a | p dvd b" by (fast intro: unnat)
   275   hence "p dvd a | p dvd b" by (fast intro: unnat)
   278   thus "(EX x. a = x * p) | (EX x. b = x * p)"
   276   thus "(EX x. a = x * p) | (EX x. b = x * p)"
   279   proof
   277   proof
   280     assume "p dvd a"
   278     assume "p dvd a"
   281     hence "EX x. a = p * x" by (simp add: dvd_def)
   279     hence "EX x. a = p * x" by (simp add: dvd_def)
   282     from this obtain x
   280     then obtain x
   283         where "a = p * x" by fast
   281         where "a = p * x" by fast
   284     hence "a = x * p" by simp
   282     hence "a = x * p" by simp
   285     hence "EX x. a = x * p" by simp
   283     hence "EX x. a = x * p" by simp
   286     thus "(EX x. a = x * p) | (EX x. b = x * p)" ..
   284     thus "(EX x. a = x * p) | (EX x. b = x * p)" ..
   287   next
   285   next
   288     assume "p dvd b"
   286     assume "p dvd b"
   289     hence "EX x. b = p * x" by (simp add: dvd_def)
   287     hence "EX x. b = p * x" by (simp add: dvd_def)
   290     from this obtain x
   288     then obtain x
   291         where "b = p * x" by fast
   289         where "b = p * x" by fast
   292     hence "b = x * p" by simp
   290     hence "b = x * p" by simp
   293     hence "EX x. b = x * p" by simp
   291     hence "EX x. b = x * p" by simp
   294     thus "(EX x. a = x * p) | (EX x. b = x * p)" ..
   292     thus "(EX x. a = x * p) | (EX x. b = x * p)" ..
   295   qed
   293   qed
   296 next
   294 next
   297   assume "UNIV = {uu. EX x. uu = x * p}"
   295   assume "UNIV = {uu. EX x. uu = x * p}"
   298   from this obtain x 
   296   then obtain x where "1 = x * p" by best
   299       where "1 = x * p" by best
   297   then have "p * x = 1" by (metis mult_commute)
   300   from this [symmetric]
       
   301       have "p * x = 1" by (subst mult_commute)
       
   302   hence "\<bar>p * x\<bar> = 1" by simp
   298   hence "\<bar>p * x\<bar> = 1" by simp
   303   hence "\<bar>p\<bar> = 1" by (rule abs_zmult_eq_1)
   299   hence "\<bar>p\<bar> = 1" by (rule abs_zmult_eq_1)
   304   from this and prime
   300   then  show "False" 
   305       show "False" by (simp add: prime_def)
   301     by (metis prime abs_of_pos one_not_prime_int prime_gt_0_int prime_int_def) 
   306 qed
   302 qed
   307 
   303 
   308 
   304 
   309 subsection {* Ideals and Divisibility *}
   305 subsection {* Ideals and Divisibility *}
   310 
   306 
   353   assumes kIl: "k \<in> ZMod l r"
   349   assumes kIl: "k \<in> ZMod l r"
   354   shows "EX x. k = x * l + r"
   350   shows "EX x. k = x * l + r"
   355 proof -
   351 proof -
   356   from kIl[unfolded ZMod_def]
   352   from kIl[unfolded ZMod_def]
   357       have "\<exists>xl\<in>Idl\<^bsub>\<Z>\<^esub> {l}. k = xl + r" by (simp add: a_r_coset_defs)
   353       have "\<exists>xl\<in>Idl\<^bsub>\<Z>\<^esub> {l}. k = xl + r" by (simp add: a_r_coset_defs)
   358   from this obtain xl
   354   then obtain xl
   359       where xl: "xl \<in> Idl\<^bsub>\<Z>\<^esub> {l}"
   355       where xl: "xl \<in> Idl\<^bsub>\<Z>\<^esub> {l}"
   360       and k: "k = xl + r"
   356       and k: "k = xl + r"
   361       by auto
   357       by auto
   362   from xl obtain x
   358   from xl obtain x
   363       where "xl = x * l"
   359       where "xl = x * l"
   374   interpret ideal "Idl\<^bsub>\<Z>\<^esub> {m}" \<Z> by (rule int.genideal_ideal, fast)
   370   interpret ideal "Idl\<^bsub>\<Z>\<^esub> {m}" \<Z> by (rule int.genideal_ideal, fast)
   375   from zmods
   371   from zmods
   376       have "b \<in> ZMod m a"
   372       have "b \<in> ZMod m a"
   377       unfolding ZMod_def
   373       unfolding ZMod_def
   378       by (simp add: a_repr_independenceD)
   374       by (simp add: a_repr_independenceD)
   379   from this
   375   then
   380       have "EX x. b = x * m + a" by (rule rcos_zfact)
   376       have "EX x. b = x * m + a" by (rule rcos_zfact)
   381   from this obtain x
   377   then obtain x
   382       where "b = x * m + a"
   378       where "b = x * m + a"
   383       by fast
   379       by fast
   384 
   380 
   385   hence "b mod m = (x * m + a) mod m" by simp
   381   hence "b mod m = (x * m + a) mod m" by simp
   386   also
   382   also