Я прочитал где - то , что наиболее эффективный алгоритм найден можно вычислить факторы в время, но код я написал это или возможно зависимости от того, насколько быстры деление и модуль. Я почти уверен, что где-то что-то неправильно понял, но я не уверен, где. Вот что я написал в форме псевдокода.O ( n log n )
function factor(number) -> list
factors = new list
if number < 0
factors.append(-1)
number = -number
i = 2
while i <= number
while number % i == 0
factors.append(i)
number /= i
i++
return factors
complexity-theory
time-complexity
factoring
primes
EnderShadow
источник
источник
Ответы:
Вы путаете число с количеством битов, необходимых для представления n . Здесь b = количество битов, необходимых для представления n (поэтому b ≈ lg n ). Это имеет огромное значение. О ( п ) -time алгоритм является O ( 2 б ) -time алгоритм - экспоненциально зависит от числа битов. Для сравнения, «эффективный» алгоритм, который вы нашли, имеет время работы, которое является субэкспоненциальным в b .n n b= n b≈lgn O(n) O(2b) b
Пример: Рассмотрим (2 млн). Тогда b = 21 бит достаточно для представления числа n . Таким образом, алгоритм , который является O ( 2 б 1 / 3 ) будет гораздо быстрее , чем алгоритм , который является O ( 2 б ) . O ( п ) алгоритм относится к последней категории, то есть, очень медленно.n=2,000,000 b=21 n O(2b1/3) O(2b) O(n)
Смотрите https://en.wikipedia.org/wiki/Integer_factorization
источник
у вас есть примерно два вопроса, общий и конкретный о вашем коде. конкретный обрабатывается в другом ответе. общий вопрос в заголовке о сложности факторинга очень глубокий. к сожалению, нет убедительных научных доказательств того, что факторинг находится за пределами P, за исключением (в основном косвенных) «многих экспертов, которые пытались потерпеть неудачу», и некоторые эксперты предполагают, что он находится внутри P; это рассматривается как одна из главных (и очень трудно решаемых) открытых проблем теории сложности. после десятилетий «тяжелой атаки» лучшие алгоритмы экспоненциальны. сложность факторинга является одной из «немногих исключительных проблем», которые, как известно, лежат «между» P и NP завершенными, но до сих пор не классифицировались как ни одна.
Как указывалось, сложность не была большой проблемой, пока она не стала использоваться («примерно») в криптосистемах RSA в середине 1980-х годов, где криптографическая безопасность зависит от предположения. (две другие «не совсем обнадеживающие» связанные точки данных: алгоритм Шорса для квантового факторинга P-времени и тестирование простоты был доказан в P в начале 2000-х годов в знаменитом / знаменитом алгоритме AKS .) Возможный положительный результат будет состоять в том, что это в квазиполиномиальном времени , которое слабее, чем NP Complete (при условии, что P ≠ NP и NP complete имеет экспоненциальное время нижней границы ), но все еще технически "трудно".
до сих пор не нашли большой обзор по этому ключевому вопросу. Однако см. также
Факторинг может быть проще, чем вы думаете / Кон
Доказательство целочисленного фактора в P / mathoverflow (упоминание мыслей Сарнака в P и ответ Кон также)
«Миры Impagliazzos, личный взгляд на сложность среднего случая / Impagliazzo. Говорит о теоретических предположениях и предположениях о сложности, связанных с криптографией (например, факторингом). Многие / большинство ключевых (например, P против NP и т. Д.) Все еще открыты спустя десятилетия.
источник