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

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

ある整数nが与えられたとき、それが「二面素数(dihedral prime)」であるかどうかを判定する方法を解説します。二面素数とは、その数自体が素数であり、さらに7セグメントディスプレイに表示した際に、表示の向き(通常の向きでも上下逆さまでも)に関わらず、同じ数または別の素数として読み取れる数のことです。

例えば、入力がn = 1181の場合、出力はTrueになります。

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

下の数字は上の数字を上下逆さま(180度回転)にして表示したものであり、どちらも素数となっています。

アルゴリズムの手順

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

  • up_side_down() 関数を定義します。引数としてnを受け取ります。
  • temp := n、total := 0 と初期化します。
  • temp > 0 の間、以下を繰り返します。
    • d := temp mod 10(一の位の数字を取り出す)
    • dが2の場合は d := 5 に置き換える
    • dが5の場合は d := 2 に置き換える
    • total := total * 10 + d
    • temp := temp / 10 の商
  • total を返します。
  • メイン処理では以下を行います。
  • nが素数でない、または up_side_down(n) が素数でない、または n の桁を逆順にした数が素数でない、または up_side_down(n) の桁を逆順にした数が素数でない場合は、False を返します。
  • temp := n とし、temp > 0 の間、以下を繰り返します。
    • rem := temp mod 10
    • rem が [3, 4, 6, 7, 9] のいずれかであれば False を返します(これらの数字は180度回転しても正しい数字として表示できないためです)。
    • temp := temp / 10 の商
  • すべてのチェックを通過すれば True を返します。

なお、素数判定にはエラトステネスの篩を用いて、あらかじめ10万までの素数テーブルを作成しています。これにより各判定を高速に行うことができます。

実装コード例

prime = (int(1e5)+5)*[True]
def reverse(n):
    return int(str(n)[::-1])

def up_side_down(n):
    temp = n
    total = 0
    while temp>0:
        d = temp % 10
        if d == 2:
            d = 5
        elif d == 5:
            d = 2
        total = total * 10 + d
        temp//= 10

    return total

def get_all_prime():
    prime[0] = prime[1] = False

    for i in range(2, int(1e5)+1):
        j = 2
        while i * j<= int(1e5):
            prime[i * j] = False
            j+= 1

def solve(n):
    get_all_prime()
    if not prime[n] or not prime[up_side_down(n)] or not prime[reverse(n)] or not prime[reverse(up_side_down(n))]:
        return False

    temp = n

    while temp>0:
        rem = temp % 10;
        if rem in [3, 4, 6, 7, 9]:
            return False
        temp //= 10

    return True

n = 1181
print(solve(n))

入力

n = 1181

出力

True

このように、対象の数・上下反転させた数・桁を逆にした数・その両方を組み合わせた数のすべてが素数であり、かつ回転しても正しく表示できる数字(0, 1, 2, 5, 8)のみで構成されている場合、その数は二面素数であると判定できます。

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

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

  2. 【Python入門】数値が素数かどうかを判定するプログラムの書き方

    この記事では、ユーザーが入力した数値(1より大きい整数)が素数かどうかを判定するPythonプログラムを紹介します。サンプルコードと実行結果、処理の流れを丁寧に解説しているので、Python初心者の方でも理解しやすい内容になっています。素数とは?素数とは、1より大きい正の整数のうち、約数が1とその数自身の2つしか存在しない数のことです。たとえば、2・3・5・7・11などは約数が1と自分自身だけであるため素数です。一方、4や6のように1と自分自身以外の約数を持つ数は「合成数」と呼ばれます。素数判定プログラムのサンプルコード# 入力された数値が素数かどうかを判定するPythonプログラム # ユ