@@ -12,7 +12,7 @@ open import Data.Nat.Base
1212open import Data.Nat.DivMod
1313open import Data.Nat.Divisibility
1414open import Data.Nat.Properties
15- open import Relation.Binary.Definitions
15+ open import Relation.Binary.Definitions
1616open import Relation.Binary.PropositionalEquality
1717 using (_≡_; refl; sym; cong; subst)
1818
@@ -49,11 +49,11 @@ nPn≡n! n = begin-equality
4949 _ = (n ∸ n) !≢0
5050
5151nP1≡n : ∀ n → n P 1 ≡ n
52- nP1≡n zero = k>n⇒nPk≡0 (z<s {n = zero})
52+ nP1≡n zero = refl
5353nP1≡n n@(suc n-1) = begin-equality
54- n P 1 ≡⟨ nPk≡n!/[n∸k]! (s≤s (z≤n {n-1})) ⟩
55- n ! / n-1 ! ≡⟨ m*n/n≡m n (n-1 !) ⟩
56- n ∎
54+ n P 1 ≡⟨ nPk≡n!/[n∸k]! (s≤s (z≤n {n-1})) ⟩
55+ n ! / n-1 ! ≡⟨ m*n/n≡m n (n-1 !) ⟩
56+ n ∎
5757 where instance
5858 _ = n-1 !≢0
5959
@@ -109,7 +109,51 @@ nC1≡n n@(suc n-1) = begin-equality
109109------------------------------------------------------------------------
110110-- Arithmetic of (n C k)
111111
112- k![n∸k]!∣n! : ∀ {n k} → k ≤ n → k ! * (n ∸ k) ! ∣ n !
112+ module _ {n k} (k<n : k < n) where
113+
114+ private
115+
116+ [n-k] = n ∸ k
117+ [n-k-1] = n ∸ suc k
118+
119+ [n-k]! = [n-k] !
120+ [n-k-1]! = [n-k-1] !
121+
122+ [n-k]≡1+[n-k-1] : [n-k] ≡ suc [n-k-1]
123+ [n-k]≡1+[n-k-1] = +-∸-assoc 1 k<n
124+
125+
126+ [n-k]*[n-k-1]!≡[n-k]! : [n-k] * [n-k-1]! ≡ [n-k]!
127+ [n-k]*[n-k-1]!≡[n-k]! = begin-equality
128+ [n-k] * [n-k-1]!
129+ ≡⟨ cong (_* [n-k-1]!) [n-k]≡1+[n-k-1] ⟩
130+ (suc [n-k-1]) * [n-k-1]!
131+ ≡˘⟨ cong _! [n-k]≡1+[n-k-1] ⟩
132+ [n-k]! ∎
133+
134+ private
135+
136+ n! = n !
137+ k! = k !
138+ [k+1]! = (suc k) !
139+
140+ d[k] = k! * [n-k]!
141+ [k+1]*d[k] = (suc k) * d[k]
142+ d[k+1] = [k+1]! * [n-k-1]!
143+ [n-k]*d[k+1] = [n-k] * d[k+1]
144+
145+ [n-k]*d[k+1]≡[k+1]*d[k] : [n-k]*d[k+1] ≡ [k+1]*d[k]
146+ [n-k]*d[k+1]≡[k+1]*d[k] = begin-equality
147+ [n-k]*d[k+1]
148+ ≡⟨ x∙yz≈y∙xz [n-k] [k+1]! [n-k-1]! ⟩
149+ [k+1]! * ([n-k] * [n-k-1]!)
150+ ≡⟨ *-assoc (suc k) k! ([n-k] * [n-k-1]!) ⟩
151+ (suc k) * (k! * ([n-k] * [n-k-1]!))
152+ ≡⟨ cong ((suc k) *_) (cong (k! *_) [n-k]*[n-k-1]!≡[n-k]!) ⟩
153+ [k+1]*d[k] ∎
154+ where open CommSemigroupProperties *-commutativeSemigroup
155+
156+ k![n∸k]!∣n! : ∀ {n k} → k ≤ n → k ! * (n ∸ k) ! ∣ n !
113157k![n∸k]!∣n! {n} {k} k≤n = subst (_∣ n !) (*-comm ((n ∸ k) !) (k !)) ([n∸k]!k!∣n! k≤n)
114158
115159nCk+nC[k+1]≡[n+1]C[k+1] : ∀ n k → n C k + n C (suc k) ≡ suc n C suc k
@@ -139,7 +183,7 @@ nCk+nC[k+1]≡[n+1]C[k+1] n k with <-cmp k n
139183 n! / d[k] + _
140184 ≡˘⟨ cong (_+ [n-k]*n!/[n-k]*d[k+1]) (m*n/m*o≡n/o (suc k) n! d[k]) ⟩
141185 (suc k * n!) / [k+1]*d[k] + _
142- ≡⟨ cong (((suc k * n!) / [k+1]*d[k]) +_) (/-congʳ [n-k]*d[k+1]≡[k+1]*d[k]) ⟩
186+ ≡⟨ cong (((suc k * n!) / [k+1]*d[k]) +_) (/-congʳ ( [n-k]*d[k+1]≡[k+1]*d[k] k<n) ) ⟩
143187 (suc k * n!) / [k+1]*d[k] + ((n ∸ k) * n! / [k+1]*d[k])
144188 ≡˘⟨ +-distrib-/-∣ˡ _ (*-monoʳ-∣ (suc k) (k![n∸k]!∣n! k≤n)) ⟩
145189 ((suc k) * n! + (n ∸ k) * n!) / [k+1]*d[k]
@@ -166,48 +210,24 @@ nCk+nC[k+1]≡[n+1]C[k+1] n k with <-cmp k n
166210 [n-k] = n ∸ k
167211 [n-k-1] = n ∸ suc k
168212
169- [n-k-1]+1≡[n-k] : suc [n-k-1] ≡ [n-k]
170- [n-k-1]+1≡[n-k] = [m-n-1]+1≡[m-n] k<n
171-
172213 n! = n !
173214 k! = k !
174215 [k+1]! = (suc k) !
175216 [n-k]! = [n-k] !
176217 [n-k-1]! = [n-k-1] !
177218
178- [n-k]*[n-k-1]!≡[n-k]! : [n-k] * [n-k-1]! ≡ [n-k]!
179- [n-k]*[n-k-1]!≡[n-k]! = begin-equality
180- [n-k] * [n-k-1]!
181- ≡˘⟨ cong (_* [n-k-1]!) [n-k-1]+1≡[n-k] ⟩
182- (suc [n-k-1]) * [n-k-1]!
183- ≡⟨ cong _! [n-k-1]+1≡[n-k] ⟩
184- [n-k]! ∎
185-
186219 d[k] = k! * [n-k]!
187220 [k+1]*d[k] = (suc k) * d[k]
188221 d[k+1] = [k+1]! * [n-k-1]!
189- [n-k]*d[k] = [n-k] * d[k]
190222 [n-k]*d[k+1] = [n-k] * d[k+1]
191223 n!/[n-k]*d[k+1] = n ! / [n-k]*d[k+1]
192224 [n-k]*n!/[n-k]*d[k+1] = [n-k] * n! / [n-k]*d[k+1]
193225 [n-k]*n!/[k+1]*d[k] = [n-k] * n! / [k+1]*d[k]
194226
195- [n-k]*d[k+1]≡[k+1]*d[k] : [n-k]*d[k+1] ≡ [k+1]*d[k]
196- [n-k]*d[k+1]≡[k+1]*d[k] = begin-equality
197- [n-k]*d[k+1]
198- ≡⟨ x∙yz≈y∙xz [n-k] [k+1]! [n-k-1]! ⟩
199- [k+1]! * ([n-k] * [n-k-1]!)
200- ≡⟨ *-assoc (suc k) k! ([n-k] * [n-k-1]!) ⟩
201- (suc k) * (k! * ([n-k] * [n-k-1]!))
202- ≡⟨ cong ((suc k) *_) (cong (k! *_) [n-k]*[n-k-1]!≡[n-k]!) ⟩
203- [k+1]*d[k] ∎
204- where open CommSemigroupProperties *-commutativeSemigroup
205-
206227 instance
207228 [k+1]!*[n-k]!≢0 = (suc k) !* [n-k] !≢0
208229 d[k]≢0 = k !* [n-k] !≢0
209230 d[k+1]≢0 = (suc k) !* (n ∸ suc k) !≢0
210231 [k+1]*d[k]≢0 = m*n≢0 (suc k) d[k]
211232 [n-k]≢0 = ≢-nonZero (m>n⇒m∸n≢0 k<n)
212- [n-k]*d[k]≢0 = m*n≢0 [n-k] d[k]
213233 [n-k]*d[k+1]≢0 = m*n≢0 [n-k] d[k+1]
0 commit comments