mirror of
https://github.com/TheAlgorithms/C-Plus-Plus.git
synced 2026-04-04 19:20:17 +08:00
feat: Add ncr mod p code (#1325)
* feat: Add ncr mod p code (#1323) * Update math/ncr_modulo_p.cpp Co-authored-by: David Leal <halfpacho@gmail.com> * Added all functions inside a class + added more asserts * updating DIRECTORY.md * clang-format and clang-tidy fixes forf6df24a5* Replace int64_t to uint64_t + add namespace + detailed documentation * clang-format and clang-tidy fixes fore09a0579* Add extra namespace + add const& in function arguments * clang-format and clang-tidy fixes for8111f881* Update ncr_modulo_p.cpp * clang-format and clang-tidy fixes for2ad2f721* Update math/ncr_modulo_p.cpp Co-authored-by: David Leal <halfpacho@gmail.com> * Update math/ncr_modulo_p.cpp Co-authored-by: David Leal <halfpacho@gmail.com> * Update math/ncr_modulo_p.cpp Co-authored-by: David Leal <halfpacho@gmail.com> * clang-format and clang-tidy fixes for5b69ba5c* updating DIRECTORY.md * clang-format and clang-tidy fixes fora8401d4bCo-authored-by: David Leal <halfpacho@gmail.com> Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
This commit is contained in:
@@ -21,75 +21,76 @@
|
||||
* @brief Mathematical algorithms
|
||||
*/
|
||||
namespace math {
|
||||
/**
|
||||
* @namespace fibonacci_sum
|
||||
* @brief Functions for the sum of the Fibonacci Sequence: \f$\mathrm{F}(n) +
|
||||
* \mathrm{F}(n+1) + .. + \mathrm{F}(m)\f$
|
||||
*/
|
||||
namespace fibonacci_sum {
|
||||
using matrix = std::vector<std::vector<uint64_t> >;
|
||||
/**
|
||||
* @namespace fibonacci_sum
|
||||
* @brief Functions for the sum of the Fibonacci Sequence: \f$\mathrm{F}(n) +
|
||||
* \mathrm{F}(n+1) + .. + \mathrm{F}(m)\f$
|
||||
*/
|
||||
namespace fibonacci_sum {
|
||||
using matrix = std::vector<std::vector<uint64_t> >;
|
||||
|
||||
/**
|
||||
* Function to multiply two matrices
|
||||
* @param T matrix 1
|
||||
* @param A martix 2
|
||||
* @returns resultant matrix
|
||||
*/
|
||||
math::fibonacci_sum::matrix multiply(const math::fibonacci_sum::matrix &T, const math::fibonacci_sum::matrix &A) {
|
||||
math::fibonacci_sum::matrix result(2, std::vector<uint64_t>(2, 0));
|
||||
/**
|
||||
* Function to multiply two matrices
|
||||
* @param T matrix 1
|
||||
* @param A martix 2
|
||||
* @returns resultant matrix
|
||||
*/
|
||||
math::fibonacci_sum::matrix multiply(const math::fibonacci_sum::matrix &T,
|
||||
const math::fibonacci_sum::matrix &A) {
|
||||
math::fibonacci_sum::matrix result(2, std::vector<uint64_t>(2, 0));
|
||||
|
||||
// multiplying matrices
|
||||
result[0][0] = T[0][0]*A[0][0] + T[0][1]*A[1][0];
|
||||
result[0][1] = T[0][0]*A[0][1] + T[0][1]*A[1][1];
|
||||
result[1][0] = T[1][0]*A[0][0] + T[1][1]*A[1][0];
|
||||
result[1][1] = T[1][0]*A[0][1] + T[1][1]*A[1][1];
|
||||
// multiplying matrices
|
||||
result[0][0] = T[0][0] * A[0][0] + T[0][1] * A[1][0];
|
||||
result[0][1] = T[0][0] * A[0][1] + T[0][1] * A[1][1];
|
||||
result[1][0] = T[1][0] * A[0][0] + T[1][1] * A[1][0];
|
||||
result[1][1] = T[1][0] * A[0][1] + T[1][1] * A[1][1];
|
||||
|
||||
return result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to compute A^n where A is a matrix.
|
||||
* @param T matrix
|
||||
* @param ex power
|
||||
* @returns resultant matrix
|
||||
*/
|
||||
math::fibonacci_sum::matrix power(math::fibonacci_sum::matrix T, uint64_t ex) {
|
||||
math::fibonacci_sum::matrix A{{1, 1}, {1, 0}};
|
||||
if (ex == 0 || ex == 1) {
|
||||
return T;
|
||||
}
|
||||
/**
|
||||
* Function to compute A^n where A is a matrix.
|
||||
* @param T matrix
|
||||
* @param ex power
|
||||
* @returns resultant matrix
|
||||
*/
|
||||
math::fibonacci_sum::matrix power(math::fibonacci_sum::matrix T, uint64_t ex) {
|
||||
math::fibonacci_sum::matrix A{{1, 1}, {1, 0}};
|
||||
if (ex == 0 || ex == 1) {
|
||||
return T;
|
||||
}
|
||||
|
||||
T = power(T, ex / 2);
|
||||
T = multiply(T, T);
|
||||
if (ex & 1) {
|
||||
T = multiply(T, A);
|
||||
}
|
||||
return T;
|
||||
}
|
||||
T = power(T, ex / 2);
|
||||
T = multiply(T, T);
|
||||
if (ex & 1) {
|
||||
T = multiply(T, A);
|
||||
}
|
||||
return T;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to compute sum of fibonacci sequence from 0 to n.
|
||||
* @param n number
|
||||
* @returns uint64_t ans, the sum of sequence
|
||||
*/
|
||||
uint64_t result(uint64_t n) {
|
||||
math::fibonacci_sum::matrix T{{1, 1}, {1, 0}};
|
||||
T = power(T, n);
|
||||
uint64_t ans = T[0][1];
|
||||
ans = (ans - 1);
|
||||
return ans;
|
||||
}
|
||||
/**
|
||||
* Function to compute sum of fibonacci sequence from 0 to n.
|
||||
* @param n number
|
||||
* @returns uint64_t ans, the sum of sequence
|
||||
*/
|
||||
uint64_t result(uint64_t n) {
|
||||
math::fibonacci_sum::matrix T{{1, 1}, {1, 0}};
|
||||
T = power(T, n);
|
||||
uint64_t ans = T[0][1];
|
||||
ans = (ans - 1);
|
||||
return ans;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to compute sum of fibonacci sequence from n to m.
|
||||
* @param n start of sequence
|
||||
* @param m end of sequence
|
||||
* @returns uint64_t the sum of sequence
|
||||
*/
|
||||
uint64_t fiboSum(uint64_t n, uint64_t m) {
|
||||
return (result(m + 2) - result(n + 1));
|
||||
}
|
||||
} // namespace fibonacci_sum
|
||||
/**
|
||||
* Function to compute sum of fibonacci sequence from n to m.
|
||||
* @param n start of sequence
|
||||
* @param m end of sequence
|
||||
* @returns uint64_t the sum of sequence
|
||||
*/
|
||||
uint64_t fiboSum(uint64_t n, uint64_t m) {
|
||||
return (result(m + 2) - result(n + 1));
|
||||
}
|
||||
} // namespace fibonacci_sum
|
||||
} // namespace math
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user