Щоб розширити ідею Стівена Стадницького, ми можемо швидко побудувати наївний алгоритм, який краще, ніж матричне множення, використовуючи дискретні перетворення Фур'є.
Ми розраховуємо кількість одиниць в . Якщо менше половини бітів є одиницями, ми будуємо пов'язаний список їх позицій. Щоб помножити, ми просто зміщуємо ліворуч на кожну позицію у списку (множимо на той біт, який представлений) і додаємо результати.БAB
Якщо більше половини бітів є одиницями, ми робимо те саме, що вище, але замість нулів використовуємо для заповнення списку позицій. Ідея полягає в тому, що ми віднімемо цю суму від суми, яка була б отримана шляхом множення на всі. Щоб отримати суму всіх одиниць, зсуваємо на кількість бітів в і віднімаємо від цьогоТоді ми можемо відняти отриману суму із пов'язаного списку.А БBAB
Це можна назвати алгоритмом наївного зв'язаного списку. Час його роботи становить в гіршому випадку, але в середньому випадку, що швидше, ніж DFT для малих.O ( | B | √O(n2)| А|O(|B||A|2π−−−√)|A|
Щоб оптимально використовувати ідею списків, ми використовуємо ділити і перемагай. Ми розділимо навпіл і знайдемо розміри пов'язаних списків за допомогою наївного алгоритму. Якщо їх більше 5, ми знову викликаємо алгоритм наївності на половини, більші за 5, поки нам не вдасться розрізати всі половинки на менше п'яти. (Це тому, що ми можемо зменшити це до 4 віднімань)A
Ще краще, ми вдосконалюємо наш алгоритм розділення і перемоги. Ми повторюємо всі можливі комбінації розгалуження, жадібно підбираючи найкраще. Ця попередня обробка займає приблизно стільки ж часу, скільки і фактичне множення.
Якщо нам дозволяється нескінченна свобода з попередньою обробкою, ми оптимально вирішуємо оптимізований алгоритм ділення і перемоги для всіх гілок. Це вимагає часу в гіршому випадку, але це повинно бути оптимальним методами ланцюгового додавання.O(2|A|)
Я працюю над обчисленням більш точних значень для вищезазначених алгоритмів.