您的代码仅查找候选人,但不检查他们是否really匹配。
浮点不准确使得您无法区分像这样的非常大的值和相同的值减一。
但由于 python 内置了无限范围整数算术,你可以check你发现的确实是匹配的。
我的想法:一旦找到幂,就计算理论数的幂(通过四舍五入),然后计算整数幂,并比较整数。
from math import log,sqrt,floor
import sys
n = 76 ** 89
t=floor(sqrt(n))+1
flag=False
for i in range(2,t):
x=log(n,i) # faster than x=log(n,2)/log(i,2)
if x-int(x)<sys.float_info.epsilon:
x = int(round(x))
r = int(round(n**(1/x)))
print("found candidate: ",x,r)
if n == r**x: # exact integer comparison with initial value & found values
print("YESSSSSSSSSSSSS!")
flag=True
break
else:
print("but not exact")
if not flag:
print("Nooooooooooooooooooo!")
与76 ** 89 - 1
值,您会得到“但不准确”,因为计算出的功率不匹配n
value.
旁白:使用起来更快x=log(n,i)
代替x=log(n,2)/log(i,2)
由于涉及的浮动操作较少,因此可能也更准确。