Реализуйте дискретное преобразование Фурье (ДПФ) для последовательности любой длины. Это может быть реализовано как функция или программа, а последовательность может быть задана как аргумент или с использованием стандартного ввода.
Алгоритм вычислит результат на основе стандартного ДПФ в прямом направлении. Входная последовательность имеет длину N
и состоит из [x(0), x(1), ..., x(N-1)]
. Выходная последовательность будет иметь одинаковую длину и состоит из тех, [X(0), X(1), ..., X(N-1)]
где каждая X(k)
определяется соотношением ниже.
правила
- Это Код-гольф поэтому выигрывает самое короткое решение.
- Встроенные функции, которые вычисляют ДПФ в прямом или обратном (также называемом обратным) направлениях, не допускаются.
- Неточности с плавающей точкой не будут засчитаны против вас.
Тестовые случаи
DFT([1, 1, 1, 1]) = [4, 0, 0, 0]
DFT([1, 0, 2, 0, 3, 0, 4, 0]) = [10, -2+2j, -2, -2-2j, 10, -2+2j, -2, -2-2j]
DFT([1, 2, 3, 4, 5]) = [15, -2.5+3.44j, -2.5+0.81j, -2.5-0.81j, -2.5-3.44j]
DFT([5-3.28571j, -0.816474-0.837162j, 0.523306-0.303902j, 0.806172-3.69346j, -4.41953+2.59494j, -0.360252+2.59411j, 1.26678+2.93119j] = [2, -3j, 5, -7j, 11, -13j, 17]
Помогите
Ранее была проблема с поиском ДПФ с использованием алгоритма БПФ для последовательностей с длиной, равной степени 2. Здесь вы можете найти некоторые приемы, которые могут вам помочь. Имейте в виду, что эта задача не ограничивает вас какой-либо сложностью, а также требует, чтобы ваше решение работало для последовательностей любой длины.
Python 3, 77 байт
Проверьте это на Ideone .
Код использует эквивалентную формулу
источник
J,
3020 байт3 байта благодаря @ миль .
Использует тот факт, что
e^ipi = -1
.Формула становится
X_k = sum(x_n / ((-1)^(2nk/N)))
.Применение
где
>>
STDIN и<<
STDOUT.«Неточности с плавающей точкой не будут засчитаны против вас».
источник
MATL ,
2016 байтовВвод - это вектор-столбец, т. Е. Заменить запятые точкой с запятой:
Это использует формулу в ответе Лики Нун , основанную на фактах, что exp ( iπ ) = −1, и что мощный оператор MATL с нецелым показателем показывает (как в большинстве языков программирования) основной результат ветвления .
Попробуйте онлайн!
Из-за странного расстояния Октавы с комплексными числами действительные и мнимые части разделены пробелом, как и разные элементы результирующего вектора. Если это выглядит слишком некрасиво, добавьте a
!
в конце ( 17 байт ), чтобы каждая запись выходных данных находилась в отдельной строке.объяснение
источник
Пиф, 30
Тестирование
Очень наивный подход, просто реализация формулы. Встречается с различными незначительными проблемами с плавающей запятой со значениями, которые должны быть аддитивно-обратными, добавляясь к результатам, значения которых немного отличаются от нуля
Как ни странно,
.j
это не работает без аргументов, но я не уверен, правильно ли я его использую.источник
Pyth, 18 байт
Использует тот факт, что
e^ipi = -1
.Формула становится
X_k = sum(x_n / ((-1)^(2nk/N)))
.Тестирование.
источник
Юлия, 45 байт
Попробуйте онлайн!
Код использует эквивалентную формулу
источник
Python 2, 78 байт
Полином вычисляется для каждой мощности
p
из1j**(4./len(l))
.Выражение
reduce(lambda a,b:a*p+b,l)
оценивает полином, заданныйl
в значенииp
методом Хорнера:За исключением того, что наш входной список перевернут, с постоянным членом в конце. Мы могли бы изменить это, но потому что
p**len(l)==1
для коэффициентов Фурье мы можем использовать хак инвертированияp
и умножения всего результата наp
.Несколько попыток равной длины:
Как функция на 1 байт больше (79):
Попытка рекурсии (80):
Итеративное моделирование
reduce
(80):источник
C (gcc) ,
8678 байтПопробуйте онлайн!
Это предполагает, что выходной вектор обнуляется перед использованием.
источник
Python 2, 89 байт
Использует тот факт, что
e^ipi = -1
.Формула становится
X_k = sum(x_n / ((-1)^(2nk/N)))
.Идео это!
источник
Mathematica,
494847 байтПо формуле из решения @Dennis .
источник
Аксиома, 81 байт
используя формулу кто-то пост здесь. Результаты
источник
Октава ,
4339 байтПопробуйте онлайн!
Умножает входной вектор на матрицу ДПФ.
источник