@@ -155,13 +155,51 @@ Lemma pos_esum_ge (T1 : choiceType) (I : set T1) (a : T1 -> \bar R) x :
155155 x <= \esum_(i in I) a i.
156156Proof . by move=> [X IX /le_trans->//]; apply: ereal_sup_ubound; exists X. Qed .
157157
158- Lemma le_pos_esum S f g : (forall i, S i -> f i <= g i) ->
158+ Lemma pos_neq0_esum (I : set T) (a : T -> \bar R) :
159+ \esum_(i in I) a i <> 0 -> exists i, a i <> 0.
160+ Proof .
161+ move=> ?. apply/existsp_asboolPn /asboolPn => h.
162+ have // : (\esum_(i in I) a i = 0); by apply pos_esum1.
163+ Qed .
164+
165+ Lemma pos_esum_ge1 (I : set T) (f : T -> \bar R) :
166+ (forall x, I x -> f x <= \esum_(i in (I : set T)) f i)%E.
167+ Proof .
168+ move=> x Ix.
169+ apply: pos_esum_ge.
170+ exists ([set` [::x]]%classic) => //=.
171+ + by split => // y /=; rewrite mem_seq1 => /eqP ->.
172+ by rewrite -fsbig_seq //= big_seq1.
173+ Qed .
174+
175+ Lemma pos_sum_esum_ge J (f: T -> R) :
176+ uniq J -> ((\sum_(j <- J) f j)%:E <= \esum_(i in [set: T]) (f i)%:E)%E.
177+ Proof .
178+ move => ?.
179+ apply: pos_esum_ge.
180+ exists [set` J]%classic => //.
181+ rewrite fsumEFin // lee_fin -fsbig_seq //=.
182+ Qed .
183+
184+ Lemma le_pos_esum {U : choiceType} (S: set U) (f g: U -> \bar R) :
185+ (forall i, S i -> f i <= g i) ->
159186 \esum_(i in S) f i <= \esum_(i in S) g i.
160187Proof .
161188move=> fg; rewrite ge_ereal_sup => //= _ [X [finX XS]] <-.
162189by rewrite pos_esum_ge//; exists X => //; apply: lee_fsum => // t /XS /fg.
163190Qed .
164191
192+ Lemma le_pos_esum_fine
193+ {U : choiceType} (A : set U) (B : set T) (f : T -> U -> \bar R) :
194+ (\esum_(i in A) (fine (\esum_(x in B) f x i))%:E <=
195+ \esum_(i in A) (\esum_(x in B) f x i))%E.
196+ Proof .
197+ rewrite le_pos_esum // => i ?.
198+ case h: (\esum_(x in B) _) => //=.
199+ + exact : leey.
200+ by rewrite -h pos_esum_ge0.
201+ Qed .
202+
165203Lemma pos_esumZ S f (c : \bar R) : 0 <= c -> (forall t, S t -> 0 <= f t) ->
166204 \esum_(t in S) c * f t = c * \esum_(t in S) f t.
167205Proof .
@@ -385,18 +423,53 @@ Section esum_realType.
385423Variables (R : realType) (T : choiceType).
386424Implicit Types (S : set T) (f : T -> \bar R).
387425
388- Lemma le_esum S f g : (forall x, S x -> 0 <= f x) ->
426+ Lemma sum_esum_ge J (f: T -> R) :
427+ (forall x, 0 <= f x)%R ->
428+ uniq J -> ((\sum_(j <- J) f j)%:E <= \esum_(i in [set:T]) (f i)%:E)%E.
429+ Proof .
430+ move=> f0 uJ; rewrite ge0_esum.
431+ + by move=> x _; rewrite lee_fin; exact: f0.
432+ exact: (PosEsum.pos_sum_esum_ge).
433+ Qed .
434+
435+ Lemma le_esum S f g :
389436 (forall x, S x -> f x <= g x) ->
390- \esum_(x in S) f x <= \esum_(x in S) g x .
437+ \esum_(i in S) f i <= \esum_(i in S) g i .
391438Proof .
392- move=> f0 leS; have g0 x : S x -> 0 <= g x.
393- by move=> /[dup] Ax /leS; apply: le_trans; exact: f0 Ax.
394- by rewrite !ge0_esum// PosEsum.le_pos_esum.
439+ move=> leS.
440+ have leS' : {in S, forall x, f x <= g x} by move=> x /set_mem; exact: leS.
441+ rewrite /esum; apply: leeB.
442+ - by apply: PosEsum.le_pos_esum => x /mem_set; exact: funepos_le.
443+ - by apply: PosEsum.le_pos_esum => x /mem_set; exact: funeneg_le.
395444Qed .
396445
397446Lemma esum_ge0 S f : (forall x, S x -> 0 <= f x) -> 0 <= \esum_(i in S) f i.
398447Proof . by move=> f0; rewrite ge0_esum// PosEsum.pos_esum_ge0. Qed .
399448
449+ Lemma le_esum_fine {U : choiceType} (A : set U) (B : set T) (f : T -> U -> \bar R) :
450+ (forall x y, 0 <= f x y)%E ->
451+ (\esum_(i in A) (fine (\esum_(x in B) f x i))%:E <=
452+ \esum_(i in A) (\esum_(x in B) f x i))%E.
453+ Proof .
454+ move=> hf.
455+ rewrite [leLHS]ge0_esum.
456+ + by move=> i _; rewrite lee_fin; apply: fine_ge0; apply esum_ge0.
457+ rewrite [leRHS]ge0_esum; first by move=> i _; apply esum_ge0.
458+ under [leLHS]PosEsum.eq_pos_esum => i _ do rewrite ge0_esum //.
459+ under [leRHS]PosEsum.eq_pos_esum => i _ do rewrite ge0_esum //.
460+ exact: PosEsum.le_pos_esum_fine.
461+ Qed .
462+
463+ Lemma subset_esum (I J : set T) (a : T -> \bar R) :
464+ (forall x, J x -> 0 <= a x) ->
465+ I `<=` J -> (\esum_(i in I) a i <= \esum_(i in J) a i)%E.
466+ Proof .
467+ move=> a0 IJ.
468+ have ?: forall x, I x -> 0 <= a x by move => x /IJ /a0.
469+ rewrite ge0_esum // ge0_esum //.
470+ by apply: PosEsum.subset_pos_esum.
471+ Qed .
472+
400473Lemma esum_fset S f : finite_set S -> (forall i, S i -> 0 <= f i) ->
401474 \esum_(i in S) f i = \sum_(i \in S) f i.
402475Proof . by move=> finF f0; rewrite ge0_esum//; exact: PosEsum.pos_esum_fset. Qed .
@@ -410,6 +483,13 @@ move=> Df0; rewrite ge0_esum; last exact: PosEsum.pos_esum1.
410483by move=> i /Df0 ->.
411484Qed .
412485
486+ Lemma esum0 {R : realFieldType} {I : choiceType} (D : set I) :
487+ \esum_(i in D) (@cst I (\bar R) 0 i) = 0.
488+ Proof .
489+ by rewrite esum1 ?subee// => r _;
490+ rewrite ?[LHS](funepos_cst0,funeneg_cst0).
491+ Qed .
492+
413493Section esum_cond.
414494Context {R : realType} {T : choiceType}.
415495Implicit Types (A B : set T) (f : T -> \bar R).
@@ -483,6 +563,10 @@ Lemma esum_ge {R : realType} {T : choiceType} (I : set T) (f : T -> \bar R) x :
483563 x <= \esum_(i in I) f i.
484564Proof . by move=> f0 If; rewrite ge0_esum// PosEsum.pos_esum_ge. Qed .
485565
566+ Lemma esum_unit {R : realType} {T : choiceType} (f : T -> \bar R) x :
567+ \esum_(i in [set:T]) (if x == i then f i else 0) = f x.
568+ Proof . by rewrite esum_if_eq_op esum_set1. Qed .
569+
486570Lemma esum_eq0P {R : realType} {T : choiceType} (A : set T) (f : T -> \bar R) :
487571 (forall i, A i -> 0 <= f i) ->
488572 \esum_(x in A) f x = 0 -> forall x, A x -> f x = 0.
@@ -493,6 +577,18 @@ exists [set x]; first by split => // t ->.
493577by rewrite -esum_set1 esum_fset// => i ->; exact: f0.
494578Qed .
495579
580+ Lemma neq0_esum {R : realType} {T : choiceType} (I : set T) (a : T -> \bar R) :
581+ \esum_(i in I) a i <> 0 -> exists i, a i <> 0.
582+ Proof .
583+ move=> ?. apply/existsp_asboolPn /asboolPn => h.
584+ have // : (\esum_(i in I) a i = 0); by apply esum1.
585+ Qed .
586+
587+ Lemma esum_ge1 {R : realType} {T : choiceType} (I : set T) (f : T -> \bar R) :
588+ (forall x, I x -> 0 <= f x) ->
589+ (forall x, I x -> f x <= \esum_(i in (I : set T)) f i)%E.
590+ Proof . by move=> f0 x Ix; rewrite ge0_esum//; exact: PosEsum.pos_esum_ge1. Qed .
591+
496592Section esumZ.
497593Context {R : realType} {T : choiceType} (A : set T) (f : T -> \bar R).
498594
@@ -780,6 +876,22 @@ rewrite /summable fin_numElt; apply/idP/idP => [->|/andP[]//].
780876by rewrite andbT (lt_le_trans (ltNyr 0))//; exact: esum_ge0.
781877Qed .
782878
879+ Lemma eq_summable D f g : f =1 g -> summable D f -> summable D g.
880+ Proof .
881+ move => eq_fg; rewrite /summable; apply: le_lt_trans.
882+ by apply: le_esum => ?; rewrite eq_fg.
883+ Qed .
884+
885+ Lemma le_summable D f g :
886+ (forall x, 0 <= f x <= g x) -> summable D g -> summable D f.
887+ Proof .
888+ move => eq_fg; rewrite /summable; apply: le_lt_trans.
889+ apply: le_esum => i //.
890+ have /andP := (eq_fg i).
891+ move =>[ h1 h2]; rewrite !gee0_abs => //=.
892+ by apply /le_trans;first apply h1.
893+ Qed .
894+
783895Lemma summableD D f g : summable D f -> summable D g -> summable D (f \+ g).
784896Proof .
785897move=> Df Dg; apply: le_lt_trans (lte_add_pinfty Df Dg).
@@ -812,6 +924,50 @@ apply: PosEsum.le_pos_esum => t Dt.
812924by rewrite -/((abse \o f) t) -funeposDneg gee0_abs// leeDr.
813925Qed .
814926
927+ Lemma summable_muleC D f1 f2 :
928+ summable D (f2 \* f1) -> summable D (f1 \* f2).
929+ Proof .
930+ rewrite /summable => ?.
931+ by under eq_esum do rewrite abseM muleC -abseM.
932+ Qed .
933+
934+ Lemma summableZ D f c :
935+ c \is a fin_num -> summable D f -> summable D (fun x => c * f x).
936+ Proof .
937+ rewrite /summable => ??.
938+ under eq_esum do rewrite abseM.
939+ by rewrite esumZ // lte_mul_pinfty //= abse_fin_num.
940+ Qed .
941+
942+ Lemma summableZr D f c :
943+ c \is a fin_num -> summable D f -> summable D (fun x => f x * c).
944+ Proof . by move=> ??; apply/summable_muleC /summableZ. Qed .
945+
946+ Lemma summableMl D f1 f2 :
947+ (exists2 M, (forall x, D x -> `|f1 x| <= M) & M \is a fin_num) ->
948+ summable D f2 -> summable D (f1 \* f2).
949+ Proof .
950+ move=> [M h1 Mfin] sf2.
951+ rewrite /summable; apply: le_lt_trans (summableZ Mfin sf2).
952+ apply: le_esum => x Dx; rewrite !abseM.
953+ apply: lee_wpmul2r; first exact: abse_ge0.
954+ by apply: le_trans (h1 x Dx) (lee_abs _).
955+ Qed .
956+
957+ Lemma summableMr D f1 f2 :
958+ (exists2 M, (forall x, D x -> `|f2 x| <= M) & M \is a fin_num ) ->
959+ summable D f1 ->
960+ summable D (f1 \* f2).
961+ Proof . by move => ??; apply/summable_muleC /summableMl. Qed .
962+
963+ Lemma summableM D f1 f2 :
964+ summable D f1 -> summable D f2 -> summable D (f1 \* f2).
965+ Proof .
966+ rewrite summableE => smS1 smS2; apply/summableMl => //.
967+ exists (\esum_(x in D) `| f1 x|) => //.
968+ by move => x; apply/esum_ge1.
969+ Qed .
970+
815971End summable_lemmas.
816972
817973Import numFieldNormedType.Exports.
@@ -960,6 +1116,121 @@ Qed.
9601116
9611117End esumB.
9621118
1119+ Section esum_summable.
1120+ Context {R : realType} {T : choiceType}.
1121+ Implicit Types (S : T -> \bar R).
1122+
1123+ Lemma summable_esum_funepos S :
1124+ summable [set: T] S -> \esum_(t in [set: T]) S^\+ t \is a fin_num.
1125+ Proof .
1126+ move => /summable_funepos.
1127+ rewrite summableE.
1128+ rewrite (@eq_esum _ _ _ (fun y : T => S^\+ y) (fun y : T => `|S^\+ y|)) //=.
1129+ by move => ??; rewrite gee0_abs.
1130+ Qed .
1131+
1132+ Lemma summable_esum_fin_num S :
1133+ summable [set: T] S -> \esum_(i in [set:T]) S i \is a fin_num.
1134+ Proof .
1135+ move=> sm; rewrite /esum fin_numB; apply/andP; split.
1136+ - rewrite /PosEsum.pos_esum -ge0_esum; first by move=> x _; exact: funepos_ge0.
1137+ exact: (summable_esum_funepos sm).
1138+ - have smN : summable [set: T] (\- S) by rewrite -summableN.
1139+ rewrite /PosEsum.pos_esum -ge0_esum; first by move=> x _; exact: funeneg_ge0.
1140+ by rewrite -funeposN; exact: (summable_esum_funepos smN).
1141+ Qed .
1142+
1143+ Lemma summable_esumN S :
1144+ summable [set : T] S -> \esum_(i in [set:T]) - S i = - \esum_(i in [set:T]) S i.
1145+ Proof .
1146+ move=> hs; rewrite /esum funeposN funenegN oppeB.
1147+ - apply: fin_num_adde_defr.
1148+ rewrite /PosEsum.pos_esum -ge0_esum; first by move=> x _; exact: funepos_ge0.
1149+ exact: (summable_esum_funepos hs).
1150+ - by rewrite addeC.
1151+ Qed .
1152+
1153+ Lemma summable_esumZ_pos S :
1154+ summable [set : T] S ->
1155+ forall d : \bar R, 0 <= d -> d \is a fin_num ->
1156+ \esum_(x in [set:T]) d * S x = d * \esum_(x in [set:T]) S x.
1157+ Proof .
1158+ move=> h d d0 dfin.
1159+ have -> : d = (fine d)%:E by rewrite fineK.
1160+ have ? : (0 <= fine d)%R by rewrite -lee_fin fineK.
1161+ have ? : (0 <= (fine d)%:E) by rewrite fineK.
1162+ have ? : (fine d)%:E \is a fin_num by [].
1163+ rewrite [in LHS]/esum ge0_funeposM// ge0_funenegM//.
1164+ rewrite (PosEsum.pos_esumZ _ (fun t _ => funepos_ge0 S t)) //.
1165+ rewrite (PosEsum.pos_esumZ _ (fun t _ => funeneg_ge0 S t)) //.
1166+ rewrite -muleBr //.
1167+ apply: fin_num_adde_defr.
1168+ rewrite /PosEsum.pos_esum -ge0_esum; first by move=> x _; exact: funepos_ge0.
1169+ exact: (summable_esum_funepos h).
1170+ Qed .
1171+
1172+ Lemma summable_esumZ S c :
1173+ `|c| \is a fin_num -> summable [set : T] S ->
1174+ \esum_(x in [set : T]) c * S x = c * \esum_(x in [set : T]) S x.
1175+ Proof .
1176+ move=> hf h.
1177+ have [c0|c0|->] := comparable_ltgtP (comparableT c 0).
1178+ - rewrite (eq_esum _ _ (fun x => - (`|c| * S x))).
1179+ + by move=> x _; rewrite lte0_abs// mulNe oppeK.
1180+ rewrite (summable_esumN (summableZ hf h)).
1181+ rewrite (summable_esumZ_pos h (abse_ge0 c) hf).
1182+ by rewrite lte0_abs// mulNe oppeK.
1183+ - apply: (summable_esumZ_pos h (ltW c0)).
1184+ by rewrite -abse_fin_num.
1185+ - rewrite [in RHS]mul0e; under eq_esum do rewrite mul0e.
1186+ by rewrite esum0.
1187+ Qed .
1188+
1189+ Lemma esum_posneg (h : T -> \bar R) :
1190+ \esum_(x in [set:T]) h x =
1191+ \esum_(x in [set:T]) h^\+ x - \esum_(x in [set:T]) h^\- x.
1192+ Proof .
1193+ rewrite [in RHS]ge0_esum; first by move=> x _; exact: funepos_ge0.
1194+ rewrite [in RHS]ge0_esum; first by move=> x _; exact: funeneg_ge0.
1195+ by rewrite /esum.
1196+ Qed .
1197+
1198+ Lemma summable_esumD S1 S2 :
1199+ summable [set: T] S1 -> summable [set: T] S2 ->
1200+ \esum_(x in [set : T]) (S1 x + S2 x) =
1201+ \esum_(x in [set : T]) S1 x + \esum_(x in [set : T]) S2 x.
1202+ Proof .
1203+ move=> sm1 sm2.
1204+ rewrite -(funeDB S1 S2).
1205+ rewrite (esum_posneg ((S1^\+ \+ S2^\+) \- (S1^\- \+ S2^\-))).
1206+ rewrite (@esumB _ _ [set:T] (S1^\+ \+ S2^\+) (S1^\- \+ S2^\-)
1207+ (summableD (summable_funepos sm1) (summable_funepos sm2))
1208+ (summableD (summable_funeneg sm1) (summable_funeneg sm2))
1209+ (fun i _ => adde_ge0 (funepos_ge0 S1 i) (funepos_ge0 S2 i))
1210+ (fun i _ => adde_ge0 (funeneg_ge0 S1 i) (funeneg_ge0 S2 i))).
1211+ rewrite (@esumD _ _ [set:T] (S1^\+) (S2^\+)
1212+ (fun i _ => funepos_ge0 S1 i) (fun i _ => funepos_ge0 S2 i)).
1213+ rewrite (@esumD _ _ [set:T] (S1^\-) (S2^\-)
1214+ (fun i _ => funeneg_ge0 S1 i) (fun i _ => funeneg_ge0 S2 i)).
1215+ rewrite [in RHS](esum_posneg S1) [in RHS](esum_posneg S2).
1216+ rewrite oppeD.
1217+ apply: fin_num_adde_defl.
1218+ exact: (summable_esum_fin_num (summable_funeneg sm2)).
1219+ by rewrite addeACA.
1220+ Qed .
1221+
1222+ Lemma summable_esumB {V : choiceType} S1 S2 :
1223+ summable [set: T] S1 -> summable [set: T] S2 ->
1224+ \esum_(x in [set : T]) (S1 x - S2 x) =
1225+ \esum_(x in [set : T]) S1 x - \esum_(x in [set : T]) S2 x.
1226+ Proof .
1227+ move=> sm1 sm2.
1228+ have nS2 : summable [set: T] (\- S2) by rewrite -summableN.
1229+ by rewrite (summable_esumD sm1 nS2) (summable_esumN sm2).
1230+ Qed .
1231+
1232+ End esum_summable.
1233+
9631234Section exchange_esum_ereal_sup.
9641235Context {R : realType} {T : choiceType} {f : T -> nat -> \bar R}.
9651236Hypothesis f_ge0 : forall t n, 0 <= f t n.
@@ -970,10 +1241,8 @@ Lemma exchange_esum_ereal_sup (A : set T) :
9701241 ereal_sup (range (fun n => \esum_(x in A) f x n)).
9711242Proof .
9721243rewrite ge0_esum.
973- by move=> x Ax; apply: le_ereal_sup_tmp; exists (f x 0).
974- under eq_imagel.
975- move=> B [fin BA]; rewrite fsbig_finite//= ereal_sup_sum//.
976- over.
1244+ + by move=> x Ax; apply: le_ereal_sup_tmp; exists (f x 0).
1245+ under eq_imagel => B [fin BA] do rewrite fsbig_finite//= ereal_sup_sum//.
9771246rewrite exchange_ereal_sup; congr ereal_sup; apply: eq_imagel => n _.
9781247rewrite ge0_esum//; congr ereal_sup.
9791248by apply: eq_imagel => B [finB BA]; rewrite fsbig_finite.
0 commit comments