この回答に基づいて、 Python 3.xで単純なアルゴリズムを実装して、整数n
が別の整数の累乗であるかどうかを判断していbase
ます。ただし、アルゴリズムは正しい結果を返しません。リンクされた回答のコードは次のとおりです。
while (n % 3 == 0) {
n /= 3;
}
return n == 1;
(コメントn == 0
は、論理的にもチェックが必要であることを示しています)。これは私のコードです:
def is_power(n: int, base: int) -> bool:
if n == 0:
return false
while (n % base == 0):
n /= base
return n == 1
特定の範囲の基数と指数をテストする簡単なテストコードを作成しましたが、返される結果が正しくありません。テストコード:
for base in range(3, 10):
print("Base: {0}".format(base))
for exp in range(30, 40):
b = is_power(pow(base, exp), base)
if not(b):
print("{: <3}: {: <5}".format(exp, str(b)))
これをはるかに広い範囲でテストしましたが、出力のために、この例では制限しました。これは以下を出力します:
Base: 3
35 : False
36 : False
37 : False
38 : False
39 : False
Base: 4
Base: 5
30 : False
31 : False
32 : False
33 : False
34 : False
35 : False
36 : False
37 : False
38 : False
39 : False
Base: 6
35 : False
36 : False
37 : False
38 : False
39 : False
Base: 7
30 : False
31 : False
32 : False
33 : False
34 : False
35 : False
36 : False
37 : False
38 : False
39 : False
Base: 8
Base: 9
30 : False
31 : False
32 : False
33 : False
34 : False
35 : False
36 : False
37 : False
38 : False
39 : False
これは明らかに間違っています。私は小さな例をデバッグしようとしました。ここで、ループ内のこれらの値を生成n = pow(3, 35)
します。base = 3
n
50031545098999707
1.6677181699666568e+16
50031545098999707/3 == 1.667718169966656 9 e + 16であるため、ループは終了します(最後の桁が異なることに注意してください)。これは問題ですか?Pythonの計算は失敗していますか?そうでない場合、このアルゴリズムの問題は何ですか?
代わりに使用すると、アルゴリズムもさらに失敗しますが、1つの例を確認すると、常に同じ値が返されるとは限らmath.pow
ないため、必ずしも驚かされるわけではpow
ありません。math.pow
import math
pow(3, 35) == math.pow(3, 35) # 50031545098999707 != 5.0031545098999704e+16