2012-02-12 91 views
3

我是编程新手(Python是我的第一语言),但我喜欢设计算法。我目前正在研究一个方程组(整数),我找不到任何关于解决我的特定问题的参考。在Python中求解困难(多项式?)方程

让我解释一下。

我有一个公式(一个测试,如果你愿意):

raw_input == [(90*x + a) * y] + z 

其中a是某个常数。

我的问题是,变量z的计数方式非常类似于斐波那契数列,而变量x是z的步长。所以我的意思是(对斐波那契数列)是在z序列的第一项中x = 0,在z序列的第二项中x = 1。我需要求解y。

用于确定荷比确切过程如下

where c and d are constants: 
#at x = 0 
temp = (c+(90*x)) * (d+(90*x)) 
temp/90 = z(0) 

#at x = 1 
new_temp = (c+(90*x)) * (d + (90*x)) 

new_temp/90 = z(1) 

#for all the rest of the values of z (and x), use: 

j = z(@ x=1) - z(@ x=0) 
k = j + 180 
l = z(@ x=1) + k 
print "z(@ x=1) - z(@ x=0) = j" 
print "j + 180 = k" 
print "k + z(1) = l" 
repeat until z > raw_input 

this creates the spread of z values by the relation: 
j = z(@ x=n) - z(@ x=n-1) 
k = j + 180 
l = k + z(@ x = n) 

我需要通过扫描(跳过)的值z与< x到测试y的一个整数溶液的状态。

这看起来可能吗?

+0

一个丢番图方程,eh?请参阅维基百科上的[Bezout's identity](http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity)。使用'range'遍历一组值。如果你需要知道如何使用它,请在python.org上查找它。 – 2012-02-12 03:24:57

回答

2

看来你最好的办法是将给定的方程改写为递推关系,然后定义一个递归函数来确定你想要计算的值或找到关系的封闭形式解。有关递推关系的更多信息,请参阅:

最后,在我的经验,这样的问题最好用数学数值分析软件如Matlab,八度,或数学解决。至少,通过这些平台可以实现快速部署和测试。

+0

是否有一个更简单的方法来简单打印限制(z)下的所有值(n)?我的意思是,而不是解决diophantine方程,我真的只想打印n = [(90 * x + a)* y] + z,对于z <极限。我想打印n,但我想通过上面的描述到达(n)。我一直无法弄清楚如何编写一个while循环来迭代我想要为变量(z)生成的序列。 – 2012-02-12 07:48:46

1

我所做的一切就是将你的伪代码翻译成Python。也许它可以有一些帮助。如果你还没有看过Python tutorial,也许你应该看看。

# python 2.7 

# raw_input returns string - convert to int 
upper_bound = int(raw_input('Upper bound: ')) 

def z(x): 
    'A function to calculate z from x.' 
    # c and d are constants 
    c = 5 
    d = 2 
    # integer division here 
    return (c + 90*x)*(d + 90*x)/90 

# the value of z_0 
z0 = z_x = z(0) 
# a list to hold the z values z_0, z_1, ... 
# the list includes z_0 (when x = 0) 
zs = [z0] 

x = 1 
while z_x < upper_bound: 
    z_x = z(x) 
    zs.append(z_x) 

    j = zs[x] - zs[x - 1] 
    k = j + 180 
    l = zs[x] + k 
    print j, k, l 

    x += 1 
+0

对不起,我是新的......我试图产生的代码给出了一组特定的结果。我给你举个例子,我的意思是:当c = 73和d = 29 [(73+(90 * 0))*(29+(90 * 0))= 2117时NEXT 2117/90 = 23 - - > 23 = z(0)NEXT [(73+(90 * 1))*(29+(90 * 1))= 19397] NEXT 19397/90 = 215 - > z(1)= 215#需要进行乘法运算,我们使用z(0)和z(1)项作为“种子值”。这些值由下式导出:[(215-23 = 192)=(z(1)-z(0)] NEXT 192 + 180 = 372 = m(1)NEXT m(1)+ z(1)= 587; 587 = z(3)NEXT [m(1)+ 180 = 552 = m(2)],[z(3)+ m(2)] = 1139 = z(4)NEXT m(2)+ 180 = 732 = m(3),z(4)+ m(3)= 1871 – 2012-02-13 21:18:01