Подтвердить что ты не робот

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 +

4b9b3361

Ответ 1

Раздражающе, в Python 2, xrange требует, чтобы его аргументы вписывались в C long. В стандартной библиотеке нет заметной замены. Однако вам не нужна замена. Вам просто нужно продолжать движение до цикла break s. Это означает, что вы хотите itertools.count, который похож на xrange, который просто продолжается:

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

Также обратите внимание, что в вашем коде есть другие ошибки. Он пытается применить факторизацию Ферма к четным числам, но факторизация Ферма не работает на четные числа. Кроме того, он не учитывает случай, когда n является квадратом, поэтому он не будет работать для n=9.