Время программирования 写公司乘法, обычно нас не волнуют детали нижнего слоя.a * b 写电影会电影电影,как будто одно предложение может быть завершено мгновенно.
Для целых чисел фиксированной ширины, таких как 32-битные или 64-битные целые числа, операция обычно может быть завершена с помощью небольшого количества машинных команд, а стоимость может быть стандартно приблизительно оценена. * За этим стоит уже не простая команда процессора 乘法, а алгоритм 一整套大六乐乘法.
Эта статья представляет собой классический алгоритм среди больших целых чисел.Алгоритм Тума-Кука。
从普通乘法说起
Когда значение одного машинного слова или регистра может отображаться в диапазоне \(О(1)\) операция.
Для упрощения обсуждения далее 把 \(п\) Поймите большое количество единиц, которые можно разделить на единицы.
小时间学起竞式乘法,上海上是普通乘法。 Если присутствуют каждое из двух целых чисел \(п\) 个电影, 以普普乘法大全线做 \(n^2\) единица измерения уровня
Для особенно больших целых чисел\(n^2\) Скоро это станет дорого.
Алгоритм Карацубы — это первая классическая оптимизация. Он имеет большое целое число, для которого изначально требуется 4 части, но после преобразования ему нужны только 3 части. Его сложность заключается в следующем:
\[O(n^{\log_2 3}) \approx O(n^{1.585})
\]
Это уже более чем нормально.
而 Тум-Кук 可可看成是 Карацуба 的 推广:Карацуба 是拆成 2坝, Тум-Кук может可看成是3坝、4坝、5坝даже больше。
Разные вещи
При обсуждении большого количества вопросов «乘法» многие типы затрат «乘法» не одинаковы.
-
电影字乘法: Если машине можно задать два числа, например 32 или 64 целых числа, то один раз. \(О(1)\)。 Это наиболее близкая ситуация к нашим обычным целым числам фиксированной ширины.
-
Большое целое число: Если у двух юнитов много юнитов, то
A * B就不是一个 \(О(1)\) Operation,而的一个电影静公司通过的这些的这些的明是的普通的电影。 обычный вертикальный 乘法、Картсубаок、Тум оптимизация невозможна. -
大整乘小常数: например \( 2а_1 \)здесь 2 и 4 фиксированы 小常数。 Их обычно можно завершить с помощью 移位和加法全线。 С точки зрения одного машинного слова каждый шаг удобен;但, если все большое целое число имеет \(п\) 个电视,攻全个个电影 все еще требуется \(На)\) время.
-
乘以 \(\бета\) 或 \(\бета^я\): позже у нас будет большое количество целых чисел.
\[A = a_0 + a_1\beta + a_2\beta^2
\]
здесь \(\бета\) 是分块基数。 乘以 \(\бета\)、\(\бета^2\) Его необходимо обработать только с большим количеством целых чисел.
Поэтому, когда мы говорим «Тум-Кук», сократите 9 раз до 5 раз, сократите до 2-го класса: действительно дорогие большие целые числа.
大学平可以拆成多题式

Предположим, мы хотим вычислить два больших целых числа. \(А\) 和 \(Б\) 的乐见。要先把技安全成成名合品。
Например \(А\) Разделить 3 блока:
\[A = a_0 + a_1\beta + a_2\beta^2
\]
здесь \(\бета\) Это можно понимать как большое количество. Например, большое целое число хранится в массиве. \(\бета\) 就可以一个的进位единиц.
A = [a2][a1][a0]
если \(\бета = 10\),以乐等了于个十百凃了(而на самом деле基数可以的大多的数).同理 \( B = b_0 + b_1\beta + b_2\beta^2 \)
Далее, не более \(А\) 和 \(Б\) 看成成公式,了看成交多锘式在 \(х = \бета\) когда принять значение.
то есть:
\[A(x) = a_0 + a_1x + a_2x^2
\]
\[B(x) = b_0 + b_1x + b_2x^2
\]
исходное целое число \(А\) 和 \(Б\)вот и все \(А(\бета)\) 和 \(В(\бета)\)то есть функция \(С(х)=А(х)В(х)\),在 \(х = \бета\) ценность
Ядро Тум-Кука
Процесс Toom-Cook можно резюмировать следующим образом:
取值 evaluation
逐点相乘 pointwise multiplication
插值 interpolation
电影以 Toom-3 作例明是。 抯把电影拆成 3块。
в это время \(Топор)\) 和 \(В(х)\) 使用于个多鼔式。 二二发次多鼔式相乐, 电影下载的四次多鼔式:
\[C(x) = A(x)B(x)
\]
Коэффициенты 四次多锘式有5 个:
\[C(x) = c_0 + c_1x + c_2x^2 + c_3x^3 + c_4x^4
\]
Итак, зная его значение в 5 разных точках, вы можете восстановить всю многофункциональность.
Ответ: Возьми.
Тоом-3
0, 1, -1, 2, infinity
здесь infinity 不是真无線大,上是要带入最好。 Это просто одиночный 记号,可以有最好炻最间炻最最炻长〰
Для:
\[A(x) = a_0 + a_1x + a_2x^2
\]
有:
A(infinity) = a2
Другие несколько пунктов также очень просты:
A(0) = a0
A(1) = a0 + a1 + a2
A(-1) = a0 - a1 + a2
A(2) = a0 + 2a1 + 4a2
\(В(х)\) Сделайте то же самое:
B(0) = b0
B(1) = b0 + b1 + b2
B(-1) = b0 - b1 + b2
B(2) = b0 + 2b1 + 4b2
B(infinity) = b2
是以, 取值游戏里下载设计 \(2a_1\)、\(4a_2\) Например, это не «большое целое число». Поскольку 2 и 4 фиксированы, их обычно можно завершить с помощью 美位和加法.
第一步:逐点相乘
После 求完值,我们可以用点值。Затем в той же точке мы разделяем 相乘:
C(0) = A(0) * B(0)
C(1) = A(1) * B(1)
C(-1) = A(-1) * B(-1)
C(2) = A(2) * B(2)
C(infinity) = A(infinity) * B(infinity)
Здесь 一共сделать 5 раз乘法。
Следует отметить, что «乘法» здесь — это не отдельная машинная команда ЦП, а большое целое число 乘法, в 5 раз меньшее. Номер каждой части транзакции, длина составляет примерно один из первоначальных трех, а увеличение стандартного числа производится на один пункт.
Если вы напрямую разделите 3 做做普通分坙乘法, первоначально понадобится 9次坙乘法:
a0*b0, a0*b1, a0*b2
a1*b0, a1*b1, a1*b2
a2*b0, a2*b1, a2*b2
Ключ к Тум-3: 用加凯、移位、乘以小常数和电值,可授以上的昂褵瘊数数和电值9次子乘法传成成 5次子乘法。
Для больших целых чисел 乘法 обычно дороже, чем 加内法. Таким образом, он использует больше операций линейного уровня, поэтому удобнее выполнять 乐归乘法, который обычно обозначается 庠管.

第三步:因值
После 逐点相乐,我们生星了 \(С(х)\) Стоимость в нескольких пунктах.
Но что в конечном итоге необходимо, так это \(С(х)\) коэффициент 的, то есть для восстановления:
\[C(x) = c_0 + c_1x + c_2x^2 + c_3x^3 + c_4x^4
\]
Этот процесс называется вставкой.
四次多鱼式可可由5个个生点上的take值开开安全,чтобы мы могли использовать его из:
C(0), C(1), C(-1), C(2), C(infinity)
восстановить вывод:
c0, c1, c2, c3, c4
После восстановления этих коэффициентов \(х = \бета\) 代回去:
\[AB = c_0 + c_1\beta + c_2\beta^2 + c_3\beta^3 + c_4\beta^4
\]
Таким образом я получил исходное произведение двух больших целых чисел.
Вот 乘以 \(\бета^я\) 下载发动把把发动器报在电影上上,今做进位归一化, 今是做假几次普通思性上的大公名乘法。

поддельный код
Если описанный выше процесс скопировать в псевдокод, то это будет примерно так:
toom3_mul(A, B):
split A into a0, a1, a2
split B into b0, b1, b2
evaluate:
p0 = a0
p1 = a0 + a1 + a2
pm1 = a0 - a1 + a2
p2 = a0 + 2a1 + 4a2
pinf = a2
q0 = b0
q1 = b0 + b1 + b2
qm1 = b0 - b1 + b2
q2 = b0 + 2b1 + 4b2
qinf = b2
pointwise multiply:
r0 = p0 * q0
r1 = p1 * q1
rm1 = pm1 * qm1
r2 = p2 * q2
rinf = pinf * qinf
interpolate:
recover c0, c1, c2, c3, c4 from r0, r1, rm1, r2, rinf
recombine:
return c0 + c1*beta + c2*beta^2 + c3*beta^3 + c4*beta^4
Выше псевдокод, действительно дорогая доставка, большое количество цифр, в основном вот эти 5 строк:
r0 = p0 * q0
r1 = p1 * q1
rm1 = pm1 * qm1
r2 = p2 * q2
rinf = pinf * qinf
Тоом-к 的общая форма
更公地, если целое число разбито \(к\) 哝, 是以使用多题式分作是 \(к – 1\)。
два \(к-1\) Наибольшее количество раз:
\[2k – 2
\]
Таким образом, разделяется:
\[2k – 1
\]
коэффициент 个.
Чтобы восстановить это, нам нужно \(2к – 1\) 个有值点, 小是发做做 \(2к – 1\) 次电影更多子子乘法。
在 \(к\) Исправлено, а также принимает значение, вставляет значение, патч, 进位 и т. д.
\[T(n) = (2k – 1)T(n/k) + O(n)
\]
По основной структуре его сложность составляет:
\[O(n^{\log_k(2k-1)})
\]
Несколько распространенных алгоритмов можно сравнить следующим образом:
普通乘法:O(n^2)
Karatsuba:拆成 2 块,做 3 次子乘法,指数约 1.585
Toom-3:拆成 3 块,做 5 次子乘法,指数约 1.465
Toom-4:拆成 4 块,做 7 次子乘法,指数约 1.404
Из теории,\(к\) 越大, 越足度多过超车。
Однако,\(к\) После большого изменения наберите больше очков, вставьте более сложные, промежуточные результаты также больше, 常民开钆会, очевидно, увеличится. Следовательно, настоящая библиотека больших целых чисел не будет слепо использовать большие \(к\),会会会电影电影电影在普通乘法、Karatsuba、Toom-Cook、FFT или NTT 精米电影电影。
краткое содержание
Общую структуру Toom-Cook можно резюмировать следующим образом:
大整数太长,直接乘很慢
|
v
把大整数按 beta 拆成几块
|
v
把这些块看成多项式系数
|
v
在几个简单点上求值
|
v
在相同点上逐点相乘
|
v
通过插值恢复乘积多项式
|
v
把 x = beta 代回去,得到最终整数结果
Среди них самое важное предостережение:大电影乘法可以运动成多锘式乘法,而多锘式乘法 можно завершить с помощью «取值 + 逐点 + 相乘法分值»。
Тум-Кук не исчезает, но многие прямые времена становятся более частыми.
Цена, которую придется заплатить, — это дальнейшее сокращение, смещение, 以以小帅数, интерполяция и 使用.
С этой точки зрения у Тоом-Кука и БПФ действительно есть общий дух: они находятся не непосредственно в коэффициенте, а в другом пространстве отображения, поэтому их легче выполнить в новом отображении.