python - 在 python 中求解特定的符号方程

标签 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 越大,如果我想遵循相同的想法,我需要的 for 循环就越多。所以我认为这不是对任意 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]

关于python - 在 python 中求解特定的符号方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25787886/

相关文章:

python - App Engine - 在运行时指定实体名称

python - 使用 py2exe 创建了一个 .exe,但是当我将粘贴从 "dist"文件夹复制到桌面时,无法正常运行

algorithm - 如何找到给定关系的时间复杂度?

java - 基于字符数的短信计数

c# - 最大化网格中缩略图的大小

python - 创建具有相同键的字典列表?

python - 旋转三角形的最佳方法是在完全旋转后顶线和底线三角形之间没有间隙?

algorithm - 与神经网络中的几个输出节点相比,具有多个输出节点的优点或缺点是什么

java - 如何实现广度优先搜索到一定深度?

python - 3D 中点和圆弧之间的距离