NumPyで最大公約数・最小公倍数を高速算出!gcd, lcmの活用術
数値計算やデータ分析を行う際、2つ以上の整数の**最大公約数(GCD: Greatest Common Divisor)や最小公倍数(LCM: Least Common Multiple)**を求める必要が出てくることがあります。NumPyは、これらの計算を効率的に行うための便利な関数を提供しています。この記事では、NumPyのnp.gcd()関数とnp.lcm()関数を使って、整数配列の最大公約数と最小公倍数を算出する方法について、具体的なサンプルコードを交えながら詳しく解説します。
最大公約数(GCD)とは?
**最大公約数(Greatest Common Divisor, GCD)**は、2つ以上の整数に共通する約数の中で、最も大きい数を指します。例えば、12と18の約数はそれぞれ
-
12の約数: 1, 2, 3, 4, 6, 12
-
18の約数: 1, 2, 3, 6, 9, 18
共通する約数は1, 2, 3, 6であり、その中で最も大きいのは6なので、12と18の最大公約数は6です。
NumPyで最大公約数を算出する:np.gcd()
np.gcd()は、2つの配列(または配列とスカラ値)の要素ごとの最大公約数を計算します。
書式
numpy.gcd(x1, x2, /[, out, where, casting, order, …])
-
x1,x2: 最大公約数を計算したい入力配列、またはスカラ値。両方とも整数である必要があります。NumPyのブロードキャスト機能が適用されます。
サンプルコード
import numpy as np
# 2つのスカラ値の最大公約数
gcd_scalar = np.gcd(12, 18)
print("12と18の最大公約数:", gcd_scalar)
# 2つの配列の要素ごとの最大公約数
arr1 = np.array([10, 15, 20])
arr2 = np.array([25, 30, 8])
gcd_element_wise = np.gcd(arr1, arr2)
print("要素ごとの最大公約数:", gcd_element_wise)
# 配列とスカラ値の最大公約数
gcd_arr_scalar = np.gcd(arr1, 5)
print("配列とスカラ値の最大公約数:", gcd_arr_scalar)
出力例
12と18の最大公約数: 6
要素ごとの最大公約数: [ 5 15 4]
配列とスカラ値の最大公約数: [5 5 5]
最小公倍数(LCM)とは?
**最小公倍数(Least Common Multiple, LCM)**は、2つ以上の整数に共通する倍数の中で、最も小さい正の数を指します。例えば、4と6の倍数はそれぞれ
-
4の倍数: 4, 8, 12, 16, 20, 24, …
-
6の倍数: 6, 12, 18, 24, 30, …
共通する倍数は12, 24, …であり、その中で最も小さいのは12なので、4と6の最小公倍数は12です。
NumPyで最小公倍数を算出する:np.lcm()
np.lcm()は、2つの配列(または配列とスカラ値)の要素ごとの最小公倍数を計算します。
書式
numpy.lcm(x1, x2, /[, out, where, casting, order, …])
-
x1,x2: 最小公倍数を計算したい入力配列、またはスカラ値。両方とも整数である必要があります。NumPyのブロードキャスト機能が適用されます。
サンプルコード
import numpy as np
# 2つのスカラ値の最小公倍数
lcm_scalar = np.lcm(4, 6)
print("4と6の最小公倍数:", lcm_scalar)
# 2つの配列の要素ごとの最小公倍数
arr1 = np.array([2, 3, 4])
arr2 = np.array([4, 6, 10])
lcm_element_wise = np.lcm(arr1, arr2)
print("要素ごとの最小公倍数:", lcm_element_wise)
# 配列とスカラ値の最小公倍数
lcm_arr_scalar = np.lcm(arr1, 5)
print("配列とスカラ値の最小公倍数:", lcm_arr_scalar)
出力例
4と6の最小公倍数: 12
要素ごとの最小公倍数: [ 4 6 20]
配列とスカラ値の最小公倍数: [10 15 20]
複数の数値に対するGCD・LCMの計算
np.gcd()もnp.lcm()も一度に2つの引数しか取れませんが、np.reduce()メソッドやfunctools.reduceと組み合わせることで、複数の数値や配列の最大公約数・最小公倍数をまとめて計算できます。
サンプルコード (複数の配列の最大公約数)
import numpy as np
from functools import reduce
arrs = [np.array([6, 12, 18]),
np.array([9, 18, 27]),
np.array([3, 6, 9])]
# 複数の配列の要素ごとの最大公約数
gcd_multi = reduce(np.gcd, arrs)
print("複数の配列の要素ごとの最大公約数:", gcd_multi)
出力例
複数の配列の要素ごとの最大公約数: [3 6 9]
まとめ
NumPyのnp.gcd()とnp.lcm()は、整数配列の最大公約数と最小公倍数を効率的に計算するための強力な関数です。
-
np.gcd(x1, x2): 2つの整数または配列の要素ごとの最大公約数を返します。 -
np.lcm(x1, x2): 2つの整数または配列の要素ごとの最小公倍数を返します。 -
ブロードキャスト対応: スカラ値や異なる形状の配列(ブロードキャスト可能であれば)とも組み合わせられます。
-
複数の数値:
functools.reduceなどと組み合わせることで、3つ以上の数値や配列に対しても適用できます。
これらの関数は、数論的な問題、周期的なイベントの同期計算、分数計算の簡略化など、様々な数学的・工学的応用で役立ちます。ぜひ、あなたのNumPyワークフローに取り入れてみてください!
