Re: Марти, курни моей травы!
От: ravik  
Дата: 21.06.25 21:20
Оценка:
Как следует из описания метода Карацюбы, вместо четырех умножений потребуется три. Например, если нужно перемножить число из 4-х блоков, не принципиально в какой разрядности, на число из 3-х блоков, то на аппаратном уровне потребуется 12 команд mul при умножении столбиком, соответственно по Карацюбе — только 9. Я тут посчитал, по моему методу тоже потребуется 9 умножений, но это реально заумь.

Смотри, квадрат x отличается от квадрата соседнего числа x + 1 на 2x + 1, это школьники знают. Мы, в отличие от школьников, понимаем, что основание квадрата изменяется при добавлении 1 в 0-й бит. И можем построить формулу при инкрементировании любого бита:

2^(i + 1) * x + 2^(2i), где i — индекс инкрементируемого разряда. Подставь вместо i нолик, получишь "школьную" формулу.

А теперь представим, что добавляем не по одному биту, а целым блоком по смещению i (по границе блока) — как изменится формула? А вот так:

2^(i + 1) * x * y + 2^(2i) * y^2, где y — целый блок битов.

Известно, что любое произведение нечетных чисел можно представить в виде разницы квадратов (метод факторизации Ферма). У нас как бы обратная задача, нам не разложить число надо, а получить. Короче, вычисляем не произведение, а разность квадратов. У меня получается столько же умножений, сколько у Карацюбы. Есть один минус, по крайней мере для тебя: формула расчитана на двоичный формат, а ты, помнится, пилишь десятичный.

P.S. Прикинул еще раз — можно исхмтриться, и в исходном примере обойтись не 9, а 7 умножениями. Семью, Марти! Пошли на Абеля, а? На подсанкционного...


P.P.S. И все же 9... Квадрат у игрека забыл подставить... отбой с Абелем.
Отредактировано 21.06.2025 21:54 ravik . Предыдущая версия . Еще …
Отредактировано 21.06.2025 21:44 ravik . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.