peopleprobs/choose/choose.go
2024-02-25 16:41:00 -03:00

33 lines
795 B
Go

// Copyright 2018, Aaron Cannon under the BSD license.
// See the license file for details.
// Package choose implements the N choose K formula, or the binomial coefficient
// formula. See https://en.wikipedia.org/wiki/Binomial_coefficient for more.
package choose
// Choose calculates n choose k. Overflows are not detected, and Choose panics
// if n >= k >= 0 is violated.
func Choose(n, k int64) int64 {
if k > n {
panic("Choose: k > n")
}
if k < 0 {
panic("Choose: k < 0")
}
if n <= 1 || k == 0 || n == k {
return 1
}
if newK := n - k; newK < k {
k = newK
}
if k == 1 {
return n
}
// Our return value, and this allows us to skip the first iteration.
ret := int64(n - k + 1)
for i, j := ret+1, int64(2); j <= k; i, j = i+1, j+1 {
ret = ret * i / j
}
return ret
}