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) |