theory LittleFermat imports "Primefactors" begin section {* Group Zp *} constdefs Z::"nat \ nat set" "Z p \ set (upt 0 p)" constdefs modeq:: "nat => nat => nat => bool" ("(1[_ = _] '(mod _'))") "[a = b] (mod p) == ((a mod p) = (b mod p))" constdefs modneq:: "nat => nat => nat => bool" ("(1[_ ~= _] '(mod _'))") "[a ~= b] (mod p) == ((a mod p) ~= (b mod p))" lemma modeq_trans: "\ [a = b] (mod p); [b = c] (mod p) \ \ [a = c] (mod p)" by (simp add:modeq_def) lemma in_Zp_upper_bound: "x \ Z p \ x < p" by (simp add:Z_def) (* FIME: Move to standard library? *) lemma mod_mult: "\ (a::nat) mod p = b mod p; a' mod p = b' mod p \ \ (a * a') mod p = (b * b') mod p" apply (subgoal_tac "a * a' mod p = a mod p * (a' mod p) mod p") prefer 2 apply (rule mod_mult_distrib_mod) apply(subgoal_tac "b * b' mod p = b mod p * (b' mod p) mod p") prefer 2 apply (rule mod_mult_distrib_mod) apply simp done lemma modeq_pow: "[a = b] (mod p) \ [a^k = b^k] (mod p)" apply (induct k) apply (simp add: modeq_def) apply (simp add: modeq_def) apply (rule mod_mult) apply simp apply simp done lemma finite_Zp: "finite (Z p)" apply (induct p) apply (simp add: Z_def) apply (simp add: Z_def) done lemma card_Zp: "card (Z p) = p" apply (induct p) apply (simp add: Z_def) apply (subgoal_tac "finite (Z p)") prefer 2 apply (rule finite_Zp) apply (simp add: Z_def) done lemma card_Zp_0: "card (Z p - {0}) = p - 1" apply (induct p) apply (simp add: Z_def) apply (subgoal_tac "finite (Z p - {0})") prefer 2 apply (subgoal_tac "finite (Z p)") prefer 2 apply (rule finite_Zp) apply simp apply (simp add: Z_def) apply (case_tac "p = 0") apply simp apply (subgoal_tac "insert p {k. k < p} - {0} = insert p ({k. k < p} - {0})") prefer 2 apply (rule sym) apply blast apply simp done lemma Little_Fermat_l2r: "p \ prime \ (\x \ (Z p - {0}). [x^(p - 1) = 1] (mod p))" sorry lemma Little_Fermat_r2l: "(\x \ (Z p - {0}). [x^(p - 1) = 1] (mod p)) \ p \ prime" sorry theorem Little_Fermat: "p \ prime = (\x \ (Z p - {0}). [x^(p - 1) = 1] (mod p))" apply (rule iffI) apply (rule Little_Fermat_l2r, assumption) apply (rule Little_Fermat_r2l, assumption) done section {* Generators *} constdefs generators::"nat set \ nat \ nat set" "generators Zp p \ {g. g \ Zp \ (\x \ Zp. \ k. [x = g^k] (mod p))}" lemma generator_check: "1 < p \ g \ generators (Z p - {0}) p = (\ k. 0 < k \ k < (p - 1) \ [g^k ~= 1] (mod p)) \ [g ^ (p - 1) = 1] (mod p)" sorry constdefs onelogs::"nat \ nat \ nat set" "onelogs x p \ {i. 0 < i \ [x^i = 1] (mod p)}" constdefs minN:: "nat set \ nat" "minN S \ LeastM (\ x. x) (\ x. x \ S)" lemma minN_in: "S \ {} \ minN S \ S" apply (subgoal_tac "\ x. x \ S") prefer 2 apply blast apply (erule exE) apply (simp only: minN_def) apply (drule_tac P="\ x. x \ S" and k="x" and m="\ x. x" in LeastM_natI) apply simp done lemma minN_least: "\ x \ S. minN S \ x" apply (rule ballI) apply (drule_tac P="\ x. x \ S" and m="\ x. x" in LeastM_nat_le) apply (simp add: minN_def) done constdefs order::"nat \ nat \ nat" "order x p \ minN (onelogs x p)" lemma onelogs_exist: "0 < x \ 0 < p \ gcd (x,p) = 1 \ onelogs x p \ {}" sorry lemma order_l_p: "onelogs x p \ {} \ order x p < p" sorry lemma order_g_0: "onelogs x p \ {} \ 0 < order x p" apply (simp add: order_def) apply (subgoal_tac "minN (onelogs x p) \ onelogs x p") prefer 2 apply (rule minN_in) apply assumption apply (simp add:onelogs_def) done lemma order_is_onelog: "onelogs x p \ {} \ [x^(order x p) = 1] (mod p)" apply (subgoal_tac "minN (onelogs x p) \ onelogs x p") prefer 2 apply (rule minN_in) apply assumption apply (simp add: onelogs_def order_def) done lemma order_minimal: "a \ onelogs x p \ order x p \ a" apply (subgoal_tac "\ a \ (onelogs x p). minN (onelogs x p) \ a") prefer 2 apply (rule minN_least) apply (erule_tac x="a" in ballE) prefer 2 apply simp apply (simp only: order_def) done lemma generator_Zp_pow: "g \ (generators (Z p - {0}) p) \ [g^(p - 1) = 1] (mod p)" apply (case_tac "1 < p") apply (drule_tac g="g" in generator_check) apply simp apply (case_tac "p = 0") apply (simp add: generators_def Z_def) apply (subgoal_tac "p = 1") prefer 2 apply simp apply (simp add: modeq_def) done lemma below_order_pow: "\ 0 < k; k < order x p \ \ [x^k ~= 1] (mod p)" sorry lemma generator_exists: "p \ prime \ \ g. g \ generators (Z p - {0}) p" sorry end