GCD、LCM、ユークリッドの互除法
約数を高速かつ正確に計算します
「GCD、LCM、ユークリッドの互除法」はCoddyKit上の無料Competitive Programming Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCompetitive Programming Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Competitive Programming Academyコースには全4レッスンが含まれています。
約数が重要な理由
コンテスト問題の多くは、2 つの数に共通する因数が鍵になります。ここで最も役立つ道具は、最大公約数である GCD です。🔢
GCD の意味
2 つの整数のGCDとは、どちらも余りなく割り切れる最大の数です。12 と 18 の GCD は 6 です。6 は両方を割り切れるからです。
遅い方法
小さい方の値から数を 1 つずつ下げ、両方を割り切れる数が見つかるまで調べることもできます。動作しますが、大きな入力には遅すぎます。
ユークリッドの着眼点
ユークリッドの互除法が高速な方法です。重要な考え方は、a と b の GCD が、b と a を b で割った余りの GCD に等しいということです。
漸化式
余りが 0 になるまで、入れ替えと mod の手順を繰り返します。最後に残る 0 でない値が答え、つまり GCD そのものです。
gcd(a, b) = gcd(b, a % b)
gcd(a, 0) = a自分でコードを書く
短いループで、b が 0 になるまで組を置き換え続けます。必要なステップ数はおよそ log で、非常に大きな数でも驚くほど高速に動作します。
def gcd(a, b):
while b:
a, b = b, a % b
return a標準ライブラリを使う
通常は自分で実装する必要はありません。Python には math.gcd が用意されており、正確で高速なうえ、引数が 0 の場合も処理してくれます。
from math import gcd
print(gcd(12, 18))GCD から LCM へ
LCM(最小公倍数)とは、両方の値で割り切れる最小の数です。これは、先ほど計算した GCD と直接つながっています。
LCM の公式
2 つの数を掛けてから、GCD で割ります。非常に大きな積でのオーバーフローを避けるため、必ず先に割ってください。
def lcm(a, b):
return a // gcd(a, b) * bリスト全体の GCD
複数の数に対して GCD を順に適用するには、2 つずつ連鎖させます。Python の reduce は、リストに対して math.gcd を左から右へ適用します。
from functools import reduce
from math import gcd
g = reduce(gcd, nums)0 の場合を扱う
定義上、gcd(a, 0) は a で、gcd(0, 0) は 0 です。この端のケースを知っておくと、空の入力でもループが誤動作しません。
確認
ユークリッドの互除法の中心となる手順を確認します。
まとめ
これで、ユークリッドの互除法を使って GCD を log ステップで計算し、そこから LCM を求め、リスト全体に対して両方を順に適用できるようになりました。✅
よくある質問
「GCD、LCM、ユークリッドの互除法」レッスンは無料ですか?
はい。「GCD、LCM、ユークリッドの互除法」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Competitive Programming Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Competitive Programming Academyコースには全4レッスンが含まれています。
「GCD、LCM、ユークリッドの互除法」で何を学びますか?
約数を高速かつ正確に計算します ブラウザで直接実行するハンズオンコードでCompetitive Programming Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Competitive Programming Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCompetitive Programming Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「GCD、LCM、ユークリッドの互除法」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCompetitive Programming Academyレッスンでコードを書いて実行できますか?
はい。すべてのCompetitive Programming Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- GCD、LCM、ユークリッドの互除法
- sqrt(n) までの素数判定
- エラトステネスのふるい
- 素因数分解と約数