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 |