RosettaCodeData/Task/Combinations-and-permutations/Sidef/combinations-and-permutations.sidef

46 lines
919 B
Text
Raw Permalink Normal View History

2017-09-23 10:01:46 +02:00
func P(n, k) { n! / ((n-k)!) }
func C(n, k) { binomial(n, k) }
2016-12-05 23:44:36 +01:00
class Logarithm(value) {
method to_s {
2017-09-23 10:01:46 +02:00
var e = int(value/10.log)
"%.8fE%+d" % (exp(value - e*10.log), e)
2016-12-05 23:44:36 +01:00
}
}
func lstirling(n) {
2017-09-23 10:01:46 +02:00
n < 10 ? (lstirling(n+1) - log(n+1))
 : (0.5*log(2*Num.pi*n) + n*log(n/Num.e + 1/(12*Num.e*n)))
2016-12-05 23:44:36 +01:00
}
func P_approx(n, k) {
Logarithm((lstirling(n) - lstirling(n -k)))
}
func C_approx(n, k) {
Logarithm((lstirling(n) - lstirling(n -k) - lstirling(k)))
}
2017-09-23 10:01:46 +02:00
say "=> Exact results:"
for n (1..12) {
var p = n//3
say "P(#{n}, #{p}) = #{P(n, p)}"
2016-12-05 23:44:36 +01:00
}
2017-09-23 10:01:46 +02:00
for n (10..60 `by` 10) {
var p = n//3
say "C(#{n}, #{p}) = #{C(n, p)}"
2016-12-05 23:44:36 +01:00
}
say '';
2017-09-23 10:01:46 +02:00
say "=> Floating point approximations:"
for n ([5, 50, 500, 1000, 5000, 15000]) {
var p = n//3
say "P(#{n}, #{p}) = #{P_approx(n, p)}"
2016-12-05 23:44:36 +01:00
}
2017-09-23 10:01:46 +02:00
for n (100..1000 `by` 100) {
var p = n//3
say "C(#{n}, #{p}) = #{C_approx(n, p)}"
2016-12-05 23:44:36 +01:00
}