解决python中特定的符号方程

时间:2014-09-11 12:49:16

标签: python algorithm math linear-algebra

我想用python解决以下问题,如果可能的话,用sympy。

n成为固定的正数。设p=(p_1,...p_n)为正整数的固定已知向​​量。设d为固定的已知正整数。设q=(q_1,...,q_n)为未知非负整数的向量。

如何获得p.q=d的所有解决方案?

哪里。指点积。

实际上我可以为每个人n解决这个问题。但我想创建一个函数

def F(n,p,d):
...
return result

使得result是例如所有解决方案的列表。请注意,根据上述限制,每个三元组数据(n,p,d)的解决方案数量有限。

我无法想出办法,所以任何建议都会受到赞赏。


加。

示例:假设n = 3(情况n = 2是微不足道的),p =(2,1,3),d = 3。然后我会做类似

的事情
res=[]
for i in range (d):
    for j in range (d):
        k=d-p[0]*i-p[2]*j
        if k>=0:
            res.append([i,k,j])

然后res=[[0, 3, 0], [0, 0, 1], [1, 1, 0]]这是正确的。

正如你可以想象的那样,越大的n,如果我想遵循相同的想法,我需要的循环越多。所以我不认为这是一个很好的方法来做任意n,比如n = 57或者足够大......

1 个答案:

答案 0 :(得分:3)

按照您提供的算法:

from itertools import product
dot = lambda X, Y: sum(x * y for x, y in zip(X, Y))
p = [1, 2, 3, ...] # Whatever fixed value you have for `p`
d = 100 # Fixed d
results = []
for q in product(range(0, d+1), repeat=len(p)):
    if dot(p, q) == d:
        results.append(q)

然而,由于可以在计算整个点积之前确定k是否为正数,因此效率稍低。因此,让我们像这样定义点积:

def dot(X, Y, d):
    total = 0
    for x, y in zip(X, Y):
        total += x * y
        if total > d:
            return -1
    return total

现在,一旦总数超过d,计算就会退出。您还可以将其表达为列表理解:

results = [q for q in product(range(0, d+1), repeat=len(p)) if dot(p, q, d) == d]