Что произойдет при возведении 2 в 10000 степень в Python
Что проверяют
Знаете ли, что целые числа в Python произвольной точности, и понимаете ли цену этого свойства: что достаётся бесплатно, а что нет.
Как отвечать
Операция выполнится, переполнения не будет: у int нет фиксированной ширины, число занимает столько памяти, сколько нужно. Результат это целое из 3011 десятичных цифр.
n = 2 ** 10000
n.bit_length() # 10001
len(str(n)) # 3011Дальше полезно показать понимание стоимости. Само возведение быстрое: используется двоичный алгоритм, то есть порядка десятка умножений с возведением в квадрат, а не десять тысяч перемножений. Память тоже скромная, около полутора килобайт против 28 байт у маленького числа. Дорогим оказывается другое: перевод в строку и печать, а также деление и взятие остатка в цикле, потому что операции с длинными числами не константные по времени.
Ещё два факта, которые отличают подготовленного кандидата:
- вещественная версия падает.
2.0 ** 10000даётOverflowError, потому чтоfloatэто 64 бита по стандарту IEEE, и потолок у него около 1.8 на 10 в 308 степени. По той же причине падаетmath.sqrt(2 ** 10000): аргумент сначала приводится кfloat; - у перевода большого числа в строку есть ограничение по количеству цифр, по умолчанию около четырёх тысяч, оно снимается через
sys.set_int_max_str_digits. Наши 3011 цифр в лимит укладываются, а2 ** 100000уже нет.
Где спотыкаются
Отвечают «переполнится» или «получится бесконечность» по памяти о C и Java. В Python переполнения целых нет вообще, есть только исчерпание памяти на действительно огромных значениях.
Второе: считают, что раз число большое, то и операция долгая. Возведение мгновенное, время съедают печать и последующая арифметика.
Третье: смешивают целые и вещественные. Для целочисленных задач есть math.isqrt, pow(a, b, m) с модулем и целочисленное деление, и как только в цепочке появляется float, точность и диапазон теряются сразу.