Zaimplementuj dyskretną transformatę Fouriera (DFT) dla sekwencji dowolnej długości. Może to zostać zaimplementowane jako funkcja lub program, a sekwencja może być podana jako argument lub przy użyciu standardowego wejścia.
Algorytm obliczy wynik na podstawie standardowego DFT w kierunku do przodu. Sekwencja wejściowa ma długość N
i składa się z [x(0), x(1), ..., x(N-1)]
. Sekwencja wyjściowa będzie miała tę samą długość i będzie się składać z [X(0), X(1), ..., X(N-1)]
miejsca, w którym każda X(k)
jest zdefiniowana przez poniższą relację.
Zasady
- To jest golf-golf więc najkrótsze rozwiązanie wygrywa.
- Wbudowane, które obliczają DFT w przód lub w tył (znany również jako kierunek odwrotny) są niedozwolone.
- Niedokładności zmiennoprzecinkowe nie będą liczone przeciwko tobie.
Przypadki testowe
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]
Wsparcie
Wcześniejsze wyzwanie polegało na znalezieniu DFT przy użyciu algorytmu FFT dla sekwencji o długości równej potędze 2. Może się tam znaleźć kilka sztuczek, które mogą ci w tym pomóc. Pamiętaj, że to wyzwanie nie ogranicza Cię do żadnej złożoności, a także wymaga rozwiązania do pracy z sekwencjami dowolnej długości.
Python 3, 77 bajtów
Przetestuj na Ideone .
Kod używa równoważnej formuły
źródło
J,
3020 bajtów3 bajty dzięki @miles .
Wykorzystuje fakt, że
e^ipi = -1
.Formuła staje się
X_k = sum(x_n / ((-1)^(2nk/N)))
.Stosowanie
gdzie
>>
jest STDIN i<<
STDOUT.„Niedokładności zmiennoprzecinkowe nie będą liczone przeciwko tobie”.
źródło
MATL ,
2016 bajtówDane wejściowe to wektor kolumny, tzn. Zamień przecinki na średniki:
Wykorzystuje to formułę w odpowiedzi Leaky Nun , opartą na faktach, że exp ( iπ ) = -1, a operacja mocy MATL z wykładnikiem niecałkowitym daje (jak w większości języków programowania) wynik głównego odgałęzienia .
Wypróbuj online!
Ze względu na dziwne odstępy Octave z liczbami zespolonymi części rzeczywista i urojona są oddzielone spacją, podobnie jak różne wpisy wynikowego wektora. Jeśli to wygląda zbyt brzydko, dodaj
!
na końcu ( 17 bajtów ), aby każdy wpis danych wyjściowych był w innym wierszu.Wyjaśnienie
źródło
Pyth, 30
Pakiet testowy
Bardzo naiwne podejście, tylko wdrożenie formuły. Występuje w różnych drobnych problemach zmiennoprzecinkowych z wartościami, które powinny być addytywnymi inwersjami dodającymi w celu uzyskania wartości, które są nieco poniżej zera.
Dziwnie
.j
nie wydaje się działać bez argumentów, ale nie jestem pewien, czy używam go poprawnie.źródło
Pyth, 18 bajtów
Wykorzystuje fakt, że
e^ipi = -1
.Formuła staje się
X_k = sum(x_n / ((-1)^(2nk/N)))
.Zestaw testowy.
źródło
Julia, 45 bajtów
Wypróbuj online!
Kod używa równoważnej formuły
źródło
Python 2, 78 bajtów
Wielomian jest oceniana dla każdej władzy
p
w1j**(4./len(l))
.Wyrażenie
reduce(lambda a,b:a*p+b,l)
ocenia wielomian podanyl
na wartościp
za pomocą metody Hornera:Z wyjątkiem, że lista wejściowa out jest odwrócona, ze stałym terminem na końcu. Możemy to odwrócić, ale ponieważ
p**len(l)==1
dla współczynników Fouriera możemy użyć odwróceniap
i pomnożenia całego wyniku przezp
.Niektóre próby jednakowej długości:
W funkcji 1 bajtu więcej (79):
Próba rekurencji (80):
Iteracyjnie symulujący
reduce
(80):źródło
C (gcc) ,
8678 bajtówWypróbuj online!
Zakłada się, że wektor wyjściowy jest zerowany przed użyciem.
źródło
Python 2, 89 bajtów
Wykorzystuje fakt, że
e^ipi = -1
.Formuła staje się
X_k = sum(x_n / ((-1)^(2nk/N)))
.Ideone to!
źródło
Mathematica,
494847 bajtówOparty na formule z rozwiązania @Dennis .
źródło
Aksjomat, 81 bajtów
używając formuły, którą ktoś tu zamieszcza. Wyniki
źródło
Oktawa ,
4339 bajtówWypróbuj online!
Mnoży wektor wejściowy przez macierz DFT.
źródło