Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで2つの数の平方差が素数かどうかを判定する方法

2つの整数 xy が与えられたとき、それぞれの2乗(正方形の面積とみなせます)の差が素数であるかどうかを判定する問題を考えてみましょう。

たとえば、x = 7、y = 6 の場合を考えます。このとき面積の差は 7² − 6² = 49 − 36 = 13 となり、13 は素数なので答えは True になります。

解法のポイント:因数分解の性質を利用する

単純に差を計算してから素数判定をする方法もありますが、数学的な性質を使うともっとスマートに解けます。2つの数の平方差は、次のように因数分解できます。

x² − y² = (x + y)(x − y)

素数は 1 とその数自身でしか割り切れないため、この積が素数になるのは「一方の因数が 1」の場合だけです。つまり、次の条件が両方満たされれば、平方差は必ず素数になります。

  • (x − y) が 1 である
  • (x + y) が素数である

アルゴリズムの手順

  1. (x + y) が素数かどうかを判定する
  2. (x − y) が 1 と等しいかどうかを確認する
  3. 両方の条件を満たせば True を返し、そうでなければ False を返す

Pythonでの実装例

def is_prime(num):
    if num <= 1:
        return False
    if num <= 3:
        return True
    if num % 2 == 0 or num % 3 == 0:
        return False
    i = 5
    while i * i <= num:
        if num % i == 0 or num % (i + 2) == 0:
            return False
        i = i + 6
    return True

def solve(x, y):
    if is_prime(x + y) and x - y == 1:
        return True
    else:
        return False

x, y = 7, 6
print(solve(x, y))

入力

7, 6

出力

True

コードの解説

is_prime() 関数は、「6k ± 1」の性質を利用した効率的な素数判定関数です。まず 2 と 3 の倍数を除外し、その後 6 ずつ増やしながら候補を絞り込むことで、√num までの範囲だけで判定を完了できます。

solve() 関数では、前述の数学的性質に基づき、「x − y が 1」かつ「x + y が素数」という条件をチェックしています。このアプローチなら、実際に平方差を計算することなく、大きな数でも高速に素数かどうかを判定できるのが大きなメリットです。

  1. Pythonで数値が二面素数(Dihedral Prime)かどうかを判定する方法

    ある整数nが与えられたとき、それが「二面素数(dihedral prime)」であるかどうかを判定する方法を解説します。二面素数とは、その数自体が素数であり、さらに7セグメントディスプレイに表示した際に、表示の向き(通常の向きでも上下逆さまでも)に関わらず、同じ数または別の素数として読み取れる数のことです。例えば、入力がn = 1181の場合、出力はTrueになります。下の数字は上の数字を上下逆さま(180度回転)にして表示したものであり、どちらも素数となっています。アルゴリズムの手順この問題を解くために、以下の手順で進めます。up_side_down() 関数を定義します。引数としてnを受け

  2. Pythonで素数を判定するプログラムの書き方を徹底解説

    はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない