Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/numeric/lcm"

From cppreference.com
< cpp‎ | numeric
m (Notes: ~FTM)
m (reorder.)
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
{{cpp/title|lcm}}
 
{{cpp/title|lcm}}
 
{{cpp/numeric/navbar}}
 
{{cpp/numeric/navbar}}
{{dcl begin}}
+
{{ddcl|header=numeric|since=c++17|
{{dcl header|numeric}}
+
{{dcl|since=c++17|
+
 
template< class M, class N >
 
template< class M, class N >
 
constexpr std::common_type_t<M, N> lcm( M m, N n );
 
constexpr std::common_type_t<M, N> lcm( M m, N n );
 
}}
 
}}
{{dcl end}}
 
  
Computes the least common multiple of the integers {{c|m}} and {{c|n}}.
+
Computes the {{enwiki|least common multiple}} of the integers {{c|m}} and {{c|n}}.
  
=== Parameters ===
+
If either {{tt|M}} or {{tt|N}} is not an integer type, or if either is (possibly cv-qualified) {{c|bool}}, the program is ill-formed.
 +
 
 +
The behavior is undefined if {{c|{{!}}m{{!}}}}, {{c|{{!}}n{{!}}}}, or the least common multiple of {{c|{{!}}m{{!}}}} and {{c|{{!}}n{{!}}}} is not representable as a value of type {{c|std::common_type_t<M, N>}}.
 +
 
 +
===Parameters===
 
{{par begin}}
 
{{par begin}}
 
{{par|m, n|integer values}}
 
{{par|m, n|integer values}}
Line 19: Line 20:
 
If either {{c|m}} or {{c|n}} is zero, returns zero. Otherwise, returns the least common multiple of {{c|{{!}}m{{!}}}} and {{c|{{!}}n{{!}}}}.
 
If either {{c|m}} or {{c|n}} is zero, returns zero. Otherwise, returns the least common multiple of {{c|{{!}}m{{!}}}} and {{c|{{!}}n{{!}}}}.
  
=== Remarks ===
+
===Exceptions===
If either {{tt|M}} or {{tt|N}} is not an integer type, or if either is (possibly cv-qualified) {{c|bool}}, the program is ill-formed.
+
 
+
The behavior is undefined if {{c|{{!}}m{{!}}}}, {{c|{{!}}n{{!}}}}, or the least common multiple of {{c|{{!}}m{{!}}}} and {{c|{{!}}n{{!}}}} is not representable as a value of type {{c|std::common_type_t<M, N>}}.
+
 
+
=== Exceptions ===
+
 
Throws no exceptions.
 
Throws no exceptions.
  
Line 30: Line 26:
 
{{feature test macro|__cpp_lib_gcd_lcm|{{lc|std::gcd}}, {{tt|std::lcm}}|value=201606L|std=C++17}}
 
{{feature test macro|__cpp_lib_gcd_lcm|{{lc|std::gcd}}, {{tt|std::lcm}}|value=201606L|std=C++17}}
  
=== Example ===
+
===Example===
 
{{example|code=
 
{{example|code=
 
#include <iostream>
 
#include <iostream>
Line 37: Line 33:
 
#define OUT(...) std::cout << #__VA_ARGS__ << " = " << __VA_ARGS__ << '\n'
 
#define OUT(...) std::cout << #__VA_ARGS__ << " = " << __VA_ARGS__ << '\n'
  
constexpr auto lcm(auto x, auto y)
+
constexpr auto lcm(auto x, auto... xs)
 
{
 
{
     return std::lcm(x, y);
+
     return ((x = std::lcm(x, xs)), ...);
}
+
 
+
constexpr auto lcm(auto head, auto...tail)
+
{
+
    return std::lcm(head, lcm(tail...));
+
 
}
 
}
  
Line 54: Line 45:
 
     static_assert(225 == std::lcm(45, 75));
 
     static_assert(225 == std::lcm(45, 75));
  
     OUT(lcm(2*3, 3*4, 4*5));
+
    static_assert(std::lcm( 6,  10) == 30);
     OUT(lcm(2*3*4, 3*4*5, 4*5*6));
+
    static_assert(std::lcm( 6, -10) == 30);
     OUT(lcm(2*3*4, 3*4*5, 4*5*6, 5*6*7));
+
    static_assert(std::lcm(-6, -10) == 30);
 +
 
 +
    static_assert(std::lcm( 24, 0) == 0);
 +
    static_assert(std::lcm(-24, 0) == 0);
 +
 
 +
     OUT(lcm(2 * 3, 3 * 4, 4 * 5));
 +
     OUT(lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6));
 +
     OUT(lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6, 5 * 6 * 7));
 
}
 
}
 
|output=
 
|output=
lcm(2*3, 3*4, 4*5) = 60
+
lcm(2 * 3, 3 * 4, 4 * 5) = 60
lcm(2*3*4, 3*4*5, 4*5*6) = 120
+
lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6) = 120
lcm(2*3*4, 3*4*5, 4*5*6, 5*6*7) = 840
+
lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6, 5 * 6 * 7) = 840
 
}}
 
}}
  
=== See also ===
+
===See also===
 
{{dsc begin}}
 
{{dsc begin}}
 
{{dsc inc|cpp/numeric/dsc gcd}}
 
{{dsc inc|cpp/numeric/dsc gcd}}
{{dsc end }}
+
{{dsc end}}
  
 
{{langlinks|de|es|ja|ru|zh}}
 
{{langlinks|de|es|ja|ru|zh}}

Latest revision as of 06:31, 14 November 2023

 
 
 
Defined in header <numeric>
template< class M, class N >
constexpr std::common_type_t<M, N> lcm( M m, N n );
(since C++17)

Computes the least common multiple of the integers m and n.

If either M or N is not an integer type, or if either is (possibly cv-qualified) bool, the program is ill-formed.

The behavior is undefined if |m|, |n|, or the least common multiple of |m| and |n| is not representable as a value of type std::common_type_t<M, N>.

Contents

[edit] Parameters

m, n - integer values

[edit] Return value

If either m or n is zero, returns zero. Otherwise, returns the least common multiple of |m| and |n|.

[edit] Exceptions

Throws no exceptions.

[edit] Notes

Feature-test macro Value Std Feature
__cpp_lib_gcd_lcm 201606L (C++17) std::gcd, std::lcm

[edit] Example

#include <iostream>
#include <numeric>
 
#define OUT(...) std::cout << #__VA_ARGS__ << " = " << __VA_ARGS__ << '\n'
 
constexpr auto lcm(auto x, auto... xs)
{
    return ((x = std::lcm(x, xs)), ...);
}
 
int main()
{
    constexpr int p{2 * 2 * 3};
    constexpr int q{2 * 3 * 3};
    static_assert(2 * 2 * 3 * 3 == std::lcm(p, q));
    static_assert(225 == std::lcm(45, 75));
 
    static_assert(std::lcm( 6,  10) == 30);
    static_assert(std::lcm( 6, -10) == 30);
    static_assert(std::lcm(-6, -10) == 30);
 
    static_assert(std::lcm( 24, 0) == 0);
    static_assert(std::lcm(-24, 0) == 0);
 
    OUT(lcm(2 * 3, 3 * 4, 4 * 5));
    OUT(lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6));
    OUT(lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6, 5 * 6 * 7));
}

Output:

lcm(2 * 3, 3 * 4, 4 * 5) = 60
lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6) = 120
lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6, 5 * 6 * 7) = 840

[edit] See also

(C++17)
computes the greatest common divisor of two integers
(function template) [edit]