На ваш вопрос уже дан ответ в статье, на которую вы ссылались: «Базовый шаг Карацубы работает для любой базы B и любого m, но рекурсивный алгоритм наиболее эффективен, когда m равно n / 2, округлено в большую сторону» ... n
- количество цифр, и 0 <= value_of_digit <B. </p>
Некоторая перспектива, которая может помочь:
Вам разрешено (и необходимо!) Использовать элементарный операций, таких как number_of_digits // 2
и divmod(digit_x * digit_x, B)
... в школьной арифметике, где B равно 10, вам необходимо (например) знать, что divmod(9 * 8, 10)
производит (7, 2)
.
При реализацииарифметика большого числа на компьютере, обычно делают В наибольшей степенью 2, которая будет удобно поддерживать элементарную операцию умножения.Например, в реализации CPython на 32-битной машине B выбирается равным 2 ** 15 (т.е. 32768), потому что тогда product = digit_x * digit_y; hi = product >> 15; lo = product & 0x7FFF;
работает без переполнения и не заботится о знаковом бите.
Я не уверен, что вы пытаетесь достичь с помощью реализации в Python, которая использует B == 2, с числами, представленными целочисленными значениями Python, чья реализация в C уже использует алгоритм Карацубы для умножения чисел, достаточно больших, чтобы сделать его стоящим,Это не может быть скорость.
В качестве учебного упражнения вы можете попытаться представить число в виде списка цифр, причем основание B является входным параметром.