Я полагаю, что не существует известного эффективного (полиномиального) алгоритма для этой задачи, поскольку существует полиномиальное сокращение времени от целочисленной факторизации до этой проблемы.Поскольку не существует известного алгоритма полиномиального времени для целочисленной факторизации, также не может быть известного алгоритма для вашей задачи, поскольку в противном случае у нас действительно был бы алгоритм полиномиального времени для целочисленной факторизации.
Чтобы увидеть, как это работаетПредположим, у вас есть номер n, который вы хотели бы принять.Теперь, используя любой алгоритм, который вы хотите, найдите общий множитель n и n, ближайший к √n.Поскольку нетривиальный делитель числа n не может быть больше, чем √n, он находит либо (1) наибольшее целое число, которое делит n, либо (2) число 1, если n простое число.Затем вы можете разделить n на это число и повторить, чтобы получить все факторы n.Поскольку n может иметь не более O (log n) факторов, для этого требуется не более полиномиального количества итераций решателя для вашей задачи, поэтому мы имеем сокращение за полиномиальное время от целочисленной факторизации до этой задачи.Как упомянуто выше, это означает, что, по крайней мере в открытой литературе, не существует известного эффективного классического алгоритма для решения этой проблемы.Кто-то может существовать, но это будет действительно очень важный результат.
Извините за отрицательный ответ, и надеюсь, что это поможет!