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/chebishev".
18 include "nat/pi_p.ma".
19 include "nat/factorization.ma".
20 include "nat/factorial2.ma".
22 definition prim: nat \to nat \def
23 \lambda n. sigma_p (S n) primeb (\lambda p.(S O)).
25 definition A: nat \to nat \def
26 \lambda n. pi_p (S n) primeb (\lambda p.exp p (log p n)).
28 theorem le_Al1: \forall n.
29 A n \le pi_p (S n) primeb (\lambda p.n).
40 theorem le_Al: \forall n.
41 A n \le exp n (prim n).
43 rewrite < exp_sigma_p.
47 theorem leA_r2: \forall n.
48 exp n (prim n) \le A n * A n.
50 elim (le_to_or_lt_eq ? ? (le_O_n n))
51 [rewrite < (exp_sigma_p (S n) n primeb).
56 rewrite < exp_plus_times.
57 apply (trans_le ? (exp i (S(log i n))))
61 apply primeb_true_to_prime.
65 apply primeb_true_to_prime.
78 |rewrite < H. apply le_n
82 definition A': nat \to nat \def
83 \lambda n. pi_p (S n) primeb
84 (\lambda p.(pi_p (log p n) (\lambda i.true) (\lambda i.p))).
86 theorem eq_A_A': \forall n.A n = A' n.
87 intro.unfold A.unfold A'.
91 apply (trans_eq ? ? (exp x (sigma_p (log x n) (λi:nat.true) (λi:nat.(S O)))))
92 [apply eq_f.apply sym_eq.apply sigma_p_true
93 |apply sym_eq.apply exp_sigma_p
98 theorem eq_pi_p_primeb_divides_b: \forall n,m.
99 pi_p n (\lambda p.primeb p \land divides_b p m) (\lambda p.exp p (ord m p))
100 = pi_p n primeb (\lambda p.exp p (ord m p)).
104 |apply (bool_elim ? (primeb n1));intro
105 [rewrite > true_to_pi_p_Sn in ⊢ (? ? ? %)
106 [apply (bool_elim ? (divides_b n1 m));intro
107 [rewrite > true_to_pi_p_Sn
110 |apply true_to_true_to_andb_true;assumption
112 |rewrite > false_to_pi_p_Sn
113 [rewrite > not_divides_to_ord_O
114 [simplify in ⊢ (? ? ? (? % ?)).
116 rewrite < times_n_SO.
118 |apply primeb_true_to_prime.assumption
119 |apply divides_b_false_to_not_divides.
122 |rewrite > H1.rewrite > H2.reflexivity
127 |rewrite > false_to_pi_p_Sn
128 [rewrite > false_to_pi_p_Sn
132 |rewrite > H1.reflexivity
138 theorem lt_max_to_pi_p_primeb: \forall q,m. O < m \to max m (\lambda i.primeb i \land divides_b i m) < q \to
139 m = pi_p q (\lambda i.primeb i \land divides_b i m) (\lambda p.exp p (ord m p)).
142 apply (not_le_Sn_O ? H1)
143 |apply (bool_elim ? (primeb n∧divides_b n m));intro
144 [rewrite > true_to_pi_p_Sn
145 [rewrite > (exp_ord n m) in ⊢ (? ? % ?)
147 rewrite > (H (ord_rem m n))
150 apply (bool_elim ? (primeb x));intro
152 apply (bool_elim ? (divides_b x (ord_rem m n)));intro
154 apply divides_to_divides_b_true
155 [apply prime_to_lt_O.
156 apply primeb_true_to_prime.
158 |apply (trans_divides ? (ord_rem m n))
159 [apply divides_b_true_to_divides.
161 |apply divides_ord_rem
162 [apply (trans_lt ? x)
163 [apply prime_to_lt_SO.
164 apply primeb_true_to_prime.
173 apply not_divides_to_divides_b_false
174 [apply prime_to_lt_O.
175 apply primeb_true_to_prime.
177 |apply ord_O_to_not_divides
179 |apply primeb_true_to_prime.
181 |rewrite < (ord_ord_rem n)
182 [apply not_divides_to_ord_O
183 [apply primeb_true_to_prime.
185 |apply divides_b_false_to_not_divides.
189 |apply primeb_true_to_prime.
190 apply (andb_true_true ? ? H3)
191 |apply primeb_true_to_prime.
204 |apply primeb_true_to_prime.
205 apply (andb_true_true ? ? H3)
206 |apply primeb_true_to_prime.
207 apply (andb_true_true ? ? H5)
212 [apply prime_to_lt_SO.
213 apply primeb_true_to_prime.
214 apply (andb_true_true ? ? H3)
217 |apply not_eq_to_le_to_lt
218 [elim (exists_max_forall_false (λi:nat.primeb i∧divides_b i (ord_rem m n)) (ord_rem m n))
220 intro.rewrite > H7 in H6.simplify in H6.
221 apply (not_divides_ord_rem m n)
223 |apply prime_to_lt_SO.
224 apply primeb_true_to_prime.
225 apply (andb_true_true ? ? H3)
226 |apply divides_b_true_to_divides.
227 apply (andb_true_true_r ? ? H6)
229 |elim H4.rewrite > H6.
232 apply primeb_true_to_prime.
233 apply (andb_true_true ? ? H3)
235 |apply (trans_le ? (max m (λi:nat.primeb i∧divides_b i (ord_rem m n))))
239 |apply divides_ord_rem
240 [apply prime_to_lt_SO.
241 apply primeb_true_to_prime.
242 apply (andb_true_true ? ? H3)
246 |apply (trans_le ? (max m (λi:nat.primeb i∧divides_b i m)))
247 [apply le_max_f_max_g.
249 apply (bool_elim ? (primeb i));intro
251 apply divides_to_divides_b_true
252 [apply prime_to_lt_O.
253 apply primeb_true_to_prime.
255 |apply (trans_divides ? (ord_rem m n))
256 [apply divides_b_true_to_divides.
257 apply (andb_true_true_r ? ? H5)
258 |apply divides_ord_rem
259 [apply prime_to_lt_SO.
260 apply primeb_true_to_prime.
261 apply (andb_true_true ? ? H3)
275 |apply prime_to_lt_SO.
276 apply primeb_true_to_prime.
277 apply (andb_true_true ? ? H3)
282 |elim (le_to_or_lt_eq ? ? H1)
283 [rewrite > false_to_pi_p_Sn
286 |apply false_to_lt_max
287 [apply (lt_to_le_to_lt ? (max m (λi:nat.primeb i∧divides_b i m)))
289 apply lt_SO_max_prime.
302 rewrite < (pi_p_false (λp:nat.p\sup(ord (S O) p)) (S n) ) in ⊢ (? ? % ?).
305 apply (bool_elim ? (primeb x));intro
307 change with (divides_b x (S O) =false).
308 apply not_divides_to_divides_b_false
309 [apply prime_to_lt_O.
310 apply primeb_true_to_prime.
313 apply (le_to_not_lt x (S O))
315 [apply lt_O_S.assumption
318 |elim (primeb_true_to_prime ? H6).
331 theorem pi_p_primeb_divides_b: \forall n. O < n \to
332 n = pi_p (S n) (\lambda i.primeb i \land divides_b i n) (\lambda p.exp p (ord n p)).
334 apply lt_max_to_pi_p_primeb
341 theorem pi_p_primeb: \forall n. O < n \to
342 n = pi_p (S n) primeb (\lambda p.exp p (ord n p)).
344 rewrite < eq_pi_p_primeb_divides_b.
345 apply pi_p_primeb_divides_b.
349 theorem le_ord_log: \forall n,p. O < n \to S O < p \to
352 rewrite > (exp_ord p) in ⊢ (? ? (? ? %))
356 |apply lt_O_ord_rem;assumption
363 theorem sigma_p_divides_b:
364 \forall m,n,p. O < n \to prime p \to \lnot divides p n \to
365 m = sigma_p m (λi:nat.divides_b (p\sup (S i)) ((exp p m)*n)) (λx:nat.S O).
368 |simplify in ⊢ (? ? ? (? % ? ?)).
369 rewrite > true_to_sigma_p_Sn
370 [rewrite > sym_plus.rewrite < plus_n_SO.
372 rewrite > (H n1 p H1 H2 H3) in ⊢ (? ? % ?).
375 apply (bool_elim ? (divides_b (p\sup(S x)) (p\sup n*n1)));intro
377 apply divides_to_divides_b_true
381 |apply (witness ? ? ((exp p (n - x))*n1)).
382 rewrite < assoc_times.
383 rewrite < exp_plus_times.
385 [apply eq_f.simplify.
388 apply plus_minus_m_m.
389 apply lt_to_le.assumption
395 apply (divides_b_false_to_not_divides ? ? H5).
396 apply (witness ? ? ((exp p (n - S x))*n1)).
397 rewrite < assoc_times.
398 rewrite < exp_plus_times.
402 apply plus_minus_m_m.
409 |apply divides_to_divides_b_true
411 apply prime_to_lt_O.assumption
412 |apply (witness ? ? n1).reflexivity
418 theorem sigma_p_divides_b1:
419 \forall m,n,p,k. O < n \to prime p \to \lnot divides p n \to m \le k \to
420 m = sigma_p k (λi:nat.divides_b (p\sup (S i)) ((exp p m)*n)) (λx:nat.S O).
422 lapply (prime_to_lt_SO ? H1) as H4.
423 lapply (prime_to_lt_O ? H1) as H5.
424 rewrite > (false_to_eq_sigma_p m k)
425 [apply sigma_p_divides_b;assumption
428 apply not_divides_to_divides_b_false
429 [apply lt_O_exp.assumption
430 |intro.apply (le_to_not_lt ? ? H6).
432 rewrite < (ord_exp p)
433 [rewrite > (plus_n_O m).
434 rewrite < (not_divides_to_ord_O ? ? H1 H2).
435 rewrite < (ord_exp p ? H4) in ⊢ (? ? (? % ?)).
437 [apply divides_to_le_ord
438 [apply lt_O_exp.assumption
439 |rewrite > (times_n_O O).
441 [apply lt_O_exp.assumption
447 |apply lt_O_exp.assumption
457 theorem eq_ord_sigma_p:
458 \forall n,m,x. O < n \to prime x \to
459 exp x m \le n \to n < exp x (S m) \to
460 ord n x=sigma_p m (λi:nat.divides_b (x\sup (S i)) n) (λx:nat.S O).
462 lapply (prime_to_lt_SO ? H1).
463 rewrite > (exp_ord x n) in ⊢ (? ? ? (? ? (λi:?.? ? %) ?))
464 [apply sigma_p_divides_b1
465 [apply lt_O_ord_rem;assumption
467 |apply not_divides_ord_rem;assumption
469 apply (le_to_lt_to_lt ? (log x n))
470 [apply le_ord_log;assumption
471 |apply (lt_exp_to_lt x)
473 |apply (le_to_lt_to_lt ? n ? ? H3).
484 theorem pi_p_primeb1: \forall n. O < n \to
485 n = pi_p (S n) primeb
486 (\lambda p.(pi_p (log p n)
487 (\lambda i.divides_b (exp p (S i)) n) (\lambda i.p))).
489 rewrite > (pi_p_primeb n H) in ⊢ (? ? % ?).
493 rewrite > exp_sigma_p.
497 |apply primeb_true_to_prime.
499 |apply le_exp_log.assumption
501 apply prime_to_lt_SO.
502 apply primeb_true_to_prime.
508 theorem eq_fact_pi_p:\forall n. fact n =
509 pi_p (S n) (\lambda i.leb (S O) i) (\lambda i.i).
512 |change with ((S n1)*n1! = pi_p (S (S n1)) (λi:nat.leb (S O) i) (λi:nat.i)).
513 rewrite > true_to_pi_p_Sn
514 [apply eq_f.assumption
520 theorem eq_sigma_p_div: \forall n,q.O < q \to
521 sigma_p (S n) (λm:nat.leb (S O) m∧divides_b q m) (λx:nat.S O)
524 apply (div_mod_spec_to_eq n q ? (n \mod q) ? (n \mod q))
525 [apply div_mod_spec_intro
526 [apply lt_mod_m_m.assumption
528 [simplify.elim q;reflexivity
529 |elim (or_div_mod1 n1 q)
531 rewrite > divides_to_mod_O
533 rewrite > true_to_sigma_p_Sn
534 [rewrite > H4 in ⊢ (? ? % ?).
539 apply (div_mod_spec_to_eq n1 q (div n1 q) (mod n1 q) ? (mod n1 q))
540 [apply div_mod_spec_div_mod.
542 |apply div_mod_spec_intro
543 [apply lt_mod_m_m.assumption
549 |apply true_to_true_to_andb_true
551 |apply divides_to_divides_b_true;assumption
558 rewrite > false_to_sigma_p_Sn
560 [rewrite < plus_n_Sm.
564 |elim (le_to_or_lt_eq (S (mod n1 q)) q)
568 apply (witness ? ? (S(div n1 q))).
569 rewrite < times_n_Sm.
571 rewrite < H2 in ⊢ (? ? ? (? ? %)).
578 |rewrite > not_divides_to_divides_b_false
579 [rewrite < andb_sym in ⊢ (? ? % ?).reflexivity
588 |apply div_mod_spec_div_mod.
593 theorem fact_pi_p: \forall n. fact n =
595 (\lambda p.(pi_p (log p n)
596 (\lambda i.true) (\lambda i.(exp p (n /(exp p (S i))))))).
598 rewrite > eq_fact_pi_p.
600 (pi_p (S n) (λi:nat.leb (S O) i)
601 (λn.pi_p (S n) primeb
602 (\lambda p.(pi_p (log p n)
603 (\lambda i.divides_b (exp p (S i)) n) (\lambda i.p))))))
604 [apply eq_pi_p1;intros
607 apply leb_true_to_le.assumption
610 (pi_p (S n) (λi:nat.leb (S O) i)
612 .pi_p (S n) (\lambda p.primeb p\land leb p n)
613 (λp:nat.pi_p (log p n) (λi:nat.divides_b ((p)\sup(S i)) n) (λi:nat.p)))))
616 |intros.apply eq_pi_p1
617 [intros.elim (primeb x1)
618 [simplify.apply sym_eq.
619 apply le_to_leb_true.
628 (pi_p (S n) (λi:nat.leb (S O) i)
630 .pi_p (S n) (λp:nat.primeb p∧leb p m)
631 (λp:nat.pi_p (log p m) (λi:nat.divides_b ((p)\sup(S i)) m) (λi:nat.p)))))
636 apply false_to_eq_pi_p
638 |intros.rewrite > lt_to_leb_false
639 [elim primeb;reflexivity|assumption]
642 |(* make a general theorem *)
646 .pi_p (S n) (λm.leb p m)
647 (λm:nat.pi_p (log p m) (λi:nat.divides_b ((p)\sup(S i)) m) (λi:nat.p)))
651 apply (bool_elim ? (primeb y \land leb y x));intros
652 [rewrite > (le_to_leb_true (S O) x)
654 |apply (trans_le ? y)
655 [apply prime_to_lt_O.
656 apply primeb_true_to_prime.
657 apply (andb_true_true ? ? H2)
658 |apply leb_true_to_le.
659 apply (andb_true_true_r ? ? H2)
662 |elim (leb (S O) x);reflexivity
668 (pi_p (S n) (λm:nat.leb x m)
669 (λm:nat.pi_p (log x n) (λi:nat.divides_b (x\sup(S i)) m) (λi:nat.x))))
674 apply false_to_eq_pi_p
676 [apply prime_to_lt_SO.
677 apply primeb_true_to_prime.
683 apply not_divides_to_divides_b_false
686 apply primeb_true_to_prime.
689 apply (lt_to_not_le x1 (exp x (S i)))
690 [apply (lt_to_le_to_lt ? (exp x (S(log x x1))))
692 apply prime_to_lt_SO.
693 apply primeb_true_to_prime.
696 [apply prime_to_lt_O.
697 apply primeb_true_to_prime.
704 [apply (lt_to_le_to_lt ? x)
705 [apply prime_to_lt_O.
706 apply primeb_true_to_prime.
708 |apply leb_true_to_le.
719 (pi_p (log x n) (λi:nat.true)
720 (λi:nat.pi_p (S n) (λm:nat.leb x m \land divides_b (x\sup(S i)) m) (λm:nat.x))))
721 [apply (pi_p_pi_p1 (\lambda m,i.x)).
727 rewrite > exp_sigma_p.
730 (sigma_p (S n) (λm:nat.leb (S O) m∧divides_b (x\sup(S x1)) m) (λx:nat.S O)))
733 apply (bool_elim ? (divides_b (x\sup(S x1)) x2));intro
734 [apply (bool_elim ? (leb x x2));intro
735 [rewrite > le_to_leb_true
737 |apply (trans_le ? x)
738 [apply prime_to_lt_O.
739 apply primeb_true_to_prime.
741 |apply leb_true_to_le.
745 |rewrite > lt_to_leb_false
747 |apply not_le_to_lt.intro.
748 apply (leb_false_to_not_le ? ? H6).
749 apply (trans_le ? (exp x (S x1)))
750 [rewrite > times_n_SO in ⊢ (? % ?).
751 change with (exp x (S O) \le exp x (S x1)).
753 [apply prime_to_lt_O.
754 apply primeb_true_to_prime.
756 |apply le_S_S.apply le_O_n.
760 |apply divides_b_true_to_divides.
767 rewrite < andb_sym in ⊢ (? ? ? %).
772 |apply eq_sigma_p_div.
775 apply primeb_true_to_prime.
788 (* odd n is just mod n (S(S O))
792 | S m \Rightarrow (S O) - odd m
795 theorem le_odd_SO: \forall n. odd n \le S O.
798 |simplify.cases (odd n1)
799 [simplify.apply le_n.
805 theorem SSO_odd: \forall n. n = (n/(S(S O)))*(S(S O)) + odd n.
807 [apply (lt_O_n_elim ? H).
808 intro.simplify.reflexivity
812 theorem fact_pi_p2: \forall n. fact ((S(S O))*n) =
813 pi_p (S ((S(S O))*n)) primeb
814 (\lambda p.(pi_p (log p ((S(S O))*n))
815 (\lambda i.true) (\lambda i.(exp p ((S(S O))*(n /(exp p (S i))))*(exp p (mod ((S(S O))*n /(exp p (S i))) (S(S O)))))))).
816 intros.rewrite > fact_pi_p.
819 |intros.apply eq_pi_p
822 rewrite < exp_plus_times.
824 rewrite > sym_times in ⊢ (? ? ? (? % ?)).
828 apply primeb_true_to_prime.
834 theorem fact_pi_p3: \forall n. fact ((S(S O))*n) =
835 pi_p (S ((S(S O))*n)) primeb
836 (\lambda p.(pi_p (log p ((S(S O))*n))
837 (\lambda i.true) (\lambda i.(exp p ((S(S O))*(n /(exp p (S i))))))))*
838 pi_p (S ((S(S O))*n)) primeb
839 (\lambda p.(pi_p (log p ((S(S O))*n))
840 (\lambda i.true) (\lambda i.(exp p (mod ((S(S O))*n /(exp p (S i))) (S(S O))))))).
842 rewrite < times_pi_p.
843 rewrite > fact_pi_p2.
850 theorem pi_p_primeb4: \forall n. S O < n \to
851 pi_p (S ((S(S O))*n)) primeb
852 (\lambda p.(pi_p (log p ((S(S O))*n))
853 (\lambda i.true) (\lambda i.(exp p ((S(S O))*(n /(exp p (S i))))))))
856 (\lambda p.(pi_p (log p (S(S O)*n))
857 (\lambda i.true) (\lambda i.(exp p ((S(S O))*(n /(exp p (S i)))))))).
859 apply or_false_eq_SO_to_eq_pi_p
866 [change with (i\sup((S(S O))*(n/i\sup(S O)))*(S O) = S O).
867 rewrite < times_n_SO.
870 |simplify.rewrite < times_n_SO.assumption
874 |apply le_S_S_to_le.assumption
879 theorem pi_p_primeb5: \forall n. S O < n \to
880 pi_p (S ((S(S O))*n)) primeb
881 (\lambda p.(pi_p (log p ((S(S O))*n))
882 (\lambda i.true) (\lambda i.(exp p ((S(S O))*(n /(exp p (S i))))))))
885 (\lambda p.(pi_p (log p n)
886 (\lambda i.true) (\lambda i.(exp p ((S(S O))*(n /(exp p (S i)))))))).
888 rewrite > (pi_p_primeb4 ? H).
889 apply eq_pi_p1;intros
891 |apply or_false_eq_SO_to_eq_pi_p
893 [apply prime_to_lt_SO.
894 apply primeb_true_to_prime.
901 [simplify.reflexivity
902 |apply (lt_to_le_to_lt ? (exp x (S(log x n))))
904 apply prime_to_lt_SO.
905 apply primeb_true_to_prime.
908 [apply prime_to_lt_O.
909 apply primeb_true_to_prime.
920 theorem exp_fact_SSO: \forall n.
921 exp (fact n) (S(S O))
924 (\lambda p.(pi_p (log p n)
925 (\lambda i.true) (\lambda i.(exp p ((S(S O))*(n /(exp p (S i)))))))).
939 (\lambda p.(pi_p (log p n)
940 (\lambda i.true) (\lambda i.(exp p (mod (n /(exp p (S i))) (S(S O))))))).
942 theorem eq_fact_B:\forall n.S O < n \to
943 fact ((S(S O))*n) = exp (fact n) (S(S O)) * B((S(S O))*n).
945 rewrite > fact_pi_p3.
948 rewrite > pi_p_primeb5
956 theorem le_B_A: \forall n. B n \le A n.
960 apply le_pi_p.intros.
961 apply le_pi_p.intros.
962 rewrite > exp_n_SO in ⊢ (? ? %).
964 [apply prime_to_lt_O.
965 apply primeb_true_to_prime.
973 theorem le_fact_A:\forall n.S O < n \to
974 fact ((S(S O))*n) \le exp (fact n) (S(S O)) * A ((S(S O))*n).
983 theorem lt_SO_to_le_B_exp: \forall n.S O < n \to
984 B ((S(S O))*n) \le exp (S(S O)) ((S(S O))*n).
986 apply (le_times_to_le (exp (fact n) (S(S O))))
990 [rewrite < sym_times in ⊢ (? ? %).
992 rewrite < assoc_times.
999 theorem le_B_exp: \forall n.
1000 B ((S(S O))*n) \le exp (S(S O)) ((S(S O))*n).
1004 [simplify.apply le_S.apply le_S.apply le_n
1005 |apply lt_SO_to_le_B_exp.
1006 apply le_S_S.apply lt_O_S.
1011 theorem lt_SO_to_le_exp_B: \forall n. S O < n \to
1012 exp (S(S O)) ((S(S O))*n) \le (S(S O)) * n * B ((S(S O))*n).
1014 apply (le_times_to_le (exp (fact n) (S(S O))))
1017 |rewrite < assoc_times in ⊢ (? ? %).
1018 rewrite > sym_times in ⊢ (? ? (? % ?)).
1019 rewrite > assoc_times in ⊢ (? ? %).
1021 [rewrite < sym_times.
1023 apply lt_to_le.assumption
1029 theorem le_exp_B: \forall n. O < n \to
1030 exp (S(S O)) ((S(S O))*n) \le (S(S O)) * n * B ((S(S O))*n).
1034 |apply lt_SO_to_le_exp_B.
1035 apply le_S_S.assumption
1039 theorem eq_A_SSO_n: \forall n.O < n \to
1041 pi_p (S ((S(S O))*n)) primeb
1042 (\lambda p.(pi_p (log p ((S(S O))*n) )
1043 (\lambda i.true) (\lambda i.(exp p (bool_to_nat (leb (S n) (exp p (S i))))))))
1046 rewrite > eq_A_A'.rewrite > eq_A_A'.
1049 pi_p (S n) primeb (λp:nat.pi_p (log p n) (λi:nat.true) (λi:nat.p))
1050 = pi_p (S ((S(S O))*n)) primeb
1051 (λp:nat.pi_p (log p ((S(S O))*n)) (λi:nat.true) (λi:nat.(p)\sup(bool_to_nat (\lnot (leb (S n) (exp p (S i))))))))
1053 rewrite < times_pi_p.
1054 apply eq_pi_p1;intros
1056 |rewrite < times_pi_p.
1057 apply eq_pi_p;intros
1059 |apply (bool_elim ? (leb (S n) (exp x (S x1))));intro
1060 [simplify.rewrite < times_n_SO.apply times_n_SO
1061 |simplify.rewrite < plus_n_O.apply times_n_SO
1065 |apply (trans_eq ? ? (pi_p (S n) primeb
1066 (\lambda p:nat.pi_p (log p n) (\lambda i:nat.true) (\lambda i:nat.(p)\sup(bool_to_nat (¬leb (S n) (exp p (S i))))))))
1067 [apply eq_pi_p1;intros
1069 |apply eq_pi_p1;intros
1071 |rewrite > lt_to_leb_false
1072 [simplify.apply times_n_SO
1074 apply (trans_le ? (exp x (log x n)))
1076 [apply prime_to_lt_O.
1077 apply primeb_true_to_prime.
1087 |apply (trans_eq ? ?
1088 (pi_p (S ((S(S O))*n)) primeb
1089 (λp:nat.pi_p (log p n) (λi:nat.true)
1090 (λi:nat.(p)\sup(bool_to_nat (¬leb (S n) ((p)\sup(S i))))))))
1092 apply or_false_eq_SO_to_eq_pi_p
1097 rewrite > lt_to_log_O
1103 |apply eq_pi_p1;intros
1106 apply or_false_eq_SO_to_eq_pi_p
1108 [apply prime_to_lt_SO.
1109 apply primeb_true_to_prime.
1115 rewrite > le_to_leb_true
1116 [simplify.reflexivity
1117 |apply (lt_to_le_to_lt ? (exp x (S (log x n))))
1119 apply prime_to_lt_SO.
1120 apply primeb_true_to_prime.
1123 [apply prime_to_lt_O.
1124 apply primeb_true_to_prime.
1126 |apply le_S_S.assumption
1137 theorem le_A_BA1: \forall n. O < n \to
1138 A((S(S O))*n) \le B((S(S O))*n)*A n.
1140 rewrite > eq_A_SSO_n
1143 apply le_pi_p.intros.
1144 apply le_pi_p.intros.
1146 [apply prime_to_lt_O.
1147 apply primeb_true_to_prime.
1149 |apply (bool_elim ? (leb (S n) (exp i (S i1))));intro
1150 [simplify in ⊢ (? % ?).
1151 cut ((S(S O))*n/i\sup(S i1) = S O)
1152 [rewrite > Hcut.apply le_n
1153 |apply (div_mod_spec_to_eq
1154 ((S(S O))*n) (exp i (S i1))
1155 ? (mod ((S(S O))*n) (exp i (S i1)))
1156 ? (minus ((S(S O))*n) (exp i (S i1))) )
1157 [apply div_mod_spec_div_mod.
1159 apply prime_to_lt_O.
1160 apply primeb_true_to_prime.
1162 |cut (i\sup(S i1)≤(S(S O))*n)
1163 [apply div_mod_spec_intro
1164 [alias id "lt_plus_to_lt_minus" = "cic:/matita/nat/map_iter_p.ma/lt_plus_to_lt_minus.con".
1165 apply lt_plus_to_lt_minus
1167 |simplify in ⊢ (? % ?).
1170 [apply leb_true_to_le.assumption
1171 |apply leb_true_to_le.assumption
1174 |rewrite > sym_plus.
1175 rewrite > sym_times in ⊢ (? ? ? (? ? %)).
1176 rewrite < times_n_SO.
1177 apply plus_minus_m_m.
1180 |apply (trans_le ? (exp i (log i ((S(S O))*n))))
1182 [apply prime_to_lt_O.
1183 apply primeb_true_to_prime.
1188 rewrite > (times_n_O O) in ⊢ (? % ?).
1204 theorem le_A_BA: \forall n. A((S(S O))*n) \le B((S(S O))*n)*A n.
1207 |apply le_A_BA1.apply lt_O_S
1211 theorem le_A_exp: \forall n.
1212 A((S(S O))*n) \le (exp (S(S O)) ((S(S O)*n)))*A n.
1214 apply (trans_le ? (B((S(S O))*n)*A n))
1221 theorem le_A_exp1: \forall n.
1222 A(exp (S(S O)) n) \le (exp (S(S O)) ((S(S O))*(exp (S(S O)) n))).
1224 [simplify.apply le_S_S.apply le_O_n
1225 |change with (A ((S(S O))*((S(S O)))\sup n1)≤ ((S(S O)))\sup((S(S O))*((S(S O))\sup(S n1)))).
1226 apply (trans_le ? ((exp (S(S O)) ((S(S O)*(exp (S(S O)) n1))))*A (exp (S(S O)) n1)))
1228 |apply (trans_le ? ((S(S O))\sup((S(S O))*((S(S O)))\sup(n1))*(S(S O))\sup((S(S O))*((S(S O)))\sup(n1))))
1231 |rewrite < exp_plus_times.
1232 simplify.rewrite < plus_n_O in ⊢ (? ? (? ? (? ? %))).
1239 theorem monotonic_A: monotonic nat le A.
1243 |apply (trans_le ? (A n1))
1246 cut (pi_p (S n1) primeb (λp:nat.(p)\sup(log p n1))
1247 ≤pi_p (S n1) primeb (λp:nat.(p)\sup(log p (S n1))))
1248 [apply (bool_elim ? (primeb (S n1)));intro
1249 [rewrite > (true_to_pi_p_Sn ? ? ? H3).
1250 rewrite > times_n_SO in ⊢ (? % ?).
1251 rewrite > sym_times.
1253 [apply lt_O_exp.apply lt_O_S
1256 |rewrite > (false_to_pi_p_Sn ? ? ? H3).
1259 |apply le_pi_p.intros.
1261 [apply prime_to_lt_O.
1262 apply primeb_true_to_prime.
1265 [apply prime_to_lt_SO.
1266 apply primeb_true_to_prime.
1268 |apply le_S.apply le_n
1276 theorem le_A_exp2: \forall n. O < n \to
1277 A(n) \le (exp (S(S O)) ((S(S O)) * (S(S O)) * n)).
1279 apply (trans_le ? (A (exp (S(S O)) (S(log (S(S O)) n)))))
1284 |apply (trans_le ? ((exp (S(S O)) ((S(S O))*(exp (S(S O)) (S(log (S(S O)) n)))))))
1288 |rewrite > assoc_times.apply le_times_r.
1289 change with ((S(S O))*((S(S O))\sup(log (S(S O)) n))≤(S(S O))*n).
1299 theorem A_SO: A (S O) = S O.
1303 theorem A_SSO: A (S(S O)) = S (S O).
1307 theorem A_SSSO: A (S(S(S O))) = S(S(S(S(S(S O))))).
1311 theorem A_SSSSO: A (S(S(S(S O)))) = S(S(S(S(S(S(S(S(S(S(S(S O))))))))))).
1316 theorem or_eq_eq_S: \forall n.\exists m.
1317 n = (S(S O))*m \lor n = S ((S(S O))*m).
1319 [apply (ex_intro ? ? O).
1322 [apply (ex_intro ? ? a).
1323 right.apply eq_f.assumption
1324 |apply (ex_intro ? ? (S a)).
1332 (* a better result *)
1333 theorem le_A_exp3: \forall n. S O < n \to
1334 A(n) \le exp (pred n) (S(S O))*(exp (S(S O)) ((S(S O)) * n)).
1336 apply (nat_elim1 n).
1338 elim (or_eq_eq_S m).
1340 [elim (le_to_or_lt_eq (S O) a)
1341 [rewrite > H3 in ⊢ (? % ?).
1342 apply (trans_le ? ((exp (S(S O)) ((S(S O)*a)))*A a))
1344 |apply (trans_le ? (((S(S O)))\sup((S(S O))*a)*
1345 ((pred a)\sup((S(S O)))*((S(S O)))\sup((S(S O))*a))))
1349 rewrite > times_n_SO in ⊢ (? % ?).
1350 rewrite > sym_times.
1352 [apply lt_to_le.assumption
1357 |rewrite > sym_times.
1358 rewrite > assoc_times.
1359 rewrite < exp_plus_times.
1361 (pred a\sup((S(S O)))*(S(S O))\sup(S(S O))*(S(S O))\sup((S(S O))*m)))
1362 [rewrite > assoc_times.
1364 rewrite < exp_plus_times.
1370 apply le_S.apply le_S.
1374 rewrite > times_exp.
1375 apply monotonic_exp1.
1377 rewrite > sym_times.
1381 rewrite < plus_n_Sm.
1388 |rewrite < H4 in H3.
1392 apply le_S_S.apply le_S_S.apply le_O_n
1393 |apply not_lt_to_le.intro.
1394 apply (lt_to_not_le ? ? H1).
1396 apply (le_n_O_elim a)
1397 [apply le_S_S_to_le.assumption
1401 |elim (le_to_or_lt_eq O a (le_O_n ?))
1402 [apply (trans_le ? (A ((S(S O))*(S a))))
1405 rewrite > times_SSO.
1407 |apply (trans_le ? ((exp (S(S O)) ((S(S O)*(S a))))*A (S a)))
1409 |apply (trans_le ? (((S(S O)))\sup((S(S O))*S a)*
1410 (a\sup((S(S O)))*((S(S O)))\sup((S(S O))*(S a)))))
1416 rewrite > plus_n_SO.
1420 |apply le_S_S.assumption
1422 |rewrite > sym_times.
1423 rewrite > assoc_times.
1424 rewrite < exp_plus_times.
1426 (a\sup((S(S O)))*(S(S O))\sup(S(S O))*(S(S O))\sup((S(S O))*m)))
1427 [rewrite > assoc_times.
1429 rewrite < exp_plus_times.
1432 |rewrite > times_SSO.
1435 rewrite < plus_n_Sm.
1440 rewrite > times_exp.
1441 apply monotonic_exp1.
1443 rewrite > sym_times.
1449 |rewrite < H4 in H3.simplify in H3.
1451 apply (lt_to_not_le ? ? H1).
1458 theorem eq_sigma_pi_SO_n: \forall n.
1459 sigma_p n (\lambda i.true) (\lambda i.S O) = n.
1462 |rewrite > true_to_sigma_p_Sn
1463 [rewrite > H.reflexivity
1469 theorem leA_prim: \forall n.
1470 exp n (prim n) \le A n * pi_p (S n) primeb (λp:nat.p).
1473 rewrite < (exp_sigma_p (S n) n primeb).
1475 rewrite < times_pi_p.
1478 rewrite > sym_times.
1479 change in ⊢ (? ? %) with (exp i (S (log i n))).
1482 apply prime_to_lt_SO.
1483 apply primeb_true_to_prime.
1488 (* the inequalities *)
1489 theorem le_exp_priml: \forall n. O < n \to
1490 exp (S(S O)) ((S(S O))*n) \le exp ((S(S O))*n) (S(prim ((S(S O))*n))).
1492 apply (trans_le ? ((((S(S O))*n*(B ((S(S O))*n))))))
1493 [apply le_exp_B.assumption
1494 |change in ⊢ (? ? %) with ((((S(S O))*n))*(((S(S O))*n))\sup (prim ((S(S O))*n))).
1496 apply (trans_le ? (A ((S(S O))*n)))
1503 theorem le_priml: \forall n. O < n \to
1504 (S(S O))*n \le (S (log (S(S O)) ((S(S O))*n)))*S(prim ((S(S O))*n)).
1506 rewrite < (eq_log_exp (S(S O))) in ⊢ (? % ?)
1507 [apply (trans_le ? ((log (S(S O)) (exp ((S(S O))*n) (S(prim ((S(S O))*n)))))))
1510 |apply le_exp_priml.assumption
1512 |rewrite > sym_times in ⊢ (? ? %).
1520 theorem le_exp_primr: \forall n. S O < n \to
1521 exp n (prim n) \le exp (pred n) ((S(S O))*(S(S O)))*(exp (S(S O)) ((S(S O))*(S(S O)) * n)).
1523 apply (trans_le ? (exp (A n) (S(S O))))
1524 [change in ⊢ (? ? %) with ((A n)*((A n)*(S O))).
1525 rewrite < times_n_SO.
1527 |apply (trans_le ? (exp (exp (pred n) (S(S O))*(exp (S(S O)) ((S(S O)) * n))) (S(S O))))
1528 [apply monotonic_exp1.
1531 |rewrite < times_exp.
1532 rewrite > exp_exp_times.
1533 rewrite > exp_exp_times.
1534 rewrite > sym_times in ⊢ (? (? ? (? ? %)) ?).
1535 rewrite < assoc_times in ⊢ (? (? ? (? ? %)) ?).