首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中特殊符号方程的求解

python中特殊符号方程的求解
EN

Stack Overflow用户
提问于 2014-09-11 12:49:16
回答 1查看 146关注 0票数 1

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

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

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

在哪里。意思是点积。

实际上,我可以为每个单独的n解决这个问题。但是我想要创建一个函数

代码语言:javascript
复制
def F(n,p,d):
...
return result

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

我想不出怎么做,所以任何建议都会很感激的。

添加了.

例如:假设n=3 ( n=2是平凡的),p=(2,1,3),d=3。

代码语言:javascript
复制
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或任何足够大的.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-11 13:29:20

按照您提供的算法:

代码语言:javascript
复制
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是否为正数。让我们定义点积,如下所示:

代码语言:javascript
复制
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,计算就会退出。您还可以将其表示为列表理解:

代码语言:javascript
复制
results = [q for q in product(range(0, d+1), repeat=len(p)) if dot(p, q, d) == d]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25787886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档