Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Алгоритм Тоома Кука




Быстрое преобразование Фурье

Будем считать, что наш многочлен имеет степень n = 2k. Если нет, дополним старшие коэффициенты нулями до ближайшей степени двойки.
Основная идея БПФ:
Пусть:
A (x)= a0 + xa2 + x2a4 + ... + xn / 2 - 1 an - 2 (четные коэффициэнты P)
B (x)= a1 + xa3 + x2a5 + ... + xn / 2 - 1 an - 1 (нечётные коэффициенты P).
Тогда P (x)= A (x2)+ xB (x2).
Теперь применим принцип «разделяй и властвуй»: чтобы посчитать значения P в n точках (ω 01, ...), посчитаем значения A и B рекурсивно в n / 2 точках (ω 02, ...). Теперь значение Pi) восстановить достаточно просто:
Pi)= A2i)+ω iB2i)
Если обозначить за ξ i2i точки, в которых мы считаем значения многочлена степени n / 2, формула преобразится:
Pi)= Ai)+ω iBi)
Её уже можно загонять в программу, не забыв что i принимает значения от 0 до n - 1, а ξ i определено лишь от 0 до n / 2 - 1. Вывод — надо будет взять i по модулю n / 2.
Время работы выражается рекуррентной формулой T (n)= O (n)+ 2T (n / 2). Это довольно известное соотношение и оно раскрывается в O (n ⋅log 2n) (грубо говоря, глубина рекурсии — log 2n уровней, на каждом уровне суммарно по всем вызовам выполняется O (n) операций).

 

Исходными данными служат два положительных длинных числа [n, u] и [n, v]; результатом - их произведение [2n, uv]. Используются четыре стека U, V, W и C, в которых при выполнении алгоритма будут храниться длинные числа, и пятый стек, содержащий коды временно приостановленных операций (имеется всего три кода, и для их представления можно воспользоваться малыми целыми числами). Массивы q и г целых чисел имеют индексы от 0 до 10; необходимо выделить память для этих двух массивов
и для еще нескольких временных переменных, упомянутых в алгоритме.

1. (Начальная установка.) Сделать все стеки пустыми. Присвоить K значение 1, q0 и q1 - значение 16, r0 и r1 - значение 4, Q - значение 4 и R - значение 2.

2. (Построение таблицы размеров). Пока K < 10 и qK-1 + qK ≥ n, выполнять следующие вычисления. Изменить К на К+1, Q - на Q + R; если (R+1)2 ≤ Q, то изменить R на R+1; установить qK равным 2Q и rk равным 2R. Если цикл оканчивается из-за K = 10, то остановиться, выдав сообщение об ошибке - число битов n слишком велико, массивы q и г переполнились. В противном случае присвоить k значение K. Поместить [qK + qK-1, v] и за ним [qK + qK-1, n] в стек C (вероятно, потребуется добавить к [n, u] и [n, v] слева нули). Поместить в управляющий стек код стоп.

3. (Главный внешний цикл.) Пока управляющий стек не пуст, выполнять шаги с 4-го по 18-й. Если на этом шаге управляющий стек окажется пустым, то остановиться с сообщением об ошибке; в управляющем стеке должен быть по крайней мере один элемент.

4. (Внутренний цикл разбиения u и v.) Пока k > 1, выполнять шаги с 5-го по 8-й,

5. (Установка параметров разбиения.) Установить k равным k - 1, s равным qk, t равным rk и p равным qk-1 + qk.

6. (Разбиение верхнего элемента стека C.) Длинное число [qk + qk+1, u] на вершине C следует рассматривать как t + 1 чисел длиной s битов каждое. Разбить [qk + qk+1, u] на длинные числа [s, Ut], [s, Ut-1],..., [s, U1], [s, U0]. Эти t + 1 чисел являются коэффициентами многочлена степени t, который следует вычислить в точках 0, 1,..., 2t - l, 2t no правилу Горнера. Для i = 0, 1,..., 2t - l, 2t вычислить [p, Xi] по формуле
(...([s, Ut]·i +... + [s, U1]·i + [s, U0]
и сразу поместить [p, Xi] в стек U. Для выполнения умножений можно использовать подпрограмму умножения длинных чисел на короткие; никакой промежуточный или окончательный результат не потребует более p битов. Удалить [qk+qk-1, u] из стека C.

7. (Продолжение разбиения.) Выполнить над числом [m, v], находящимся сейчас на вершине стека C, ту же последовательность действий, что на шаге 6; полученные числа [p, Y0],...,[p, Y2t] поместить в стек V в порядке получения. Не забудьте удалить вершину стека C.

8. (Заполнение заново стека C.) Попеременно удалять 2t раз) вершины стеков V и U и помещать эти значения в стек C. В результате значения, вычисленные на шагах 6 и 7, будут помещены, чередуясь, в стек C в обратном порядке. После выполнения этого перемешивания верхняя часть стека C, рассматриваемая снизу вверх, будет иметь вид
[p, Y2t], [p, X2t],..., [p, Y0], [p, X0],
на вершине будет [p, X0]. Поместить в управляющий стек один код операции интерполировать и 2t кодов операции сохранять и вернуться к шагу 4.

9. (Подготовка к интерполяции.) Присвоить k значение 0. Выбрать два верхних элемента стека C и поместить их в обычные переменные u и v. Оба числа u и v будут состоять из 32 битов. Используя некоторую другую подпрограмму умножения, вычислить [64, w] = [64, uv]. Это умножение можно выполнить аппаратно или с помощью подпрограммы, как вы найдете нужным.

10. (Интерполяция при необходимости.) Выбрать вершину управляющего стека в переменную A. Если значение A есть интерполировать, то выполнить шаги с 11-го по 16-й, в противном случае перейти к шагу 17.

11. (Организация интерполяции.) Поместить [m, w] в стек W (это может быть значение, полученное на шаге 9 или 16). Присвоить s значение qk, t - значение rk, р - значение qk-i + qk. Обозначим верхнюю часть стека W, рассматриваемую снизу вверх, как
[2р, Z0], [2p, Z1],..., [2р, Z2t-1], [2p, Z2t],
последнее из этих значений - на вершине стека.

12. (Внешний цикл деления Z.) Выполнять шаг 13 для i = 1, 2, 2t.

13. (Внутренний цикл деления Z.) Присвоить [2p, Zj] значение ([2p, Zj] - [2p, Zj-1])/i для j =2t, 2t - 1,..., i + 1, i. Все разности будут положительными, а все деления выполняются нацело, т. е. без остатка.

14. (Внешний цикл умножения Z.) Выполнять шаг 15 для i = 2t-1, 2t-2,..., 2, 1.

15. (Внутренний цикл умножения Z.) Заменить [2р, Zj] на [2р, Zj] - i·[2р, Zj+1] для j = i, i+1,..., 2t-2, 2t-1. Все разности будут положительными, и все результаты поместятся в 2p битов.

16. (Образование нового w и начало нового цикла.) Присвоить значение многочлена
(... ([2р, Z2t]·2s + [2р, Z2t-1])·2s +... + [2р, Z1])·2s + [2р, Z0]
переменной [2(qk + qk+1), w]. Этот шаг можно выполнять, используя только сдвиги и сложения длинных чисел. Заметьте, что используется та же переменная [m, w], что и на шаге 9. Удалить [2p, Z2t],..., [2p, Z0] из стека W. Присвоить k значение k + 1 и вернуться к шагу 10.

17. (Проверка окончания.) Если A имеет значение стоп, то в переменной [m, w], уже вычисленной на шаге 9 или 16, находится результат алгоритма. В этом случае окончить работу.

18. (Сохранение значения.) Значением A должен быть код сохранить (если это не так, завершить алгоритм по ошибке). Присвоить k значение k + 1 и поместить [qk + qk-1, w] в стек W. Это значение w, только что вычисленное на шаге 9 или 16. Теперь вернуться к шагу 3.




Поделиться с друзьями:


Дата добавления: 2015-04-23; Просмотров: 1130; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.017 сек.