1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| A.Asperti, C.Sacerdoti Coen, *)
8 (* ||A|| E.Tassi, S.Zacchiroli *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU Lesser General Public License Version 2.1 *)
13 (**************************************************************************)
15 set "baseuri" "cic:/matita/nat/fermat_little_theorem".
19 include "nat/permutation.ma".
21 theorem permut_mod: \forall p,a:nat. prime p \to
22 \lnot divides p a\to permut (\lambda n.(mod (a*n) p)) (pred p).
24 split.intros.apply le_S_S_to_le.
26 change with mod (a*i) p < p.
29 simplify.apply trans_le ? (S (S O)).
30 apply le_n_Sn.assumption.
31 rewrite < S_pred.apply le_n.
34 apply trans_lt ? (S O).simplify.apply le_n.assumption.
36 apply nat_compare_elim i j.
43 apply le_plus_to_minus.
44 apply trans_le ? (pred p).assumption.
49 apply trans_lt ? (S O).simplify.apply le_n.assumption.
50 apply le_to_not_lt p (j-i).
51 apply divides_to_le.simplify.
52 apply le_SO_minus.assumption.
53 cut divides p a \lor divides p (j-i).
54 elim Hcut.apply False_ind.apply H1.assumption.assumption.
55 apply divides_times_to_divides.assumption.
56 rewrite > distr_times_minus.
57 apply eq_mod_to_divides.
60 apply trans_lt ? (S O).simplify.apply le_n.assumption.
71 apply le_plus_to_minus.
72 apply trans_le ? (pred p).assumption.
77 apply trans_lt ? (S O).simplify.apply le_n.assumption.
78 apply le_to_not_lt p (i-j).
79 apply divides_to_le.simplify.
80 apply le_SO_minus.assumption.
81 cut divides p a \lor divides p (i-j).
82 elim Hcut.apply False_ind.apply H1.assumption.assumption.
83 apply divides_times_to_divides.assumption.
84 rewrite > distr_times_minus.
85 apply eq_mod_to_divides.
88 apply trans_lt ? (S O).simplify.apply le_n.assumption.
93 theorem bad : \forall p,a:nat. prime p \to \lnot divides p a \to
94 mod (exp a (pred p)) p = (S O).
96 cut map_iter p (\lambda x.x) times (S O) =
97 map_iter p (\lambda n.(mod (a*n) p)) times (S O).