aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-02-05 11:47:30 -0500
committerSam Anthony <sam@samanthony.xyz>2024-02-05 11:47:30 -0500
commit288101b54b0234ffb679ad6f91b93ac7c1309e84 (patch)
treea718fc26a1b073b47b8609815b8da28f21058de5
parent8f62185202f18d969c6db0725e7024ad93d34564 (diff)
downloadpfc-288101b54b0234ffb679ad6f91b93ac7c1309e84.zip
add combination (n choose k) function
-rw-r--r--func.go32
1 files changed, 32 insertions, 0 deletions
diff --git a/func.go b/func.go
index 039cb4f..bc8a0bc 100644
--- a/func.go
+++ b/func.go
@@ -18,6 +18,8 @@ func parseFunction(fn string) func(*Calculator) {
return rad
case "fac":
return fac
+ case "ch": // choose
+ return combination
}
return nil
}
@@ -98,6 +100,36 @@ func fac(c *Calculator) {
c.stack.push(float64(factorial(uint(n))))
}
+// Combination function. "n choose k" with integers n and k such that n >= k >= 0.
+func combination(c *Calculator) {
+ k, err := c.stack.pop()
+ if err != nil {
+ return
+ }
+ if !isUint(k) { // undefined on non-ints
+ c.stack.push(k)
+ return
+ }
+
+ n, err := c.stack.pop()
+ if err != nil {
+ c.stack.push(k)
+ return
+ }
+ if !isUint(n) { // undefined on non-ints
+ c.stack.push(n)
+ return
+ }
+
+ if k > n || n < 0 || k < 0 {
+ c.stack.push(n)
+ c.stack.push(k)
+ } else {
+ n, k := uint(n), uint(k)
+ c.stack.push(float64(factorial(n) / (factorial(k) * factorial(n-k))))
+ }
+}
+
func degToRad(deg float64) (rad float64) {
return deg * math.Pi / 180.0
}