Як вже зазначає @DavidRicherby, плутанина виникає через те, що різні заходи складності змішуються. Але дозвольте мені трохи детальніше.
Зазвичай, вивчаючи алгоритми множення поліномів на довільні кільця, цікавить кількість арифметичних операцій у кільці, яке використовує алгоритм. Зокрема, враховуючи деяке (комутаційне, унітарне) кільце та два многочлени ступеня менше , алгоритм Шенгаге-Штрассена потребує множення та доповнення в , щоб обчислити , приблизно, примикаючи до -го примітивних коренів єдності до щоб отримати трохи більше кільце а потім, використовуючи швидкий Перетворення Фур'є черезf , g ∈ R [ X ] n O ( n log n log log n ) R f g ∈ R [ X ] n R D ⊃ R D DRf,g∈R[X]nO(nlognloglogn)Rfg∈R[X]nRD⊃RD, Обчислюючи продукт в .D
Якщо ваше кільце містить -й корінь з одиниці, то це може бути прискорене до операцій в за допомогою швидкого перетворення Фур'є безпосередньо над . Більш конкретно, над це можна зробити за допомогою кільцевих операцій (ігноруючи той факт, що це вимагатиме точної арифметики над складними числами).O ( n log n ) R R Z ⊂ C O ( n log n )nO(nlogn)RRZ⊂CO(nlogn)
Іншим заходом, який можна врахувати, є бітова складність операції. І це те, що нас цікавить при множенні двох цілих чисел бітової довжини . Тут примітивні операції - це множення і додавання двох цифр (з перенесенням). Отже, при множенні двох многочленів на вам потрібно враховувати той факт, що числа, що виникають під час обчислення, не можна перемножувати, використовуючи постійну кількість примітивних операцій. Це та факт, що не має -го примітивного кореня єдності для заважає застосувати алгоритм . Ви долаєте це, вважаючиZ Z п п > 2 Про ( п увійти п ) е , г Z / ⟨ 2 п + 1 ⟩ п 2 п Про ( п увійти п увійти журналу п )nZZnn>2O(nlogn)f,gз коефіцієнтами з кільця , оскільки коефіцієнти многочлена добутку не перевищуватимуть цю межу. Там (коли - потужність двох), ви маєте (клас конгруентності) як -й корінь єдності, і рекурсивно викликаючи алгоритм множення коефіцієнтів, ви можете досягти загального примітивні (тобто, бітові) операції. Потім це переходить до цілого множення.Z/⟨2n+1⟩n2nO(nlognloglogn)
Для прикладу, який добре підкреслює важливість різниці між операціями кільця та примітивними операціями, розглянемо два методи оцінки поліномів: метод Хорнера та метод Естріна. Метод Горнера оцінює поліном на деякому , використовуючи тотожність
тоді як метод Естріна розбивається на дві частини
і
тобто містить терміни ступеня а терміни ступеняf=∑ni=0fiXix∈Z
f(x)=(…(fnx+fn−1)x+…+…)+f0
fH=∑i=1n/2fn/2+iXi
L=∑i=0n/2fiXi
H>n/2L≤n/2(припустимо, - сила двох, для простоти).
n
Тоді ми можемо обчислити використовуючи
і застосовуючи алгоритм рекурсивно.f(x)
f(x)=H(x)xn/2+L(x)
Перший, використовуючи додавань і множень, виявився оптимальним wrt числом додавань і множень (тобто кільцевих операцій), другий потребує більшої кількості (принаймні ).nn+logn
Але, на рівні бітових операцій можна (досить легко) показати, що в гіршому випадку метод Горнера виконує множення чисел розміром принаймні , що призводить до безлічі біт операції (це справедливо, навіть якщо припустити, що два бітні числа можна помножити за часом ), тоді як схема Естріна використовує операції для деяких , що, безумовно, асимптотично швидше.n / 2 Ω ( n 2 ) n O ( n ) O ( n log c n ) = ˜ O ( n ) c > 0n/2n/2Ω(n2)nO(n)O(nlogcn)=O~(n)c>0