Алгоритм Гуда — Томаса

Pause

Алгоритм Гуда — Томаса — алгоритм вычисления быстрого преобразования Фурье, применяющийся к последовательностям, длина которых равна произведению двух взаимно простых чисел[1][2].

Алгоритм Гуда — Томаса не следует путать с алгоритмом Кули — Тьюки, где делители длины преобразования не обязаны быть взаимно простыми. Алгоритм Гуда — Томаса ограничен этим условием, а также задействует более сложную схему переиндексации, чем алгоритм Кули — Тьюки, но при этом не требует промежуточного умножения на комплексные множители и потому несколько проще с точки зрения вычислений[3][4].

Построение алгоритма

Для произвольного натурального числа дискретным преобразованием Фурье комплексного вектора , где , называется комплексный вектор , где , компоненты которого задаются формулой:

где .

Пусть , где и взаимно просты. Пусть также и  — новые входные индексы, задающиеся соотношениями[5]:

Отсюда по китайской теореме об остатках и соотношению Безу следует, что существуют такие целые числа и , что

и Аналогично, пусть и  — новые выходные индексы, задающиеся соотношениями

Тогда

С использованием обозначений

исходная формула принимает вид

то есть произошёл переход от одномерного преобразования длины к двумерному преобразованию размера . При этом число умножений и число сложений стало равно примерно [6].

Современная реализация

  • Разделение на потоки. Каждый вычислительный блок обрабатывает свою строку/столбец матрицы. Игровые и профессиональные GPU (такие как архитектуры NVIDIA Ampere, Hopper или Ada Lovelace) используют модель памяти с высокой пропускной способностью[7].
  • Использование cuFFT и VkFFT.Хотя для длин, являющихся степенью двойки, применяются традиционные алгоритмы (Кули — Тьюки), современные программные библиотеки включают алгоритмы разложения на взаимно простые множители. К примеру, фреймворк VkFFT отслеживает и оптимизирует доступ к памяти без банковских конфликтов, поддерживая эффективные длины последовательностей[8].
  • Векторизация в малых полях. Для специфических научных вычислений используются реализации, где базовые длины вроде 3, 5, 7 или 13 трансформируются с помощью разделения по блокам (thread block level) и вычисляются непосредственно в быстрой разделяемой памяти[9].

Примечания

Литература

  • Блейхут, Р.. Быстрые алгоритмы цифровой обработки сигналов. — М.: Мир, 1989. — 448 с.

Категории

Pause