最大公約数とユークリッドの互除法

2つの整数を割り切る最大の整数を探します。大きい方を余りに置き換えても公約数は変わりません。

言語:Python / 計算量:O(log min(A,B)) 回程度の除算

前提:繰り返しを1周ずつ追う

考え方

  1. a=bq+r と書けるので、a,bの公約数はb,rも割り切ります。
  2. rが0になるまで繰り返します。
  3. 最小公倍数は a//gcd(a,b)*b(正整数の場合)。

具体例

gcd(18,12): (18,12)→(12,6)→(6,0)。答えは6です。

実装

from math import gcd
a,b=18,12
print(gcd(a,b))
print(a//gcd(a,b)*b)

注意する条件

先にa*bを計算すると固定幅整数ではあふれることがあります。0を含む最小公倍数は別途定義を確認します。

確認問題

gcd(24,18) は?

解答と理由

6

24=18+6、18=6×3なので最大公約数は6。

実装課題

正整数 A B(各≤10^12)の最小公倍数を求める。

入力:
6 8
出力:
24
参考実装
from math import gcd
a,b=map(int,input().split())
print(a//gcd(a,b)*b)

読了の記録・下書き・メモへ