1/**
2 * One-sided binomial tail: the probability of getting at least k correct out
3 * of n trials by guessing (p = 1/2 per trial). Computed in log space so it
4 * stays finite for large n.
5 */
6export function binomialTailP(k: number, n: number): number {
7 if (n <= 0) return 1
8 if (k <= 0) return 1
9 let logTerm = -n * Math.LN2 // log C(n,0) 0.5^n
10 let cum = 0
11 for (let i = 0; i <= n; i++) {
12 if (i >= k) cum += Math.exp(logTerm)
13 if (i < n) logTerm += Math.log(n - i) - Math.log(i + 1)
14 }
15 return Math.min(1, cum)
16}
18export function formatP(p: number): string {
19 if (p >= 0.01) return p.toFixed(2)
20 if (p >= 1e-4) return p.toFixed(4)
21 return p.toExponential(1)
22}