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}