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 . } |