Pythonで与えられた数値がワグスタッフ素数かどうかを判定する方法
ワグスタッフ素数とは?
ある数値 n が与えられたとき、その数がワグスタッフ素数(Wagstaff prime)であるかどうかを判定することを考えます。ワグスタッフ素数とは、次の形式で表される素数のことです。
(2q + 1) / 3
ここで q は奇素数(2 以外の素数)でなければなりません。
具体例での確認
たとえば、入力が n = 683 の場合、出力は True になります。これは、683 を次のように表せるためです。
683 = (211 + 1) / 3 = 2049 / 3
この場合 q = 11 であり、11 は奇素数なので、683 はワグスタッフ素数であることがわかります。
判定の手順
この問題を解くには、以下の手順に従います。
- num が素数であり、かつ (num × 3 − 1) が 2 の累乗である場合 →
Trueを返す - 上記以外の場合 →
Falseを返す
ポイントは、(num × 3 − 1) が 2 の累乗(つまり 2q)になれば、num は自動的に (2q + 1) / 3 の形を満たすという点です。あとは num 自身が素数であることを確認すればよいわけです。
サンプルコード
def isPrime(num):
if num > 1:
for i in range(2, num):
if num % i == 0:
return False
return True
return False
def power_of_two(num):
return num and not(num & (num - 1))
def solve(num):
if isPrime(num) and power_of_two(num * 3 - 1):
return True
return False
n = 683
print(solve(n))
入力
683
出力
True
コードの解説
isPrime 関数: 2 から num−1 まで順番に割り切れるかどうかを調べる、シンプルな試し割り法による素数判定を行います。
power_of_two 関数: ビット演算を使ったテクニックで、2 の累乗かどうかを判定します。「num & (num − 1)」が 0 になるのは num が 2 の累乗の場合だけです。これにより効率的にチェックできます。
solve 関数: 「num が素数」かつ「num × 3 − 1 が 2 の累乗」という 2 つの条件を確認し、両方が成立すればワグスタッフ素数として True を返します。
-
Pythonで数値が二面素数(Dihedral Prime)かどうかを判定する方法
ある整数nが与えられたとき、それが「二面素数(dihedral prime)」であるかどうかを判定する方法を解説します。二面素数とは、その数自体が素数であり、さらに7セグメントディスプレイに表示した際に、表示の向き(通常の向きでも上下逆さまでも)に関わらず、同じ数または別の素数として読み取れる数のことです。例えば、入力がn = 1181の場合、出力はTrueになります。下の数字は上の数字を上下逆さま(180度回転)にして表示したものであり、どちらも素数となっています。アルゴリズムの手順この問題を解くために、以下の手順で進めます。up_side_down() 関数を定義します。引数としてnを受け
-
Pythonで数値が素数かどうかを判定する方法
素数判定の基本的な考え方ここで紹介する方法の原理は、与えられた数を3からその平方根までのすべての整数で順に割っていくというものです。ある数の平方根は、その数が持ちうる約数の中で最大の候補となる値です。したがって、平方根を超える数については、割り切れるかどうかを確認する必要はありません。この関数は、2で割り切れる数や2未満の数に対しては False を返します。それ以外の数については、組み込み関数 all() を使い、平方根以下のいずれかの数で割り切れる場合には False(素数ではない)、どの数でも割り切れない場合には True(素数である)を返します。サンプルコードdef is_prime(