如果可能的话,我想用python解决以下问题。
设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或任何足够大的。。。
遵循您提供的算法:
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]