2012-02-12 67 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