Dark_Knight
@Dark_Knight
Game Dev

Кто может объяснить алгоритм Умножение Карацубы?

Здравствуйте, подскажите пожалуйста.
Разбираю алгоритм умножения Карацубы и столкнулся с проблемой, что не могу понять как работает правильно step5.
То есть, мы взяли step1 и добавили к нему четыре нуля, почему?
Потому что в step2 у нас четыре цифры?
Почему в step4 мы добавили два нуля?
Пожалуйста, объясните "на пальцах", как правильно работать с этой формулой и как правильно получить step5, а точнее, как и откуда берутся эти нули.
Спасибо за помощь и ваше время.
  • Вопрос задан
  • 6172 просмотра
Решения вопроса 1
@Sumor
ab × cd
По формуле получаем:
(a × c) × 1000   +   b × d   +   ( (a + b) × (c + d) - a × c - b × d ) × 100 =
= 1000 × a × c + b × d  + ( a × c + a × d + b × c + b × d - a × c - b × d ) × 100 =
= 1000 × a × c + b × d  + ( a × d + b × c )  × 100 =
= 1000 × a × c + 100 × a × d + 100 × b × c + b × d

Итого получили классическое умножение столбиком, только в стоичной системе счисления.
Только в классическом умножении у нас четыре умножения, а в предложенном алгоритме всего три.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
На пальцах. Предположим что у нас есть два целых числа размерностью n. Тогда
X = 10^(n/2) * a + b;
Y = 10^(n/2) * c + d;


Перемножим:
X * Y = (10^(n/2) * a + b) * (10^n/2 * c + d)

Или если упростить

X * Y = 10^n * ac + 10^(n/2) * (ad + bc) + dc;
Или если добавить переменных:

s1 = ac; // step 1
s2 = bd; // step 2
s3 = ad + bc; //step 3
X * Y = 10^n * s1 + 10^(n/2) * s3 + s2;


По сути пятый стэп - это как раз таки вот эта формула.

Вся соль в том, что когда мы вычисляем s1 или s2 или s3 мы опять имеем дело с умножением и можем применить этот же алгоритм, рекурсивненько уменьшая размерность операндов, за счет чего понижается количество необходимых операций.

@updated: исправил опечатки.
Ответ написан
@Anton_Menshov
Аспирант в области вычислительной электродинамики
В дополнение к вышестоящим объяснениям добавлю: мне сначала было легче разобраться с быстрым умножением матриц (умножение Штрассена, https://ru.wikipedia.org/wiki/Алгоритм_Штрассена). Это один из самых наглядных (в математическом смысле) быстрых алгоритмов типа "разделяй и властвуй". Для меня проще думать в терминах матриц, нежели составных частей чисел.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы