Twoje pytanie jest już odpowiedź w artykule, do której mowa: „Podstawowym krokiem Karatsuba za prace dla każdego bazowego B i każdy m, ale rekurencyjny algorytm jest najbardziej wydajny, gdy m jest równe n/2, zaokrągloną w górę”... n
oznacza liczbę cyfr, i 0 < = value_of_digit < B.
Niektóre perspektywicznym, który może pomóc :
Jesteś dozwolone (i wymagane!), Aby użyć elementarne operacje takie jak number_of_digits // 2
i divmod(digit_x * digit_x, B)
... w szkolnej arytmetyki, gdzie B to 10, jesteś wymagany (na przykład), aby wiedzieć, że divmod(9 * 8, 10)
produkuje (7, 2)
.
Podczas implementowania arytmetyki dużej liczby na komputerze, zwykle B jest największą potęgą 2, która będzie wygodnie obsługiwać elementarną operację mnożenia. Na przykład w implementacji CPython na maszynie 32-bitowej wybrano, że B wynosi 2 ** 15 (to jest 32768), ponieważ wtedy product = digit_x * digit_y; hi = product >> 15; lo = product & 0x7FFF;
działa bez przepełnienia i bez obaw o bit znaku.
Nie jestem pewien, co próbujesz osiągnąć za pomocą implementacji w Pythonie, która używa B == 2, z liczbami reprezentowanymi przez int Pythona, którego implementacja w C już używa algorytmu Karatsuba do mnożenia liczb, które są wystarczająco duże aby było warto. To nie może być szybkość.
Jako ćwiczenie do nauki, możesz spróbować reprezentować liczbę jako listę cyfr, przy czym podstawa B jest parametrem wejściowym.
Specjalnie dla podstawy b = 2? (łatwiejsze niż uogólnione b) – smci
Wiesz, że multiplikacje długich w pytonie używają mnożenia Karatsuba wewnętrznie? Zawsze możesz spojrzeć na źródło Pythona, jeśli chcesz mieć jakieś pomysły. –