From 3ef8a09e20d8ab33d3b87d63be0ffa2c34fb427a Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 21 Mar 2009 01:34:31 +0000 Subject: (svn r15777) -Add: helper functions to get the least common multiple and the greatest common divisor (Alberth) --- src/core/math_func.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/core/math_func.hpp | 3 +++ 2 files changed, 44 insertions(+) create mode 100644 src/core/math_func.cpp (limited to 'src/core') diff --git a/src/core/math_func.cpp b/src/core/math_func.cpp new file mode 100644 index 000000000..360ec0ec5 --- /dev/null +++ b/src/core/math_func.cpp @@ -0,0 +1,41 @@ +/* $Id$ */ + +/** @file math_func.cpp Math functions. */ + +#include "../stdafx.h" +#include "math_func.hpp" + +/** + * Compute least common multiple (lcm) of arguments \a a and \a b, the smallest + * integer value that is a multiple of both \a a and \a b. + * @param a First number. + * @param b second number. + * @return Least common multiple of values \a a and \a b. + * + * @note This function only works for non-negative values of \a a and \a b. + */ +int LeastCommonMultiple(int a, int b) +{ + if (a == 0 || b == 0) return 0; // By definition. + if (a == 1 || a == b) return b; + if (b == 1) return a; + + return a * b / GreatestCommonDivisor(a, b); +} + +/** + * Compute greatest common divisor (gcd) of \a a and \a b. + * @param a First number. + * @param b second number. + * @return Greatest common divisor of \a a and \a b. + */ +int GreatestCommonDivisor(int a, int b) +{ + while (b != 0) { + int t = b; + b = a % b; + a = t; + } + return a; + +} diff --git a/src/core/math_func.hpp b/src/core/math_func.hpp index 6a0f5c17a..35e660d88 100644 --- a/src/core/math_func.hpp +++ b/src/core/math_func.hpp @@ -264,4 +264,7 @@ static FORCEINLINE void Swap(T &a, T &b) b = t; } +int LeastCommonMultiple(int a, int b); +int GreatestCommonDivisor(int a, int b); + #endif /* MATH_FUNC_HPP */ -- cgit v1.2.3-54-g00ecf