- numeric[meta header]
- function template[meta id-type]
- std[meta namespace]
- cpp17[meta cpp]
- [mathjax enable]
namespace std {
template <class M, class N>
constexpr common_type_t<M, N> lcm(M m, N n);
}- common_type_t[link /reference/type_traits/common_type.md]
最小公倍数 (least common multiple) を求める。
- 型
MおよびNがbool以外の整数型であること
この要件を満たさない場合、プログラムは不適格となる |m|および|n|がcommon_type_t<M, N>の値として表現できること
この要件を満たさない場合の動作は未定義|m|と|n|の最小公倍数がcommon_type_t<M, N>の値として表現できること
この要件を満たさない場合の動作は未定義
mまたはnが 0 の場合 0 を返す- それ以外の場合引数
|m|と|n|の最小公倍数を返す
投げない。
#include <cmath>
#include <iostream>
#include <limits>
#include <numeric>
int main() {
static_assert(std::lcm(0, 1) == 0);
static_assert(std::lcm(4u, -6l) == 12);
// オーバーフローする例
auto m = std::numeric_limits<uint32_t>::max();
auto n = m - 1;
std::cout << "lcm(" << m << ", " << n << ") " << std::lcm(m, n) << std::endl;
auto g = std::gcd(m, n); // 1
std::cout << "true lcm(" << m << ", " << n << ") " << std::fabs(m) * std::fabs(n / g) << std::endl;
}- std::lcm[color ff0000]
- max[link /reference/limits/numeric_limits/max.md]
- std::fabs[link /reference/cmath/fabs.md]
lcm(4294967295, 4294967294) 2
true lcm(4294967295, 4294967294) 1.84467e+19
- C++17
- Clang: 4.0.0
- GCC: 7.1.0
- ICC: ??
- Visual C++: ??
要件 2 を満たすかどうかチェックしない。
_LIBCPP_DEBUG マクロが
0 以上の場合、要件 3 を満たさなければ abort する。
ただし 4 系では <limits> を <numeric> より先に include しなければならない。
それ以外の場合(デフォルト)、オーバーフローにより戻り値が不正になることがある。
要件 2, 3 を満たすかどうかチェックしない。 要件 3 を満たさない場合、オーバーフローにより戻り値が不正になることがある。
- WG21 N3845 Greatest Common Divisor and Least Common Multiple
- WG21 N3913 Greatest Common Divisor and Least Common Multiple, v2
- WG21 N4061 Greatest Common Divisor and Least Common Multiple, v3
- WG21 P0295R0 Adopt Selected Library Fundamentals V2 Components for C++17
- LWG Issue 2837.
gcdandlcmshould support a wider range of input values - LWG Issue 2759.
gcd/lcmandboolfor the WP