@@ -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) : (forall i, S i -> f i <= g i) ->
159185 \esum_(i in S) f i <= \esum_(i in S) g i.
160186Proof .
161187move=> fg; rewrite ge_ereal_sup => //= _ [X [finX XS]] <-.
162188by rewrite pos_esum_ge//; exists X => //; apply: lee_fsum => // t /XS /fg.
163189Qed .
164190
191+ Lemma le_pos_esum_fine {U : choiceType} (f: T -> U -> \bar R):
192+ (forall x y, 0 <= f x y)%E ->
193+ (\esum_(i in [set: U]) (fine (\esum_(x in [set: T]) f x i))%:E <=
194+ \esum_(i in [set: U]) (\esum_(x in [set: T]) f x i))%E.
195+ Proof .
196+ move => hf.
197+ rewrite le_pos_esum // => i ?.
198+ case h: (\esum_(x in [set: T]) _) => //=.
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 .
@@ -361,6 +399,12 @@ rewrite /esum PosEsum.ge0_pos_esum_funepos// PosEsum.ge0_pos_esum_funeneg//.
361399by rewrite sube0.
362400Qed .
363401
402+ Lemma esum_pos_esum S f : (forall x, S x -> 0 <= f x) ->
403+ \esum_(i in S) f i = PosEsum.pos_esum S f.
404+ Proof .
405+ by move=> ?; rewrite ge0_esum.
406+ Qed .
407+
364408Lemma esum_set0 f : \esum_(i in set0) f i = 0.
365409Proof . by rewrite /esum !PosEsum.pos_esum_set0 subee. Qed .
366410
@@ -385,13 +429,60 @@ Section esum_realType.
385429Variables (R : realType) (T : choiceType).
386430Implicit Types (S : set T) (f : T -> \bar R).
387431
388- Lemma le_esum S f g : (forall x, S x -> 0 <= f x) ->
432+ Lemma sum_esum_ge J (f: T -> R) :
433+ (forall x, 0 <= f x)%R ->
434+ uniq J -> ((\sum_(j <- J) f j)%:E <= \esum_(i in [set:T]) (f i)%:E)%E.
435+ Proof .
436+ move=> f0 uJ.
437+ rewrite esum_pos_esum.
438+ + by move=> x _; rewrite lee_fin; exact: f0.
439+ exact: (PosEsum.pos_sum_esum_ge).
440+ Qed .
441+
442+ (* Lemma le_esum S f g : (forall x, S x -> 0 <= f x) -> *)
443+ (* (forall x, S x -> f x <= g x) -> *)
444+ (* \esum_(x in S) f x <= \esum_(x in S) g x. *)
445+ (* Proof. *)
446+ (* move=> f0 leS; have g0 x : S x -> 0 <= g x. *)
447+ (* by move=> /[dup] Ax /leS; apply: le_trans; exact: f0 Ax. *)
448+ (* by rewrite !ge0_esum// PosEsum.le_pos_esum. *)
449+ (* Qed. *)
450+
451+ Lemma le_esum S f g :
389452 (forall x, S x -> f x <= g x) ->
390- \esum_(x in S) f x <= \esum_(x in S) g x.
453+ \esum_(i in S) f i <= \esum_(i in S) g i.
454+ Proof .
455+ move=> leS.
456+ have leS' : {in S, forall x, f x <= g x} by move=> x /set_mem; exact: leS.
457+ rewrite /esum; apply: leeB.
458+ - by apply: PosEsum.le_pos_esum => x /mem_set; exact: funepos_le.
459+ - by apply: PosEsum.le_pos_esum => x /mem_set; exact: funeneg_le.
460+ Qed .
461+
462+ Lemma le_esum_fine {U : choiceType} (f: T -> U -> \bar R):
463+ (forall x y, 0 <= f x y)%E ->
464+ (\esum_(i in [set: U]) (fine (\esum_(x in [set: T]) f x i))%:E <=
465+ \esum_(i in [set: U]) (\esum_(x in [set: T]) f x i))%E.
466+ Proof .
467+ move=> hf.
468+ have E i : \esum_(x in [set: T]) f x i = PosEsum.pos_esum [set: T] (fun x => f x i).
469+ by rewrite esum_pos_esum// => x _; exact: hf.
470+ have hpos i : (0 <= \esum_(x in [set: T]) f x i)%E by rewrite E PosEsum.pos_esum_ge0.
471+ rewrite [leLHS]esum_pos_esum; first by move=> i _; rewrite lee_fin; apply: fine_ge0; exact: hpos.
472+ rewrite [leRHS]esum_pos_esum; first by move=> i _; exact: hpos.
473+ under [leLHS]PosEsum.eq_pos_esum => i _ do rewrite E.
474+ under [leRHS]PosEsum.eq_pos_esum => i _ do rewrite E.
475+ exact: (PosEsum.le_pos_esum_fine hf).
476+ Qed .
477+
478+ Lemma subset_esum (I J : set T) (a : T -> \bar R) :
479+ (forall x, J x -> 0 <= a x) ->
480+ I `<=` J -> (\esum_(i in I) a i <= \esum_(i in J) a i)%E.
391481Proof .
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.
482+ move=> a0 IJ.
483+ have ?: forall x, I x -> 0 <= a x by move => x /IJ /a0.
484+ rewrite esum_pos_esum // esum_pos_esum //.
485+ by apply: PosEsum.subset_pos_esum.
395486Qed .
396487
397488Lemma esum_ge0 S f : (forall x, S x -> 0 <= f x) -> 0 <= \esum_(i in S) f i.
@@ -410,6 +501,13 @@ move=> Df0; rewrite ge0_esum; last exact: PosEsum.pos_esum1.
410501by move=> i /Df0 ->.
411502Qed .
412503
504+ Lemma esum0 {R : realFieldType} {I : choiceType} (D : set I) :
505+ \esum_(i in D) (@cst I (\bar R) 0 i) = 0.
506+ Proof .
507+ by rewrite esum1 ?subee// => r _;
508+ rewrite ?[LHS](funepos_cst0,funeneg_cst0).
509+ Qed .
510+
413511Section esum_cond.
414512Context {R : realType} {T : choiceType}.
415513Implicit Types (A B : set T) (f : T -> \bar R).
@@ -483,6 +581,13 @@ Lemma esum_ge {R : realType} {T : choiceType} (I : set T) (f : T -> \bar R) x :
483581 x <= \esum_(i in I) f i.
484582Proof . by move=> f0 If; rewrite ge0_esum// PosEsum.pos_esum_ge. Qed .
485583
584+ Lemma esum_unit {R : realType} {T : choiceType} (f : T -> \bar R) x :
585+ \esum_(i in [set:T]) (if x == i then f i else 0) = f x.
586+ Proof .
587+ rewrite esum_if_eq_op.
588+ by rewrite esum_set1.
589+ Qed .
590+
486591Lemma esum_eq0P {R : realType} {T : choiceType} (A : set T) (f : T -> \bar R) :
487592 (forall i, A i -> 0 <= f i) ->
488593 \esum_(x in A) f x = 0 -> forall x, A x -> f x = 0.
@@ -493,6 +598,18 @@ exists [set x]; first by split => // t ->.
493598by rewrite -esum_set1 esum_fset// => i ->; exact: f0.
494599Qed .
495600
601+ Lemma neq0_esum {R : realType} {T : choiceType} (I : set T) (a : T -> \bar R) :
602+ \esum_(i in I) a i <> 0 -> exists i, a i <> 0.
603+ Proof .
604+ move=> ?. apply/existsp_asboolPn /asboolPn => h.
605+ have // : (\esum_(i in I) a i = 0); by apply esum1.
606+ Qed .
607+
608+ Lemma esum_ge1 {R : realType} {T : choiceType} (I : set T) (f: T -> \bar R) :
609+ (forall x, I x -> 0 <= f x) ->
610+ (forall x, I x -> f x <= \esum_(i in (I : set T)) f i)%E.
611+ Proof . by move=> f0 x Ix; rewrite ge0_esum//; exact: PosEsum.pos_esum_ge1. Qed .
612+
496613Section esumZ.
497614Context {R : realType} {T : choiceType} (A : set T) (f : T -> \bar R).
498615
@@ -780,6 +897,22 @@ rewrite /summable fin_numElt; apply/idP/idP => [->|/andP[]//].
780897by rewrite andbT (lt_le_trans (ltNyr 0))//; exact: esum_ge0.
781898Qed .
782899
900+ Lemma eq_summable D f g : f =1 g -> summable D f -> summable D g.
901+ Proof .
902+ move => eq_fg; rewrite /summable; apply: le_lt_trans.
903+ by apply: le_esum => ?; rewrite eq_fg.
904+ Qed .
905+
906+ Lemma le_summable D f g :
907+ (forall x, 0 <= f x <= g x) -> summable D g -> summable D f.
908+ Proof .
909+ move => eq_fg; rewrite /summable; apply: le_lt_trans.
910+ apply: le_esum => i //.
911+ have /andP := (eq_fg i).
912+ move =>[ h1 h2]; rewrite !gee0_abs => //=.
913+ by apply /le_trans;first apply h1.
914+ Qed .
915+
783916Lemma summableD D f g : summable D f -> summable D g -> summable D (f \+ g).
784917Proof .
785918move=> Df Dg; apply: le_lt_trans (lte_add_pinfty Df Dg).
@@ -812,6 +945,50 @@ apply: PosEsum.le_pos_esum => t Dt.
812945by rewrite -/((abse \o f) t) -funeposDneg gee0_abs// leeDr.
813946Qed .
814947
948+ Lemma summable_muleC D f1 f2 :
949+ summable D (f2 \* f1) -> summable D (f1 \* f2).
950+ Proof .
951+ rewrite /summable => ?.
952+ by under eq_esum do rewrite abseM muleC -abseM.
953+ Qed .
954+
955+ Lemma summableZ D f c :
956+ c \is a fin_num -> summable D f -> summable D (fun x => c * f x).
957+ Proof .
958+ rewrite /summable => ??.
959+ under eq_esum do rewrite abseM.
960+ by rewrite esumZ // lte_mul_pinfty //= abse_fin_num.
961+ Qed .
962+
963+ Lemma summableZr D f c :
964+ c \is a fin_num -> summable D f -> summable D (fun x => f x * c).
965+ Proof . by move=> ??; apply/summable_muleC /summableZ. Qed .
966+
967+ Lemma summableMl D f1 f2 :
968+ (exists M, (forall x, D x -> `|f1 x| <= M) /\ M \is a fin_num) ->
969+ summable D f2 -> summable D (f1 \* f2).
970+ Proof .
971+ move=> [M [h1 Mfin]] sf2.
972+ rewrite /summable; apply: le_lt_trans (summableZ Mfin sf2).
973+ apply: le_esum => x Dx; rewrite !abseM.
974+ apply: lee_wpmul2r; first exact: abse_ge0.
975+ by apply: le_trans (h1 x Dx) (lee_abs _).
976+ Qed .
977+
978+ Lemma summableMr D f1 f2 :
979+ (exists M, (forall x, D x -> `|f2 x| <= M) /\ M \is a fin_num ) ->
980+ summable D f1 ->
981+ summable D (f1 \* f2).
982+ Proof . by move => ??; apply/summable_muleC /summableMl. Qed .
983+
984+ Lemma summableM D f1 f2 :
985+ summable D f1 -> summable D f2 -> summable D (f1 \* f2).
986+ Proof .
987+ rewrite summableE => smS1 smS2; apply/summableMl => //.
988+ exists (\esum_(x in D) `| f1 x|) => //; split => //.
989+ by move => x; apply/esum_ge1.
990+ Qed .
991+
815992End summable_lemmas.
816993
817994Import numFieldNormedType.Exports.
@@ -960,6 +1137,121 @@ Qed.
9601137
9611138End esumB.
9621139
1140+ Section esum_summable.
1141+ Context {R : realType} {T : choiceType}.
1142+ Implicit Types (S : T -> \bar R).
1143+
1144+ Lemma summable_esum_funepos S :
1145+ summable [set: T] S -> \esum_(t in [set: T]) S^\+ t \is a fin_num.
1146+ Proof .
1147+ move => /summable_funepos.
1148+ rewrite summableE.
1149+ rewrite (@eq_esum _ _ _ (fun y : T => S^\+ y) (fun y : T => `|S^\+ y|)) //=.
1150+ by move => ??; rewrite gee0_abs.
1151+ Qed .
1152+
1153+ Lemma summable_esum_fin_num S :
1154+ summable [set: T] S -> \esum_(i in [set:T]) S i \is a fin_num.
1155+ Proof .
1156+ move=> sm; rewrite /esum fin_numB; apply/andP; split.
1157+ - rewrite -esum_pos_esum; first by move=> x _; exact: funepos_ge0.
1158+ exact: (summable_esum_funepos sm).
1159+ - have smN : summable [set: T] (\- S) by rewrite -summableN.
1160+ rewrite -esum_pos_esum; first by move=> x _; exact: funeneg_ge0.
1161+ by rewrite -funeposN; exact: (summable_esum_funepos smN).
1162+ Qed .
1163+
1164+ Lemma summable_esumN S :
1165+ summable [set : T] S -> \esum_(i in [set:T]) - S i = - \esum_(i in [set:T]) S i.
1166+ Proof .
1167+ move=> hs; rewrite /esum funeposN funenegN oppeB.
1168+ - apply: fin_num_adde_defr.
1169+ rewrite -esum_pos_esum; first by move=> x _; exact: funepos_ge0.
1170+ exact: (summable_esum_funepos hs).
1171+ - by rewrite addeC.
1172+ Qed .
1173+
1174+ Lemma summable_esumZ_pos S :
1175+ summable [set : T] S ->
1176+ forall d : \bar R, 0 <= d -> d \is a fin_num ->
1177+ \esum_(x in [set:T]) d * S x = d * \esum_(x in [set:T]) S x.
1178+ Proof .
1179+ move=> h d d0 dfin.
1180+ have -> : d = (fine d)%:E by rewrite fineK.
1181+ have ? : (0 <= fine d)%R by rewrite -lee_fin fineK.
1182+ have ? : (0 <= (fine d)%:E) by rewrite fineK.
1183+ have ? : (fine d)%:E \is a fin_num by [].
1184+ rewrite [in LHS]/esum ge0_funeposM// ge0_funenegM//.
1185+ rewrite (PosEsum.pos_esumZ _ (fun t _ => funepos_ge0 S t)) //.
1186+ rewrite (PosEsum.pos_esumZ _ (fun t _ => funeneg_ge0 S t)) //.
1187+ rewrite -muleBr //.
1188+ apply: fin_num_adde_defr.
1189+ rewrite -esum_pos_esum; first by move=> x _; exact: funepos_ge0.
1190+ exact: (summable_esum_funepos h).
1191+ Qed .
1192+
1193+ Lemma summable_esumZ S c :
1194+ `|c| \is a fin_num -> summable [set : T] S ->
1195+ \esum_(x in [set : T]) c * S x = c * \esum_(x in [set : T]) S x.
1196+ Proof .
1197+ move=> hf h.
1198+ have [c0|c0|->] := comparable_ltgtP (comparableT c 0).
1199+ - rewrite (eq_esum _ _ (fun x => - (`|c| * S x))).
1200+ + by move=> x _; rewrite lte0_abs// mulNe oppeK.
1201+ rewrite (summable_esumN (summableZ hf h)).
1202+ rewrite (summable_esumZ_pos h (abse_ge0 c) hf).
1203+ by rewrite lte0_abs// mulNe oppeK.
1204+ - apply: (summable_esumZ_pos h (ltW c0)).
1205+ by rewrite -abse_fin_num.
1206+ - rewrite [in RHS]mul0e; under eq_esum do rewrite mul0e.
1207+ by rewrite esum0.
1208+ Qed .
1209+
1210+ Lemma esum_posneg (h : T -> \bar R) :
1211+ \esum_(x in [set:T]) h x =
1212+ \esum_(x in [set:T]) h^\+ x - \esum_(x in [set:T]) h^\- x.
1213+ Proof .
1214+ rewrite [in RHS]esum_pos_esum; first by move=> x _; exact: funepos_ge0.
1215+ rewrite [in RHS]esum_pos_esum; first by move=> x _; exact: funeneg_ge0.
1216+ by rewrite /esum.
1217+ Qed .
1218+
1219+ Lemma summable_esumD S1 S2 :
1220+ summable [set: T] S1 -> summable [set: T] S2 ->
1221+ \esum_(x in [set : T]) (S1 x + S2 x) =
1222+ \esum_(x in [set : T]) S1 x + \esum_(x in [set : T]) S2 x.
1223+ Proof .
1224+ move=> sm1 sm2.
1225+ rewrite -(funeDB S1 S2).
1226+ rewrite (esum_posneg ((S1^\+ \+ S2^\+) \- (S1^\- \+ S2^\-))).
1227+ rewrite (@esumB _ _ [set:T] (S1^\+ \+ S2^\+) (S1^\- \+ S2^\-)
1228+ (summableD (summable_funepos sm1) (summable_funepos sm2))
1229+ (summableD (summable_funeneg sm1) (summable_funeneg sm2))
1230+ (fun i _ => adde_ge0 (funepos_ge0 S1 i) (funepos_ge0 S2 i))
1231+ (fun i _ => adde_ge0 (funeneg_ge0 S1 i) (funeneg_ge0 S2 i))).
1232+ rewrite (@esumD _ _ [set:T] (S1^\+) (S2^\+)
1233+ (fun i _ => funepos_ge0 S1 i) (fun i _ => funepos_ge0 S2 i)).
1234+ rewrite (@esumD _ _ [set:T] (S1^\-) (S2^\-)
1235+ (fun i _ => funeneg_ge0 S1 i) (fun i _ => funeneg_ge0 S2 i)).
1236+ rewrite [in RHS](esum_posneg S1) [in RHS](esum_posneg S2).
1237+ rewrite oppeD.
1238+ apply: fin_num_adde_defl.
1239+ exact: (summable_esum_fin_num (summable_funeneg sm2)).
1240+ by rewrite addeACA.
1241+ Qed .
1242+
1243+ Lemma summable_esumB {V : choiceType} S1 S2 :
1244+ summable [set: T] S1 -> summable [set: T] S2 ->
1245+ \esum_(x in [set : T]) (S1 x - S2 x) =
1246+ \esum_(x in [set : T]) S1 x - \esum_(x in [set : T]) S2 x.
1247+ Proof .
1248+ move=> sm1 sm2.
1249+ have nS2 : summable [set: T] (\- S2) by rewrite -summableN.
1250+ by rewrite (summable_esumD sm1 nS2) (summable_esumN sm2).
1251+ Qed .
1252+
1253+ End esum_summable.
1254+
9631255Section exchange_esum_ereal_sup.
9641256Context {R : realType} {T : choiceType} {f : T -> nat -> \bar R}.
9651257Hypothesis f_ge0 : forall t n, 0 <= f t n.
@@ -970,10 +1262,8 @@ Lemma exchange_esum_ereal_sup (A : set T) :
9701262 ereal_sup (range (fun n => \esum_(x in A) f x n)).
9711263Proof .
9721264rewrite 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.
1265+ + by move=> x Ax; apply: le_ereal_sup_tmp; exists (f x 0).
1266+ under eq_imagel => B [fin BA] do rewrite fsbig_finite//= ereal_sup_sum//.
9771267rewrite exchange_ereal_sup; congr ereal_sup; apply: eq_imagel => n _.
9781268rewrite ge0_esum//; congr ereal_sup.
9791269by apply: eq_imagel => B [finB BA]; rewrite fsbig_finite.
0 commit comments