AKS素数测试算法的第一步是检查输入数字是否为完美幂。这似乎是数论中众所周知的事实,因为本文没有详细解释。有人可以告诉我如何在多项式时间内执行此操作吗?谢谢。
AKS素数测试算法的第一步是检查输入数字是否为完美幂。这似乎是数论中众所周知的事实,因为本文没有详细解释。有人可以告诉我如何在多项式时间内执行此操作吗?谢谢。
Answers:
参见Bach和Sorenson,《用于完美功率测试的Sieve算法》,Algorithmica 9(1993),313-328,DOI:10.1007 / BF01228507,和DJ Bernstein,《在基本上线性的时间内检测完美功率》,《数学》。比较 67(1998),1253-1283。
不知何故,我可以表明,该二进制搜索算法是。
首先,,存在b < l g n。二进制搜索算法:
对于每个b,我们使用二进制搜索找到a。
每次使用快速幂运算来计算花费l g b = l g l g n个运算 。因此,剩下的问题是范围一。
如果是最大可能值一,那么二进制搜索需要 升克甲操作
注意,即 l g A = l g n 。当总结, Σ升克甲=升克Ñ⋅(1
换言之,对于所有二进制搜索的操作是
ps:所有lg都以2为底。
Python代码:
#--- a^n ---------------------------------------
def fast_exponentation(a, n):
ans = 1
while n:
if n & 1 : ans = ans * a
a = a * a
n >>= 1
return ans
#------------------------------------------
# Determines whether n is a power a ^ b, O(lg n (lg lg n) ^ 2)
def is_power(n):
if (- n & n) == n: return True # 2 ^ k
lgn = 1 + ( len( bin ( abs ( n ) ) ) - 2)
for b in range(2,lgn):
# b lg a = lg n
lowa = 1L
higha = 1L << (lgn / b + 1)
while lowa < higha - 1:
mida = (lowa + higha) >> 1
ab = fast_exponentation(mida,b)
if ab > n: higha = mida
elif ab < n: lowa = mida
else: return True # mida ^ b
return False