Как сравнить различные алгоритмы умножения по диапазону чисел

#python #multiplication #karatsuba #gmpy #strassen

#python #умножение #карацуба #gmpy #strassen

Вопрос:

Проходя лекцию MIT в MITOpencourseware (6.006 лекция 12), я наткнулся на упоминание о 4 алгоритмах умножения (для умножения двух n-значных чисел) —

  1. Обычный наивный подход со сложностью O (n ^ 2)
  2. Алгоритм Карацубы — O(n ^ 1.584)
  3. Toom-Cook(Toom3) — O (n ^ 1.465)
  4. Schonhage-Strassen — O(nlog(n)log(log(n)))

Теперь нужно исследовать, в каких пороговых точках (т. Е. Значениях n) Один метод превзошел другой в качестве лучшего алгоритма. Упоминалось, что все вышеперечисленное находится в пакете gmpy.

Чтобы попробовать это, я обратился к документации пакета gmpy2 по следующей ссылке — https://gmpy2.readthedocs.io/en/latest/intro.html

Однако, просматривая части этой документации, казалось, что gmpy2 больше подходит для работы с большими числами. В частности, я не нашел отдельных функций, реализующих каждый из этих 4 алгоритмов. Итак, есть ли какие-либо части gmpy2, где реализованы эти алгоритмы, чтобы я мог построить график времени выполнения этих алгоритмов в отношении n (количество цифр)?

Ответ №1:

Я сопровождающий gmpy2.

gmpy2 напрямую не реализует никаких алгоритмов умножения. Он просто вызывает алгоритмы, реализованные в GMP

Много лет назад я написал чистую реализацию Python арифметики с множественной точностью. Для умножения используются свертки naive, Karatsuba, Toom-3, Toom-4 и Nussbaumer. (Интересно, что если вы выберете достаточно большую точность, решение на чистом Python, которое рекурсивно вызывает Toom-4, Toom-3, Karatsuba, может быть быстрее, чем версия Karatsuba only, используемая в Python и написанная на C.) Также реализована пара разных алгоритмов деления.

Легко модифицировать код и добавить глобальную переменную, чтобы подсчитать, сколько раз выполняется каждый шаг.

Его можно найти в DecInt