Pythonで数がトロイ数(Trojan Number)かどうかを判定する方法
ある数 n が与えられたとき、それが「トロイ数(Trojan Number)」であるかどうかを判定します。トロイ数とは、「強い数(Strong Number)」であるにもかかわらず、累乗数(perfect power)ではない数のことを指します。
ここで、数 n が強い数であるとは、n のすべての素因数 p に対して p² もまた n の約数となることを意味します。言い換えると、すべての素因数が少なくとも2回現れる数です。トロイ数は必ず強い数ですが、その逆は成り立ちません。つまり、すべての強い数がトロイ数というわけではなく、ab の形で表せないものだけがトロイ数となります。
たとえば入力が 72 の場合、出力は True になります。72 は (6×6×2) = (6² × 2) と表せるため、素因数がすべて2回以上現れる強い数でありながら、累乗数ではないからです。
解法のアプローチ
この問題を解くには、以下の手順に従います。
- 関数 check_perfect_pow() を定義する。引数として n を受け取る
- n が 1 と等しい場合は True を返す
- x を 2 から √n の整数部分 + 1 まで繰り返す:
- y := 2
- p = xy
- p ≤ n かつ p > 0 の間、以下を繰り返す:
- p が n と等しければ True を返す
- y := y + 1
- p = xy
- False を返す
- 関数 check_strong_num() を定義する。引数として n を受け取る
- count := 各数値の出現回数を保持する辞書(初期値はすべて 0)
- n を 2 で割り切れる間、以下を繰り返す:
- n := n // 2(整数除算)
- count[2] := count[2] + 1
- i を 3 から √n の整数部分 + 1 まで 2 ずつ増やしながら繰り返す:
- n が i で割り切れる間、以下を繰り返す:
- n := n // i(整数除算)
- count[i] := count[i] + 1
- n が i で割り切れる間、以下を繰り返す:
- n > 2 の場合は count[n] := count[n] + 1
- flag := 0
- count の各キーと値について:
- 値が 1 であれば flag := 1 としてループを抜ける
- flag が 1 なら False を返す
- True を返す
- メイン処理では、check_perfect_pow(n) が False かつ check_strong_num(n) が True のときに true を返し、それ以外は false を返す
実装例
理解を深めるために、以下の実装を見てみましょう。
from math import sqrt, pow
def check_perfect_pow(n):
if n == 1:
return True
for x in range(2, int(sqrt(n)) + 1):
y = 2
p = x**y
while p <= n and p > 0:
if p == n:
return True
y += 1
p = x**y
return False
def check_strong_num(n):
count = {i:0 for i in range(n)}
while n % 2 == 0:
n = n // 2
count[2] += 1
for i in range(3,int(sqrt(n)) + 1, 2):
while n % i == 0:
n = n // i
count[i] += 1
if n > 2:
count[n] += 1
flag = 0
for key,value in count.items():
if value == 1:
flag = 1
break
if flag == 1:
return False
return True
def isTrojan(n):
return check_perfect_pow(n) == False and check_strong_num(n)
n = 72
print(isTrojan(n))入力
72
出力
True
-
Pythonで素数を判定するプログラムの書き方を徹底解説
はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない
-
Pythonでアームストロング数を判定するプログラムの書き方
この記事では、与えられた整数が「アームストロング数(Armstrong number)」であるかどうかを判定するための考え方と、Pythonによる具体的な実装方法を解説します。 問題の定義 整数 n が与えられたとき、その整数がアームストロング数であるかどうかを判定することを目標とします。 アームストロング数とは? n 桁の正の整数 abcd… が次の条件を満たすとき、この数は「n 次(オーダー n)のアームストロング数」と呼ばれます。 abcd... = a^n + b^n + c^n + d^n + … つまり、各桁の数字を「桁数乗」した値の総和が、元の数と一致するかを確認す