pub trait Factorial {
fn h_factorial(&self) -> u64;
}
impl<T> Factorial for T
where
T: Copy + Into<u64>,
{
fn h_factorial(&self) -> u64 {
let mut result: u64 = 1;
for i in 1..=(*self).into() as u64 {
result *= i;
}
result
}
}
pub trait RootDegree {
fn h_root_degree(&self, degree: u32) -> f64;
}
impl<T> RootDegree for T
where
T: Copy + Into<f64>,
{
fn h_root_degree(&self, degree: u32) -> f64 {
(*self).into().powf(1.0 / degree as f64)
}
}
pub fn h_sigma<T>(start: T, repetitions: u32, steps: T) -> f64
where
T: Copy + Into<f64>,
{
let mut i: f64 = start.into();
let mut sum: f64 = 0.0;
for _ in 1..=repetitions {
sum += i;
i += steps.into();
}
sum
}
pub fn h_arrange_vec_exclusive<I>(start: I, stop: I, step: I) -> Vec<f64>
where
I: Copy + Into<f64>,
{
let mut s = start.into();
let end = stop.into();
let step = step.into();
if step == 0.0 {
return vec![];
}
if (s < end && step < 0.0) || (s > end && step > 0.0) {
return vec![];
}
let mut v = Vec::new();
if step > 0.0 {
while s < end {
v.push(s);
s += step;
}
} else {
while s > end {
v.push(s);
s += step;
}
}
v
}
pub fn h_arrange_vec_inclusive<I>(start: I, stop: I, step: I) -> Vec<f64>
where
I: Copy + Into<f64>,
{
let mut s = start.into();
let end = stop.into();
let step = step.into();
if step == 0.0 {
return vec![];
}
if (s < end && step < 0.0) || (s > end && step > 0.0) {
return vec![];
}
let mut v = Vec::new();
if step > 0.0 {
while s <= end {
v.push(s);
s += step;
}
} else {
while s >= end {
v.push(s);
s += step;
}
}
v
}
pub fn h_pi() -> f64 {
return std::f64::consts::PI;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_factorial() {
assert_eq!(5u32.h_factorial(), 120);
assert_eq!(0u32.h_factorial(), 1);
assert_eq!(1u32.h_factorial(), 1);
}
#[test]
fn test_root_degree() {
assert_eq!(16.0.h_root_degree(2), 4.0);
assert_eq!(27.0.h_root_degree(3), 3.0);
assert_eq!(8.0.h_root_degree(3), 2.0);
}
#[test]
fn test_h_sigma() {
assert_eq!(h_sigma(1.0, 5, 1.0), 15.0);
assert_eq!(h_sigma(2.0, 3, 2.0), 12.0);
}
#[test]
fn test_h_arrange_vec_exclusive() {
assert_eq!(h_arrange_vec_exclusive(1.0, 5.0, 1.0), vec![1.0, 2.0, 3.0, 4.0]);
assert_eq!(h_arrange_vec_exclusive(5.0, 1.0, -1.0), vec![5.0, 4.0, 3.0, 2.0]);
assert_eq!(h_arrange_vec_exclusive(1.0, 1.0, 1.0), vec![]);
}
#[test]
fn test_h_arrange_vec_inclusive() {
assert_eq!(h_arrange_vec_inclusive(1.0, 5.0, 1.0), vec![1.0, 2.0, 3.0, 4.0, 5.0]);
assert_eq!(h_arrange_vec_inclusive(5.0, 1.0, -1.0), vec![5.0, 4.0, 3.0, 2.0, 1.0]);
assert_eq!(h_arrange_vec_inclusive(1.0, 1.0, 1.0), vec![1.0]);
}
#[test]
fn test_h_pi() {
assert!((h_pi() - 3.141592653589793).abs() < 1e-10);
}
}