diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c23ceb055..2a1a771cca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2020,6 +2020,16 @@ Other minor changes allUpTo? : (P? : Decidable P) → ∀ v → Dec (∀ {n} → n < v → P n) ``` +* Added new proofs in `Data.Nat.Combinatorics`: + ```agda + [n-k]*[n-k-1]!≡[n-k]! : k < n → (n ∸ k) * (n ∸ suc k) ! ≡ (n ∸ k) ! + [n-k]*d[k+1]≡[k+1]*d[k] : k < n → (n ∸ k) * ((suc k) ! * (n ∸ suc k) !) ≡ (suc k) * (k ! * (n ∸ k) !) + k![n∸k]!∣n! : k ≤ n → k ! * (n ∸ k) ! ∣ n ! + nP1≡n : n P 1 ≡ n + nC1≡n : n C 1 ≡ n + nCk+nC[k+1]≡[n+1]C[k+1] : n C k + n C (suc k) ≡ suc n C suc k + ``` + * Added new proofs in `Data.Nat.DivMod`: ```agda m%n≤n : .{{_ : NonZero n}} → m % n ≤ n diff --git a/src/Data/Nat/Combinatorics.agda b/src/Data/Nat/Combinatorics.agda index d36458e9f1..cdfbe56746 100644 --- a/src/Data/Nat/Combinatorics.agda +++ b/src/Data/Nat/Combinatorics.agda @@ -12,11 +12,13 @@ open import Data.Nat.Base open import Data.Nat.DivMod open import Data.Nat.Divisibility open import Data.Nat.Properties +open import Relation.Binary.Definitions open import Relation.Binary.PropositionalEquality using (_≡_; refl; sym; cong; subst) import Data.Nat.Combinatorics.Base as Base import Data.Nat.Combinatorics.Specification as Specification +import Algebra.Properties.CommutativeSemigroup as CommSemigroupProperties open ≤-Reasoning @@ -46,6 +48,15 @@ nPn≡n! n = begin-equality where instance _ = (n ∸ n) !≢0 +nP1≡n : ∀ n → n P 1 ≡ n +nP1≡n zero = refl +nP1≡n n@(suc n-1) = begin-equality + n P 1 ≡⟨ nPk≡n!/[n∸k]! (s≤s (z≤n {n-1})) ⟩ + n ! / n-1 ! ≡⟨ m*n/n≡m n (n-1 !) ⟩ + n ∎ + where instance + _ = n-1 !≢0 + ------------------------------------------------------------------------ -- Properties of _C_ @@ -85,3 +96,138 @@ nCn≡1 n = begin-equality 1 ∎ where instance _ = n !≢0 + +nC1≡n : ∀ n → n C 1 ≡ n +nC1≡n zero = refl +nC1≡n n@(suc n-1) = begin-equality + n C 1 ≡⟨ nCk≡nPk/k! (s≤s (z≤n {n-1})) ⟩ + (n P 1) / 1 ! ≡⟨ n/1≡n (n P 1) ⟩ + n P 1 ≡⟨ nP1≡n n ⟩ + n ∎ + + +------------------------------------------------------------------------ +-- Arithmetic of (n C k) + +module _ {n k} (kn, in which case 1+k>1+n>n -} +... | tri> _ _ k>n = begin-equality + n C k + n C (suc k) ≡⟨ cong (_+ (n C (suc k))) (k>n⇒nCk≡0 k>n) ⟩ + 0 + n C (suc k) ≡⟨⟩ + n C (suc k) ≡⟨ k>n⇒nCk≡0 (mn) ⟩ + 0 ≡˘⟨ k>n⇒nCk≡0 (sn) ⟩ + suc n C suc k ∎ +{- case k≡n, in which case 1+k≡1+n>n -} +... | tri≈ _ k≡n _ rewrite k≡n = begin-equality + n C n + n C (suc n) ≡⟨ cong (n C n +_) (k>n⇒nCk≡0 (n<1+n n)) ⟩ + n C n + 0 ≡⟨ +-identityʳ (n C n) ⟩ + n C n ≡⟨ nCn≡1 n ⟩ + 1 ≡˘⟨ nCn≡1 (suc n) ⟩ + suc n C suc n ∎ +{- case kn⇒m∸n≢0 k