2014-03-01 3 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 파이썬 int가 너무 커서 C로 변환 할 수 없습니다.

이 제 2 입력

[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 : 544564564545456 
Traceback (most recent call last): 
    File "./fermat.py", line 8, in <module> 
    for b in range(1,n+1): 
MemoryError 

의 한 종류이고,이 제 3 출력

[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 
사실

I가 코드를 작성 하였다위한 Fermat 인수 분해를 통해 주어진 수의 인자들을 찾는다. 그리고 나의 요구 사항은 백개의 숫자를 입력으로 주더라도 입력 번호에 대한 출력을 제공해야합니다.

이런 종류의 문제를 해결할 수있는 방법이 있습니까? 파이썬 2.7.5 이상에서 우분투를 사용하고 있습니다.

+3

처음 두 개의 추적 표시는 게시하지 않은 코드를 나타냅니다. 당신은'xrange()'대신에'range()'를 사용하여 너무 많은 원소를 가진리스트를 생성했습니다. 어쨌든 그러한 엄청난 요인에 대한 루프를 만들어서는 안됩니다. 어쨌든 * 적당한 시간 내에 코드가 완료되지 않습니다. –

+0

[Fermat 's factorization algorithm] (https://en.wikipedia.org/wiki/Fermat's_factorization_method)에서 이러한 루프를 만들 필요가 있음을 알 수 있습니까? –

+0

짝수에 대해 Fermat 인수 분해를 사용할 수 없습니다. – user2357112

답변

36

Annoyingly, Python 2에서 xrange은 인수가 C long에 맞아야합니다. 표준 라이브러리에는 대체가 없습니다. 그러나 드롭 인 대체가 필요하지 않습니다. 루프 break까지 계속 진행하면됩니다.

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

는 또한, 코드가 다른 버그가 있습니다 : 그것은 그냥가는에 지속적 xrange 같은 인 itertools.count을 것을 의미합니다. 그것은 짝수에 Fermat 인수 분해를 적용하려고 시도하지만, Fermat 인수 분해는 짝수에 대해서는 작동하지 않습니다. 또한 n이 정사각형 인 경우를 고려하지 않으므로 n=9에서 작동하지 않습니다.

관련 문제