理论上是否可能用O(1)空间和时间复杂度决定一个已知的正整数K是否是方程的解
其中 a 和 b 是固定的,正整数(既不是另一个的倍数),μ i < / em> s是 unknown 非负整数,除了有限数量(但不是全部)之外都是零?如果在O(1)空间和时间中不可能,那么最着名算法的空间和时间要求是什么?
我发现这个问题的唯一方法是提前列举所有可能的 K 的子集,但当然这需要我选择上限 M < / em>和 N 使i≤N和∀μ i ≤M。更糟糕的是,它的空间要求是O( M N ),这可能是如此巨大,以至于没有查找算法在真实硬件上实现O(1)检索性能。我有一种不好的感觉,这实际上是伪装的Knapsack Problem,但我还不确定是否放弃了。
我试图在空间和时间上一直到O(1),因为我需要知道这是否可以在嵌入式环境中实时完成,在CPU或RAM中几乎没有任何空间。 / p>
我不需要知道满意的μ i 值。
编辑:此Python函数计算集合对象S
,当且仅当 K 是其中一个解决方案时,K in S
才为真如上所述,给定 a , b 和cutoffs M 和 N 。
def compute_set(a, b, M, N):
ss = [a*i + b for i in xrange(1,N+1)]
aa = itertools.product(xrange(0,M+1), repeat=N)
rv = set(map(lambda a: sum(a[i]*ss[i] for i in xrange(N)), aa))
rv.remove(0)
return rv
答案 0 :(得分:2)
分两个阶段解决。
在第1阶段,使用处理Diophantine equations的标准技术计算集合{(x,y):x,y在Z和ax + by = K}的描述。设g = gcd(a,b);除非g除以K,否则没有解决方案。通过extended Euclidean algorithm计算g来解决ax'+ by'= g以及计算g;第一种解决方案是(x',y')* K / g。其他解决方案通过(-b / g,a / g)的整数倍相加。
在阶段2中,计算可以通过μ i 的不同选择实现的(x,y)解的描述。由于K≥0,我们知道y≥1是必要条件。如果n是变量,则x≥0且y≥1是必要且充分的条件(设置μ 0 = y - 1且μ x = 1且所有其他μs到0)。
如果n是一个参数,那么事情就会变得更加棘手。使用阶段1的结果,找到x≥0且y最大的解(x,y)(如果没有这样的解,那么K是不可行的)。对于此解决方案,请检查x /y≤n。
def egcd(A, B):
"""Returns a triple (gcd(A, B), s, t) such that s * A + t * B == gcd(A, B)."""
a, b, s, t, u, v = A, B, 1, 0, 0, 1
while True:
assert s * A + t * B == a
assert u * A + v * B == b
if not b:
break
q, r = divmod(a, b)
a, b, s, t, u, v = b, r, u, v, s - q * u, t - q * v
return a, s, t
def solvable(K, a, b):
g, s, t = egcd(a, b)
q, r = divmod(K, g)
if r:
return False
x, y = s * q, t * q
assert a * x + b * y == K
d = a // g
q, r = divmod(y, d)
if r <= 0:
q -= 1
r += d
assert 0 < r <= d
x, y = x + q * (b // g), r
assert a * x + b * y == K
return x >= y