Який найшвидший алгоритм множення двох n-значних чисел?


21

Хочу знати, який алгоритм найшвидший для множення двох n-значних чисел? Космічну складність тут можна розслабити!


1
Вас цікавить теоретичне питання чи практичне запитання?
Yuval Filmus

Обидва, але більш схильні до практичного!
Енді

1
Для практичного запитання рекомендую використовувати GMP. Якщо вам цікаво, чим вони користуються, подивіться документацію або вихідний код.
Yuval Filmus

Ніхто не знає. Ми її ще не знайшли.
JeffE

Відповіді:


22

На сьогодні алгоритм Фюрера Мартіна Фюрера має складність у часі який використовує перетворення Фур'є на складні числа. Його алгоритм фактично заснований на алгоритмі Шенгаге та Страссена, який має часову складність Θ ( n log ( n ) log ( log ( n ) ) )nlog(n)2Θ(log(n))Θ(nlog(n)log(log(n)))

Інші алгоритми, швидші за алгоритм множення школи класу, - це множення Карацуби, яке має складність у часі на O ( n 1.585 ) та алгоритм Toom 3, що має складність у часі Θ ( n 1.465 )O(nlog23)O(n1.585)Θ(n1.465)

Зауважте, що це швидкі алгоритми. Пошук найшвидшого алгоритму множення є відкритою проблемою в інформатиці.

Список літератури:

  1. Алгоритм Фюрера
  2. Множення великої кількості на основі FFT
  3. Швидке перетворення Фур'є
  4. Множення Toom – Cook
  5. Алгоритм Шенгаге – Штрассена
  6. Алгоритм Карацуби

Зверніть увагу на нещодавній документ Д. Харві та Дж. Ван дер Хоевена (березень 2019 р.), Що описує алгоритм складності . O(nlnn)
hardmath

9

Зауважте, що алгоритми FFT, перелічені avi, додають велику константу, що робить їх непрактичним для чисел, менших ніж тисячі + біт.

Окрім цього списку, є ще деякі цікаві алгоритми та відкриті запитання:

  • Лінійне множення часу на моделі оперативної пам'яті (з попередньою обчисленням)
  • O(n2logn)1O(n2)O(logn)
  • Система залишків номерів та інші представлення чисел; множення - майже лінійний час. Мінус полягає в тому, що множення є модульним, і {виявлення переливу, парність, порівняння величин} всі такі ж важкі або майже такі ж важкі, як перетворення числа назад у бінарне чи подібне подання та проведення традиційного порівняння; ця конверсія є принаймні такою ж поганою, як і традиційне множення (на даний момент, AFAIK).
    • Інші представництва:
      • 16×32=2log216+log232=24+5=29
        • Зворотний перехід до логарифмічного подання і з нього може бути таким же важким, як множення або складніше, подання також може бути дробовим / ірраціональним / приблизним тощо.
      • 36×48=3251×223141=22324151
      • Нижня сторона - це потребує факторів чи факторизації - набагато складніша проблема, ніж множення. Інші операції, такі як додавання, ймовірно, дуже важкі.

1
Я вважаю, що підхід, орієнтований на теоретику залишків / китайської теорії, з правильними модулями може призвести до прискорення традиційного множення навіть при поверненні назад; в якийсь момент це було в розділі 4 TAOCP, принаймні як виноска. (Це все ще не наближається до методів на основі FFT, але це цікава історична примітка)
Steven Stadnicki

@StevenStadnicki о, круто, мені потрібно подивитися на це тоді; ви випадково знаєте складність?
Realz Slaw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.