Pythonで2つの数がいとこ素数(cousin primes)かどうかを判定する方法
2つの整数のペアが与えられたとき、それらが「いとこ素数(cousin primes)」であるかどうかを判定する方法を解説します。いとこ素数とは、両方とも素数であり、その差が4であるような2つの数の組み合わせのことです。
例えば、入力が pair = (19, 23) の場合を考えてみましょう。19と23はどちらも素数であり、その差は 23 - 19 = 4 なので、このペアはいとこ素数と判定され、出力は True になります。
いとこ素数には他にも (7, 11)、(13, 17)、(37, 41) などの組み合わせが存在します。
解き方のアプローチ
この問題を解くためには、以下の手順に従います。
- 2つの要素の差が4でない場合は、
Falseを返す - 差が4である場合は、両方とも素数であれば
True、そうでなければFalseを返す
素数の判定には、2からその数自身より1小さい数まで順に割り切れるかを確認する、シンプルな試し割り法を使用します。
サンプルコード
def isPrime(num):
if num > 1:
for i in range(2, num):
if num % i == 0:
return False
return True
return False
def solve(pair):
if not abs(pair[0] - pair[1]) == 4:
return False
return isPrime(pair[0]) and isPrime(pair[1])
pair = (19, 23)
print(solve(pair))
コードの解説
isPrime(num):引数が素数かどうかを判定する関数です。1以下の数は素数ではないためFalseを返し、2から num-1 までの数で割り切れるものがあればFalse、なければTrueを返します。solve(pair):まずabs()を使って2つの数の差の絶対値が4かどうかを確認します。差が4でなければ即座にFalseを返し、差が4の場合は両方の数が素数であるかをand演算子で判定します。
入力
(19, 23)
出力
True
このように、差のチェックと素数判定を組み合わせるだけで、いとこ素数の判定を簡単に実装できます。なお、数が大きくなる可能性がある場合は、素数判定を平方根までの範囲で行う(range(2, int(num**0.5) + 1))ことで、計算量を削減できます。
-
Pythonでブロックの高さリストが直線y=xに対して対称かどうかを判定するプログラム
数値のリスト nums があるとします。これは正方形のブロックを横一列に並べたときの、各列の高さを表しています。ここで、このブロック形状が直線 y = x に対して対称であるかどうかを判定する必要があります。 たとえば、入力が nums = [7, 5, 3, 2, 2, 1, 1] の場合、出力は True になります。 解き方のアプローチ この問題は、リストの両端から同時に走査していくことで効率的に判定できます。手順は次のとおりです。 i を 0、j を「リストの長さ - 1」で初期化します。 i <= j である間、次の処理を繰り返します。 h := nums[j](右側の
-
Pythonで与えられたグラフが2部グラフかどうかを判定するプログラム
2部グラフとは無向グラフが与えられたとき、そのグラフが2部グラフ(バイパータイトグラフ)であるかどうかを判定する方法を解説します。2部グラフとは、グラフのすべての頂点を2つの集合 A と B に分割でき、グラフ内のすべての辺 {u, v} が必ず一方の端点 u が集合 A、もう一方の端点 v が集合 B に属するようなグラフのことです。つまり、同じ集合内の頂点同士を結ぶ辺(A-A や B-B)が一切存在しないグラフです。例として、次のようなグラフを考えてみましょう。この場合、頂点 [0, 4] を集合 A に、[1, 2, 3] を集合 B に分類できます。すべての辺は A から B、または