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 include "nat/sqrt.ma".
16 include "nat/chebyshev_teta.ma".
17 include "nat/chebyshev.ma".
18 include "list/list.ma".
21 let rec list_divides l n \def
24 | cons (m:nat) (tl:list nat) ⇒ orb (divides_b m n) (list_divides tl n) ].
26 definition lprim : nat \to list nat \def
27 \lambda n.let rec aux m acc \def
30 | S m1 => match (list_divides acc (n-m1)) with
32 | false => aux m1 (n-m1::acc)]]
35 let rec filter A l p on l \def
38 | cons (a:A) (tl:list A) => match (p a) with
39 [ true => a::(filter A tl p)
40 | false => filter A tl p ]].
42 let rec length A (l:list A) on l \def
45 | cons (a:A) (tl:list A) => S (length A tl) ].
47 let rec list_n_aux n k \def
50 | S n1 => k::list_n_aux n1 (S k) ].
52 definition list_n : nat \to list nat \def
53 \lambda n.list_n_aux (pred n) 2.
55 let rec sieve_aux l1 l2 t on t \def
58 | S t1 => match l2 with
60 | cons n tl => sieve_aux (n::l1) (filter nat tl (\lambda x.notb (divides_b n x))) t1]].
62 definition sieve : nat \to list nat \def
63 \lambda m.sieve_aux [] (list_n m) m.
65 definition ord_list \def
67 \forall a,b,l1,l2.l = l1@(a::b::l2) \to b \leq a.
69 definition in_list \def
70 \lambda A.\lambda a:A.\lambda l:list A.
71 \exists l1,l2.l = l1@(a::l2).
73 lemma in_list_filter_to_p_true : \forall l,x,p.in_list nat x (filter nat l p) \to p x = true.
74 intros;elim H;elim H1;clear H H1;generalize in match H2;generalize in match a;elim l 0
75 [simplify;intro;elim l1
76 [simplify in H;destruct H
77 |simplify in H1;destruct H1]
78 |intros;simplify in H1;apply (bool_elim ? (p t));intro;
79 rewrite > H3 in H1;simplify in H1
80 [generalize in match H1;elim l2
81 [simplify in H4;destruct H4;assumption
82 |simplify in H5;destruct H5;apply (H l3);assumption]
83 |apply (H l2);assumption]]
86 lemma in_list_cons : \forall l,x,y.in_list nat x l \to in_list nat x (y::l).
87 intros;unfold in H;unfold;elim H;elim H1;apply (ex_intro ? ? (y::a));
88 apply (ex_intro ? ? a1);simplify;rewrite < H2;reflexivity.
91 lemma in_list_tail : \forall l,x,y.in_list nat x (y::l) \to x \neq y \to in_list nat x l.
92 intros;elim H;elim H2;generalize in match H3;elim a
93 [simplify in H4;destruct H4;elim H1;reflexivity
94 |simplify in H5;destruct H5;apply (ex_intro ? ? l1);apply (ex_intro ? ? a1);
98 lemma in_list_filter : \forall l,p,x.in_list nat x (filter nat l p) \to in_list nat x l.
99 intros;elim H;elim H1;generalize in match H2;generalize in match a;elim l 0
100 [simplify;intro;elim l1
101 [simplify in H3;destruct H3
102 |simplify in H4;destruct H4]
103 |intros;simplify in H4;apply (bool_elim ? (p t));intro
104 [rewrite > H5 in H4;simplify in H4;generalize in match H4;elim l2
105 [simplify in H6;destruct H6;apply (ex_intro ? ? []);apply (ex_intro ? ? l1);
107 |simplify in H7;destruct H7;apply in_list_cons;apply (H3 ? Hcut1);]
108 |rewrite > H5 in H4;simplify in H4;apply in_list_cons;apply (H3 ? H4);]]
111 lemma in_list_filter_r : \forall l,p,x.in_list nat x l \to p x = true \to in_list nat x (filter nat l p).
112 intros;elim H;elim H2;rewrite > H3;elim a
113 [simplify;rewrite > H1;simplify;apply (ex_intro ? ? []);apply (ex_intro ? ? (filter nat a1 p));
115 |simplify;elim (p t);simplify
116 [apply in_list_cons;assumption
120 lemma in_list_head : \forall x,l.in_list nat x (x::l).
121 intros;apply (ex_intro ? ? []);apply (ex_intro ? ? l);reflexivity;
124 lemma in_list_cons_case : \forall A,x,a,l.in_list A x (a::l) \to
125 x = a \lor in_list A x l.
126 intros;elim H;elim H1;clear H H1;generalize in match H2;elim a1
127 [simplify in H;destruct H;left;reflexivity
128 |simplify in H1;destruct H1;right;
129 apply (ex_intro ? ? l1);
130 apply (ex_intro ? ? a2);
134 lemma divides_to_prime_divides : \forall n,m.1 < m \to m < n \to m \divides n \to
135 \exists p.p \leq m \land prime p \land p \divides n.
136 intros;apply (ex_intro ? ? (nth_prime (max_prime_factor m)));split
139 [apply lt_to_le;assumption
140 |apply divides_max_prime_factor_n;assumption]
141 |apply prime_nth_prime;]
142 |apply (transitive_divides ? ? ? ? H2);apply divides_max_prime_factor_n;
147 lemma le_length_filter : \forall A,l,p.length A (filter A l p) \leq length A l.
150 |simplify;apply (bool_elim ? (p t));intro
151 [simplify;apply le_S_S;assumption
152 |simplify;apply le_S;assumption]]
155 inductive sorted (P:nat \to nat \to Prop): list nat \to Prop \def
156 | sort_nil : sorted P []
157 | sort_cons : \forall x,l.sorted P l \to (\forall y.in_list ? y l \to P x y)
160 definition sorted_lt : list nat \to Prop \def \lambda l.sorted lt l.
162 definition sorted_gt : list nat \to Prop \def \lambda l.sorted gt l.
164 lemma sorted_cons_to_sorted : \forall P,x,l.sorted P (x::l) \to sorted P l.
165 intros;inversion H;intros
167 |destruct H4;assumption]
170 lemma sorted_to_minimum : \forall P,x,l.sorted P (x::l) \to
171 \forall y.in_list ? y l \to P x y.
172 intros;inversion H;intros;
174 |destruct H5;apply H4;assumption]
177 lemma not_in_list_nil : \forall A,a.\lnot in_list A a [].
178 intros;intro;elim H;elim H1;generalize in match H2;elim a1
179 [simplify in H3;destruct H3
180 |simplify in H4;destruct H4]
183 lemma sieve_prime : \forall t,k,l2,l1.
184 (\forall p.(in_list ? p l1 \to prime p \land p \leq k \land \forall x.in_list ? x l2 \to p < x) \land
185 (prime p \to p \leq k \to (\forall x.in_list ? x l2 \to p < x) \to in_list ? p l1)) \to
186 (\forall x.(in_list ? x l2 \to 2 \leq x \land x \leq k \land \forall p.in_list ? p l1 \to \lnot p \divides x) \land
187 (2 \leq x \to x \leq k \to (\forall p.in_list ? p l1 \to \lnot p \divides x) \to
189 length ? l2 \leq t \to
192 sorted_gt (sieve_aux l1 l2 t) \land
193 \forall p.(in_list ? p (sieve_aux l1 l2 t) \to prime p \land p \leq k) \land
194 (prime p \to p \leq k \to in_list ? p (sieve_aux l1 l2 t)).
196 [intros;cut (l2 = [])
197 [|generalize in match H2;elim l2
199 |simplify in H6;elim (not_le_Sn_O ? H6)]]
202 |intro;elim (H p);split;intros
203 [elim (H5 H7);assumption
204 |apply (H6 H7 H8);rewrite > Hcut;intros;elim (not_in_list_nil ? ? H9)]]
208 |intro;elim (H1 p);split;intros
209 [elim (H6 H8);assumption
210 |apply (H7 H8 H9);intros;elim (not_in_list_nil ? ? H10)]]
211 |simplify;elim (H k (filter ? l (\lambda x.notb (divides_b t1 x))) (t1::l1))
216 [elim (in_list_cons_case ? ? ? ? H7);
220 [elim (H3 t1);elim H9
223 |intros;elim (le_to_or_lt_eq ? ? (divides_to_le ? ? ? H9))
224 [elim (divides_to_prime_divides ? ? H10 H11 H9);elim H12;
225 elim H13;clear H13 H12;elim (H3 t1);elim H12
226 [clear H13 H12;elim (H18 ? ? H14);elim (H2 a);
229 |elim H17;apply (trans_le ? ? ? ? H20);
230 apply (trans_le ? ? ? H15);
231 apply lt_to_le;assumption
232 |intros;apply (trans_le ? (S m))
233 [apply le_S_S;assumption
234 |apply (trans_le ? ? ? H11);
235 elim (in_list_cons_case ? ? ? ? H19)
236 [rewrite > H20;apply le_n
237 |apply lt_to_le;apply (sorted_to_minimum ? ? ? H6);assumption]]]
238 |unfold;apply (ex_intro ? ? []);
239 apply (ex_intro ? ? l);
241 |elim (H3 t1);elim H11
242 [elim H13;apply lt_to_le;assumption
245 |elim (H3 t1);elim H9
247 |apply (ex_intro ? ? []);apply (ex_intro ? ? l);reflexivity]]
248 |intros;elim (le_to_or_lt_eq t1 x)
250 |rewrite > H10 in H9;lapply (in_list_filter_to_p_true ? ? ? H9);
251 lapply (divides_n_n x);
252 rewrite > (divides_to_divides_b_true ? ? ? Hletin1) in Hletin
253 [simplify in Hletin;destruct Hletin
254 |rewrite < H10;elim (H3 t1);elim H11
255 [elim H13;apply lt_to_le;assumption
256 |apply in_list_head]]
257 |apply lt_to_le;apply (sorted_to_minimum ? ? ? H6);apply (in_list_filter ? ? ? H9)]]
258 |elim (H2 p);elim (H9 H8);split
260 |intros;apply H12;apply in_list_cons;apply (in_list_filter ? ? ? H13)]]
261 |elim (decidable_eq_nat p t1)
262 [rewrite > H10;apply (ex_intro ? ? []);apply (ex_intro ? ? l1);
264 |apply in_list_cons;elim (H2 p);apply (H12 H7 H8);intros;
265 apply (trans_le ? t1)
266 [elim (decidable_lt p t1)
268 |lapply (not_lt_to_le ? ? H14);
269 lapply (decidable_divides t1 p)
271 [elim H7;lapply (H17 ? H15)
272 [elim H10;symmetry;assumption
273 |elim (H3 t1);elim H18
275 |apply in_list_head]]
276 |elim (Not_lt_n_n p);apply H9;apply in_list_filter_r
277 [elim (H3 p);apply (in_list_tail ? ? t1)
279 [apply prime_to_lt_SO;assumption
281 |intros;elim H7;intro;lapply (H20 ? H21)
282 [rewrite > Hletin2 in H18;elim (H11 H18);
284 [elim (lt_to_not_le ? ? Hletin3 Hletin)
285 |apply (ex_intro ? ? []);apply (ex_intro ? ? l);
287 |apply prime_to_lt_SO;elim (H2 p1);elim (H22 H18);
288 elim H24;assumption]]
289 |unfold;intro;apply H15;rewrite > H18;apply divides_n_n]
290 |rewrite > (not_divides_to_divides_b_false ? ? ? H15);
292 |elim (H3 t1);elim H16
293 [elim H18;apply lt_to_le;assumption
294 |apply in_list_head]]]]
295 |elim (H3 t1);elim H15
296 [elim H17;apply lt_to_le;assumption
297 |apply in_list_head]]]
298 |elim (in_list_cons_case ? ? ? ? H13)
299 [rewrite > H14;apply le_n
300 |apply lt_to_le;apply (sorted_to_minimum ? ? ? H6);assumption]]]]
301 |elim (H3 x);split;intros;
305 |apply in_list_cons;apply (in_list_filter ? ? ? H9)]
306 |intros;elim (in_list_cons_case ? ? ? ? H10)
307 [rewrite > H11;intro;lapply (in_list_filter_to_p_true ? ? ? H9);
308 rewrite > (divides_to_divides_b_true ? ? ? H12) in Hletin
309 [simplify in Hletin;destruct Hletin
310 |elim (H3 t1);elim H13
311 [elim H15;apply lt_to_le;assumption
312 |apply in_list_head]]
314 [apply H13;assumption
315 |apply in_list_cons;apply (in_list_filter ? ? ? H9)]]]
316 |elim (in_list_cons_case ? ? ? ? (H8 ? ? ?))
318 [rewrite > H12;apply in_list_head
322 |intros;apply H11;apply in_list_cons;assumption
323 |apply in_list_filter_r;
326 [rewrite > (not_divides_to_divides_b_false ? ? ? Hletin);
328 |elim (H3 t1);elim H13
329 [elim H15;apply lt_to_le;assumption
330 |apply in_list_head]]
331 |apply in_list_head]]]]
332 |apply (trans_le ? ? ? (le_length_filter ? ? ?));apply le_S_S_to_le;
336 |intros;unfold;elim (H2 y);elim (H8 H7);
337 apply H11;apply in_list_head]
338 |generalize in match (sorted_cons_to_sorted ? ? ? H6);elim l
340 |simplify;elim (notb (divides_b t1 t2));simplify
341 [lapply (sorted_cons_to_sorted ? ? ? H8);lapply (H7 Hletin);
342 apply (sort_cons ? ? ? Hletin1);intros;
343 apply (sorted_to_minimum ? ? ? H8);apply (in_list_filter ? ? ? H9);
344 |apply H7;apply (sorted_cons_to_sorted ? ? ? H8)]]]]]
347 lemma in_list_singleton_to_eq : \forall A,x,y.in_list A x [y] \to x = y.
348 intros;elim H;elim H1;generalize in match H2;elim a
349 [simplify in H3;destruct H3;reflexivity
350 |simplify in H4;destruct H4;generalize in match Hcut1;elim l
351 [simplify in H4;destruct H4
352 |simplify in H5;destruct H5]]
355 lemma le_list_n_aux_k_k : \forall n,m,k.in_list ? n (list_n_aux m k) \to
358 [simplify in H;elim (not_in_list_nil ? ? H)
359 |simplify in H1;elim H1;elim H2;generalize in match H3;elim a
360 [simplify in H4;destruct H4;apply le_n
361 |simplify in H5;destruct H5;apply lt_to_le;apply (H (S k));
362 apply (ex_intro ? ? l);apply (ex_intro ? ? a1);assumption]]
365 lemma in_list_SSO_list_n : \forall n.2 \leq n \to in_list ? 2 (list_n n).
367 [simplify;apply (ex_intro ? ? []);apply (ex_intro ? ? []);
369 |generalize in match H2;elim H1
370 [simplify;apply (ex_intro ? ? []);apply (ex_intro ? ? [3]);simplify;reflexivity
371 |simplify;apply (ex_intro ? ? []);apply (ex_intro ? ? (list_n_aux n2 3));
372 simplify;reflexivity]]
375 lemma le_SSO_list_n : \forall m,n.in_list nat n (list_n m) \to 2 \leq n.
376 intros;unfold list_n in H;apply (le_list_n_aux_k_k ? ? ? H);
379 lemma le_list_n_aux : \forall n,m,k.in_list ? n (list_n_aux m k) \to n \leq k+m-1.
381 [simplify in H;elim (not_in_list_nil ? ? H)
382 |simplify in H1;elim H1;elim H2;generalize in match H3;elim a
383 [simplify in H4;destruct H4;rewrite < plus_n_Sm;simplify;rewrite < minus_n_O;
384 rewrite > plus_n_O in \vdash (? % ?);apply le_plus_r;apply le_O_n
385 |simplify in H5;destruct H5;rewrite < plus_n_Sm;apply (H (S k));
386 apply (ex_intro ? ? l);apply (ex_intro ? ? a1);assumption]]
389 lemma le_list_n : \forall n,m.in_list ? n (list_n m) \to n \leq m.
390 intros;unfold list_n in H;lapply (le_list_n_aux ? ? ? H);
391 simplify in Hletin;generalize in match H;generalize in match Hletin;elim m
392 [simplify in H2;elim (not_in_list_nil ? ? H2)
393 |simplify in H2;assumption]
397 lemma le_list_n_aux_r : \forall n,m.O < m \to \forall k.k \leq n \to n \leq k+m-1 \to in_list ? n (list_n_aux m k).
399 [intros;simplify;rewrite < plus_n_Sm in H2;simplify in H2;
400 rewrite < plus_n_O in H2;rewrite < minus_n_O in H2;
401 rewrite > (antisymmetric_le k n H1 H2);apply in_list_head
402 |intros 5;simplify;generalize in match H2;elim H3
404 |apply in_list_cons;apply H6
405 [apply le_S_S;assumption
406 |rewrite < plus_n_Sm in H7;apply H7]]]
409 lemma le_list_n_r : \forall n,m.S O < m \to 2 \leq n \to n \leq m \to in_list ? n (list_n m).
410 intros;unfold list_n;apply le_list_n_aux_r
413 |generalize in match H4;elim H3;
415 |simplify in H7;apply le_S;assumption]]
417 |simplify;generalize in match H2;elim H;simplify;assumption]
420 lemma le_length_list_n : \forall n. length ? (list_n n) \leq n.
421 intro;cut (\forall n,k.length ? (list_n_aux n k) \leq (S n))
425 |intro;elim n1;simplify
427 |apply le_S_S;apply H]]
430 lemma sorted_list_n_aux : \forall n,k.sorted_lt (list_n_aux n k).
432 [simplify;intro;apply sort_nil
433 |intro;simplify;intros 2;apply sort_cons
435 |intros;lapply (le_list_n_aux_k_k ? ? ? H1);assumption]]
438 lemma sieve_sound1 : \forall n.2 \leq n \to
439 sorted_gt (sieve n) \land
440 (\forall p.in_list ? p (sieve n) \to
441 prime p \land p \leq n).
442 intros;elim (sieve_prime n n (list_n n) [])
445 |intro;unfold sieve in H3;elim (H2 p);elim (H3 H5);split;assumption]
447 [elim (not_in_list_nil ? ? H1)
448 |lapply (lt_to_not_le ? ? (H3 2 ?))
449 [apply in_list_SSO_list_n;assumption
450 |elim Hletin;apply prime_to_lt_SO;assumption]]
454 [apply (le_SSO_list_n ? ? H1)
455 |apply (le_list_n ? ? H1)]
456 |intros;elim (not_in_list_nil ? ? H2)]
457 |apply le_list_n_r;assumption]
458 |apply le_length_list_n
464 |simplify;apply sort_cons
465 [apply sorted_list_n_aux
466 |intros;lapply (le_list_n_aux_k_k ? ? ? H3);
470 lemma sieve_sorted : \forall n.sorted_gt (sieve n).
471 intros;elim (decidable_le 2 n)
472 [elim (sieve_sound1 ? H);assumption
473 |generalize in match (le_S_S_to_le ? ? (not_le_to_lt ? ? H));cases n
474 [intro;apply sort_nil
475 |intros;lapply (le_S_S_to_le ? ? H1);rewrite < (le_n_O_to_eq ? Hletin);
479 lemma in_list_sieve_to_prime : \forall n,p.2 \leq n \to in_list ? p (sieve n) \to
481 intros;elim (sieve_sound1 ? H);elim (H3 ? H1);assumption;
484 lemma in_list_sieve_to_leq : \forall n,p.2 \leq n \to in_list ? p (sieve n) \to
486 intros;elim (sieve_sound1 ? H);elim (H3 ? H1);assumption;
489 lemma sieve_sound2 : \forall n,p.p \leq n \to prime p \to in_list ? p (sieve n).
490 intros;elim (sieve_prime n n (list_n n) [])
491 [elim (H3 p);apply H5;assumption
493 [intro;elim (not_in_list_nil ? ? H2)
494 |intros;lapply (lt_to_not_le ? ? (H4 2 ?))
495 [apply in_list_SSO_list_n;apply (trans_le ? ? ? ? H);
496 apply prime_to_lt_SO;assumption
497 |elim Hletin;apply prime_to_lt_SO;assumption]]
501 [apply (le_SSO_list_n ? ? H2)
502 |apply (le_list_n ? ? H2)]
503 |elim (not_in_list_nil ? ? H3)]
505 [apply (trans_le ? ? ? H2 H3)
508 |apply le_length_list_n
514 |simplify;apply sort_cons
515 [apply sorted_list_n_aux
516 |intros;lapply (le_list_n_aux_k_k ? ? ? H4);
520 let rec checker l \def
523 | cons h1 t1 => match t1 with
525 | cons h2 t2 => (andb (checker t1) (leb h1 (2*h2))) ]].
527 lemma checker_cons : \forall t,l.checker (t::l) = true \to checker l = true.
528 intros 2;simplify;intro;generalize in match H;elim l
530 |change in H2 with (andb (checker (t1::l1)) (leb t (t1+(t1+O))) = true);
531 apply (andb_true_true ? ? H2)]
534 theorem checker_sound : \forall l1,l2,l,x,y.l = l1@(x::y::l2) \to
535 checker l = true \to x \leq 2*y.
537 [simplify;intros 5;rewrite > H;simplify;intro;
538 apply leb_true_to_le;apply (andb_true_true_r ? ? H1);
539 |simplify;intros;rewrite > H1 in H2;lapply (checker_cons ? ? H2);
540 apply (H l2 ? ? ? ? Hletin);reflexivity]
543 definition bertrand \def \lambda n.
544 \exists p.n < p \land p \le 2*n \land (prime p).
546 definition not_bertrand \def \lambda n.
547 \forall p.n < p \to p \le 2*n \to \not (prime p).
549 lemma min_prim : \forall n.\exists p. n < p \land prime p \land
550 \forall q.prime q \to q < p \to q \leq n.
551 intro;elim (le_to_or_lt_eq ? ? (le_O_n n))
552 [apply (ex_intro ? ? (min_aux (S (n!)) (S n) primeb));
556 |apply primeb_true_to_prime;apply f_min_aux_true;elim (ex_prime n);
557 [apply (ex_intro ? ? a);elim H1;elim H2;split
560 |rewrite > plus_n_O;apply le_plus
563 |apply prime_to_primeb_true;assumption]
565 |intros;apply not_lt_to_le;intro;lapply (lt_min_aux_to_false ? ? ? ? H3 H2);
566 rewrite > (prime_to_primeb_true ? H1) in Hletin;destruct Hletin]
567 |apply (ex_intro ? ? 2);split
569 [rewrite < H;apply lt_O_S
570 |apply primeb_true_to_prime;reflexivity]
571 |intros;elim (lt_to_not_le ? ? H2);apply prime_to_lt_SO;assumption]]
574 (*lemma pippo : \forall k,n.in_list ? (nth_prime (S k)) (sieve n) \to
575 \exists l.sieve n = l@((nth_prime (S k))::(sieve (nth_prime k))).
576 intros;elim H;elim H1;clear H H1;apply (ex_intro ? ? a);
577 cut (a1 = sieve (nth_prime k))
578 [rewrite < Hcut;assumption
579 |lapply (sieve_sorted n);generalize in match H2*)
581 lemma le_to_bertrand : \forall n.O < n \to n \leq exp 2 8 \to bertrand n.
583 elim (min_prim n);apply (ex_intro ? ? a);elim H2;elim H3;clear H2 H3;
585 [|apply not_lt_to_le;intro;apply (le_to_not_lt ? ? H1);apply (H4 ? ? H2);
586 apply primeb_true_to_prime;reflexivity]
590 |elim (prime_to_nth_prime a H6);generalize in match H2;cases a1
591 [simplify;intro;rewrite < H3;rewrite < plus_n_O;
592 change in \vdash (? % ?) with (1+1);apply le_plus;assumption
593 |intro;lapply (H4 (nth_prime n1))
594 [apply (trans_le ? (2*(nth_prime n1)))
596 cut (\exists l1,l2.sieve 257 = l1@((nth_prime (S n1))::((nth_prime n1)::l2)))
597 [elim Hcut1;elim H7;clear Hcut1 H7;
598 apply (checker_sound a2 a3 (sieve 257))
601 |elim (sieve_sound2 257 (nth_prime (S n1)) ? ?)
602 [elim (sieve_sound2 257 (nth_prime n1) ? ?)
604 cut (\forall p.in_list ? p (a3@(nth_prime n1::a4)) \to prime p)
605 [|rewrite < H9;intros;apply (in_list_sieve_to_prime 257 p ? H10);
606 apply leb_true_to_le;reflexivity]
607 apply (ex_intro ? ? a2);apply (ex_intro ? ? a4);
609 cut ((nth_prime n1)::a4 = a5)
610 [|generalize in match H10;
611 lapply (sieve_sorted 257);
612 generalize in match Hletin1;
613 rewrite > H9 in ⊢ (? %→? ? % ?→?);
614 generalize in match Hcut1;
615 generalize in match a2;
618 [change in H11 with (nth_prime n1::a4 = nth_prime (S n1)::a5);
619 destruct H11;elim (eq_to_not_lt ? ? Hcut2);
620 apply increasing_nth_prime
621 |change in H12 with (nth_prime n1::a4 = t::(l1@(nth_prime (S n1)::a5)));
623 change in H11 with (sorted_gt (nth_prime n1::l1@(nth_prime (S n1)::a5)));
624 lapply (sorted_to_minimum ? ? ? H11 (nth_prime (S n1)))
625 [unfold in Hletin2;elim (le_to_not_lt ? ? (lt_to_le ? ? Hletin2));
626 apply increasing_nth_prime
627 |apply (ex_intro ? ? l1);apply (ex_intro ? ? a5);reflexivity]]
629 [change in H12 with (t::(l@(nth_prime n1::a4)) = nth_prime (S n1)::a5);
630 destruct H12;cut (l = [])
631 [rewrite > Hcut2;reflexivity
632 |change in H11 with (sorted_gt (nth_prime (S n1)::(l@(nth_prime n1::a4))));
633 generalize in match H11;generalize in match H8;cases l;intros
635 |lapply (sorted_cons_to_sorted ? ? ? H13);
636 lapply (sorted_to_minimum ? ? ? H13 n2)
637 [simplify in Hletin2;lapply (sorted_to_minimum ? ? ? Hletin2 (nth_prime n1))
638 [unfold in Hletin3;unfold in Hletin4;
639 elim (lt_nth_prime_to_not_prime ? ? Hletin4 Hletin3);
641 apply (ex_intro ? ? [nth_prime (S n1)]);
642 apply (ex_intro ? ? (l2@(nth_prime n1::a4)));
644 |apply (ex_intro ? ? l2);apply (ex_intro ? ? a4);reflexivity]
645 |simplify;apply in_list_head]]]
646 |change in H13 with (t::(l@(nth_prime n1::a4)) = t1::(l2@(nth_prime (S n1)::a5)));
647 destruct H13;apply (H7 l2 ? ? Hcut3)
648 [intros;apply H8;simplify;apply in_list_cons;
651 apply (sorted_cons_to_sorted ? ? ? H12)]]]]
652 rewrite > Hcut2 in ⊢ (? ? ? (? ? ? (? ? ? %)));
654 |apply (trans_le ? ? ? Hletin);apply lt_to_le;
655 apply (trans_le ? ? ? H5 Hcut)
656 |apply prime_nth_prime]
657 |rewrite > H3;assumption
658 |apply prime_nth_prime]]
659 |apply le_times_r;assumption]
660 |apply prime_nth_prime
661 |rewrite < H3;apply increasing_nth_prime]]]
665 lemma not_not_bertrand_to_bertrand1: \forall n.
666 \lnot (not_bertrand n) \to \forall x. n \le x \to x \le 2*n \to
667 (\forall p.x < p \to p \le 2*n \to \not (prime p))
668 \to \exists p.n < p \land p \le x \land (prime p).
670 [apply False_ind.apply H.assumption
671 |apply (bool_elim ? (primeb (S n1)));intro
672 [apply (ex_intro ? ? (S n1)).
675 [apply le_S_S.assumption
678 |apply primeb_true_to_prime.assumption
683 apply (ex_intro ? ? a).
687 |apply le_S.assumption
691 |apply lt_to_le.assumption
692 |elim (le_to_or_lt_eq ? ? H7)
695 apply primeb_false_to_not_prime.
703 theorem not_not_bertrand_to_bertrand: \forall n.
704 \lnot (not_bertrand n) \to bertrand n.
705 unfold bertrand.intros.
706 apply (not_not_bertrand_to_bertrand1 ? ? (2*n))
708 |apply le_times_n.apply le_n_Sn
710 |intros.apply False_ind.
711 apply (lt_to_not_le ? ? H1 H2)
716 theorem divides_pi_p_to_divides: \forall p,n,b,g.prime p \to
717 divides p (pi_p n b g) \to \exists i. (i < n \and (b i = true \and
722 apply (le_to_not_lt p 1)
729 |apply (bool_elim ? (b n1));intro
730 [rewrite > (true_to_pi_p_Sn ? ? ? H3) in H2.
731 elim (divides_times_to_divides ? ? ? H1 H2)
732 [apply (ex_intro ? ? n1).
739 apply (ex_intro ? ? a).
741 [apply lt_to_le.apply le_S_S.assumption
745 |rewrite > (false_to_pi_p_Sn ? ? ? H3) in H2.
748 apply (ex_intro ? ? a).
750 [apply lt_to_le.apply le_S_S.assumption
757 theorem divides_B: \forall n,p.prime p \to p \divides (B n) \to
758 p \le n \land \exists i.mod (n /(exp p (S i))) 2 \neq O.
761 elim (divides_pi_p_to_divides ? ? ? ? H H1).
764 elim (divides_pi_p_to_divides ? ? ? ? H H5).clear H5.
769 [rewrite > Hcut.apply le_S_S_to_le.assumption
770 |apply (ex_intro ? ? a1).
773 change in H7:(? ? %) with (exp a ((n/(exp a (S a1))) \mod 2)).
777 [apply divides_to_le[apply lt_O_S|assumption]
778 |apply lt_to_not_le.elim H.assumption
781 |apply (divides_exp_to_eq ? ? ? H ? H7).
782 apply primeb_true_to_prime.
788 definition k \def \lambda n,p.
789 sigma_p (log p n) (λi:nat.true) (λi:nat.((n/(exp p (S i))\mod 2))).
791 theorem le_k: \forall n,p. k n p \le log p n.
792 intros.unfold k.elim (log p n)
794 |rewrite > true_to_sigma_p_Sn
795 [rewrite > plus_n_SO.
796 rewrite > sym_plus in ⊢ (? ? %).
809 \lambda n. pi_p (S n) primeb (\lambda p.(exp p (k n p))).
811 theorem eq_B_B1: \forall n. B n = B1 n.
812 intros.unfold B.unfold B1.
820 definition B_split1 \def \lambda n.
821 pi_p (S n) primeb (\lambda p.(exp p (bool_to_nat (leb (k n p) 1)* (k n p)))).
823 definition B_split2 \def \lambda n.
824 pi_p (S n) primeb (\lambda p.(exp p (bool_to_nat (leb 2 (k n p))* (k n p)))).
826 theorem eq_B1_times_B_split1_B_split2: \forall n.
827 B1 n = B_split1 n * B_split2 n.
828 intro.unfold B1.unfold B_split1.unfold B_split2.
829 rewrite < times_pi_p.
832 |intros.apply (bool_elim ? (leb (k n x) 1));intro
833 [rewrite > (lt_to_leb_false 2 (k n x))
834 [simplify.rewrite < plus_n_O.
835 rewrite < times_n_SO.reflexivity
836 |apply le_S_S.apply leb_true_to_le.assumption
838 |rewrite > (le_to_leb_true 2 (k n x))
839 [simplify.rewrite < plus_n_O.
840 rewrite < plus_n_O.reflexivity
841 |apply not_le_to_lt.apply leb_false_to_not_le.assumption
847 lemma lt_div_to_times: \forall n,m,q. O < q \to n/q < m \to n < q*m.
851 intro.apply (lt_to_not_le ? ? H1).
852 apply le_times_to_le_div;assumption
853 |apply (ltn_to_ltO ? ? H1)
857 lemma lt_to_div_O:\forall n,m. n < m \to n / m = O.
859 apply (div_mod_spec_to_eq n m (n/m) (n \mod m) O n)
860 [apply div_mod_spec_div_mod.
861 apply (ltn_to_ltO ? ? H)
862 |apply div_mod_spec_intro
869 (* the value of n could be smaller *)
870 lemma k1: \forall n,p. 18 \le n \to p \le n \to 2*n/ 3 < p\to k (2*n) p = O.
874 |rewrite > true_to_sigma_p_Sn
879 cut (2*n/p = 2) as H4
880 [rewrite > H4.reflexivity
881 |apply lt_to_le_times_to_lt_S_to_div
882 [apply (ltn_to_ltO ? ? H2)
883 |rewrite < sym_times.
886 |rewrite > sym_times in ⊢ (? ? %).
887 apply lt_div_to_times
893 |cut (2*n/(p)\sup(S (S n2)) = O) as H4
894 [rewrite > H4.reflexivity
896 apply (le_to_lt_to_lt ? (exp ((2*n)/3) 2))
897 [apply (le_times_to_le (exp 3 2))
898 [apply leb_true_to_le.reflexivity
899 |rewrite > sym_times in ⊢ (? ? %).
901 apply (trans_le ? (exp n 2))
902 [rewrite < assoc_times.
903 rewrite > exp_SSO in ⊢ (? ? %).
906 |apply monotonic_exp1.
907 apply (le_plus_to_le 3).
908 change in ⊢ (? ? %) with ((S(2*n/3))*3).
909 apply (trans_le ? (2*n))
910 [simplify in ⊢ (? ? %).
913 apply (trans_le ? 18 ? ? H).
914 apply leb_true_to_le.reflexivity
921 |apply (lt_to_le_to_lt ? (exp p 2))
927 [apply (ltn_to_ltO ? ? H2)
928 |apply le_S_S.apply le_S_S.apply le_O_n
939 theorem le_B_split1_teta:\forall n.18 \le n \to not_bertrand n \to
940 B_split1 (2*n) \le teta (2 * n / 3).
941 intros.unfold B_split1.unfold teta.
942 apply (trans_le ? (pi_p (S (2*n)) primeb (λp:nat.(p)\sup(bool_to_nat (eqb (k (2*n) p) 1)))))
943 [apply le_pi_p.intros.
945 [apply prime_to_lt_O.apply primeb_true_to_prime.assumption
946 |apply (bool_elim ? (leb (k (2*n) i) 1));intro
947 [elim (le_to_or_lt_eq ? ? (leb_true_to_le ? ? H4))
948 [lapply (le_S_S_to_le ? ? H5) as H6.
949 apply (le_n_O_elim ? H6).
952 |rewrite > (eq_to_eqb_true ? ? H5).
953 rewrite > H5.apply le_n
958 |apply (trans_le ? (pi_p (S (2*n/3)) primeb (λp:nat.(p)\sup(bool_to_nat (eqb (k (2*n) p) 1)))))
959 [apply (eq_ind ? ? ? (le_n ?)).
960 apply or_false_eq_SO_to_eq_pi_p
962 apply le_times_to_le_div2
964 |rewrite > sym_times in ⊢ (? ? %).
966 apply leb_true_to_le.reflexivity
969 unfold not_bertrand in H1.
970 elim (decidable_le (S n) i)
972 apply not_prime_to_primeb_false.
975 |apply le_S_S_to_le.assumption
982 apply not_le_to_lt.assumption
987 |apply le_pi_p.intros.
988 elim (eqb (k (2*n) i) 1)
989 [rewrite < exp_n_SO.apply le_n
990 |simplify.apply prime_to_lt_O.
991 apply primeb_true_to_prime.
998 theorem le_B_split2_exp: \forall n. exp 2 7 \le n \to
999 B_split2 (2*n) \le exp (2*n) (pred(sqrt(2*n)/2)).
1000 intros.unfold B_split2.
1002 [apply (trans_le ? (pi_p (S (sqrt (2*n))) primeb
1003 (λp:nat.(p)\sup(bool_to_nat (leb 2 (k (2*n) p))*k (2*n) p))))
1004 [apply (eq_ind ? ? ? (le_n ?)).
1005 apply or_false_eq_SO_to_eq_pi_p
1009 apply (bool_elim ? (leb 2 (k (2*n) i)));intro
1011 apply (lt_to_not_le ? ? H1).unfold sqrt.
1013 [apply le_S_S_to_le.assumption
1014 |apply le_to_leb_true.
1016 apply not_lt_to_le.intro.
1017 apply (le_to_not_lt 2 (log i (2*n)))
1018 [apply (trans_le ? (k (2*n) i))
1019 [apply leb_true_to_le.assumption
1022 |apply le_S_S.unfold log.apply f_false_to_le_max
1023 [apply (ex_intro ? ? O).split
1025 |apply le_to_leb_true.simplify.
1026 apply (trans_le ? n)
1031 |intros.apply lt_to_leb_false.
1032 apply (lt_to_le_to_lt ? (exp i 2))
1035 [apply (ltn_to_ltO ? ? H1)
1045 |apply (trans_le ? (pi_p (S (sqrt (2*n))) primeb (λp:nat.2*n)))
1046 [apply le_pi_p.intros.
1047 apply (trans_le ? (exp i (log i (2*n))))
1049 [apply prime_to_lt_O.
1050 apply primeb_true_to_prime.
1052 |apply (bool_elim ? (leb 2 (k (2*n) i)));intro
1053 [simplify in ⊢ (? (? % ?) ?).
1054 rewrite > sym_times.
1055 rewrite < times_n_SO.
1061 rewrite > (times_n_O O) in ⊢ (? % ?).
1067 |apply (trans_le ? (exp (2*n) (prim(sqrt (2*n)))))
1069 apply (eq_ind ? ? ? (le_n ?)).
1072 [rewrite > (times_n_O O) in ⊢ (? % ?).
1080 [apply (trans_le ? (2*(exp 2 7)))
1081 [apply leb_true_to_le.reflexivity
1082 |apply le_times_r.assumption
1084 |apply le_to_leb_true.
1085 apply (trans_le ? (2*(exp 2 7)))
1086 [apply leb_true_to_le.reflexivity
1087 |apply le_times_r.assumption
1094 |apply (lt_to_le_to_lt ? ? ? ? H).
1095 apply leb_true_to_le.reflexivity
1099 theorem not_bertrand_to_le_B:
1100 \forall n.exp 2 7 \le n \to not_bertrand n \to
1101 B (2*n) \le (exp 2 (2*(2 * n / 3)))*(exp (2*n) (pred(sqrt(2*n)/2))).
1104 rewrite > eq_B1_times_B_split1_B_split2.
1106 [apply (trans_le ? (teta ((2*n)/3)))
1107 [apply le_B_split1_teta
1108 [apply (trans_le ? ? ? ? H).
1109 apply leb_true_to_le.reflexivity
1114 |apply le_B_split2_exp.
1120 theorem not_bertrand_to_le1:
1121 \forall n.18 \le n \to not_bertrand n \to
1122 exp 2 (2*n) \le (exp 2 (2*(2 * n / 3)))*(exp (2*n) (S(sqrt(2*n)))).
1125 theorem le_times_div_m_m: \forall n,m. O < m \to n/m*m \le n.
1127 rewrite > (div_mod n m) in ⊢ (? ? %)
1133 theorem not_bertrand_to_le1:
1134 \forall n.exp 2 7 \le n \to not_bertrand n \to
1135 (exp 2 (2*n / 3)) \le (exp (2*n) (sqrt(2*n)/2)).
1137 apply (le_times_to_le (exp 2 (2*(2 * n / 3))))
1138 [apply lt_O_exp.apply lt_O_S
1139 |rewrite < exp_plus_times.
1140 apply (trans_le ? (exp 2 (2*n)))
1143 |rewrite < sym_plus.
1144 change in ⊢ (? % ?) with (3*(2*n/3)).
1145 rewrite > sym_times.
1146 apply le_times_div_m_m.
1150 rewrite < distr_times_plus.
1152 apply (trans_le ? ((2*n + n)/3))
1153 [apply le_plus_div.apply lt_O_S
1154 |rewrite < sym_plus.
1155 change in ⊢ (? (? % ?) ?) with (3*n).
1156 rewrite < sym_times.
1157 rewrite > lt_O_to_div_times
1163 |apply (trans_le ? (2*n*B(2*n)))
1165 apply (trans_le ? ? ? ? H).
1166 apply leb_true_to_le.reflexivity
1167 |rewrite > S_pred in ⊢ (? ? (? ? (? ? %)))
1169 rewrite < assoc_times.
1170 rewrite < sym_times in ⊢ (? ? (? % ?)).
1171 rewrite > assoc_times in ⊢ (? ? %).
1173 apply not_bertrand_to_le_B;assumption
1174 |apply le_times_to_le_div
1176 |apply (trans_le ? (sqrt (exp 2 8)))
1177 [apply leb_true_to_le.reflexivity
1178 |apply monotonic_sqrt.
1179 change in ⊢ (? % ?) with (2*(exp 2 7)).
1190 theorem not_bertrand_to_le2:
1191 \forall n.exp 2 7 \le n \to not_bertrand n \to
1192 2*n / 3 \le (sqrt(2*n)/2)*S(log 2 (2*n)).
1194 rewrite < (eq_log_exp 2)
1195 [apply (trans_le ? (log 2 ((exp (2*n) (sqrt(2*n)/2)))))
1198 |apply not_bertrand_to_le1;assumption
1207 theorem tech1: \forall a,b,c,d.O < b \to O < d \to
1208 (a/b)*(c/d) \le (a*c)/(b*d).
1210 apply le_times_to_le_div
1211 [rewrite > (times_n_O O).
1212 apply lt_times;assumption
1213 |rewrite > assoc_times.
1214 rewrite < assoc_times in ⊢ (? (? ? %) ?).
1215 rewrite < sym_times in ⊢ (? (? ? (? % ?)) ?).
1216 rewrite > assoc_times.
1217 rewrite < assoc_times.
1219 rewrite > sym_times;apply le_times_div_m_m;assumption
1223 theorem tech: \forall n. 2*(S(log 2 (2*n))) \le sqrt (2*n) \to
1224 (sqrt(2*n)/2)*S(log 2 (2*n)) \le 2*n / 4.
1226 cut (4*(S(log 2 (2*n))) \le 2* sqrt(2*n))
1227 [rewrite > sym_times.
1228 apply le_times_to_le_div
1230 |rewrite < assoc_times.
1231 apply (trans_le ? (2*sqrt(2*n)*(sqrt (2*n)/2)))
1232 [apply le_times_l.assumption
1233 |apply (trans_le ? ((2*sqrt(2*n)*(sqrt(2*n))/2)))
1234 [apply le_times_div_div_times.
1236 |rewrite > assoc_times.
1237 rewrite > sym_times.
1238 rewrite > lt_O_to_div_times.
1244 |change in ⊢ (? (? % ?) ?) with (2*2).
1245 rewrite > assoc_times.
1251 theorem lt_div_S_div: \forall n,m. O < m \to exp m 2 \le n \to
1254 apply lt_times_to_lt_div.
1255 apply (lt_to_le_to_lt ? (S(n/m)*m))
1256 [apply lt_div_S.assumption
1257 |rewrite > sym_times in ⊢ (? ? %). simplify.
1258 rewrite > sym_times in ⊢ (? ? (? ? %)).
1260 apply le_times_to_le_div
1268 theorem exp_plus_SSO: \forall a,b. exp (a+b) 2 = (exp a 2) + 2*a*b + (exp b 2).
1271 rewrite > distr_times_plus.
1272 rewrite > times_plus_l.
1274 rewrite > assoc_plus.
1275 rewrite > assoc_plus.
1277 rewrite > times_plus_l.
1279 rewrite < assoc_plus.
1280 rewrite < sym_times.
1281 rewrite > plus_n_O in ⊢ (? ? (? (? ? %) ?) ?).
1282 rewrite > assoc_times.
1283 apply eq_f2;reflexivity.
1286 theorem tech3: \forall n. (exp 2 8) \le n \to 2*(S(log 2 (2*n))) \le sqrt (2*n).
1288 lapply (le_log 2 ? ? (le_n ?) H) as H1.
1289 rewrite > exp_n_SO in ⊢ (? (? ? (? (? ? (? % ?)))) ?).
1291 [rewrite > sym_plus.
1292 rewrite > plus_n_Sm.
1296 apply (trans_le ? (2*log 2 n))
1297 [rewrite < times_SSO_n.
1299 apply (trans_le ? 8)
1300 [apply leb_true_to_le.reflexivity
1301 |rewrite < (eq_log_exp 2)
1306 |apply (trans_le ? ? ? ? (le_exp_log 2 ? ? )).
1307 apply le_times_SSO_n_exp_SSO_n.
1308 apply (lt_to_le_to_lt ? ? ? ? H).
1309 apply leb_true_to_le.reflexivity
1311 |apply le_to_leb_true.
1312 rewrite > assoc_times.
1314 rewrite > sym_times.
1315 rewrite > assoc_times.
1317 rewrite > exp_plus_SSO.
1318 rewrite > distr_times_plus.
1319 rewrite > distr_times_plus.
1320 rewrite > assoc_plus.
1321 apply (trans_le ? (4*exp (log 2 n) 2))
1322 [change in ⊢ (? ? (? % ?)) with (2*2).
1323 rewrite > assoc_times in ⊢ (? ? %).
1324 rewrite < times_SSO_n in ⊢ (? ? %).
1326 rewrite < times_SSO_n in ⊢ (? ? %).
1328 [rewrite > sym_times in ⊢ (? (? ? %) ?).
1329 rewrite < assoc_times.
1330 rewrite < assoc_times.
1331 change in ⊢ (? (? % ?) ?) with 8.
1334 (* strange things here *)
1335 rewrite < (eq_log_exp 2)
1339 |apply (trans_le ? (log 2 n))
1340 [change in ⊢ (? % ?) with 8.
1341 rewrite < (eq_log_exp 2)
1345 |rewrite > exp_n_SO in ⊢ (? % ?).
1348 [apply (lt_to_le_to_lt ? ? ? ? H).
1349 apply leb_true_to_le.reflexivity
1350 |apply (lt_to_le_to_lt ? ? ? ? H).
1351 apply leb_true_to_le.reflexivity
1357 |change in ⊢ (? (? % ?) ?) with (exp 2 2).
1358 apply (trans_le ? ? ? ? (le_exp_log 2 ? ?))
1359 [apply le_times_exp_n_SSO_exp_SSO_n
1361 |change in ⊢ (? % ?) with 8.
1362 rewrite < (eq_log_exp 2)
1367 |apply (lt_to_le_to_lt ? ? ? ? H).
1368 apply leb_true_to_le.reflexivity
1373 |apply (lt_to_le_to_lt ? ? ? ? H).
1374 apply leb_true_to_le.reflexivity
1378 theorem le_to_bertrand2:
1379 \forall n. (exp 2 8) \le n \to bertrand n.
1381 apply not_not_bertrand_to_bertrand.unfold.intro.
1382 absurd (2*n / 3 \le (sqrt(2*n)/2)*S(log 2 (2*n)))
1383 [apply not_bertrand_to_le2
1384 [apply (trans_le ? ? ? ? H).
1391 |apply lt_to_not_le.
1392 apply (le_to_lt_to_lt ? ? ? ? (lt_div_S_div ? ? ? ?))
1393 [apply tech.apply tech3.assumption
1395 |apply (trans_le ? (2*exp 2 8))
1396 [apply leb_true_to_le.reflexivity
1397 |apply le_times_r.assumption
1403 theorem bertrand_n :
1404 \forall n. O < n \to bertrand n.
1405 intros;elim (decidable_le n 256)
1406 [apply le_to_bertrand;assumption
1407 |apply le_to_bertrand2;apply lt_to_le;apply not_le_to_lt;apply H1]
1411 theorem mod_exp: eqb (mod (exp 2 8) 13) O = false.