OverflowError Python int слишком большой, чтобы преобразовать в C long
#!/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
когда я запускаю этот код, он бросает разные типы ошибок для разных входов.
Ниже приведен один вид ввода
[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
На самом деле я писал код для факторизации Ферма, чтобы найти факторы заданного числа. И мое требование, даже если дать сотню цифр в качестве входных данных, должно дать вывод для этого номера ввода.
Есть ли способ избавиться от этой проблемы?
Я использую Ubuntu с python 2.7.5 +
Ответы
Ответ 1
Раздражающе, в Python 2, xrange
требует, чтобы его аргументы вписывались в C long. В стандартной библиотеке нет заметной замены. Однако вам не нужна замена. Вам просто нужно продолжать движение до цикла break
s. Это означает, что вы хотите itertools.count
, который похож на xrange
, который просто продолжается:
import itertools
for b in itertools.count(1):
...
Также обратите внимание, что в вашем коде есть другие ошибки. Он пытается применить факторизацию Ферма к четным числам, но факторизация Ферма не работает на четные числа. Кроме того, он не учитывает случай, когда n
является квадратом, поэтому он не будет работать для n=9
.