【Python】数値のすべての回転が素数かどうかを判定するプログラム
ある整数 n が与えられたとき、その桁を入れ替えてできるすべての回転数が素数であるかどうかを判定します。このような性質を持つ数は「循環素数(circular prime)」として知られています。
例えば、入力が n = 13 の場合を考えてみましょう。13 自体が素数であり、桁を入れ替えた 31 も素数であるため、出力は True になります。
解決のアプローチ
この問題は、以下の手順で解くことができます。
- 数値
nを文字列に変換します。 nの桁数と同じ回数だけループ処理を行います。- 現在の
nが素数でなければ、Falseを返します。 - 素数であれば、先頭の桁を取り出して末尾に移動し、新しい
nを作ります。
- 現在の
- すべての回転が素数であれば、最後に
Trueを返します。
実装例
それでは、実際のPythonコードを見てみましょう。
class Solution:
def solve(self, n):
def is_prime(num):
if num <= 1:
return False
return not any(num % 2 == 0 or num % i == 0
for i in range(3, int(num**0.5) + 1, 2))
n = str(n)
for _ in range(len(n)):
if not is_prime(int(n)):
return False
n = n[1:] + n[0]
return True
ob = Solution()
print(ob.solve(13))
入力
13
出力
True
コードの解説
素数判定関数(is_prime)
内部関数 is_prime は、試し割り法によって素数判定を行います。まず 1 以下の数は素数ではないため False を返し、その後、2 および 3 以上の奇数(√num まで)で割り切れるかどうかを確認します。割り切れる数が存在しなければ素数と判断できます。
回転の生成方法
回転は文字列スライスによって簡単に実現できます。n[1:] + n[0] により、先頭の1文字を取り除いた残りに先頭の文字を連結することで、桁を左に回転させた新しい数を作れます。これを桁数分繰り返すことで、すべての回転パターンを網羅的にチェックできます。
なお、回転の過程で先頭に 0 が現れた場合(例:103 → 031)でも、int() による変換で自動的に 31 として扱われるため、特別な処理は不要です。
計算量
桁数を d、元の数値を n とすると、各回転ごとの素数判定は O(√n)、回転は全部で d 回行うため、全体の計算量は O(d・√n) となります。桁数が少ない範囲では非常に効率的に動作します。
-
Pythonで数値が二面素数(Dihedral Prime)かどうかを判定する方法
ある整数nが与えられたとき、それが「二面素数(dihedral prime)」であるかどうかを判定する方法を解説します。二面素数とは、その数自体が素数であり、さらに7セグメントディスプレイに表示した際に、表示の向き(通常の向きでも上下逆さまでも)に関わらず、同じ数または別の素数として読み取れる数のことです。例えば、入力がn = 1181の場合、出力はTrueになります。下の数字は上の数字を上下逆さま(180度回転)にして表示したものであり、どちらも素数となっています。アルゴリズムの手順この問題を解くために、以下の手順で進めます。up_side_down() 関数を定義します。引数としてnを受け
-
Pythonで素数を判定するプログラムの書き方を徹底解説
はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない