Разница в нахождении простых множителей

При работе с модулем Python primefachttps://pypi.org/project/primefac/

Я заметил, что этот код работает:

import sys
import primefac
n = 600851475143
factors = list(primefac.primefac(n))

Но это не так:

import sys
import primefac
n = 19087688894909892783503691960213776632781962588843842839953893606139157282825376128877238229887486797933180624979637419997128020864299273315243907454874577263432419226852240380380880131843664800828228959920799327101817796594944161768692639537839544009100224905464911818390882192901883104039350105285757995782376058970382205463192526628231366854662473466838863987148898819243940809068605863725041711337107340279029811816555169181781669826715177100102639379572663639848699896757952171115689208069972249342540932428107175784150214806633479073061672324629925288020557720111253896992657435200329511186117042808357973613389
factors = list(primefac.primefac(n))

В результате следующая ошибка:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\primefac.py", line 677, in primefac
    f = multifactor(n, methods=methods, verbose=verbose)
  File "C:\Python27\lib\site-packages\primefac.py", line 596, in multifactor
    for p in procs: p.start()
  File "C:\Python27\lib\multiprocessing\process.py", line 130, in start
    self._popen = Popen(self)
  File "C:\Python27\lib\multiprocessing\forking.py", line 277, in __init__
    dump(process_obj, to_child, HIGHEST_PROTOCOL)
  File "C:\Python27\lib\multiprocessing\forking.py", line 199, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Python27\lib\pickle.py", line 224, in dump
    self.save(obj)
  File "C:\Python27\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python27\lib\pickle.py", line 425, in save_reduce
    save(state)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Python27\lib\pickle.py", line 687, in _batch_setitems
    save(v)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 754, in save_global
    (obj, module, name))
pickle.PicklingError: Can't pickle <function factory at 0x00000000032520B8>: it's not found as primefac.factory
type(n)Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python27\lib\multiprocessing\forking.py", line 381, in main
    self = load(from_parent)
  File "C:\Python27\lib\pickle.py", line 1384, in load
    return Unpickler(file).load()
  File "C:\Python27\lib\pickle.py", line 864, in load
    dispatch[key](self)
  File "C:\Python27\lib\pickle.py", line 886, in load_eof
    raise EOFError
EOFError

Кто-нибудь знает, почему это происходит?

В обоих случаях type(n) возвращает <type 'long'>


person Employee    schedule 18.01.2019    source источник
comment
Я считаю, что в обоих случаях n имеет правильный тип, но как насчет типов, используемых в этой библиотеке?   -  person Dominique    schedule 18.01.2019
comment
Случайное предположение: поместите активный код (после импорта) в блок if __name__ == "__main__":. В Windows есть некоторые проблемы с многопроцессорностью.   -  person Michael Butscher    schedule 18.01.2019
comment
@MichaelButscher ничего не меняется   -  person Employee    schedule 18.01.2019
comment
Запуск на MacOs не вызывал никаких исключений. Я считаю, что это что-то связанное с Windows.   -  person knh190    schedule 18.01.2019


Ответы (2)


Функция factory определена внутри другой функции multifactor в primefac.py.

pickle.PicklingError: не удается рассолить фабрику функций по адресу 0x00000000032520B8: она не найдена как primefac.factory

Pickle работает только с функциями верхнего уровня.

Если вы переместите эту функцию на верхний уровень, т. е. за пределы мультифактора в primefac.py, эта ошибка исчезнет.

person Ajay Srivastava    schedule 22.01.2019
comment
Спасибо за остроумное наблюдение. Я запустил скрипт и пока не получил ни одной ошибки, но машина все еще работает. Как только я увижу вывод факторов на консоль, я приму ваш ответ. Кстати: вам удалось заставить скрипт завершить свою работу и увидеть, что вывод был правильным? Моя машина все еще работает. - person Employee; 23.01.2019
comment
Машина все еще вычисляет и не возвращается... Я все еще жду - person Employee; 23.01.2019
comment
Моя система зависла. Процесс занял всю память. Итак, я сдался. - person Ajay Srivastava; 23.01.2019
comment
Я просто принудительно завершил процесс, потому что моя система тоже зависла. Но для того, чтобы быть уверенным в правильности своего ответа и принять его, должно быть достигнуто и доказано правильное функционирование - person Employee; 23.01.2019
comment
@Lossofhumanidentity Я не пробовал ваш код, но пробовали ли вы число, которое легче разложить? Это все еще может быть огромное число, но с множеством очень маленьких простых множителей. - person tobias_k; 23.01.2019
comment
@tobias_k скопируйте/вставьте мне число, о котором вы думаете, и я его проверю - person Employee; 23.01.2019
comment
@Lossofhumanidentity Что-то вроде 2**largenumber*3**largenumber*5**...*7**... Просто идея сузить проблему. - person tobias_k; 23.01.2019
comment
Не то, чтобы это имело значение, но пример OP - полупростой с очень похожими факторами. Так что OLF Ферма или Харта находит его легко. Как и последний яфу. Одним из факторов: 138158202416323775732758181522345834049037787229131795417941446702298473258343563193135609927838924393215490081927911051242414284813908013710478543881939279495893465648447667821464399443365370563999639701664554440716709602014683969079330309194498696044593783004289298158663252552132414967582447904614532945373. - person DanaJ; 08.02.2019

Вот мои два цента:

  • Попробуйте импортировать gmpy2, если у вас его еще нет.
  • #P2# <блочная цитата> #P3# #P4#
person IftahP    schedule 22.01.2019