From adccfdfa41cc99f21ccf367bd44581794dfc3297 Mon Sep 17 00:00:00 2001 From: Swastika Gupta Date: Wed, 21 Jul 2021 08:54:28 +0000 Subject: [PATCH] n-bonacci --- math/n_bonacci.cpp | 98 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 math/n_bonacci.cpp diff --git a/math/n_bonacci.cpp b/math/n_bonacci.cpp new file mode 100644 index 000000000..90302131d --- /dev/null +++ b/math/n_bonacci.cpp @@ -0,0 +1,98 @@ +/** + * @file + * @brief Implementation of the [N-bonacci](http://oeis.org/wiki/N-bonacci_numbers) series + * + * @details + * In general, in N-bonacci sequence, + * we generate sum of preceding N numbers from the next term. + * + * For example, a 3-bonacci sequence is the following: + * 0, 0, 1, 1, 2, 4, 7, 13, 24, 44, 81 + * In this code we take N and M as input where M is the number of terms + * to be printed of the N-bonacci series + * + * @author [Swastika Gupta](https://github.com/swastyy) + */ +#include /// for std::is_equal, std::swap +#include /// for assert +#include /// for IO operations +#include /// for std::vector + +/** + * @namespace math + * @brief Mathematical algorithms + */ +namespace math { +/** + * @namespace n_bonacci + * @brief Functions for the [N-bonacci](http://oeis.org/wiki/N-bonacci_numbers) + * implementation + */ +namespace n_bonacci { +/** + * @brief Finds the N-Bonacci series for the `n` parameter value and `m` parameter terms. + * @param n is in the N-Bonacci series + * @param m is the number of terms in the N-Bonacci sequence + * @returns the n-bonacci sequence as vector array + */ +std::vector N_bonacci(int n, unsigned int m) { + std::vector a(m, 0); // we create an empty array of size m + + a[n - 1] = 1; /// we initialise the (n-1)th term as 1 which is the sum of preceding N zeros + a[n] = 1; /// similarily the sum of preceding N zeros and the (N+1)th 1 is also 1 + for (int i = n + 1; i < m; i++) { + // this is an optimized solution that works in O(M) time and takes O(M) extra space here we use the concept of the sliding window the current + // term can be computed using the given formula + a[i] = 2 * a[i - 1] - a[i - 1 - n]; + } + return a; +} +} // namespace n_bonacci +} // namespace math + +/** + * @brief Self-test implementations + * @returns void + */ +static void test() { + // n = 1 m = 1 return [1, 1] + std::cout << "1st test"; + std::vector arr1 = math::n_bonacci::N_bonacci(1, 1); // first input is the param n and second one is the param m for N-bonacci func + std::vector output_array1 = {1, 1}; // It is the expected output series of length m + assert(std::equal(std::begin(arr1), std::end(arr1), + std::begin(output_array1))); + std::cout << "passed" << std::endl; + + // n = 5 m = 15 return [0, 0, 0, 0, 1, 1, 2, 4, 8, 16, 31, 61, 120, 236, 464] + std::cout << "2nd test"; + std::vector arr2 = math::n_bonacci::N_bonacci(5, 15); // first input is the param n and second one is the param m for N-bonacci func + std::vector output_array2 = {0, 0, 0, 0, 1, 1, 2, 4, 8, 16, 31, 61, 120, 236, 464}; // It is the expected output series of length m + assert(std::equal(std::begin(arr2), std::end(arr2), + std::begin(output_array2))); + std::cout << "passed" << std::endl; + + // n = 6 m = 17 return [0, 0, 0, 0, 0, 1, 1, 2, 4, 8, 16, 32, 63, 125, 248, 492, 976] + std::cout << "3rd test"; + std::vector arr3 = math::n_bonacci::N_bonacci(6, 17); // first input is the param n and second one is the param m for N-bonacci func + std::vector output_array3 = {0, 0, 0, 0, 0, 1, 1, 2, 4, 8, 16, 32, 63, 125, 248, 492, 976}; // It is the expected output series of length m + assert(std::equal(std::begin(arr3), std::end(arr3), + std::begin(output_array3))); + std::cout << "passed" << std::endl; + + // n = 56 m = 15 return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + std::cout << "4th test"; + std::vector arr4 = math::n_bonacci::N_bonacci(56, 15); // first input is the param n and second one is the param m for N-bonacci func + std::vector output_array4 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // It is the expected output series of length m + assert(std::equal(std::begin(arr4), std::end(arr4), + std::begin(output_array4))); + std::cout << "passed" << std::endl; +} + +/** + * @brief Main function + * @returns 0 on exit + */ +int main() { + test(); // run self-test implementations + return 0; +} \ No newline at end of file