summaryrefslogtreecommitdiff
path: root/theories/Reals/Binomial.v
diff options
context:
space:
mode:
Diffstat (limited to 'theories/Reals/Binomial.v')
-rw-r--r--theories/Reals/Binomial.v367
1 files changed, 186 insertions, 181 deletions
diff --git a/theories/Reals/Binomial.v b/theories/Reals/Binomial.v
index 940bd628..5be34e71 100644
--- a/theories/Reals/Binomial.v
+++ b/theories/Reals/Binomial.v
@@ -1,12 +1,12 @@
-(************************************************************************)
-(* v * The Coq Proof Assistant / The Coq Development Team *)
-(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
-(* \VV/ **************************************************************)
-(* // * This file is distributed under the terms of the *)
-(* * GNU Lesser General Public License Version 2.1 *)
-(************************************************************************)
-
-(*i $Id: Binomial.v 6295 2004-11-12 16:40:39Z gregoire $ i*)
+ (************************************************************************)
+ (* v * The Coq Proof Assistant / The Coq Development Team *)
+ (* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+ (* \VV/ **************************************************************)
+ (* // * This file is distributed under the terms of the *)
+ (* * GNU Lesser General Public License Version 2.1 *)
+ (************************************************************************)
+
+ (*i $Id: Binomial.v 9245 2006-10-17 12:53:34Z notin $ i*)
Require Import Rbase.
Require Import Rfunctions.
@@ -17,188 +17,193 @@ Definition C (n p:nat) : R :=
INR (fact n) / (INR (fact p) * INR (fact (n - p))).
Lemma pascal_step1 : forall n i:nat, (i <= n)%nat -> C n i = C n (n - i).
-intros; unfold C in |- *; replace (n - (n - i))%nat with i.
-rewrite Rmult_comm.
-reflexivity.
-apply plus_minus; rewrite plus_comm; apply le_plus_minus; assumption.
+Proof.
+ intros; unfold C in |- *; replace (n - (n - i))%nat with i.
+ rewrite Rmult_comm.
+ reflexivity.
+ apply plus_minus; rewrite plus_comm; apply le_plus_minus; assumption.
Qed.
Lemma pascal_step2 :
- forall n i:nat,
- (i <= n)%nat -> C (S n) i = INR (S n) / INR (S n - i) * C n i.
-intros; unfold C in |- *; replace (S n - i)%nat with (S (n - i)).
-cut (forall n:nat, fact (S n) = (S n * fact n)%nat).
-intro; repeat rewrite H0.
-unfold Rdiv in |- *; repeat rewrite mult_INR; repeat rewrite Rinv_mult_distr.
-ring.
-apply INR_fact_neq_0.
-apply INR_fact_neq_0.
-apply not_O_INR; discriminate.
-apply INR_fact_neq_0.
-apply INR_fact_neq_0.
-apply prod_neq_R0.
-apply not_O_INR; discriminate.
-apply INR_fact_neq_0.
-intro; reflexivity.
-apply minus_Sn_m; assumption.
+ forall n i:nat,
+ (i <= n)%nat -> C (S n) i = INR (S n) / INR (S n - i) * C n i.
+Proof.
+ intros; unfold C in |- *; replace (S n - i)%nat with (S (n - i)).
+ cut (forall n:nat, fact (S n) = (S n * fact n)%nat).
+ intro; repeat rewrite H0.
+ unfold Rdiv in |- *; repeat rewrite mult_INR; repeat rewrite Rinv_mult_distr.
+ ring.
+ apply INR_fact_neq_0.
+ apply INR_fact_neq_0.
+ apply not_O_INR; discriminate.
+ apply INR_fact_neq_0.
+ apply INR_fact_neq_0.
+ apply prod_neq_R0.
+ apply not_O_INR; discriminate.
+ apply INR_fact_neq_0.
+ intro; reflexivity.
+ apply minus_Sn_m; assumption.
Qed.
Lemma pascal_step3 :
- forall n i:nat, (i < n)%nat -> C n (S i) = INR (n - i) / INR (S i) * C n i.
-intros; unfold C in |- *.
-cut (forall n:nat, fact (S n) = (S n * fact n)%nat).
-intro.
-cut ((n - i)%nat = S (n - S i)).
-intro.
-pattern (n - i)%nat at 2 in |- *; rewrite H1.
-repeat rewrite H0; unfold Rdiv in |- *; repeat rewrite mult_INR;
- repeat rewrite Rinv_mult_distr.
-rewrite <- H1; rewrite (Rmult_comm (/ INR (n - i)));
- repeat rewrite Rmult_assoc; rewrite (Rmult_comm (INR (n - i)));
- repeat rewrite Rmult_assoc; rewrite <- Rinv_l_sym.
-ring.
-apply not_O_INR; apply minus_neq_O; assumption.
-apply not_O_INR; discriminate.
-apply INR_fact_neq_0.
-apply INR_fact_neq_0.
-apply prod_neq_R0; [ apply not_O_INR; discriminate | apply INR_fact_neq_0 ].
-apply not_O_INR; discriminate.
-apply INR_fact_neq_0.
-apply prod_neq_R0; [ apply not_O_INR; discriminate | apply INR_fact_neq_0 ].
-apply INR_fact_neq_0.
-rewrite minus_Sn_m.
-simpl in |- *; reflexivity.
-apply lt_le_S; assumption.
-intro; reflexivity.
+ forall n i:nat, (i < n)%nat -> C n (S i) = INR (n - i) / INR (S i) * C n i.
+Proof.
+ intros; unfold C in |- *.
+ cut (forall n:nat, fact (S n) = (S n * fact n)%nat).
+ intro.
+ cut ((n - i)%nat = S (n - S i)).
+ intro.
+ pattern (n - i)%nat at 2 in |- *; rewrite H1.
+ repeat rewrite H0; unfold Rdiv in |- *; repeat rewrite mult_INR;
+ repeat rewrite Rinv_mult_distr.
+ rewrite <- H1; rewrite (Rmult_comm (/ INR (n - i)));
+ repeat rewrite Rmult_assoc; rewrite (Rmult_comm (INR (n - i)));
+ repeat rewrite Rmult_assoc; rewrite <- Rinv_l_sym.
+ ring.
+ apply not_O_INR; apply minus_neq_O; assumption.
+ apply not_O_INR; discriminate.
+ apply INR_fact_neq_0.
+ apply INR_fact_neq_0.
+ apply prod_neq_R0; [ apply not_O_INR; discriminate | apply INR_fact_neq_0 ].
+ apply not_O_INR; discriminate.
+ apply INR_fact_neq_0.
+ apply prod_neq_R0; [ apply not_O_INR; discriminate | apply INR_fact_neq_0 ].
+ apply INR_fact_neq_0.
+ rewrite minus_Sn_m.
+ simpl in |- *; reflexivity.
+ apply lt_le_S; assumption.
+ intro; reflexivity.
Qed.
-(**********)
+ (**********)
Lemma pascal :
- forall n i:nat, (i < n)%nat -> C n i + C n (S i) = C (S n) (S i).
-intros.
-rewrite pascal_step3; [ idtac | assumption ].
-replace (C n i + INR (n - i) / INR (S i) * C n i) with
- (C n i * (1 + INR (n - i) / INR (S i))); [ idtac | ring ].
-replace (1 + INR (n - i) / INR (S i)) with (INR (S n) / INR (S i)).
-rewrite pascal_step1.
-rewrite Rmult_comm; replace (S i) with (S n - (n - i))%nat.
-rewrite <- pascal_step2.
-apply pascal_step1.
-apply le_trans with n.
-apply le_minusni_n.
-apply lt_le_weak; assumption.
-apply le_n_Sn.
-apply le_minusni_n.
-apply lt_le_weak; assumption.
-rewrite <- minus_Sn_m.
-cut ((n - (n - i))%nat = i).
-intro; rewrite H0; reflexivity.
-symmetry in |- *; apply plus_minus.
-rewrite plus_comm; rewrite le_plus_minus_r.
-reflexivity.
-apply lt_le_weak; assumption.
-apply le_minusni_n; apply lt_le_weak; assumption.
-apply lt_le_weak; assumption.
-unfold Rdiv in |- *.
-repeat rewrite S_INR.
-rewrite minus_INR.
-cut (INR i + 1 <> 0).
-intro.
-apply Rmult_eq_reg_l with (INR i + 1); [ idtac | assumption ].
-rewrite Rmult_plus_distr_l.
-rewrite Rmult_1_r.
-do 2 rewrite (Rmult_comm (INR i + 1)).
-repeat rewrite Rmult_assoc.
-rewrite <- Rinv_l_sym; [ idtac | assumption ].
-ring.
-rewrite <- S_INR.
-apply not_O_INR; discriminate.
-apply lt_le_weak; assumption.
+ forall n i:nat, (i < n)%nat -> C n i + C n (S i) = C (S n) (S i).
+Proof.
+ intros.
+ rewrite pascal_step3; [ idtac | assumption ].
+ replace (C n i + INR (n - i) / INR (S i) * C n i) with
+ (C n i * (1 + INR (n - i) / INR (S i))); [ idtac | ring ].
+ replace (1 + INR (n - i) / INR (S i)) with (INR (S n) / INR (S i)).
+ rewrite pascal_step1.
+ rewrite Rmult_comm; replace (S i) with (S n - (n - i))%nat.
+ rewrite <- pascal_step2.
+ apply pascal_step1.
+ apply le_trans with n.
+ apply le_minusni_n.
+ apply lt_le_weak; assumption.
+ apply le_n_Sn.
+ apply le_minusni_n.
+ apply lt_le_weak; assumption.
+ rewrite <- minus_Sn_m.
+ cut ((n - (n - i))%nat = i).
+ intro; rewrite H0; reflexivity.
+ symmetry in |- *; apply plus_minus.
+ rewrite plus_comm; rewrite le_plus_minus_r.
+ reflexivity.
+ apply lt_le_weak; assumption.
+ apply le_minusni_n; apply lt_le_weak; assumption.
+ apply lt_le_weak; assumption.
+ unfold Rdiv in |- *.
+ repeat rewrite S_INR.
+ rewrite minus_INR.
+ cut (INR i + 1 <> 0).
+ intro.
+ apply Rmult_eq_reg_l with (INR i + 1); [ idtac | assumption ].
+ rewrite Rmult_plus_distr_l.
+ rewrite Rmult_1_r.
+ do 2 rewrite (Rmult_comm (INR i + 1)).
+ repeat rewrite Rmult_assoc.
+ rewrite <- Rinv_l_sym; [ idtac | assumption ].
+ ring.
+ rewrite <- S_INR.
+ apply not_O_INR; discriminate.
+ apply lt_le_weak; assumption.
Qed.
-(*********************)
-(*********************)
+ (*********************)
+ (*********************)
Lemma binomial :
- forall (x y:R) (n:nat),
- (x + y) ^ n = sum_f_R0 (fun i:nat => C n i * x ^ i * y ^ (n - i)) n.
-intros; induction n as [| n Hrecn].
-unfold C in |- *; simpl in |- *; unfold Rdiv in |- *;
- repeat rewrite Rmult_1_r; rewrite Rinv_1; ring.
-pattern (S n) at 1 in |- *; replace (S n) with (n + 1)%nat; [ idtac | ring ].
-rewrite pow_add; rewrite Hrecn.
-replace ((x + y) ^ 1) with (x + y); [ idtac | simpl in |- *; ring ].
-rewrite tech5.
-cut (forall p:nat, C p p = 1).
-cut (forall p:nat, C p 0 = 1).
-intros; rewrite H0; rewrite <- minus_n_n; rewrite Rmult_1_l.
-replace (y ^ 0) with 1; [ rewrite Rmult_1_r | simpl in |- *; reflexivity ].
-induction n as [| n Hrecn0].
-simpl in |- *; do 2 rewrite H; ring.
-(* N >= 1 *)
-set (N := S n).
-rewrite Rmult_plus_distr_l.
-replace (sum_f_R0 (fun i:nat => C N i * x ^ i * y ^ (N - i)) N * x) with
- (sum_f_R0 (fun i:nat => C N i * x ^ S i * y ^ (N - i)) N).
-replace (sum_f_R0 (fun i:nat => C N i * x ^ i * y ^ (N - i)) N * y) with
- (sum_f_R0 (fun i:nat => C N i * x ^ i * y ^ (S N - i)) N).
-rewrite (decomp_sum (fun i:nat => C (S N) i * x ^ i * y ^ (S N - i)) N).
-rewrite H; replace (x ^ 0) with 1; [ idtac | reflexivity ].
-do 2 rewrite Rmult_1_l.
-replace (S N - 0)%nat with (S N); [ idtac | reflexivity ].
-set (An := fun i:nat => C N i * x ^ S i * y ^ (N - i)).
-set (Bn := fun i:nat => C N (S i) * x ^ S i * y ^ (N - i)).
-replace (pred N) with n.
-replace (sum_f_R0 (fun i:nat => C (S N) (S i) * x ^ S i * y ^ (S N - S i)) n)
- with (sum_f_R0 (fun i:nat => An i + Bn i) n).
-rewrite plus_sum.
-replace (x ^ S N) with (An (S n)).
-rewrite (Rplus_comm (sum_f_R0 An n)).
-repeat rewrite Rplus_assoc.
-rewrite <- tech5.
-fold N in |- *.
-set (Cn := fun i:nat => C N i * x ^ i * y ^ (S N - i)).
-cut (forall i:nat, (i < N)%nat -> Cn (S i) = Bn i).
-intro; replace (sum_f_R0 Bn n) with (sum_f_R0 (fun i:nat => Cn (S i)) n).
-replace (y ^ S N) with (Cn 0%nat).
-rewrite <- Rplus_assoc; rewrite (decomp_sum Cn N).
-replace (pred N) with n.
-ring.
-unfold N in |- *; simpl in |- *; reflexivity.
-unfold N in |- *; apply lt_O_Sn.
-unfold Cn in |- *; rewrite H; simpl in |- *; ring.
-apply sum_eq.
-intros; apply H1.
-unfold N in |- *; apply le_lt_trans with n; [ assumption | apply lt_n_Sn ].
-intros; unfold Bn, Cn in |- *.
-replace (S N - S i)%nat with (N - i)%nat; reflexivity.
-unfold An in |- *; fold N in |- *; rewrite <- minus_n_n; rewrite H0;
- simpl in |- *; ring.
-apply sum_eq.
-intros; unfold An, Bn in |- *; replace (S N - S i)%nat with (N - i)%nat;
- [ idtac | reflexivity ].
-rewrite <- pascal;
- [ ring
- | apply le_lt_trans with n; [ assumption | unfold N in |- *; apply lt_n_Sn ] ].
-unfold N in |- *; reflexivity.
-unfold N in |- *; apply lt_O_Sn.
-rewrite <- (Rmult_comm y); rewrite scal_sum; apply sum_eq.
-intros; replace (S N - i)%nat with (S (N - i)).
-replace (S (N - i)) with (N - i + 1)%nat; [ idtac | ring ].
-rewrite pow_add; replace (y ^ 1) with y; [ idtac | simpl in |- *; ring ];
- ring.
-apply minus_Sn_m; assumption.
-rewrite <- (Rmult_comm x); rewrite scal_sum; apply sum_eq.
-intros; replace (S i) with (i + 1)%nat; [ idtac | ring ]; rewrite pow_add;
- replace (x ^ 1) with x; [ idtac | simpl in |- *; ring ];
- ring.
-intro; unfold C in |- *.
-replace (INR (fact 0)) with 1; [ idtac | reflexivity ].
-replace (p - 0)%nat with p; [ idtac | apply minus_n_O ].
-rewrite Rmult_1_l; unfold Rdiv in |- *; rewrite <- Rinv_r_sym;
- [ reflexivity | apply INR_fact_neq_0 ].
-intro; unfold C in |- *.
-replace (p - p)%nat with 0%nat; [ idtac | apply minus_n_n ].
-replace (INR (fact 0)) with 1; [ idtac | reflexivity ].
-rewrite Rmult_1_r; unfold Rdiv in |- *; rewrite <- Rinv_r_sym;
- [ reflexivity | apply INR_fact_neq_0 ].
+ forall (x y:R) (n:nat),
+ (x + y) ^ n = sum_f_R0 (fun i:nat => C n i * x ^ i * y ^ (n - i)) n.
+Proof.
+ intros; induction n as [| n Hrecn].
+ unfold C in |- *; simpl in |- *; unfold Rdiv in |- *;
+ repeat rewrite Rmult_1_r; rewrite Rinv_1; ring.
+ pattern (S n) at 1 in |- *; replace (S n) with (n + 1)%nat; [ idtac | ring ].
+ rewrite pow_add; rewrite Hrecn.
+ replace ((x + y) ^ 1) with (x + y); [ idtac | simpl in |- *; ring ].
+ rewrite tech5.
+ cut (forall p:nat, C p p = 1).
+ cut (forall p:nat, C p 0 = 1).
+ intros; rewrite H0; rewrite <- minus_n_n; rewrite Rmult_1_l.
+ replace (y ^ 0) with 1; [ rewrite Rmult_1_r | simpl in |- *; reflexivity ].
+ induction n as [| n Hrecn0].
+ simpl in |- *; do 2 rewrite H; ring.
+ (* N >= 1 *)
+ set (N := S n).
+ rewrite Rmult_plus_distr_l.
+ replace (sum_f_R0 (fun i:nat => C N i * x ^ i * y ^ (N - i)) N * x) with
+ (sum_f_R0 (fun i:nat => C N i * x ^ S i * y ^ (N - i)) N).
+ replace (sum_f_R0 (fun i:nat => C N i * x ^ i * y ^ (N - i)) N * y) with
+ (sum_f_R0 (fun i:nat => C N i * x ^ i * y ^ (S N - i)) N).
+ rewrite (decomp_sum (fun i:nat => C (S N) i * x ^ i * y ^ (S N - i)) N).
+ rewrite H; replace (x ^ 0) with 1; [ idtac | reflexivity ].
+ do 2 rewrite Rmult_1_l.
+ replace (S N - 0)%nat with (S N); [ idtac | reflexivity ].
+ set (An := fun i:nat => C N i * x ^ S i * y ^ (N - i)).
+ set (Bn := fun i:nat => C N (S i) * x ^ S i * y ^ (N - i)).
+ replace (pred N) with n.
+ replace (sum_f_R0 (fun i:nat => C (S N) (S i) * x ^ S i * y ^ (S N - S i)) n)
+ with (sum_f_R0 (fun i:nat => An i + Bn i) n).
+ rewrite plus_sum.
+ replace (x ^ S N) with (An (S n)).
+ rewrite (Rplus_comm (sum_f_R0 An n)).
+ repeat rewrite Rplus_assoc.
+ rewrite <- tech5.
+ fold N in |- *.
+ set (Cn := fun i:nat => C N i * x ^ i * y ^ (S N - i)).
+ cut (forall i:nat, (i < N)%nat -> Cn (S i) = Bn i).
+ intro; replace (sum_f_R0 Bn n) with (sum_f_R0 (fun i:nat => Cn (S i)) n).
+ replace (y ^ S N) with (Cn 0%nat).
+ rewrite <- Rplus_assoc; rewrite (decomp_sum Cn N).
+ replace (pred N) with n.
+ ring.
+ unfold N in |- *; simpl in |- *; reflexivity.
+ unfold N in |- *; apply lt_O_Sn.
+ unfold Cn in |- *; rewrite H; simpl in |- *; ring.
+ apply sum_eq.
+ intros; apply H1.
+ unfold N in |- *; apply le_lt_trans with n; [ assumption | apply lt_n_Sn ].
+ intros; unfold Bn, Cn in |- *.
+ replace (S N - S i)%nat with (N - i)%nat; reflexivity.
+ unfold An in |- *; fold N in |- *; rewrite <- minus_n_n; rewrite H0;
+ simpl in |- *; ring.
+ apply sum_eq.
+ intros; unfold An, Bn in |- *; replace (S N - S i)%nat with (N - i)%nat;
+ [ idtac | reflexivity ].
+ rewrite <- pascal;
+ [ ring
+ | apply le_lt_trans with n; [ assumption | unfold N in |- *; apply lt_n_Sn ] ].
+ unfold N in |- *; reflexivity.
+ unfold N in |- *; apply lt_O_Sn.
+ rewrite <- (Rmult_comm y); rewrite scal_sum; apply sum_eq.
+ intros; replace (S N - i)%nat with (S (N - i)).
+ replace (S (N - i)) with (N - i + 1)%nat; [ idtac | ring ].
+ rewrite pow_add; replace (y ^ 1) with y; [ idtac | simpl in |- *; ring ];
+ ring.
+ apply minus_Sn_m; assumption.
+ rewrite <- (Rmult_comm x); rewrite scal_sum; apply sum_eq.
+ intros; replace (S i) with (i + 1)%nat; [ idtac | ring ]; rewrite pow_add;
+ replace (x ^ 1) with x; [ idtac | simpl in |- *; ring ];
+ ring.
+ intro; unfold C in |- *.
+ replace (INR (fact 0)) with 1; [ idtac | reflexivity ].
+ replace (p - 0)%nat with p; [ idtac | apply minus_n_O ].
+ rewrite Rmult_1_l; unfold Rdiv in |- *; rewrite <- Rinv_r_sym;
+ [ reflexivity | apply INR_fact_neq_0 ].
+ intro; unfold C in |- *.
+ replace (p - p)%nat with 0%nat; [ idtac | apply minus_n_n ].
+ replace (INR (fact 0)) with 1; [ idtac | reflexivity ].
+ rewrite Rmult_1_r; unfold Rdiv in |- *; rewrite <- Rinv_r_sym;
+ [ reflexivity | apply INR_fact_neq_0 ].
Qed.