Timings for ConstructiveSum.v
- /home/gitlab-runner/builds/v6HyzL39/0/coq/coq/_bench/opam.OLD/ocaml-OLD/.opam-switch/build/coq-stdlib.dev/_build/default/theories//./Reals/Abstract/ConstructiveSum.timing
- /home/gitlab-runner/builds/v6HyzL39/0/coq/coq/_bench/opam.NEW/ocaml-NEW/.opam-switch/build/coq-stdlib.dev/_build/default/theories//./Reals/Abstract/ConstructiveSum.timing
(************************************************************************)
(* * The Coq Proof Assistant / The Coq Development Team *)
(* v * INRIA, CNRS and contributors - Copyright 1999-2019 *)
(* <O___,, * (see CREDITS file for the list of authors) *)
(* \VV/ **************************************************************)
(* // * This file is distributed under the terms of the *)
(* * GNU Lesser General Public License Version 2.1 *)
(* * (see LICENSE file for the text of the license) *)
(************************************************************************)
Require Import QArith Qabs.
Require Import ConstructiveReals.
Require Import ConstructiveRealsMorphisms.
Require Import ConstructiveAbs.
Require Import ConstructiveLimits.
Local Open Scope ConstructiveReals.
(**
Definition and properties of finite sums and powers.
WARNING: this file is experimental and likely to change in future releases.
*)
Fixpoint CRsum {R : ConstructiveReals}
(f:nat -> CRcarrier R) (N:nat) : CRcarrier R :=
match N with
| O => f 0%nat
| S i => CRsum f i + f (S i)
end.
Lemma CRsum_eq :
forall {R : ConstructiveReals} (An Bn:nat -> CRcarrier R) (N:nat),
(forall i:nat, (i <= N)%nat -> An i == Bn i) ->
CRsum An N == CRsum Bn N.
exact (H O (Nat.le_refl _)).
apply (Nat.le_trans _ N _ H0), le_S, Nat.le_refl.
Lemma sum_eq_R0 : forall {R : ConstructiveReals} (un : nat -> CRcarrier R) (n : nat),
(forall k:nat, un k == 0)
-> CRsum un n == 0.
Definition INR {R : ConstructiveReals} (n : nat) : CRcarrier R
:= CR_of_Q R (Z.of_nat n # 1).
Lemma sum_const : forall {R : ConstructiveReals} (a : CRcarrier R) (n : nat),
CRsum (fun _ => a) n == a * INR (S n).
replace (Z.of_nat (S (S n))) with (Z.of_nat (S n) + 1)%Z.
rewrite <- Qinv_plus_distr, CR_of_Q_plus, CRmult_plus_distr_l.
replace 1%Z with (Z.of_nat 1).
rewrite <- Nat2Z.inj_add.
Lemma multiTriangleIneg : forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (n : nat),
CRabs R (CRsum u n) <= CRsum (fun k => CRabs R (u k)) n.
apply (CRle_trans _ (CRabs R (CRsum u n) + CRabs R (u (S n)))).
Lemma sum_assoc : forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (n p : nat),
CRsum u (S n + p)
== CRsum u n + CRsum (fun k => u (S n + k)%nat) p.
rewrite (Radd_assoc (CRisRing R)).
rewrite (CRsum_eq (fun k : nat => u (S (n + k))) (fun k : nat => u (S n + k)%nat)).
Lemma sum_Rle : forall {R : ConstructiveReals} (un vn : nat -> CRcarrier R) (n : nat),
(forall k, le k n -> un k <= vn k)
-> CRsum un n <= CRsum vn n.
apply (Nat.le_trans _ n _ H0).
Lemma Abs_sum_maj : forall {R : ConstructiveReals} (un vn : nat -> CRcarrier R),
(forall n:nat, CRabs R (un n) <= (vn n))
-> forall n p:nat, (CRabs R (CRsum un n - CRsum un p) <=
CRsum vn (Init.Nat.max n p) - CRsum vn (Init.Nat.min n p)).
destruct (le_lt_dec n p).
destruct (Nat.le_exists_sub n p) as [k [maj _]].
setoid_replace (CRsum un n - CRsum un (k + n))
with (-(CRsum un (k + n) - CRsum un n)).
rewrite CRabs_right; apply CRle_refl.
replace (S k + n)%nat with (S n + k)%nat.
apply (CRle_trans _ (CRsum (fun k0 : nat => CRabs R (un (S n + k0)%nat)) k)).
rewrite Nat.add_comm, Nat.add_succ_r.
rewrite CRopp_plus_distr, CRopp_involutive, CRplus_comm.
destruct (Nat.le_exists_sub p n) as [k [maj _]].
apply (Nat.le_trans p (S p)).
replace (S k + p)%nat with (S p + k)%nat.
apply (CRle_trans _ (CRsum (fun k0 : nat => CRabs R (un (S p + k0)%nat)) k)).
rewrite Nat.add_comm, Nat.add_succ_r.
apply (Nat.le_trans p (S p)).
apply (Nat.le_trans p (S p)).
Lemma cond_pos_sum : forall {R : ConstructiveReals} (un : nat -> CRcarrier R) (n : nat),
(forall k, 0 <= un k)
-> 0 <= CRsum un n.
Lemma pos_sum_more : forall {R : ConstructiveReals} (u : nat -> CRcarrier R)
(n p : nat),
(forall k:nat, 0 <= u k)
-> le n p -> CRsum u n <= CRsum u p.
destruct (Nat.le_exists_sub n p H0).
replace (S (n + x)) with (S n + x)%nat.
rewrite <- CRplus_0_r, CRplus_assoc.
apply CRplus_le_compat_l.
Lemma sum_opp : forall {R : ConstructiveReals} (un : nat -> CRcarrier R) (n : nat),
CRsum (fun k => - un k) n == - CRsum un n.
rewrite CRopp_plus_distr.
Lemma sum_scale : forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (a : CRcarrier R) (n : nat),
CRsum (fun k : nat => u k * a) n == CRsum u n * a.
rewrite (Rmul_comm (CRisRing R)).
rewrite CRmult_plus_distr_r.
rewrite (Rmul_comm (CRisRing R)).
Lemma sum_plus : forall {R : ConstructiveReals} (u v : nat -> CRcarrier R) (n : nat),
CRsum (fun n0 : nat => u n0 + v n0) n == CRsum u n + CRsum v n.
do 2 rewrite CRplus_assoc.
rewrite CRplus_comm, CRplus_assoc.
Lemma decomp_sum :
forall {R : ConstructiveReals} (An:nat -> CRcarrier R) (N:nat),
(0 < N)%nat ->
CRsum An N == An 0%nat + CRsum (fun i:nat => An (S i)) (pred N).
apply le_n_S, Nat.le_0_l.
Lemma reverse_sum : forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (n : nat),
CRsum u n == CRsum (fun k => u (n-k)%nat) n.
rewrite (decomp_sum (fun k : nat => u (S n - k)%nat)).
apply -> Nat.succ_le_mono; apply Nat.le_0_l.
Lemma Rplus_le_pos : forall {R : ConstructiveReals} (a b : CRcarrier R),
0 <= b -> a <= a + b.
rewrite <- (CRplus_0_r a).
apply CRplus_le_compat_l.
Lemma selectOneInSum : forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (n i : nat),
le i n
-> (forall k:nat, 0 <= u k)
-> u i <= CRsum u n.
apply Nat.le_succ_r in H.
apply (CRle_trans _ (CRsum u n)).
Lemma splitSum : forall {R : ConstructiveReals} (un : nat -> CRcarrier R)
(filter : nat -> bool) (n : nat),
CRsum un n
== CRsum (fun i => if filter i then un i else 0) n
+ CRsum (fun i => if filter i then 0 else un i) n.
symmetry; apply CRplus_0_r.
do 2 rewrite CRplus_assoc.
Definition series_cv {R : ConstructiveReals}
(un : nat -> CRcarrier R) (s : CRcarrier R) : Set
:= CR_cv R (CRsum un) s.
Definition series_cv_lim_lt {R : ConstructiveReals}
(un : nat -> CRcarrier R) (x : CRcarrier R) : Set
:= { l : CRcarrier R & prod (series_cv un l) (l < x) }.
Definition series_cv_le_lim {R : ConstructiveReals}
(x : CRcarrier R) (un : nat -> CRcarrier R) : Set
:= { l : CRcarrier R & prod (series_cv un l) (x <= l) }.
Lemma series_cv_maj : forall {R : ConstructiveReals}
(un vn : nat -> CRcarrier R) (s : CRcarrier R),
(forall n:nat, CRabs R (un n) <= vn n)
-> series_cv vn s
-> { l : CRcarrier R & prod (series_cv un l) (l <= s) }.
destruct (CR_complete R (CRsum un)).
specialize (H0 (2*n)%positive) as [N maj].
apply (CRle_trans _ (CRsum vn (max i j) - CRsum vn (min i j))).
setoid_replace (CRsum vn (max i j) - CRsum vn (min i j))
with (CRabs R (CRsum vn (max i j) - (CRsum vn (min i j)))).
setoid_replace (CRsum vn (Init.Nat.max i j) - CRsum vn (Init.Nat.min i j))
with (CRsum vn (Init.Nat.max i j) - s - (CRsum vn (Init.Nat.min i j) - s)).
apply (CRle_trans _ _ _ (CRabs_triang _ _)).
setoid_replace (1#n)%Q with ((1#2*n) + (1#2*n))%Q.
apply (Nat.le_trans _ i).
apply (Nat.le_trans _ i).
rewrite CRopp_plus_distr, CRopp_involutive.
rewrite CRplus_comm, CRplus_assoc, CRplus_opp_r, CRplus_0_r.
rewrite <- (CRplus_opp_r (CRsum vn (Init.Nat.min i j))).
apply (CRle_trans _ (CRabs R (un k))), H.
apply (Nat.le_trans _ i), Nat.le_max_l.
apply (CRplus_le_reg_r (-x)).
apply (CR_cv_bound_down (fun n => CRsum vn n - CRsum un n) _ _ 0).
rewrite <- (CRplus_opp_r (CRsum un n)).
apply (CRle_trans _ (CRabs R (un k))).
Lemma series_cv_abs_lt
: forall {R : ConstructiveReals} (un vn : nat -> CRcarrier R) (l : CRcarrier R),
(forall n:nat, CRabs R (un n) <= vn n)
-> series_cv_lim_lt vn l
-> series_cv_lim_lt un l.
destruct H0 as [x [H0 H1]].
destruct (series_cv_maj un vn x H H0) as [x0 H2].
apply (CRle_lt_trans _ x).
Definition series_cv_abs {R : ConstructiveReals} (u : nat -> CRcarrier R)
: CR_cauchy R (CRsum (fun n => CRabs R (u n)))
-> { l : CRcarrier R & series_cv u l }.
destruct (series_cv_maj u (fun k => CRabs R (u k)) x).
Lemma series_cv_unique :
forall {R : ConstructiveReals} (Un:nat -> CRcarrier R) (l1 l2:CRcarrier R),
series_cv Un l1 -> series_cv Un l2 -> l1 == l2.
apply (CR_cv_unique (CRsum Un)); assumption.
Lemma series_cv_abs_eq
: forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (a : CRcarrier R)
(cau : CR_cauchy R (CRsum (fun n => CRabs R (u n)))),
series_cv u a
-> (a == (let (l,_):= series_cv_abs u cau in l))%ConstructiveReals.
destruct (series_cv_abs u cau).
apply (series_cv_unique u).
Lemma series_cv_abs_cv
: forall {R : ConstructiveReals} (u : nat -> CRcarrier R)
(cau : CR_cauchy R (CRsum (fun n => CRabs R (u n)))),
series_cv u (let (l,_):= series_cv_abs u cau in l).
destruct (series_cv_abs u cau).
Lemma series_cv_opp : forall {R : ConstructiveReals}
(s : CRcarrier R) (u : nat -> CRcarrier R),
series_cv u s
-> series_cv (fun n => - u n) (- s).
specialize (H p) as [N H].
setoid_replace (CRsum (fun n0 : nat => - u n0) n - - s)
with (-(CRsum (fun n0 : nat => u n0) n - s)).
rewrite CRopp_plus_distr.
Lemma series_cv_scale : forall {R : ConstructiveReals}
(a : CRcarrier R) (s : CRcarrier R) (u : nat -> CRcarrier R),
series_cv u s
-> series_cv (fun n => (u n) * a) (s * a).
apply (CR_cv_eq _ (fun n => CRsum u n * a)).
Lemma series_cv_plus : forall {R : ConstructiveReals}
(u v : nat -> CRcarrier R) (s t : CRcarrier R),
series_cv u s
-> series_cv v t
-> series_cv (fun n => u n + v n) (s + t).
apply (CR_cv_eq _ (fun n => CRsum u n + CRsum v n)).
Lemma series_cv_minus : forall {R : ConstructiveReals}
(u v : nat -> CRcarrier R) (s t : CRcarrier R),
series_cv u s
-> series_cv v t
-> series_cv (fun n => u n - v n) (s - t).
apply (CR_cv_eq _ (fun n => CRsum u n - CRsum v n)).
Lemma series_cv_nonneg : forall {R : ConstructiveReals}
(u : nat -> CRcarrier R) (s : CRcarrier R),
(forall n:nat, 0 <= u n) -> series_cv u s -> 0 <= s.
apply (CRle_trans 0 (CRsum u 0)).
apply (growing_ineq (CRsum u)).
Lemma series_cv_eq : forall {R : ConstructiveReals}
(u v : nat -> CRcarrier R) (s : CRcarrier R),
(forall n:nat, u n == v n)
-> series_cv u s
-> series_cv v s.
Lemma series_cv_remainder_maj : forall {R : ConstructiveReals} (u : nat -> CRcarrier R)
(s eps : CRcarrier R)
(N : nat),
series_cv u s
-> 0 < eps
-> (forall n:nat, 0 <= u n)
-> CRabs R (CRsum u N - s) <= eps
-> forall n:nat, CRsum (fun k=> u (N + S k)%nat) n <= eps.
pose proof (sum_assoc u N n).
rewrite <- (CRsum_eq (fun k : nat => u (S N + k)%nat)).
apply (CRplus_le_reg_l (CRsum u N)).
rewrite <- CRplus_0_r, CRplus_assoc.
apply CRplus_le_compat_l.
rewrite CRabs_minus_sym in H2.
apply (CRplus_le_reg_r (-CRsum u N)).
apply (CRle_trans _ (CRabs R (s - CRsum u N))).
Lemma series_cv_abs_remainder : forall {R : ConstructiveReals} (u : nat -> CRcarrier R)
(s sAbs : CRcarrier R)
(n : nat),
series_cv u s
-> series_cv (fun n => CRabs R (u n)) sAbs
-> CRabs R (CRsum u n - s)
<= sAbs - CRsum (fun n => CRabs R (u n)) n.
apply (CR_cv_le (fun N => CRabs R (CRsum u n - (CRsum u (n + N))))
(fun N => CRsum (fun n : nat => CRabs R (u n)) (n + N)
- CRsum (fun n : nat => CRabs R (u n)) n)).
replace (S (n + N)) with (S n + N)%nat.
rewrite CRopp_plus_distr.
rewrite <- CRplus_assoc, CRplus_opp_r, CRplus_0_l, CRabs_opp.
rewrite CRplus_comm, <- CRplus_assoc, CRplus_opp_l.
specialize (H eps) as [N lim].
apply (Nat.le_trans N i).
rewrite <- (Nat.add_0_r i), <- Nat.add_assoc.
apply Nat.add_le_mono_l, Nat.le_0_l.
specialize (H0 eps) as [N lim].
apply (Nat.le_trans N i).
rewrite <- (Nat.add_0_r i), <- Nat.add_assoc.
apply Nat.add_le_mono_l, Nat.le_0_l.
Lemma series_cv_triangle : forall {R : ConstructiveReals}
(u : nat -> CRcarrier R) (s sAbs : CRcarrier R),
series_cv u s
-> series_cv (fun n => CRabs R (u n)) sAbs
-> CRabs R s <= sAbs.
apply (CR_cv_le (fun n => CRabs R (CRsum u n))
(CRsum (fun n => CRabs R (u n)))).
Lemma series_cv_shift :
forall {R : ConstructiveReals} (f : nat -> CRcarrier R) k l,
series_cv (fun n => f (S k + n)%nat) l
-> series_cv f (l + CRsum f k).
specialize (H p) as [n nmaj].
destruct (Nat.le_exists_sub (S k) i).
apply (Nat.le_trans _ (S k + 0)).
apply (Nat.le_trans _ (S k + n)).
apply Nat.add_le_mono_l, Nat.le_0_l.
rewrite Nat.add_comm in H.
rewrite <- Nat.add_le_mono_r in H.
rewrite Nat.add_comm, (sum_assoc f k x).
setoid_replace (CRsum f k + CRsum (fun k0 : nat => f (S k + k0)%nat) x - (l + CRsum f k))
with (CRsum (fun k0 : nat => f (S k + k0)%nat) x - l).
rewrite (CRplus_comm (CRsum f k)).
rewrite CRplus_comm, CRopp_plus_distr, CRplus_assoc.
rewrite CRplus_opp_l, CRplus_0_r.
Lemma series_cv_shift' : forall {R : ConstructiveReals}
(un : nat -> CRcarrier R) (s : CRcarrier R) (shift : nat),
series_cv un s
-> series_cv (fun n => un (n+shift)%nat)
(s - match shift with
| O => 0
| S p => CRsum un p
end).
apply (CR_cv_eq _ (fun n => CRsum un (n + S p) - CRsum un p)).
rewrite CRplus_comm, <- CRplus_assoc.
rewrite CRplus_opp_l, CRplus_0_l.
rewrite (Nat.add_comm i).
apply (CR_cv_shift' _ (S p) _ H).
rewrite CRopp_involutive, CRplus_opp_l.
Lemma CRmorph_sum : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(un : nat -> CRcarrier R1) (n : nat),
CRmorph f (CRsum un n) ==
CRsum (fun n0 : nat => CRmorph f (un n0)) n.
rewrite CRmorph_plus, IHn.
Lemma CRmorph_INR : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(n : nat),
CRmorph f (INR n) == INR n.
rewrite (CRmorph_proper f _ (1 + CR_of_Q R1 (Z.of_nat n # 1))).
rewrite CRmorph_one, <- CR_of_Q_plus.
Lemma CRmorph_series_cv : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(un : nat -> CRcarrier R1)
(l : CRcarrier R1),
series_cv un l
-> series_cv (fun n => CRmorph f (un n)) (CRmorph f l).
apply (CR_cv_eq _ (fun n => CRmorph f (CRsum un n))).