Хелпикс

Главная

Контакты

Случайная статья





Умножение методом Карацубы на FASM



Умножение методом Карацубы на FASM

 

1. Цель

 

Написать реализацию алгоритма Карацубы по быстрому умножению n-битовых чисел для десятичных чисел, чья длина не превосходит 30 символов.

 

Описание алгоритма в псевдокоде:

 

Процедура Karatsuba(x, y)

{

 

       ВХОД: положительные целые х, у

       ВЫХОД: ху

 

       n = max(размер х, размер у)

       если n ≤ 3 — вернуть ху

 

       P1_x, P2_x — левые ⌈ n/2⌉, правые ⌊ n/2⌋ разрядов числа х

       P1_y, P2_y — левые ⌈ n/2⌉, правые ⌊ n/2⌋ разрядов числа y

       P3_x = P1_x + P2_x

       P3_y = P1_y + P2_y

 

       P1 = Karatsuba(P1_x, P1_y)

       P2 = Karatsuba(P2_x, P2_y)

       P3 = Karatsuba(P3_x, P3_y)

           

       Вернуть P1 * 102⌊ n/2⌋ + P2 + (P3 — P2 — P1) * 10⌊ n/2⌋

}

 

2. Используемые обозначения

Число-строка — десятичное число, хранимое в памяти как строка.

 

Сегментированный буфер — буфер, логически разделённый на ячейки одинакового размера.

 

 

3. Общее описание работы программы

 

  1. Считывание строки в формате «< число_1> * < число_2> » из консоли.
  2. Обработка входной строки: вычленение < число_1> и < число_2>
  3. Вызов метода Karatsuba для произведения умножения < число_1> на < число_2>
  4. Вывод полученного произведения на консоль

 

 

4. Используемые методы

  1. input — чтение из строки
  2. get_length_number — вычисление длины полученного числа в буфере
  3. output — вывод результата на консоль
  4. add_simple — сложение двух однострочных число-строк, с учётом переноса. Вспомогательный метод.
  5. clean_buffer — принимает на вход указатель на буфер, который лежит в rax. Обнуляет первые 64 байта этого буфера.
  6. add_string — сложение двух чисел из буфера
  7. substract_simple - вычитание двух однострочных число строк, с учётом переноса. Вспомогательный метод.
  8. building_ten_degree — строит число-строку, являющуюся степенью десятки по заданной степени.
  9. buffer_equalizer — в результате вычитания число-строка может получиться по длине меньше, чем какая-либо из изначальных. Метод выравнивает число-строку слева.
  10. subtract_string — вычитание из одного числа другого
  11. cut_left — получение «левых разрядов» числа
  12. cut_right — получение «правых разрядов» числа
  13. multiply_string - «умножение» на степень десятки (сдвиг числа)
  14. decide_pointer — высчитывает текущий указатель на буфер на данной итерации рекурсивного вызова.
  15. parse_input — вытаскивает число-строки из введённых данных
  16. to_string_converter — преобразует числа в число-строки. Вспомогательный метод.
  17. to_number_converter — преобразует число-строки в числа. Вспомогательный метод.
  18. multiply_numbers — переводит в числа число-строки и перемножает их.
  19. Karatsuba — герой, что спасёт нас всех.

 

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.