2014-03-01 85 views
21
#!/usr/bin/python 
import sys,math 
n = input("enter a number to find the factors : ") 
j,flag,b= 0l,False,0l 
for b in xrange(1,n+1): 
    a = n + (b*b) 
    j = long(math.sqrt(a)) 
    if a == j*j: 
     flag = True 
     break 
if flag: 
    c = j+b 
    d = j-b 
    print "the first factor is : ",c ," and the second factor is : ",d 

當我運行這段代碼時,它會爲不同的輸入引發不同類型的錯誤。OverflowError Python int太大而不能轉換成C long

以下是一種輸入

[email protected]:~$ ./fermat.py 
enter a number to find the factors : 544564564545456 
Traceback (most recent call last): 
    File "./fermat.py", line 8, in <module> 
    for b in range(1,n+1): 
MemoryError 

的這是第二個輸入

[email protected]:~$ ./fermat.py 
enter a number to find the factors : 28888888888888888888888888888888888444444444444444444444444 
Traceback (most recent call last): 
    File "./fermat.py", line 8, in <module> 
    for b in range(1,n+1): 
OverflowError: range() result has too many items 

這是第三輸出

[email protected]:~$ ./fermat.py 
enter a number to find the factors : 28888888888888888888888888888888888444444444444444444444444 
Traceback (most recent call last): 
    File "./fermat.py", line 8, in <module> 
    for b in xrange(1,n+1): 
OverflowError: Python int too large to convert to C long 

其實我在寫代碼費馬因式分解法找出給定數字的因素。而且我的要求是即使給出一個百位數字作爲輸入,它也應該給出該輸入數字的輸出。

有什麼辦法擺脫這種問題? 我使用的是Python python 2.7.5+

+3

您的前兩個回溯針對您未發佈的代碼;你使用'range()'而不是'xrange()',產生元素過多的列表。在任何情況下,您都不應該爲這些*巨大的因素設法產生循環。你的代碼永遠不會在任何合理的時間內完成*無論如何*。 –

+0

在[Fermat的因式分解算法]中(https://en.wikipedia.org/wiki/Fermat's_factorization_method),您是否首先需要創建這樣的循環? –

+0

您不能對偶數使用費馬分解。 – user2357112

回答

36

令人煩惱的是,在Python 2中,xrange需要它的參數適合C長。標準庫中沒有太多的替代品。但是,你並不需要一個簡單的替換。你只需要繼續下去,直到循環break s。這意味着你要itertools.count,這就像一個xrange,只是不斷去:

import itertools 
for b in itertools.count(1): 
    ... 

另外請注意,您的代碼有其他錯誤。它試圖將費馬分解應用於偶數,但費馬分解不適用於偶數。此外,它不考慮n是正方形的情況,所以它不適用於n=9

相關問題