140 |
140 |
141 lemma cong_mult: assumes xx': "[x = x'] (mod n)" and yy':"[y = y'] (mod n)" |
141 lemma cong_mult: assumes xx': "[x = x'] (mod n)" and yy':"[y = y'] (mod n)" |
142 shows "[x * y = x' * y'] (mod n)" |
142 shows "[x * y = x' * y'] (mod n)" |
143 proof- |
143 proof- |
144 have "(x * y) mod n = (x mod n) * (y mod n) mod n" |
144 have "(x * y) mod n = (x mod n) * (y mod n) mod n" |
145 by (simp add: mod_mult1_eq'[of x y n] mod_mult1_eq[of "x mod n" y n]) |
145 by (simp add: mod_mult_left_eq[of x y n] mod_mult_right_eq[of "x mod n" y n]) |
146 also have "\<dots> = (x' mod n) * (y' mod n) mod n" using xx'[unfolded modeq_def] yy'[unfolded modeq_def] by simp |
146 also have "\<dots> = (x' mod n) * (y' mod n) mod n" using xx'[unfolded modeq_def] yy'[unfolded modeq_def] by simp |
147 also have "\<dots> = (x' * y') mod n" |
147 also have "\<dots> = (x' * y') mod n" |
148 by (simp add: mod_mult1_eq'[of x' y' n] mod_mult1_eq[of "x' mod n" y' n]) |
148 by (simp add: mod_mult_left_eq[of x' y' n] mod_mult_right_eq[of "x' mod n" y' n]) |
149 finally show ?thesis unfolding modeq_def . |
149 finally show ?thesis unfolding modeq_def . |
150 qed |
150 qed |
151 |
151 |
152 lemma cong_exp: "[x = y] (mod n) \<Longrightarrow> [x^k = y^k] (mod n)" |
152 lemma cong_exp: "[x = y] (mod n) \<Longrightarrow> [x^k = y^k] (mod n)" |
153 by (induct k, auto simp add: cong_refl cong_mult) |
153 by (induct k, auto simp add: cong_refl cong_mult) |
294 proof- |
294 proof- |
295 let ?P = "\<lambda>x. x < n \<and> [a * x = b] (mod n)" |
295 let ?P = "\<lambda>x. x < n \<and> [a * x = b] (mod n)" |
296 from cong_solve[OF an] obtain x where x: "[a*x = b] (mod n)" by blast |
296 from cong_solve[OF an] obtain x where x: "[a*x = b] (mod n)" by blast |
297 let ?x = "x mod n" |
297 let ?x = "x mod n" |
298 from x have th: "[a * ?x = b] (mod n)" |
298 from x have th: "[a * ?x = b] (mod n)" |
299 by (simp add: modeq_def mod_mult1_eq[of a x n]) |
299 by (simp add: modeq_def mod_mult_right_eq[of a x n]) |
300 from mod_less_divisor[ of n x] nz th have Px: "?P ?x" by simp |
300 from mod_less_divisor[ of n x] nz th have Px: "?P ?x" by simp |
301 {fix y assume Py: "y < n" "[a * y = b] (mod n)" |
301 {fix y assume Py: "y < n" "[a * y = b] (mod n)" |
302 from Py(2) th have "[a * y = a*?x] (mod n)" by (simp add: modeq_def) |
302 from Py(2) th have "[a * y = a*?x] (mod n)" by (simp add: modeq_def) |
303 hence "[y = ?x] (mod n)" by (simp add: cong_mult_lcancel_eq[OF an]) |
303 hence "[y = ?x] (mod n)" by (simp add: cong_mult_lcancel_eq[OF an]) |
304 with mod_less[OF Py(1)] mod_less_divisor[ of n x] nz |
304 with mod_less[OF Py(1)] mod_less_divisor[ of n x] nz |
751 proof(induct n) |
751 proof(induct n) |
752 case 0 thus ?case by simp |
752 case 0 thus ?case by simp |
753 next |
753 next |
754 case (Suc n) |
754 case (Suc n) |
755 have "(x mod m)^(Suc n) mod m = ((x mod m) * (((x mod m) ^ n) mod m)) mod m" |
755 have "(x mod m)^(Suc n) mod m = ((x mod m) * (((x mod m) ^ n) mod m)) mod m" |
756 by (simp add: mod_mult1_eq[symmetric]) |
756 by (simp add: mod_mult_right_eq[symmetric]) |
757 also have "\<dots> = ((x mod m) * (x^n mod m)) mod m" using Suc.hyps by simp |
757 also have "\<dots> = ((x mod m) * (x^n mod m)) mod m" using Suc.hyps by simp |
758 also have "\<dots> = x^(Suc n) mod m" |
758 also have "\<dots> = x^(Suc n) mod m" |
759 by (simp add: mod_mult1_eq'[symmetric] mod_mult1_eq[symmetric]) |
759 by (simp add: mod_mult_left_eq[symmetric] mod_mult_right_eq[symmetric]) |
760 finally show ?case . |
760 finally show ?case . |
761 qed |
761 qed |
762 |
762 |
763 lemma lucas: |
763 lemma lucas: |
764 assumes n2: "n \<ge> 2" and an1: "[a^(n - 1) = 1] (mod n)" |
764 assumes n2: "n \<ge> 2" and an1: "[a^(n - 1) = 1] (mod n)" |
871 from H[unfolded coprime] |
871 from H[unfolded coprime] |
872 obtain p where p: "p dvd n" "p dvd a" "p \<noteq> 1" by auto |
872 obtain p where p: "p dvd n" "p dvd a" "p \<noteq> 1" by auto |
873 from lh[unfolded nat_mod] |
873 from lh[unfolded nat_mod] |
874 obtain q1 q2 where q12:"a ^ d + n * q1 = 1 + n * q2" by blast |
874 obtain q1 q2 where q12:"a ^ d + n * q1 = 1 + n * q2" by blast |
875 hence "a ^ d + n * q1 - n * q2 = 1" by simp |
875 hence "a ^ d + n * q1 - n * q2 = 1" by simp |
876 with dvd_diff [OF dvd_add [OF divides_rexp[OF p(2), of d'] dvd_mult2[OF p(1), of q1]] dvd_mult2[OF p(1), of q2]] d' have "p dvd 1" by simp |
876 with nat_dvd_diff [OF dvd_add [OF divides_rexp[OF p(2), of d'] dvd_mult2[OF p(1), of q1]] dvd_mult2[OF p(1), of q2]] d' have "p dvd 1" by simp |
877 with p(3) have False by simp |
877 with p(3) have False by simp |
878 hence ?rhs ..} |
878 hence ?rhs ..} |
879 ultimately have ?rhs by blast} |
879 ultimately have ?rhs by blast} |
880 moreover |
880 moreover |
881 {assume H: "coprime n a" |
881 {assume H: "coprime n a" |
889 from mod_div_equality[of d "ord n a"] lh |
889 from mod_div_equality[of d "ord n a"] lh |
890 have "[a^(?o*?q + ?r) = 1] (mod n)" by (simp add: modeq_def mult_commute) |
890 have "[a^(?o*?q + ?r) = 1] (mod n)" by (simp add: modeq_def mult_commute) |
891 hence "[(a^?o)^?q * (a^?r) = 1] (mod n)" |
891 hence "[(a^?o)^?q * (a^?r) = 1] (mod n)" |
892 by (simp add: modeq_def power_mult[symmetric] power_add[symmetric]) |
892 by (simp add: modeq_def power_mult[symmetric] power_add[symmetric]) |
893 hence th: "[a^?r = 1] (mod n)" |
893 hence th: "[a^?r = 1] (mod n)" |
894 using eqo mod_mult1_eq'[of "(a^?o)^?q" "a^?r" n] |
894 using eqo mod_mult_left_eq[of "(a^?o)^?q" "a^?r" n] |
895 apply (simp add: modeq_def del: One_nat_def) |
895 apply (simp add: modeq_def del: One_nat_def) |
896 by (simp add: mod_mult1_eq'[symmetric]) |
896 by (simp add: mod_mult_left_eq[symmetric]) |
897 {assume r: "?r = 0" hence ?rhs by (simp add: dvd_eq_mod_eq_0)} |
897 {assume r: "?r = 0" hence ?rhs by (simp add: dvd_eq_mod_eq_0)} |
898 moreover |
898 moreover |
899 {assume r: "?r \<noteq> 0" |
899 {assume r: "?r \<noteq> 0" |
900 with mod_less_divisor[OF op, of d] have r0o:"?r >0 \<and> ?r < ?o" by simp |
900 with mod_less_divisor[OF op, of d] have r0o:"?r >0 \<and> ?r < ?o" by simp |
901 from conjunct2[OF ord_works[of a n], rule_format, OF r0o] th |
901 from conjunct2[OF ord_works[of a n], rule_format, OF r0o] th |