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

Pythonで数値が素数階乗素数(プライモリアル素数)かどうかを判定する方法


ある数 n が与えられたとき、その n が「素数階乗素数(primorial prime)」であるかどうかを判定することを考えます。素数階乗素数とは、pN# + 1 または pN# − 1 の形で表される素数のことです。ここで pN# は pN の素数階乗(primorial)を表し、「最初の N 個の素数の積」として定義されます。

例えば、入力が 29 の場合、出力は True になります。N = 3 のとき素数階乗は 2 × 3 × 5 = 30 となり、30 − 1 = 29 であるため、29 は pN# − 1 の形の素数階乗素数に該当します。

なお、素数階乗素数の具体例としては、5(= 2×3−1)、7(= 2×3+1)、29、31、211 などが挙げられます。

解法のアプローチ

この問題を解くために、以下の手順に従います。

  • 上限値 MAX := 100000 とする
  • prime := サイズ MAX のリストを作成し、すべて True で初期化する
  • arr := 新しい空のリストを作成する
  • 関数 SieveOfEratosthenes() を定義する。処理内容は次の通り:
    • pri を 2 から int(√MAX) + 1 まで繰り返す
      • prime[pri] が True の場合
        • i を pri × 2 から MAX まで pri 刻みで繰り返し、prime[i] を False に更新する
  • pri を 2 から MAX まで繰り返し、prime[pri] が True であれば arr の末尾に pri を追加する

続いて、メインの判定処理では以下を行います。

  • prime[n] が False(素数でない)の場合は False を返す
  • product := 1、i := 0 と初期化する
  • product < n の間、以下を繰り返す
    • product := product × arr[i]
    • product + 1 == n または product − 1 == n であれば True を返す
    • i := i + 1
  • ループを抜けたら False を返す

実装例

以下の実装例を見て、理解を深めましょう。

from math import sqrt
MAX = 100000
prime = [True] * MAX
arr = []
def SieveOfEratosthenes() :
    for pri in range(2, int(sqrt(MAX)) + 1) :
        if prime[pri] == True :
            for i in range(pri * 2 , MAX, pri) :
                prime[i] = False
    for pri in range(2, MAX) :
        if prime[pri] :
            arr.append(pri)
def check_primorial_prime(n) :
    if not prime[n] :
        return False
    product, i = 1, 0
    while product < n :
        product *= arr[i]
        if product + 1 == n or product - 1 == n :
            return True
        i += 1
    return False
SieveOfEratosthenes()
n = 29
print(check_primorial_prime(n))

入力

29

出力

True

  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以下の数値は素数ではない