Pythonで数Nが強素数(ストロングプライム)かどうかを判定する方法
強素数とは?
ある数 n が与えられたとき、それが強素数(strong prime)であるかどうかを判定します。強素数とは、「直前の素数」と「直後の素数」の平均値よりも大きい素数のことです。
例えば、num = 37 の場合、出力は True になります。これは、37 に最も近い素数が 31 と 41 であり、その平均は (31 + 41) / 2 = 36。37 は 36 より大きいため、強素数と判断されるからです。
ちなみに、2 を除外しているのは、2 より小さい素数が存在しないため平均値が計算できないからです。
アルゴリズムの手順
この問題を解くには、以下の手順に従います。
- num が素数でない場合、または num が 2 の場合は
Falseを返す - last := num − 1、next := num + 1 と初期化する
- next が素数になるまで、next を 1 ずつ増やしていく
- last が素数になるまで、last を 1 ずつ減らしていく
- avg := (last + next) / 2 を計算する
- num > avg であれば
Trueを返す - それ以外は
Falseを返す
実装例
理解を深めるために、以下の Python 実装を見てみましょう。
def isPrime(num):
if num > 1:
for i in range(2, num):
if num % i == 0:
return False
return True
return False
def solve(num):
if isPrime(num) == False or num == 2:
return False
last = num - 1
next = num + 1
while isPrime(next) == False:
next += 1
while isPrime(last) == False:
last -= 1
avg = (last + next) / 2
if num > avg:
return True
return False
num = 37
print(solve(num))
入力
37
出力
True
補足:効率化のポイント
上記の isPrime 関数はシンプルですが、2 から num−1 まで全て確認するため大きな数では非効率です。実際には、√num までの約数をチェックすれば十分なので、range(2, int(num**0.5) + 1) とすることで計算量を大幅に削減できます。
また、強素数は暗号学の分野でも重要な概念です。特に RSA 暗号の鍵生成において、強素数を使うことでポラード・ロー法などの因数分解アルゴリズムに対する耐性が高まるとされています。
-
Pythonで数値が二面素数(Dihedral Prime)かどうかを判定する方法
ある整数nが与えられたとき、それが「二面素数(dihedral prime)」であるかどうかを判定する方法を解説します。二面素数とは、その数自体が素数であり、さらに7セグメントディスプレイに表示した際に、表示の向き(通常の向きでも上下逆さまでも)に関わらず、同じ数または別の素数として読み取れる数のことです。例えば、入力がn = 1181の場合、出力はTrueになります。下の数字は上の数字を上下逆さま(180度回転)にして表示したものであり、どちらも素数となっています。アルゴリズムの手順この問題を解くために、以下の手順で進めます。up_side_down() 関数を定義します。引数としてnを受け
-
Pythonで素数を判定するプログラムの書き方を徹底解説
はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない