works for n = 0..61 for all k
| 260 | |
| 261 | // works for n = 0..61 for all k |
| 262 | uint64_t combinations64(uint16_t n, uint16_t k) |
| 263 | { |
| 264 | if ((k == 0) || (k == n)) return 1; |
| 265 | if (k < (n-k)) k = n - k; // symmetry |
| 266 | uint64_t rv = n; |
| 267 | uint8_t p = 2; |
| 268 | for (uint8_t i = n-1; i > k; i--) |
| 269 | { |
| 270 | // overflow detect here ? |
| 271 | rv = (rv * i) / p; |
| 272 | p++; |
| 273 | } |
| 274 | return rv; |
| 275 | } |
| 276 | |
| 277 | |
| 278 | // experimental - not exact but allows large values |