Skip to content

Commit 8c72fe8

Browse files
golfing dvg_sum_inv_prim_seq (#1933)
* golfing dvg_sum_inv_prim_seq --------- Co-authored-by: affeldt-aist <33154536+affeldt-aist@users.noreply.github.com>
1 parent 903b60a commit 8c72fe8

File tree

1 file changed

+45
-73
lines changed

1 file changed

+45
-73
lines changed

theories/showcase/pnt.v

Lines changed: 45 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ End prime_seq.
108108
Section dvg_sum_inv_prime_seq.
109109

110110
Let P (k N : nat) :=
111-
[set n : 'I_N.+1 |all (fun p => p < prime_seq k) (primes n)]%SET.
111+
[set n : 'I_N.+1 | all (fun p => p < prime_seq k) (primes n)]%SET.
112112
Let G (k N : nat) := ~: P k N.
113113

114114
Let cardPcardG k N : #|G k N| + #|P k N| = N.+1.
@@ -121,13 +121,13 @@ Qed.
121121

122122
Let cardG (R : realType) (k N : nat) :
123123
(\sum_(k <= k0 <oo) ((prime_seq k0)%:R^-1 : R)%:E < (2^-1)%:E)%E
124-
-> k <= N.+1 -> ~~ odd N -> N > 0 -> (#|G k N| < (N./2)).
124+
-> N > 0 -> (#|G k N|%:R < (N%:R / 2) :> R)%R.
125125
Proof.
126126
set E := fun i => [set n : 'I_N.+1 | (prime_seq i) \in (primes n)].
127127
set Parts := fun i => [set ([set x in [seq (insubd ord0 x : 'I_N.+1) |
128128
x <- iota ((val y).+1 - (prime_seq i)) (prime_seq i)]]
129129
: {set 'I_N.+1}) | y in (E i)]%SET.
130-
move=> Rklthalf kleqN1 evenN Nneq0.
130+
move=> Rklthalf Nneq0.
131131
suff cardEi : forall i, k <= i ->
132132
(#|E i|%:R <= N%:R / (prime_seq i)%:R :>R)%R => [|i klti].
133133
have -> : G k N = \bigcup_(k <= i < N.+1) E i.
@@ -150,23 +150,17 @@ suff cardEi : forall i, k <= i ->
150150
exact/mono_leq_infl/leq_prime_seq.
151151
exists (Ordinal ileqN) => /=; first by rewrite -leq_prime_seq.
152152
by rewrite inE mem_primes xneq0 pidvdx/= andbT -mem_prime_seq inE.
153-
apply: (leq_ltn_trans (card_big_setU _ _ E)).
154-
rewrite -(ltr_nat R).
153+
apply: (le_lt_trans (ler_wpMn2l ler01 (card_big_setU _ _ E))).
155154
apply: (@le_lt_trans _ _ (N%:R * \sum_(k <= i < N.+1) (prime_seq i)%:R^-1)%R).
156155
rewrite mulr_sumr raddf_sum /= ler_sum_nat// => i /andP[+ _].
157156
exact: cardEi.
158-
have SnleqlimSn: ((\sum_(k <= i < N.+1) (prime_seq i)%:R^-1)%:E <=
159-
\sum_(k <= i <oo) ((prime_seq i)%:R^-1 : R)%:E)%E.
160-
rewrite (nneseries_split _ (N.+1 - k)) => [i leqi|].
161-
by rewrite lee_fin invr_ge0.
162-
rewrite subnKC // raddf_sum leeDl//; apply/nneseries_ge0 => n _ _.
163-
by rewrite lee_fin invr_ge0.
164157
rewrite -lte_fin.
165158
apply: (@le_lt_trans _ _ (N%:R%:E * \sum_(k <= i <oo) (prime_seq i)%:R^-1%:E)%E).
166-
rewrite EFinM lee_pmul ?lee_fin// => //.
167-
by apply: sumr_ge0 => i _; rewrite invr_ge0.
168-
rewrite -divn2 natf_div ?dvdn2// EFinM -lte_pdivrMl ?ltr0n//.
169-
by rewrite muleA -EFinM mulVf ?mul1e// pnatr_eq0 -lt0n.
159+
rewrite EFinM lee_pmul ?lee_fin//; first by rewrite sumr_ge0.
160+
rewrite raddf_sum; apply: nneseries_lim_ge => n _ _.
161+
by rewrite lee_fin invr_ge0.
162+
rewrite EFinM -lte_pdivrMl ?ltr0n// muleA -EFinM mulVf ?mul1e//.
163+
by rewrite pnatr_eq0 -lt0n.
170164
rewrite ler_pdivlMr.
171165
rewrite ltr0n.
172166
have : prime_seq i \in range prime_seq by rewrite inE.
@@ -179,31 +173,28 @@ have Eigtpi x3 : x3 \in E i -> prime_seq i - x3.+1 = 0.
179173
move: x3inEi; rewrite /E inE mem_primes -mem_prime_seq mem_range.
180174
by case: (x3 > 0).
181175
have: finset.trivIset (Parts i).
182-
apply/finset.trivIsetP => A B /imsetP [] x xinEi + /imsetP [] y yinEi.
183-
wlog xley: x y xinEi yinEi A B / x <= y.
184-
move: (leq_total x y) => /orP [xley Hw| ylex Hw Adef Bdef].
176+
apply/finset.trivIsetP => _ _ /imsetP [] x xinEi -> /imsetP [] y yinEi ->.
177+
wlog : x y xinEi yinEi / x <= y.
178+
move: (leq_total x y) => /orP [xley Hw| ylex Hw].
185179
exact: (Hw x y).
186180
by rewrite eq_sym disjoint_sym; apply: (Hw y x).
187-
have [-> <- ->| xneqy] := eqVneq x y; first by rewrite eqxx.
188-
rewrite -setI_eq0 => -> -> AneqB /=; rewrite -finset.subset0.
189-
apply/fintype.subsetP; rewrite /sub_mem => x0.
190-
rewrite finset.in_setI => /andP. rewrite finset.inE => -[].
191-
rewrite finset.inE => /mapP -[] x1 x1iniota -> /mapP -[] x2 x2iniota
192-
/(congr1 val).
193-
rewrite !val_insubd. move: x1iniota x2iniota.
181+
rewrite -[x <= y]/(x <= y)%O.
182+
rewrite le_eqVlt => /predU1P[->|xy _]; first by rewrite eqxx.
183+
rewrite -setI_eq0 -finset.subset0.
184+
apply/fintype.subsetP => x0.
185+
rewrite finset.in_setI !inE => /andP[] /mapP[]/= x1 x1x -> /mapP[]/= x2 x2y.
186+
move=> /(congr1 val); rewrite !val_insubd; move: x1x x2y.
194187
rewrite !mem_iota !addnCB (Eigtpi x) // (Eigtpi y) // !addn0 !ltnS.
195-
move=> /andP [] x1ge x1lt /andP [] x2ge x2lt.
196-
rewrite (leq_trans x1lt (ltn_ord x)) (leq_trans x2lt (ltn_ord y)) => x12.
197-
have: y.+1 - (prime_seq i) >= x.+1.
198-
rewrite -(leq_add2r (prime_seq i)) -(@leq_sub2rE x.+1).
199-
by rewrite addnCB (Eigtpi y) // addn0.
200-
rewrite addnCB (Eigtpi y) // addn0 -addnBAC // subnn add0n subSS.
201-
apply: dvdn_leq; first by rewrite subn_gt0 ltn_neqAle; apply/andP.
202-
suff pidvdEi x3 : x3 \in E i -> prime_seq i %| x3.
203-
by apply: dvdn_sub; apply: (pidvdEi _).
204-
by rewrite /E inE mem_primes -mem_prime_seq mem_range; case: (x3 > 0).
205-
move=> /(fun H => leq_trans H x2ge) /(leq_ltn_trans x1lt).
206-
by rewrite x12 ltnn.
188+
have xiN (a : 'I_N.+1) (b : nat) : b <= a -> b <= N.
189+
by move/leq_trans; apply; rewrite -ltnS.
190+
move=> /andP [] _ /[dup] + /xiN -> /andP [] + /xiN -> x1eqx2.
191+
rewrite -x1eqx2 => /(leq_trans _)/[apply].
192+
rewrite -(leq_add2r (prime_seq i)) addnCB Eigtpi// addn0.
193+
rewrite -(@leq_sub2rE x) ?leq_addr// subDnCA// subnn addn0 (subSn (ltW xy)).
194+
rewrite ltnNge dvdn_leq// ?subn_gt0//.
195+
have dvdni z : z \in E i -> prime_seq i %| z.
196+
by rewrite inE mem_primes => /andP[] _ /andP[].
197+
by apply: dvdn_sub; apply: dvdni.
207198
set i1toN := [set : 'I_N.+1] :\ ord0.
208199
have cardNeqN: #|i1toN| = N.
209200
rewrite /i1toN. apply/eqP.
@@ -283,35 +274,24 @@ Qed.
283274
Let cardP (k : nat) : #|P k (2 ^ (k.*2 + 2))| <= (2 ^ (k.*2 + 1)).+1.
284275
Proof.
285276
set N := 2 ^ (k.*2 + 2).
286-
set P' := fun k N => P k N :\ ord0.
277+
pose P' k N := P k N :\ ord0.
287278
set A := k.-tuple bool.
288279
set B := 'I_(2 ^ (k + 1)).+1.
289-
set a := fun n i => odd (logn (prime_seq i) n).
280+
pose a n i := odd (logn (prime_seq i) n).
290281
have eqseq : forall n k, n < k ->
291-
[seq i <- [seq prime_seq i | i <- index_iota 0 k] | i \in primes n]
282+
[seq i <- [seq prime_seq i | i <- index_iota 0 k] | i \in primes n]
292283
= primes n.
293284
move=> + k0; case=> [|n nlek]; first by rewrite filter_pred0.
294285
apply: lt_sorted_eq => [||elt].
295286
- apply: lt_sorted_filter.
296287
rewrite sorted_map.
297288
apply: (@sub_sorted _ ltn); last exact: iota_ltn_sorted.
298-
rewrite ltEnat => i j /=.
299-
by rewrite (leqW_mono leq_prime_seq).
289+
by rewrite ltEnat => i j /=; rewrite (leqW_mono leq_prime_seq).
300290
- exact: sorted_primes.
301-
rewrite mem_filter andb_idr// => eltinprimesn.
302-
suff: prime elt /\ elt < prime_seq k0.
303-
rewrite -mem_prime_seq inE => /= -[[i _ <-]] pilepk.
304-
rewrite map_comp; apply: map_f.
305-
by rewrite map_id_in // mem_iota /= add0n subn0 -(leqW_mono leq_prime_seq).
306-
split.
307-
by apply/(@allP _ _ (primes n.+1)); first exact: all_prime_primes.
308-
apply: (@leq_ltn_trans n.+1).
309-
rewrite dvdn_leq//.
310-
move: eltinprimesn.
311-
by rewrite mem_primes => /andP[_ /andP[]].
312-
apply: (@leq_ltn_trans k0.-1); first by rewrite ltn_predRL.
313-
rewrite prednK ?(ltn_trans _ nlek)//.
314-
exact/mono_leq_infl/leq_prime_seq.
291+
rewrite mem_filter andb_idr// mem_primes -mem_prime_seq => /andP[].
292+
rewrite inE => -[] i _ <- /andP[] _ /dvdn_leq/wrap[]// idn.
293+
apply: map_f; rewrite mem_iota leq0n/= add0n subn0.
294+
exact/(leq_ltn_trans _ nlek)/(leq_trans _ idn)/mono_leq_infl/leq_prime_seq.
315295
have binB (n : 'I_N.+1) :
316296
(\prod_(i < k) (prime_seq i) ^ (logn (prime_seq i) n)./2) <
317297
(2 ^ (k + 1)).+1.
@@ -334,13 +314,9 @@ have binB (n : 'I_N.+1) :
334314
(prime_seq i) ^ logn (prime_seq i) n)) -(big_map prime_seq predT
335315
(fun i => i ^ logn i n)) /=.
336316
rewrite (bigID (mem (primes n))) /=.
337-
rewrite [X in _ * X]big1 => [i inotinprimesn|].
338-
have [/predU1P[->|/eqP->]//|] := boolP ((i == 0) || (i == 1)).
339-
move=> /norP[ineq0 ineq1].
340-
rewrite -(expn0 i); apply/eqP; rewrite eqn_exp2l.
341-
by rewrite ltn_neqAle lt0n ineq0 eq_sym ineq1.
342-
apply/eqP; move: inotinprimesn.
343-
by rewrite -logn_gt0 lt0n negbK => /eqP.
317+
rewrite [X in _ * X]big1 => [[//|][//|] i ip|].
318+
apply/eqP; rewrite -(expn0 i.+2) eqn_exp2l//.
319+
by move: ip; rewrite -logn_gt0 lt0n negbK.
344320
rewrite muln1 -big_filter.
345321
have [nltk|klen] := ltnP n k; first by rewrite (eqseq n).
346322
rewrite -[in X in _ <= X](eqseq n n.+1); first exact: ltnSn.
@@ -434,21 +410,17 @@ rewrite lte_subel_addl; first by rewrite leqlimnSn.
434410
rewrite -lteBlDr; first exact/sum_fin_numP.
435411
rewrite (nneseries_split _ k); first by move=> k0 _; exact: unpos.
436412
rewrite /Sn add0n addrAC subee; first exact/sum_fin_numP.
437-
rewrite add0e => Rklthalf.
413+
rewrite add0e div1r => Rklthalf.
438414
suff: N.+1 < N.+1 by rewrite ltnn.
439415
rewrite -[X in X < _](cardPcardG k N).
440416
have Neq : N./2 + (2 ^ (k.*2 + 1)).+1 = N.+1.
441-
rewrite addnC addSn /N -divn2.
442-
rewrite -[X in _ %/ X]expn1 -expnB //; first by rewrite addn2.
443-
rewrite -addnBA /subn //= addnn.
444-
by rewrite -mul2n -expnS -[X in 2 ^ X]addn1 -addnA.
417+
by rewrite /N 2!addnS expnS mul2n doubleK addnn.
445418
rewrite -[X in _ < X]Neq -addSn.
446419
apply: leq_add; last exact: cardP.
447-
apply: (@cardG R); first by move: Rklthalf; rewrite /un div1r.
448-
- rewrite /N; apply/leqW/(leq_trans (ltnW (ltn_expl k (ltnSn 1)))).
449-
by rewrite leq_exp2l// -addnn -addnA leq_addr.
450-
- by rewrite /N addn2 expnS mul2n odd_double.
451-
- by rewrite /N expn_gt0.
420+
rewrite -(ltr_nat R).
421+
have -> : (N./2%:R = N%:R / 2 :> R)%R.
422+
by rewrite /N addnS expnS [in LHS]mul2n doubleK natrM mulrC mulKf.
423+
by apply: (@cardG R) => //; rewrite /N expn_gt0.
452424
Qed.
453425

454426
End dvg_sum_inv_prime_seq.

0 commit comments

Comments
 (0)