Сложность в худшем случае:
for(..)
выполняется sqrt(A)
раз
Тогда while(..)
зависит от простой факторизации A=p_1^e1*p_2^e_2*..*p_n^e_n
, поэтому Max(e_1,e_2,..,e_n)
наихудший случай или примерно Max(log_p_1(A),log_p_2(A),..)
Максимум while(..)
будет исполняться log(A)
приблизительно раз.
, поэтому общая грубая сложность в худшем случае = sqrt(A)*log(A)
, исключая постоянные факторы
Наихудшая сложность возникает для чисел A
, которые являются произведениями разных целых чисел ie A = n_1^e_1*n_2^e_2*..
Сложность в среднем случае:
Дано чисел, которые являются произведениями разных целых чисел более многочисленны, чем числа, которые являются просто степенями одного целого числа, в данном диапазоне, тогда выбор случайного числа, скорее всего, будет произведением различных целых чисел, ie A = n_1^e_1*n_2^e_2..
. Таким образом, сложность среднего случая примерно такая же, как сложность в худшем случае ie sqrt(A)*log(A)
сложность в лучшем случае:
сложность в лучшем случае возникает, когда число A
действительно степень одного целого числа / простого числа ie A = n^e
. Тогда алгоритм в этом случае занимает меньше времени. Я оставляю это как упражнение для вычисления сложности в лучшем случае.
PS. Другой способ убедиться в этом - понять, что, проверяя, является ли число степенью простого / целого числа, фактически нужно преобразовать число в его простое факторизацию (что и делается в этом алгоритме), что по сути сложность (см., например, сложность факторинга по пробному делению ).
SO должен иметь поддержку mathjax, поскольку cs.stackexchange имеет: p!