src/HOL/Old_Number_Theory/Gauss.thy
changeset 63566 e5abbdee461a
parent 61382 efac889fccbc
child 64240 eabf80376aab
equal deleted inserted replaced
63560:3e3097ac37d1 63566:e5abbdee461a
   441 
   441 
   442 theorem pre_gauss_lemma:
   442 theorem pre_gauss_lemma:
   443   "[a ^ nat((p - 1) div 2) = (-1) ^ (card E)] (mod p)"
   443   "[a ^ nat((p - 1) div 2) = (-1) ^ (card E)] (mod p)"
   444 proof -
   444 proof -
   445   have "[setprod id A = setprod id F * setprod id D](mod p)"
   445   have "[setprod id A = setprod id F * setprod id D](mod p)"
   446     by (auto simp add: prod_D_F_eq_prod_A mult.commute cong del:setprod.cong)
   446     by (auto simp add: prod_D_F_eq_prod_A mult.commute cong del: setprod.strong_cong)
   447   then have "[setprod id A = ((-1)^(card E) * setprod id E) *
   447   then have "[setprod id A = ((-1)^(card E) * setprod id E) *
   448       setprod id D] (mod p)"
   448       setprod id D] (mod p)"
   449     apply (rule zcong_trans)
   449     by (rule zcong_trans) (auto simp add: prod_F_zcong zcong_scalar cong del: setprod.strong_cong)
   450     apply (auto simp add: prod_F_zcong zcong_scalar cong del: setprod.cong)
       
   451     done
       
   452   then have "[setprod id A = ((-1)^(card E) * setprod id C)] (mod p)"
   450   then have "[setprod id A = ((-1)^(card E) * setprod id C)] (mod p)"
   453     apply (rule zcong_trans)
   451     apply (rule zcong_trans)
   454     apply (insert C_prod_eq_D_times_E, erule subst)
   452     apply (insert C_prod_eq_D_times_E, erule subst)
   455     apply (subst mult.assoc, auto)
   453     apply (subst mult.assoc)
       
   454     apply auto
   456     done
   455     done
   457   then have "[setprod id A = ((-1)^(card E) * setprod id B)] (mod p)"
   456   then have "[setprod id A = ((-1)^(card E) * setprod id B)] (mod p)"
   458     apply (rule zcong_trans)
   457     apply (rule zcong_trans)
   459     apply (simp add: C_B_zcong_prod zcong_scalar2 cong del:setprod.cong)
   458     apply (simp add: C_B_zcong_prod zcong_scalar2 cong del: setprod.strong_cong)
   460     done
   459     done
   461   then have "[setprod id A = ((-1)^(card E) *
   460   then have "[setprod id A = ((-1)^(card E) *
   462     (setprod id ((%x. x * a) ` A)))] (mod p)"
   461     (setprod id ((%x. x * a) ` A)))] (mod p)"
   463     by (simp add: B_def)
   462     by (simp add: B_def)
   464   then have "[setprod id A = ((-1)^(card E) * (setprod (%x. x * a) A))]
   463   then have "[setprod id A = ((-1)^(card E) * (setprod (%x. x * a) A))]
   465     (mod p)"
   464     (mod p)"
   466     by (simp add:finite_A inj_on_xa_A setprod.reindex cong del:setprod.cong)
   465     by (simp add:finite_A inj_on_xa_A setprod.reindex cong del: setprod.strong_cong)
   467   moreover have "setprod (%x. x * a) A =
   466   moreover have "setprod (%x. x * a) A =
   468     setprod (%x. a) A * setprod id A"
   467     setprod (%x. a) A * setprod id A"
   469     using finite_A by (induct set: finite) auto
   468     using finite_A by (induct set: finite) auto
   470   ultimately have "[setprod id A = ((-1)^(card E) * (setprod (%x. a) A *
   469   ultimately have "[setprod id A = ((-1)^(card E) * (setprod (%x. a) A *
   471     setprod id A))] (mod p)"
   470     setprod id A))] (mod p)"
   472     by simp
   471     by simp
   473   then have "[setprod id A = ((-1)^(card E) * a^(card A) *
   472   then have "[setprod id A = ((-1)^(card E) * a^(card A) *
   474       setprod id A)](mod p)"
   473       setprod id A)](mod p)"
   475     apply (rule zcong_trans)
   474     by (rule zcong_trans) (simp add: zcong_scalar2 zcong_scalar finite_A setprod_constant mult.assoc)
   476     apply (simp add: zcong_scalar2 zcong_scalar finite_A setprod_constant mult.assoc)
       
   477     done
       
   478   then have a: "[setprod id A * (-1)^(card E) =
   475   then have a: "[setprod id A * (-1)^(card E) =
   479       ((-1)^(card E) * a^(card A) * setprod id A * (-1)^(card E))](mod p)"
   476       ((-1)^(card E) * a^(card A) * setprod id A * (-1)^(card E))](mod p)"
   480     by (rule zcong_scalar)
   477     by (rule zcong_scalar)
   481   then have "[setprod id A * (-1)^(card E) = setprod id A *
   478   then have "[setprod id A * (-1)^(card E) = setprod id A *
   482       (-1)^(card E) * a^(card A) * (-1)^(card E)](mod p)"
   479       (-1)^(card E) * a^(card A) * (-1)^(card E)](mod p)"
   483     apply (rule zcong_trans)
   480     by (rule zcong_trans) (simp add: a mult.commute mult.left_commute)
   484     apply (simp add: a mult.commute mult.left_commute)
       
   485     done
       
   486   then have "[setprod id A * (-1)^(card E) = setprod id A *
   481   then have "[setprod id A * (-1)^(card E) = setprod id A *
   487       a^(card A)](mod p)"
   482       a^(card A)](mod p)"
   488     apply (rule zcong_trans)
   483     by (rule zcong_trans) (simp add: aux cong del: setprod.strong_cong)
   489     apply (simp add: aux cong del:setprod.cong)
       
   490     done
       
   491   with this zcong_cancel2 [of p "setprod id A" "(- 1) ^ card E" "a ^ card A"]
   484   with this zcong_cancel2 [of p "setprod id A" "(- 1) ^ card E" "a ^ card A"]
   492       p_g_0 A_prod_relprime have "[(- 1) ^ card E = a ^ card A](mod p)"
   485       p_g_0 A_prod_relprime have "[(- 1) ^ card E = a ^ card A](mod p)"
   493     by (simp add: order_less_imp_le)
   486     by (simp add: order_less_imp_le)
   494   from this show ?thesis
   487   from this show ?thesis
   495     by (simp add: A_card_eq zcong_sym)
   488     by (simp add: A_card_eq zcong_sym)