А делается только два допущения.
Первое - искомое число находится между девятками. То есть искомое число больше либо равно 900 009. Очень сильно сокращает количество итераций ибо используются пары чисел (x,y) с соответствующими окончаниями (1,9) (3,3) (7,7) (9,1)
Второе - очень сомнительное и кривое. Проверки то нет.
Но у DeFoR'a допущений больше в последнем алгоритме.
А изначальный вариант выглядел вот так:
def get_max_polindrome(length=3):
i1 = int("9" * length)
count = 0
max_polindrome = [0,0,0]
min_val = 100
for i in range(i1, 0, -1):
for j in range(i, min_val, -1):
test_val = i * j
if test_val > max_polindrome[0]:
if is_polindrome(test_val):
min_val = j
max_polindrome = [test_val, i, j]
break
else:
min_val = j
break
if i < min_val:
break
return max_polindrome
Таким образом, если мы нашли полиндром, нет необходимости постоянно уменьшать Y до ста.
ред… Ой. И ещё одно - если получено число X * Y меньше чем уже найденный полиндром, то уменьшая Y мы уже не найдём большего полиндрома. И соответственно в дальнейшем, опять же, не имеет смысла проверять Y меньше полученного (согласно выше описанному правилу).