src/HOL/NumberTheory/Gauss.thy
changeset 30837 3d4832d9f7e4
parent 30034 60f64f112174
equal deleted inserted replaced
30829:d64a293f23ba 30837:3d4832d9f7e4
   288 
   288 
   289 lemma all_A_relprime: "\<forall>x \<in> A. zgcd x p = 1"
   289 lemma all_A_relprime: "\<forall>x \<in> A. zgcd x p = 1"
   290   using p_prime p_minus_one_l by (auto simp add: A_def zless_zprime_imp_zrelprime)
   290   using p_prime p_minus_one_l by (auto simp add: A_def zless_zprime_imp_zrelprime)
   291 
   291 
   292 lemma A_prod_relprime: "zgcd (setprod id A) p = 1"
   292 lemma A_prod_relprime: "zgcd (setprod id A) p = 1"
   293   using all_A_relprime finite_A by (simp add: all_relprime_prod_relprime)
   293 by(rule all_relprime_prod_relprime[OF finite_A all_A_relprime])
   294 
   294 
   295 
   295 
   296 subsection {* Relationships Between Gauss Sets *}
   296 subsection {* Relationships Between Gauss Sets *}
   297 
   297 
   298 lemma B_card_eq_A: "card B = card A"
   298 lemma B_card_eq_A: "card B = card A"
   414     apply (frule_tac f = "op - p" in setprod_reindex_id, auto)
   414     apply (frule_tac f = "op - p" in setprod_reindex_id, auto)
   415     done
   415     done
   416   then have one:
   416   then have one:
   417     "[setprod id F = setprod (StandardRes p o (op - p)) E] (mod p)"
   417     "[setprod id F = setprod (StandardRes p o (op - p)) E] (mod p)"
   418     apply simp
   418     apply simp
   419     apply (insert p_g_0 finite_E)
   419     apply (insert p_g_0 finite_E StandardRes_prod)
   420     by (auto simp add: StandardRes_prod)
   420     by (auto)
   421   moreover have a: "\<forall>x \<in> E. [p - x = 0 - x] (mod p)"
   421   moreover have a: "\<forall>x \<in> E. [p - x = 0 - x] (mod p)"
   422     apply clarify
   422     apply clarify
   423     apply (insert zcong_id [of p])
   423     apply (insert zcong_id [of p])
   424     apply (rule_tac a = p and m = p and c = x and d = x in zcong_zdiff, auto)
   424     apply (rule_tac a = p and m = p and c = x and d = x in zcong_zdiff, auto)
   425     done
   425     done
   433     apply (rule_tac b = "p - x" in zcong_trans, auto)
   433     apply (rule_tac b = "p - x" in zcong_trans, auto)
   434     done
   434     done
   435   ultimately have c:
   435   ultimately have c:
   436     "[setprod (StandardRes p o (op - p)) E = setprod (uminus) E](mod p)"
   436     "[setprod (StandardRes p o (op - p)) E = setprod (uminus) E](mod p)"
   437     apply simp
   437     apply simp
   438     apply (insert finite_E p_g_0)
   438     using finite_E p_g_0
   439     apply (rule setprod_same_function_zcong
   439       setprod_same_function_zcong [of E "StandardRes p o (op - p)" uminus p]
   440       [of E "StandardRes p o (op - p)" uminus p], auto)
   440     by auto
   441     done
       
   442   then have two: "[setprod id F = setprod (uminus) E](mod p)"
   441   then have two: "[setprod id F = setprod (uminus) E](mod p)"
   443     apply (insert one c)
   442     apply (insert one c)
   444     apply (rule zcong_trans [of "setprod id F"
   443     apply (rule zcong_trans [of "setprod id F"
   445                                "setprod (StandardRes p o op - p) E" p
   444                                "setprod (StandardRes p o op - p) E" p
   446                                "setprod uminus E"], auto)
   445                                "setprod uminus E"], auto)
   461 
   460 
   462 theorem pre_gauss_lemma:
   461 theorem pre_gauss_lemma:
   463   "[a ^ nat((p - 1) div 2) = (-1) ^ (card E)] (mod p)"
   462   "[a ^ nat((p - 1) div 2) = (-1) ^ (card E)] (mod p)"
   464 proof -
   463 proof -
   465   have "[setprod id A = setprod id F * setprod id D](mod p)"
   464   have "[setprod id A = setprod id F * setprod id D](mod p)"
   466     by (auto simp add: prod_D_F_eq_prod_A zmult_commute)
   465     by (auto simp add: prod_D_F_eq_prod_A zmult_commute cong del:setprod_cong)
   467   then have "[setprod id A = ((-1)^(card E) * setprod id E) *
   466   then have "[setprod id A = ((-1)^(card E) * setprod id E) *
   468       setprod id D] (mod p)"
   467       setprod id D] (mod p)"
   469     apply (rule zcong_trans)
   468     apply (rule zcong_trans)
   470     apply (auto simp add: prod_F_zcong zcong_scalar)
   469     apply (auto simp add: prod_F_zcong zcong_scalar cong del: setprod_cong)
   471     done
   470     done
   472   then have "[setprod id A = ((-1)^(card E) * setprod id C)] (mod p)"
   471   then have "[setprod id A = ((-1)^(card E) * setprod id C)] (mod p)"
   473     apply (rule zcong_trans)
   472     apply (rule zcong_trans)
   474     apply (insert C_prod_eq_D_times_E, erule subst)
   473     apply (insert C_prod_eq_D_times_E, erule subst)
   475     apply (subst zmult_assoc, auto)
   474     apply (subst zmult_assoc, auto)
   476     done
   475     done
   477   then have "[setprod id A = ((-1)^(card E) * setprod id B)] (mod p)"
   476   then have "[setprod id A = ((-1)^(card E) * setprod id B)] (mod p)"
   478     apply (rule zcong_trans)
   477     apply (rule zcong_trans)
   479     apply (simp add: C_B_zcong_prod zcong_scalar2)
   478     apply (simp add: C_B_zcong_prod zcong_scalar2 cong del:setprod_cong)
   480     done
   479     done
   481   then have "[setprod id A = ((-1)^(card E) *
   480   then have "[setprod id A = ((-1)^(card E) *
   482     (setprod id ((%x. x * a) ` A)))] (mod p)"
   481     (setprod id ((%x. x * a) ` A)))] (mod p)"
   483     by (simp add: B_def)
   482     by (simp add: B_def)
   484   then have "[setprod id A = ((-1)^(card E) * (setprod (%x. x * a) A))]
   483   then have "[setprod id A = ((-1)^(card E) * (setprod (%x. x * a) A))]
   485     (mod p)"
   484     (mod p)"
   486     by (simp add:finite_A inj_on_xa_A setprod_reindex_id[symmetric])
   485     by (simp add:finite_A inj_on_xa_A setprod_reindex_id[symmetric] cong del:setprod_cong)
   487   moreover have "setprod (%x. x * a) A =
   486   moreover have "setprod (%x. x * a) A =
   488     setprod (%x. a) A * setprod id A"
   487     setprod (%x. a) A * setprod id A"
   489     using finite_A by (induct set: finite) auto
   488     using finite_A by (induct set: finite) auto
   490   ultimately have "[setprod id A = ((-1)^(card E) * (setprod (%x. a) A *
   489   ultimately have "[setprod id A = ((-1)^(card E) * (setprod (%x. a) A *
   491     setprod id A))] (mod p)"
   490     setprod id A))] (mod p)"
   504     apply (simp add: a mult_commute mult_left_commute)
   503     apply (simp add: a mult_commute mult_left_commute)
   505     done
   504     done
   506   then have "[setprod id A * (-1)^(card E) = setprod id A *
   505   then have "[setprod id A * (-1)^(card E) = setprod id A *
   507       a^(card A)](mod p)"
   506       a^(card A)](mod p)"
   508     apply (rule zcong_trans)
   507     apply (rule zcong_trans)
   509     apply (simp add: aux)
   508     apply (simp add: aux cong del:setprod_cong)
   510     done
   509     done
   511   with this zcong_cancel2 [of p "setprod id A" "-1 ^ card E" "a ^ card A"]
   510   with this zcong_cancel2 [of p "setprod id A" "-1 ^ card E" "a ^ card A"]
   512       p_g_0 A_prod_relprime have "[-1 ^ card E = a ^ card A](mod p)"
   511       p_g_0 A_prod_relprime have "[-1 ^ card E = a ^ card A](mod p)"
   513     by (simp add: order_less_imp_le)
   512     by (simp add: order_less_imp_le)
   514   from this show ?thesis
   513   from this show ?thesis