cp-library

C++ Library for Competitive Programming

View the Project on GitHub emthrm/cp-library

:heavy_check_mark: 拡張 Euclid の互除法 (extended Euclidean algorithm)
(include/emthrm/math/ext_gcd.hpp)

$ax + by = \gcd(a, b)$ を満たす整数解 $(x, y)$ を求めるアルゴリズムである。

$ax + by = c \cdot \mathrm{gcd}(a, b)$ の特殊解を $(x, y) = (x^{\prime}, y^{\prime})$ とすると、一般解は $k \in \mathrm{Z}$ を用いて $(x, y) = \left(x^{\prime} + k \frac{b}{\mathrm{gcd}(a, b)}, y^{\prime} - k \frac{a}{\mathrm{gcd}(a, b)}\right)$ と表せる。

時間計算量

$O(\log{\max \lbrace A, B \rbrace})$

仕様

名前 戻り値 備考
template <typename T>
std::pair<T, T> ext_gcd(T a, T b);
$ax + by = \gcd(a, b)$ を満たす整数解 $(x, y)$ $a \neq 0,\ b \neq 0$ のとき $\lvert x \rvert \leq \left\lvert \frac{b}{\mathrm{gcd}(a, b)} \right\rvert,\ \lvert y \rvert \leq \left\lvert \frac{a}{\mathrm{gcd}(a, b)} \right\rvert$ が成り立つ。

参考文献

Submissons

https://onlinejudge.u-aizu.ac.jp/solutions/problem/NTL_1_E/review/5272349/emthrm/C++17

Verified with

Code

#ifndef EMTHRM_MATH_EXT_GCD_HPP_
#define EMTHRM_MATH_EXT_GCD_HPP_

#include <tuple>
#include <utility>

namespace emthrm {

template <typename T>
std::pair<T, T> ext_gcd(T a, T b) {
  T x = 1, y = 0;
  for (T u = 0, v = 1; b;) {
    const T q = a / b;
    std::swap(a -= q * b, b);
    std::swap(x -= q * u, u);
    std::swap(y -= q * v, v);
  }
  return a < 0 ? std::make_pair(-x, -y) : std::make_pair(x, y);
}

}  // namespace emthrm

#endif  // EMTHRM_MATH_EXT_GCD_HPP_
#line 1 "include/emthrm/math/ext_gcd.hpp"



#include <tuple>
#include <utility>

namespace emthrm {

template <typename T>
std::pair<T, T> ext_gcd(T a, T b) {
  T x = 1, y = 0;
  for (T u = 0, v = 1; b;) {
    const T q = a / b;
    std::swap(a -= q * b, b);
    std::swap(x -= q * u, u);
    std::swap(y -= q * v, v);
  }
  return a < 0 ? std::make_pair(-x, -y) : std::make_pair(x, y);
}

}  // namespace emthrm
Back to top page