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 (* \ / Matita is distributed under the terms of the *)
11 (* v GNU Lesser General Public License Version 2.1 *)
13 (**************************************************************************)
15 set "baseuri" "cic:/matita/nat/ord".
17 include "datatypes/constructors.ma".
21 (* this definition of log is based on pairs, with a remainder *)
23 let rec p_ord_aux p n m \def
27 [ O \Rightarrow pair nat nat O n
29 match (p_ord_aux p (n / m) m) with
30 [ (pair q r) \Rightarrow pair nat nat (S q) r] ]
31 | (S a) \Rightarrow pair nat nat O n].
33 (* p_ord n m = <q,r> if m divides n q times, with remainder r *)
34 definition p_ord \def \lambda n,m:nat.p_ord_aux n n m.
36 theorem p_ord_aux_to_Prop: \forall p,n,m. O < m \to
37 match p_ord_aux p n m with
38 [ (pair q r) \Rightarrow n = m \sup q *r ].
41 apply (nat_case (n \mod m)).
42 simplify.apply plus_n_O.
44 simplify.apply plus_n_O.
46 apply (nat_case1 (n1 \mod m)).intro.
48 generalize in match (H (n1 / m) m).
49 elim (p_ord_aux n (n1 / m) m).
51 rewrite > assoc_times.
52 rewrite < H3.rewrite > (plus_n_O (m*(n1 / m))).
55 rewrite < div_mod.reflexivity.
56 assumption.assumption.
57 intros.simplify.apply plus_n_O.
60 theorem p_ord_aux_to_exp: \forall p,n,m,q,r. O < m \to
61 (pair nat nat q r) = p_ord_aux p n m \to n = m \sup q * r.
64 match (pair nat nat q r) with
65 [ (pair q r) \Rightarrow n = m \sup q * r ].
67 apply p_ord_aux_to_Prop.
71 (* questo va spostato in primes1.ma *)
72 theorem p_ord_exp: \forall n,m,i. O < m \to n \mod m \neq O \to
73 \forall p. i \le p \to p_ord_aux p (m \sup i * n) m = pair nat nat i n.
80 elim (n \mod m).simplify.reflexivity.simplify.reflexivity.
83 cut (O < n \mod m \lor O = n \mod m).
84 elim Hcut.apply (lt_O_n_elim (n \mod m) H3).
85 intros. simplify.reflexivity.
87 apply H1.apply sym_eq.assumption.
88 apply le_to_or_lt_eq.apply le_O_n.
89 generalize in match H3.
90 apply (nat_case p).intro.apply False_ind.apply (not_le_Sn_O n1 H4).
92 simplify. fold simplify (m \sup (S n1)).
93 cut (((m \sup (S n1)*n) \mod m) = O).
95 simplify.fold simplify (m \sup (S n1)).
96 cut ((m \sup (S n1) *n) / m = m \sup n1 *n).
98 rewrite > (H2 m1). simplify.reflexivity.
99 apply le_S_S_to_le.assumption.
102 rewrite > assoc_times.
103 apply (lt_O_n_elim m H).
104 intro.apply div_times.
106 apply divides_to_mod_O.
108 simplify.rewrite > assoc_times.
109 apply (witness ? ? (m \sup n1 *n)).reflexivity.
112 theorem p_ord_aux_to_Prop1: \forall p,n,m. (S O) < m \to O < n \to n \le p \to
113 match p_ord_aux p n m with
114 [ (pair q r) \Rightarrow r \mod m \neq O].
115 intro.elim p.absurd (O < n).assumption.
116 apply le_to_not_lt.assumption.
118 apply (nat_case1 (n1 \mod m)).intro.
119 generalize in match (H (n1 / m) m).
120 elim (p_ord_aux n (n1 / m) m).
122 apply eq_mod_O_to_lt_O_div.
123 apply (trans_lt ? (S O)).unfold lt.apply le_n.
124 assumption.assumption.assumption.
126 apply (trans_le ? n1).change with (n1 / m < n1).
127 apply lt_div_n_m_n.assumption.assumption.assumption.
131 apply (not_eq_O_S m1).
132 rewrite > H5.reflexivity.
135 theorem p_ord_aux_to_not_mod_O: \forall p,n,m,q,r. (S O) < m \to O < n \to n \le p \to
136 pair nat nat q r = p_ord_aux p n m \to r \mod m \neq O.
139 match (pair nat nat q r) with
140 [ (pair q r) \Rightarrow r \mod m \neq O].
142 apply p_ord_aux_to_Prop1.
143 assumption.assumption.assumption.
146 theorem p_ord_exp1: \forall p,n,q,r. O < p \to \lnot p \divides r \to
147 n = p \sup q * r \to p_ord n p = pair nat nat q r.
152 |unfold.intro.apply H1.
153 apply mod_O_to_divides[assumption|assumption]
154 |apply (trans_le ? (p \sup q)).
156 elim q.simplify.apply le_n_Sn.
158 generalize in match H3.
159 apply (nat_case n1).simplify.
160 rewrite < times_n_SO.intro.assumption.
162 apply (trans_le ? (p*(S m))).
163 apply (trans_le ? ((S (S O))*(S m))).
164 simplify.rewrite > plus_n_Sm.
169 apply le_times_r.assumption.
170 alias id "not_eq_to_le_to_lt" = "cic:/matita/algebra/finite_groups/not_eq_to_le_to_lt.con".
171 apply not_eq_to_le_to_lt.
172 unfold.intro.apply H1.
174 apply (witness ? r r ?).simplify.apply plus_n_O.
176 rewrite > times_n_SO in \vdash (? % ?).
178 change with (O \lt r).
179 apply not_eq_to_le_to_lt.
181 apply H1.rewrite < H3.
182 apply (witness ? ? O ?).rewrite < times_n_O.reflexivity.
187 theorem p_ord_to_exp1: \forall p,n,q,r. (S O) \lt p \to O \lt n \to p_ord n p = pair nat nat q r\to
188 \lnot p \divides r \land n = p \sup q * r.
192 apply (p_ord_aux_to_not_mod_O n n p q r).assumption.assumption.
193 apply le_n.symmetry.assumption.
194 apply divides_to_mod_O.apply (trans_lt ? (S O)).
195 unfold.apply le_n.assumption.assumption.
196 apply (p_ord_aux_to_exp n).apply (trans_lt ? (S O)).
197 unfold.apply le_n.assumption.symmetry.assumption.
200 theorem p_ord_times: \forall p,a,b,qa,ra,qb,rb. prime p
201 \to O \lt a \to O \lt b
202 \to p_ord a p = pair nat nat qa ra
203 \to p_ord b p = pair nat nat qb rb
204 \to p_ord (a*b) p = pair nat nat (qa + qb) (ra*rb).
207 elim (p_ord_to_exp1 ? ? ? ? Hcut H1 H3).
208 elim (p_ord_to_exp1 ? ? ? ? Hcut H2 H4).
210 apply (trans_lt ? (S O)).unfold.apply le_n.assumption.
212 elim (divides_times_to_divides ? ? ? H H9).
213 apply (absurd ? ? H10 H5).
214 apply (absurd ? ? H10 H7).
218 unfold prime in H. elim H. assumption.
221 theorem fst_p_ord_times: \forall p,a,b. prime p
222 \to O \lt a \to O \lt b
223 \to fst ? ? (p_ord (a*b) p) = (fst ? ? (p_ord a p)) + (fst ? ? (p_ord b p)).
225 rewrite > (p_ord_times p a b (fst ? ? (p_ord a p)) (snd ? ? (p_ord a p))
226 (fst ? ? (p_ord b p)) (snd ? ? (p_ord b p)) H H1 H2).
227 simplify.reflexivity.
228 apply eq_pair_fst_snd.
229 apply eq_pair_fst_snd.
232 theorem p_ord_p : \forall p:nat. (S O) \lt p \to p_ord p p = pair ? ? (S O) (S O).
235 apply (trans_lt ? (S O)). unfold.apply le_n.assumption.
237 apply (absurd ? ? H).
239 apply divides_to_le.unfold.apply le_n.assumption.
240 rewrite < times_n_SO.