1
(************************************************************************)
2
(* v * The Coq Proof Assistant / The Coq Development Team *)
3
(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
4
(* \VV/ **************************************************************)
5
(* // * This file is distributed under the terms of the *)
6
(* * GNU Lesser General Public License Version 2.1 *)
7
(************************************************************************)
9
(*i $Id: Binomial.v 9245 2006-10-17 12:53:34Z notin $ i*)
12
Require Import Rfunctions.
13
Require Import PartSum.
14
Open Local Scope R_scope.
16
Definition C (n p:nat) : R :=
17
INR (fact n) / (INR (fact p) * INR (fact (n - p))).
19
Lemma pascal_step1 : forall n i:nat, (i <= n)%nat -> C n i = C n (n - i).
21
intros; unfold C in |- *; replace (n - (n - i))%nat with i.
24
apply plus_minus; rewrite plus_comm; apply le_plus_minus; assumption.
29
(i <= n)%nat -> C (S n) i = INR (S n) / INR (S n - i) * C n i.
31
intros; unfold C in |- *; replace (S n - i)%nat with (S (n - i)).
32
cut (forall n:nat, fact (S n) = (S n * fact n)%nat).
33
intro; repeat rewrite H0.
34
unfold Rdiv in |- *; repeat rewrite mult_INR; repeat rewrite Rinv_mult_distr.
38
apply not_O_INR; discriminate.
42
apply not_O_INR; discriminate.
45
apply minus_Sn_m; assumption.
49
forall n i:nat, (i < n)%nat -> C n (S i) = INR (n - i) / INR (S i) * C n i.
51
intros; unfold C in |- *.
52
cut (forall n:nat, fact (S n) = (S n * fact n)%nat).
54
cut ((n - i)%nat = S (n - S i)).
56
pattern (n - i)%nat at 2 in |- *; rewrite H1.
57
repeat rewrite H0; unfold Rdiv in |- *; repeat rewrite mult_INR;
58
repeat rewrite Rinv_mult_distr.
59
rewrite <- H1; rewrite (Rmult_comm (/ INR (n - i)));
60
repeat rewrite Rmult_assoc; rewrite (Rmult_comm (INR (n - i)));
61
repeat rewrite Rmult_assoc; rewrite <- Rinv_l_sym.
63
apply not_O_INR; apply minus_neq_O; assumption.
64
apply not_O_INR; discriminate.
67
apply prod_neq_R0; [ apply not_O_INR; discriminate | apply INR_fact_neq_0 ].
68
apply not_O_INR; discriminate.
70
apply prod_neq_R0; [ apply not_O_INR; discriminate | apply INR_fact_neq_0 ].
73
simpl in |- *; reflexivity.
74
apply lt_le_S; assumption.
80
forall n i:nat, (i < n)%nat -> C n i + C n (S i) = C (S n) (S i).
83
rewrite pascal_step3; [ idtac | assumption ].
84
replace (C n i + INR (n - i) / INR (S i) * C n i) with
85
(C n i * (1 + INR (n - i) / INR (S i))); [ idtac | ring ].
86
replace (1 + INR (n - i) / INR (S i)) with (INR (S n) / INR (S i)).
88
rewrite Rmult_comm; replace (S i) with (S n - (n - i))%nat.
89
rewrite <- pascal_step2.
91
apply le_trans with n.
93
apply lt_le_weak; assumption.
96
apply lt_le_weak; assumption.
97
rewrite <- minus_Sn_m.
98
cut ((n - (n - i))%nat = i).
99
intro; rewrite H0; reflexivity.
100
symmetry in |- *; apply plus_minus.
101
rewrite plus_comm; rewrite le_plus_minus_r.
103
apply lt_le_weak; assumption.
104
apply le_minusni_n; apply lt_le_weak; assumption.
105
apply lt_le_weak; assumption.
107
repeat rewrite S_INR.
109
cut (INR i + 1 <> 0).
111
apply Rmult_eq_reg_l with (INR i + 1); [ idtac | assumption ].
112
rewrite Rmult_plus_distr_l.
114
do 2 rewrite (Rmult_comm (INR i + 1)).
115
repeat rewrite Rmult_assoc.
116
rewrite <- Rinv_l_sym; [ idtac | assumption ].
119
apply not_O_INR; discriminate.
120
apply lt_le_weak; assumption.
123
(*********************)
124
(*********************)
126
forall (x y:R) (n:nat),
127
(x + y) ^ n = sum_f_R0 (fun i:nat => C n i * x ^ i * y ^ (n - i)) n.
129
intros; induction n as [| n Hrecn].
130
unfold C in |- *; simpl in |- *; unfold Rdiv in |- *;
131
repeat rewrite Rmult_1_r; rewrite Rinv_1; ring.
132
pattern (S n) at 1 in |- *; replace (S n) with (n + 1)%nat; [ idtac | ring ].
133
rewrite pow_add; rewrite Hrecn.
134
replace ((x + y) ^ 1) with (x + y); [ idtac | simpl in |- *; ring ].
136
cut (forall p:nat, C p p = 1).
137
cut (forall p:nat, C p 0 = 1).
138
intros; rewrite H0; rewrite <- minus_n_n; rewrite Rmult_1_l.
139
replace (y ^ 0) with 1; [ rewrite Rmult_1_r | simpl in |- *; reflexivity ].
140
induction n as [| n Hrecn0].
141
simpl in |- *; do 2 rewrite H; ring.
144
rewrite Rmult_plus_distr_l.
145
replace (sum_f_R0 (fun i:nat => C N i * x ^ i * y ^ (N - i)) N * x) with
146
(sum_f_R0 (fun i:nat => C N i * x ^ S i * y ^ (N - i)) N).
147
replace (sum_f_R0 (fun i:nat => C N i * x ^ i * y ^ (N - i)) N * y) with
148
(sum_f_R0 (fun i:nat => C N i * x ^ i * y ^ (S N - i)) N).
149
rewrite (decomp_sum (fun i:nat => C (S N) i * x ^ i * y ^ (S N - i)) N).
150
rewrite H; replace (x ^ 0) with 1; [ idtac | reflexivity ].
151
do 2 rewrite Rmult_1_l.
152
replace (S N - 0)%nat with (S N); [ idtac | reflexivity ].
153
set (An := fun i:nat => C N i * x ^ S i * y ^ (N - i)).
154
set (Bn := fun i:nat => C N (S i) * x ^ S i * y ^ (N - i)).
155
replace (pred N) with n.
156
replace (sum_f_R0 (fun i:nat => C (S N) (S i) * x ^ S i * y ^ (S N - S i)) n)
157
with (sum_f_R0 (fun i:nat => An i + Bn i) n).
159
replace (x ^ S N) with (An (S n)).
160
rewrite (Rplus_comm (sum_f_R0 An n)).
161
repeat rewrite Rplus_assoc.
164
set (Cn := fun i:nat => C N i * x ^ i * y ^ (S N - i)).
165
cut (forall i:nat, (i < N)%nat -> Cn (S i) = Bn i).
166
intro; replace (sum_f_R0 Bn n) with (sum_f_R0 (fun i:nat => Cn (S i)) n).
167
replace (y ^ S N) with (Cn 0%nat).
168
rewrite <- Rplus_assoc; rewrite (decomp_sum Cn N).
169
replace (pred N) with n.
171
unfold N in |- *; simpl in |- *; reflexivity.
172
unfold N in |- *; apply lt_O_Sn.
173
unfold Cn in |- *; rewrite H; simpl in |- *; ring.
176
unfold N in |- *; apply le_lt_trans with n; [ assumption | apply lt_n_Sn ].
177
intros; unfold Bn, Cn in |- *.
178
replace (S N - S i)%nat with (N - i)%nat; reflexivity.
179
unfold An in |- *; fold N in |- *; rewrite <- minus_n_n; rewrite H0;
182
intros; unfold An, Bn in |- *; replace (S N - S i)%nat with (N - i)%nat;
183
[ idtac | reflexivity ].
186
| apply le_lt_trans with n; [ assumption | unfold N in |- *; apply lt_n_Sn ] ].
187
unfold N in |- *; reflexivity.
188
unfold N in |- *; apply lt_O_Sn.
189
rewrite <- (Rmult_comm y); rewrite scal_sum; apply sum_eq.
190
intros; replace (S N - i)%nat with (S (N - i)).
191
replace (S (N - i)) with (N - i + 1)%nat; [ idtac | ring ].
192
rewrite pow_add; replace (y ^ 1) with y; [ idtac | simpl in |- *; ring ];
194
apply minus_Sn_m; assumption.
195
rewrite <- (Rmult_comm x); rewrite scal_sum; apply sum_eq.
196
intros; replace (S i) with (i + 1)%nat; [ idtac | ring ]; rewrite pow_add;
197
replace (x ^ 1) with x; [ idtac | simpl in |- *; ring ];
199
intro; unfold C in |- *.
200
replace (INR (fact 0)) with 1; [ idtac | reflexivity ].
201
replace (p - 0)%nat with p; [ idtac | apply minus_n_O ].
202
rewrite Rmult_1_l; unfold Rdiv in |- *; rewrite <- Rinv_r_sym;
203
[ reflexivity | apply INR_fact_neq_0 ].
204
intro; unfold C in |- *.
205
replace (p - p)%nat with 0%nat; [ idtac | apply minus_n_n ].
206
replace (INR (fact 0)) with 1; [ idtac | reflexivity ].
207
rewrite Rmult_1_r; unfold Rdiv in |- *; rewrite <- Rinv_r_sym;
208
[ reflexivity | apply INR_fact_neq_0 ].