Обновления
Хрущовки
Архитектура Румынии
Венецианское Биеннале
Столица Грац
Дом над водопадом
Защита зданий от атмосферных осадков
Краковские тенденции
Легендарный город Севастополь
Новый Париж Миттерана
Парадоксы Советской архитектуры
Реконструкция города Фрунзе
Реконструкция столицы Узбекистана
Софиевка - природа и искусство
Строительство по американски
Строительтво в Чикаго
Тектоника здания
Австрийская архитектура
Постмодернизм в Польше
Промышленное строительство
Строительство в Японии
Далее
|
Главная -> Вычислительные алгоритмы Используя описанную идею, процедуру на рис. 3.1 можно заменить более эффективной процедурой одновременного вычисления двух вещественных сверток, представленной на рис. 3.2. 3.2. Алгоритм Кука-Тоома Алгоритм Кука - Тоома является алгоритмом вычисления линейной свертки, который был разработан как метод умножения двух многочленов. Запишем линейную свертку в виде произведения двух многочленов S (X) = g (X) d (X), где deg d (х) = N - 1 и deg g (х) = L - 1. Степень многочлена S (х) равна N + L - 2, так что этот многочлен однозначно определяется своими значениями в N -\- L - 1 различных точках. Пусть Ро, Pi.....Pl+.v-i - множество из L + N - 1 различных вещественных чисел. Если нам известны Для k = О, 4 L - 1, то S (х) можно вычислить по интерполяционной формуле Лагранжа. Согласно теореме 2.7.10, многочлен Ilzi n(x-Pj) 1=0 1Ф1 является единственным многочленом степени л - 1, принимающим значения s (Pt) при х = Рй для всех ft = О, п- 1. Идея алгоритма Кука - Тоома состоит в том, чтобы сначала вычислить величины s (Р/) для k = О.....п - 1, а затем воспользоваться интерполяцией Лагранжа. Алгоритм Кука - Тоома приведен на рис. 3.3. Умножения даются равенствами s(Pi.) = g-(POd(Pf.), ft = 0, L + Af-2. Всего имеется L N - 1 таких равенств, так что здесь мы имеем L -\- N - 1 умножений, и, если разумно выбирать точки о полное число умножений будет исчерпываться этими умножениями. Имеются еще и другие умножения, а именно те, которые . входят в вычисление величин d (Р) и g (Рь), и те, которые участвуют в интерполяционной формуле Лагранжа. Но эти умножения представляют собой умножения на малые константы, и мы не будем их учитывать при подсчете полного числа умножений хотя полностью их игнорировать нельзя. ) На самом даде не учитывать можно только умножения на О и ±1; во, как правило, за счет некоторых предварительных проделанных раз и навсегда вычислений удается свести рассматриваемые константы к трем указанным. - Прим. перев.
Выход Рис. 3.3. Структура алгоритма Кука-Тоома. Простейшим- примером является линейная {2х2)-свертка; d{x)=dxyd, g{x) = gxX + gQ и s{x) = d{x) g{x). К такому вычищению сводится прохождение двух отсчетов данных через КИО-фильтр с двумя отводами. Очевидный алгоритм выполнение такого вычисления содержит четыре умножения и одно сложение, но мы построим алгоритм с тремя умножениями, тремя сложениями. Может показаться, что эта задача слишком мала для каких-либо практических применений. Но на самом деле хороший алгоритм решения этой задачи является хорошим блоком, из которого можно строить тщательно проработанные алгоритмы. Таким образом, рассматр;ваемый пример представляет собой нечто большее, чем простую иллюстрацию алгоритма Кука - Тоома; он важен практически В качестве первой попытки опишем алгоритм с тремя умножениями и пятьюсложениями, а затем его улучшим. Так как 1) Первым, еще до Тоома (1963) и Кука 0966), способ выполнения (2X2)-свертки с тремя умножениями и четырьм-: сложениями описал А. Карацуба [ДАН, 145 (1962), 293, 294]; его алгоритм- состоит в следующем: Sq = 4go, Sj = = igi. = ( + di) (go + gi), Sl = / - So - Eg. - Я/?ыж. перев. степень многочлена s (х) равна двум, то надо выбрать три точки. Выберем их равными Ро = О, Pi = 1 и р = -1. Тогда d (Ро) = do, g (Ро) = g , d (pi) = do + dl, g (Pi) = 0 + gi, d(M=d,~-d g(M=go~g, s (h) = g (Po) d (Po), s (Pi) = g (Pi) d (Pi), s (P.) = g (P.) d (PJ, так что требуются три умножения. Если КИО-фильтр задается фиксированным многочленом g {х), то константы g (р) не надо каждый раз вычислять заново; их можно вычислить заранее один раз и запомнить. Коэффициенты многочлена g {х) в запоминании не нуждаются. Наконец, согласно интерполяционной формуле Лагранжа s(x)=s (Ро) и () + S (Pi) Z-i (X) + s (PJ (X), где интерполяционные многочлены равны L, (д:) = -х + !, Li (х) = (1/2) (г* + л:), {х) = (1/2) (д:= - х). Это завершает описание алгоритма Кука - Тоома для вычисления S {х). Но вычисления можно организовать в более компактной форме. Деления на 2 можно похоронить так, чтобы они не были видны. Для этого просто заменим константы g (Рд) новыми, поглощающими этот делитель. Пусть Go = go, = (1/2) (go + G, = {\/2)(go-gi). Так как в большинстве случаев многочлен g (х) фиксирован, то эти константы можно вычислить заранее, и ничто не мешает нам определить их таким образом. Тогда Lo (х) = + 1, Li (х) = х + X, Lj {X) = X? - X. Построенный алгоритм показан на рис. 3.4, айв компактной форме может быть записан в матрично-векторных обозначениях в виде s = Cj[Bgl-[Ad], где точкой обозначено покомпонентное умножение векторов Bg и Ad. Матричная запись дает удобную форму обозрения алгоритма, но вычисления, конечно, проводятся не посредством умножения матриц. Умножение на матрицы А и С выполняется как серия сложений. Возможная последовательность вычислений показана на рис. 3.4, Ь.
D, = rf - d, s,i - So >] - Sl - s, 1, = -s. . s, + s.
Phc. 3.4. Алгоритм Кука-Тоома вычисления линейной свертки 2-точечных векторов. Алгоритм Кука Тоома можно рассматривать как факторизацию матрицы-ГЗ рассматриваемом примере свертка может быть записана в виде go gi О LS2 J или, кратко, S = Td- На для этой свертки переписан рис. 3.4с алгоритм Кука - Тоома с использованием диагональной матрицы, также обозначенной G и содержащей элементы вектора G. Алгоритм теперь имеет форму S = CGAd, что позволяет интерпретировать его как факторизацию матрицы Т = CGA, где А - матрица предсложений, С есть матрица постсложений, а G - диагональная матрица, ответственная за все умножения. Число умножений равно размерности матрицы О. Такое представление алгоритма очень полезно для обозрения его структуры. В общем случае линейная свертка может быть выражена в виде 5 = Td, где d - входной вектор длины Л, s - выходной вектор длины Л + Z. - 1 и Т представляет собой ({Л + L - 1) х Л)-матрицу, элементами которой являются компоненты вектора g. Алгоритм Кука - Тоома в такой форме представляет собой алгоритм факторизации матрицы Т = CGA, где G - диагональная матрица, а матрицы А и С содержат только малые целые числа. Алгоритм Кука - Тоома можно модифицировать к другому варианту, содержащему то же число умножений, но меньшее число сложений. Заметим, что = Sl-i-i- Для вычисле- ния этого коэффициента необходимо одно умножение. Степень модифицированного многочлена s(x)- Si .,xi+-2 = g (дг) d (X) - s ,x+- равна L -f - 3, так что использующее идеи алгоритма Кука - Тоома вычисление этого многочлена требует L N - 2 умножений. Общее число умножений опять равно L -\- Ы - 1, но сложений теперь будет меньше. Рассмотрим поведение этой модификации алгоритма Кука - Тоома при вычислении линейной (2х2)-свертки. Выберем Ро = О и Pi = -1. Тогда d (Ро) = do, g (P.) = go, d (Pi) = do~ di, g (Pi) =go-gi nPo)=g(Po}d(Po}-gid,p (() = g(Pi)d(?.)-gii,Pi. где t (x) = g (x) d (x) - gidx. Согласно интерполяционной формуле Лагранжа, s {х) ~gx = t (Pi) ti (X) -f i (P ) Lo (x), где Lo{x) = X + I и ii (x) = -x. Объединение всех этих фрагментов дает искомый алгоритм s(x) = gidix -f [-(do - di) (go - ffi) + g-idi + gAl * + godo- Алгоритм содержит три сложения и три умножения. Его матричная форма выписана на рис. 3.5, который полезно сравнить с рис. 3.4. Это приведенный на стр. 85 алгоритм А- Карацубы (1962), в котором не учтено в числе сложений вычисление go-ffi- - Прим. перев.
1 о 1 -1 О I Рис. 3.5. Улучшенный алгоритм Кука-Тоома вычисления линейной (2X2)-свертки. Алгоритм Кука - Тоома эффективен по числу умноженн но если объем задачи растет, то число необходимых сложений также начинает быстро расти. Это происходит потому, что хороший выбор чисел р, в виде О, 1 и -1 уже сделан, и с ростом задачи мы должны использовать также ±2, :t3 и другие малые целые числа. При этом матрицы А и С будут содержать эти числа. Конечно, умножения на них можно заменить соответствующим числом сложений, но это резонно делать только в случае, когда выбираемые числа малы. Поэтому алгоритм Кука - Тоома становится слишком громоздок при вычислении сверток, больших чем 3x4 или 4x4. Для больших задач надо пользоваться описываемыми в следующем разделе алгоритмами Винограда вычисления сверток или итерировать малые алгоритмы Кука - Тоома, используя изучаемые в гл. 7 гнездовые методы. Имеется еще один подход к пониманию алгоритма Кука - Тоома, и эта альтернатива перекидывает мостик к следующему Вход
Рис. 3.6. Другое описание алгоритма Кука-Тоома.
|