src/HOL/Library/Pocklington.thy
changeset 30240 5b25fee0362c
parent 29667 53103fc8ffa3
child 30242 aea5d7fa7ef5
equal deleted inserted replaced
30239:179ff9cb160b 30240:5b25fee0362c
   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