Pythonで2つの数(m, n)が友愛数かどうかを判定する方法
友愛数とは?
友愛数(アミカブル数)とは、互いに異なる2つの整数のうち、一方の数の真の約数の総和がもう一方の数と一致し、その逆も同様に成り立つような数のペアを指します。
ここでいう真の約数とは、その数自身を除いた正の約数のことです。たとえば、6の真の約数は 1、2、3 となります。
最も有名な例が (220, 284) のペアです。
- 220 の真の約数:1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 → 合計は 284
- 284 の真の約数:1, 2, 4, 71, 142 → 合計は 220
Pythonで友愛数を判定するコード
Pythonでは、各数について真の約数の合計を求め、それが相手方の数と一致するかどうかを比較することで判定できます。
def are_amicable(x, y):
if x == y:
return False
# 各数の真の約数の合計を求める
sum_x = sum(e for e in range(1, x//2+1) if x % e == 0)
sum_y = sum(e for e in range(1, y//2+1) if y % e == 0)
# 条件を満たす場合は True を返す
return sum_x == y and sum_y == x
print(are_amicable(15, 20))
print(are_amicable(220, 284))
このコードを実行すると、次の出力が得られます。
False True
コードのポイント解説
- 同一数の除外: 友愛数は必ず「異なる」2つの数である必要があるため、x == y の場合は False を返します。
- 効率的な約数の合計: 約数の最大値は元の数の半分以下になるため、range(1, x//2+1) までを調べれば十分です。ジェネレータ式と sum() を組み合わせることで簡潔に書けます。
- 相互条件の確認: 「x の約数の合計が y」と「y の約数の合計が x」の両方が成立した場合のみ True を返します。
たとえば (15, 20) の場合、15 の真の約数の合計は 1 + 3 + 5 = 9 となり 20 と一致しないため、False が出力されます。一方 (220, 284) は互いの約数の合計が相手の数と一致するため、True となります。
-
Pythonで2つの数が友愛数(アミカブルナンバー)かどうかを判定する方法
友愛数(アミカブルナンバー)とは、互いに異なる2つの数のうち、それぞれの「真の約数」(その数自身を除く約数)の総和が、相手方の数とちょうど一致するような数のペアのことです。有名な例としては「220」と「284」の組み合わせが知られています。 2つの数が友愛数であるかどうかを判定するには、まず対象の数について約数の総和を求める関数を定義し、続いてその関数を呼び出して2つの数を比較する別の関数を定義します。約数の総和は、平方根までの範囲でループ処理を行い、剰余演算子(%)を使って割り切れるかを確認することで、効率的に計算できます。 以下に実際の実装例を示します。 サンプルコード import ma
-
Pythonで2つの二分木の全レベルがアナグラムかどうかを判定する方法
問題概要 2つの二分木が与えられたとき、片方の木の各レベルに含まれる値の集合が、もう片方の木の同じレベルの値のアナグラム(並べ替え)になっているかどうかを判定します。すべてのレベルがアナグラムであれば True を、そうでなければ False を返します。 例えば、次のような入力が与えられた場合を考えてみましょう。 この場合、出力は True になります。 解法のアプローチ この問題は、幅優先探索(BFS)を応用して解くことができます。各レベルごとにノードの値を収集し、ソートした上で比較するのがポイントです。手順は以下の通りです。 tree_1 を1つ目の木のルートノード、tree_2 を