From 7ec4785a5ae6ce18bfb5b6eb993d7c222208108a Mon Sep 17 00:00:00 2001 From: Harsh Kumar <61012869+cyrixninja@users.noreply.github.com> Date: Sun, 29 Oct 2023 01:58:55 +0530 Subject: [PATCH] Add Geometric Series (#595) --- src/math/geometric_series.rs | 56 ++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/math/geometric_series.rs diff --git a/src/math/geometric_series.rs b/src/math/geometric_series.rs new file mode 100644 index 00000000000..d2900768726 --- /dev/null +++ b/src/math/geometric_series.rs @@ -0,0 +1,56 @@ +// Author : cyrixninja +// Wikipedia : https://en.wikipedia.org/wiki/Geometric_series +// Calculate a geometric series. + +fn geometric_series(nth_term: f64, start_term_a: f64, common_ratio_r: f64) -> Vec { + let mut series = Vec::new(); + let mut multiple = 1.0; + + for _ in 0..(nth_term as i32) { + series.push(start_term_a * multiple); + multiple *= common_ratio_r; + } + + series +} + + +#[cfg(test)] +mod tests { + use super::*; + + fn assert_approx_eq(a: f64, b: f64) { + let epsilon = 1e-10; + assert!( + (a - b).abs() < epsilon, + "Expected {}, found {}", + a, + b + ); + } + + #[test] + fn test_geometric_series() { + let result = geometric_series(4.0, 2.0, 2.0); + assert_eq!(result.len(), 4); + assert_approx_eq(result[0], 2.0); + assert_approx_eq(result[1], 4.0); + assert_approx_eq(result[2], 8.0); + assert_approx_eq(result[3], 16.0); + + let result = geometric_series(4.1, 2.1, 2.1); + assert_eq!(result.len(), 4); + assert_approx_eq(result[0], 2.1); + assert_approx_eq(result[1], 4.41); + assert_approx_eq(result[2], 9.261); + assert_approx_eq(result[3], 19.4481); + + let result = geometric_series(4.0, -2.0, 2.0); + assert_eq!(result.len(), 4); + assert_approx_eq(result[0], -2.0); + assert_approx_eq(result[1], -4.0); + assert_approx_eq(result[2], -8.0); + assert_approx_eq(result[3], -16.0); + + } +}