src/HOL/Old_Number_Theory/Pocklington.thy
changeset 57129 7edb7550663e
parent 56073 29e308b56d23
child 57418 6ab1c7cb0b8d
equal deleted inserted replaced
57128:4874411752fe 57129:7edb7550663e
    16 
    16 
    17 lemma modeq_trans:
    17 lemma modeq_trans:
    18   "\<lbrakk> [a = b] (mod p); [b = c] (mod p) \<rbrakk> \<Longrightarrow> [a = c] (mod p)"
    18   "\<lbrakk> [a = b] (mod p); [b = c] (mod p) \<rbrakk> \<Longrightarrow> [a = c] (mod p)"
    19   by (simp add:modeq_def)
    19   by (simp add:modeq_def)
    20 
    20 
       
    21 lemma modeq_sym[sym]:
       
    22   "[a = b] (mod p) \<Longrightarrow> [b = a] (mod p)"
       
    23   unfolding modeq_def by simp
       
    24 
       
    25 lemma modneq_sym[sym]:
       
    26   "[a \<noteq> b] (mod p) \<Longrightarrow> [b \<noteq> a] (mod p)"
       
    27   by (simp add: modneq_def)
    21 
    28 
    22 lemma nat_mod_lemma: assumes xyn: "[x = y] (mod n)" and xy:"y \<le> x"
    29 lemma nat_mod_lemma: assumes xyn: "[x = y] (mod n)" and xy:"y \<le> x"
    23   shows "\<exists>q. x = y + n * q"
    30   shows "\<exists>q. x = y + n * q"
    24 using xyn xy unfolding modeq_def using nat_mod_eq_lemma by blast
    31 using xyn xy unfolding modeq_def using nat_mod_eq_lemma by blast
    25 
    32 
   595     hence Sn: "\<forall>m\<in> ?S. coprime (a*m) n " by blast
   602     hence Sn: "\<forall>m\<in> ?S. coprime (a*m) n " by blast
   596     from coprime_nproduct[OF fS, of n "\<lambda>m. m"] have nP:"coprime ?P n"
   603     from coprime_nproduct[OF fS, of n "\<lambda>m. m"] have nP:"coprime ?P n"
   597       by (simp add: coprime_commute)
   604       by (simp add: coprime_commute)
   598     have Paphi: "[?P*a^ (\<phi> n) = ?P*1] (mod n)"
   605     have Paphi: "[?P*a^ (\<phi> n) = ?P*1] (mod n)"
   599     proof-
   606     proof-
   600       let ?h = "\<lambda>m. m mod n"
   607       let ?h = "\<lambda>m. (a * m) mod n"
   601       {fix m assume mS: "m\<in> ?S"
   608       
   602         hence "?h m \<in> ?S" by simp}
   609       have eq0: "(\<Prod>i\<in>?S. ?h i) = (\<Prod>i\<in>?S. i)"
   603       hence hS: "?h ` ?S = ?S"by (auto simp add: image_iff)
   610       proof (rule setprod.reindex_bij_betw)
   604       have "a\<noteq>0" using an n1 nz apply- apply (rule ccontr) by simp
   611         have "inj_on (\<lambda>i. ?h i) ?S"
   605       hence inj: "inj_on (op * a) ?S" unfolding inj_on_def by simp
   612         proof (rule inj_onI)
   606       have eq0: "setprod (?h \<circ> op * a) {m. coprime m n \<and> m < n} = setprod (\<lambda>m. m) {m. coprime m n \<and> m < n}"
   613           fix x y assume "?h x = ?h y"
   607       proof (rule setprod.eq_general [where h="?h o (op * a)"])
   614           then have "[a * x = a * y] (mod n)"
   608         {fix y assume yS: "y \<in> ?S" hence y: "coprime y n" "y < n" by simp_all
   615             by (simp add: modeq_def)
   609           from cong_solve_unique[OF an nz, of y]
   616           moreover assume "x \<in> ?S" "y \<in> ?S"
   610           obtain x where x:"x < n" "[a * x = y] (mod n)" "\<forall>z. z < n \<and> [a * z = y] (mod n) \<longrightarrow> z=x" by blast
   617           ultimately show "x = y"
   611           from cong_coprime[OF x(2)] y(1)
   618             by (auto intro: cong_imp_eq cong_mult_lcancel an)
   612           have xm: "coprime x n" by (simp add: coprime_mul_eq coprime_commute)
   619         qed
   613           {fix z assume "z \<in> ?S" "(?h \<circ> op * a) z = y"
   620         moreover have "?h ` ?S = ?S"
   614             hence z: "coprime z n" "z < n" "(?h \<circ> op * a) z = y" by simp_all
   621         proof safe
   615             from x(3)[rule_format, of z] z(2,3) have "z=x"
   622           fix y assume "coprime y n" then show "coprime (?h y) n"
   616               unfolding modeq_def mod_less[OF y(2)] by simp}
   623             by (metis an nz coprime_commute coprime_mod coprime_mul_eq)
   617           with xm x(1,2) have "\<exists>!x. x \<in> ?S \<and> (?h \<circ> op * a) x = y"
   624         next
   618             unfolding modeq_def mod_less[OF y(2)] by safe auto }
   625           fix y assume y: "coprime y n" "y < n"
   619         thus "\<forall>y\<in>{m. coprime m n \<and> m < n}.
   626           from cong_solve_unique[OF an nz] obtain x where x: "x < n" "[a * x = y] (mod n)"
   620        \<exists>!x. x \<in> {m. coprime m n \<and> m < n} \<and> ((\<lambda>m. m mod n) \<circ> op * a) x = y" by blast
   627             by blast
   621       next
   628           then show "y \<in> ?h ` ?S"
   622         {fix x assume xS: "x\<in> ?S"
   629             using cong_coprime[OF x(2)] coprime_mul_eq[of n a x] an y x
   623           hence x: "coprime x n" "x < n" by simp_all
   630             by (intro image_eqI[of _ _ x]) (auto simp add: coprime_commute modeq_def)
   624           with an have "coprime (a*x) n"
   631         qed (insert nz, simp)
   625             by (simp add: coprime_mul_eq[of n a x] coprime_commute)
   632         ultimately show "bij_betw ?h ?S ?S"
   626           hence "?h (a*x) \<in> ?S" using nz
   633           by (simp add: bij_betw_def)
   627             by (simp add: coprime_mod[OF nz])}
       
   628         thus " \<forall>x\<in>{m. coprime m n \<and> m < n}.
       
   629        ((\<lambda>m. m mod n) \<circ> op * a) x \<in> {m. coprime m n \<and> m < n} \<and>
       
   630        ((\<lambda>m. m mod n) \<circ> op * a) x = ((\<lambda>m. m mod n) \<circ> op * a) x" by simp
       
   631       qed
   634       qed
   632       from nproduct_mod[OF fS nz, of "op * a"]
   635       from nproduct_mod[OF fS nz, of "op * a"]
   633       have "[(setprod (op *a) ?S) = (setprod (?h o (op * a)) ?S)] (mod n)"
   636       have "[(\<Prod>i\<in>?S. a * i) = (\<Prod>i\<in>?S. ?h i)] (mod n)"
   634         unfolding o_def
       
   635         by (simp add: cong_commute)
   637         by (simp add: cong_commute)
   636       also have "[setprod (?h o (op * a)) ?S = ?P ] (mod n)"
   638       also have "[(\<Prod>i\<in>?S. ?h i) = ?P] (mod n)"
   637         using eq0 fS an by (simp add: setprod_def modeq_def o_def)
   639         using eq0 fS an by (simp add: setprod_def modeq_def)
   638       finally show "[?P*a^ (\<phi> n) = ?P*1] (mod n)"
   640       finally show "[?P*a^ (\<phi> n) = ?P*1] (mod n)"
   639         unfolding cardfS mult_commute[of ?P "a^ (card ?S)"]
   641         unfolding cardfS mult_commute[of ?P "a^ (card ?S)"]
   640           nproduct_cmul[OF fS, symmetric] mult_1_right by simp
   642           nproduct_cmul[OF fS, symmetric] mult_1_right by simp
   641     qed
   643     qed
   642     from cong_mult_lcancel[OF nP Paphi] have ?thesis . }
   644     from cong_mult_lcancel[OF nP Paphi] have ?thesis . }