确定一个数字是否满足欠定方程

时间:2011-12-08 00:30:55

标签: algorithm complexity-theory combinatorics

理论上是否可能用O(1)空间和时间复杂度决定一个已知的正整数K是否是方程的解

  

K = \sum_{i=1}^\infty \mu_i (ai + b) = \mu_1 (a + b) + \mu_2 (2a + b) + \ldots

其中 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

1 个答案:

答案 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