peroxide/statistics/
ops.rs

1/// Factorial
2///
3/// # Type
4/// : `usize -> usize`
5///
6/// # Usage
7///
8/// ```
9/// extern crate peroxide;
10/// use peroxide::fuga::*;
11///
12/// assert_eq!(factorial(5), 120);
13/// ```
14pub fn factorial(n: usize) -> usize {
15    let mut p = 1usize;
16    for i in 1..(n + 1) {
17        p *= i;
18    }
19    p
20}
21
22/// Double Factorial
23///
24/// # Type
25/// : `usize -> usize`
26///
27/// # Usage
28///
29/// ```
30/// extern crate peroxide;
31/// use peroxide::fuga::*;
32///
33/// assert_eq!(double_factorial(7), 105);
34/// ```
35pub fn double_factorial(n: usize) -> usize {
36    let mut s = 1usize;
37    let mut n = n;
38    while n >= 2 {
39        s *= n;
40        n -= 2;
41    }
42    s
43}
44
45/// Permutation
46///
47/// # Usage
48///
49/// ```
50/// extern crate peroxide;
51/// use peroxide::fuga::*;
52///
53/// assert_eq!(P(5,3), 60);
54/// ```
55#[allow(non_snake_case)]
56pub fn P(n: usize, r: usize) -> usize {
57    let mut p = 1usize;
58    for i in 0..r {
59        p *= n - i;
60    }
61    p
62}
63
64/// Combination
65///
66/// # Usage
67///
68/// ```
69/// extern crate peroxide;
70/// use peroxide::fuga::*;
71///
72/// assert_eq!(C(10, 9), 10);
73/// ```
74#[allow(non_snake_case)]
75pub fn C(n: usize, r: usize) -> usize {
76    if r > n / 2 {
77        return C(n, n - r);
78    }
79
80    P(n, r) / factorial(r)
81}
82
83/// Combination with Repetition
84///
85/// # Usage
86///
87/// ```
88/// extern crate peroxide;
89/// use peroxide::fuga::*;
90///
91/// assert_eq!(H(5,3), C(7,3));
92/// ```
93#[allow(non_snake_case)]
94pub fn H(n: usize, r: usize) -> usize {
95    C(n + r - 1, r)
96}