Çok Hızlı, Çok Fourier: FFT Code Golf


48

Hızlı Fourier Dönüşümü'nü mümkün olan en az karakterde uygulayın.

Kurallar:

  • En kısa çözüm kazanır
  • Girişin, uzunluğu iki olan bir 1D dizisi olduğu varsayılabilir.
  • İstediğiniz algoritmayı kullanabilirsiniz, ancak çözüm aslında bir Hızlı Fourier Dönüşümü olmalı, yalnızca saf bir Ayrık Fourier Dönüşümü (yani, asimptotik hesaplama maliyetine sahip olmalı )O(NlogN)

Düzenle:

  • Kod Hızlı Fourier ileri standardını uygulamak Transform gerektiğini denklemi (3) görülebilir hangi biçimi bu Wolfram makalesinde ,

    görüntü tanımını buraya girin

  • Önceden var olan standart bir kütüphaneden veya istatistik paketinden FFT işlevini kullanmak yasaktır. Buradaki zorluk , FFT algoritmasının kendisini başarıyla uygulamaktır .

3
Bu belirtilmiştir. En azından normalizasyon faktörlerini tanımlamanız gerekir ve ayrıca herhangi bir belirsizliğin isteyerek yanlış yorumlanacağının farkında olmalısınız. Örn: "Uygulama" cevabından memnun mu " FFT(3 karakter): standart kütüphanede"? Bazı test durumları da iyi olurdu.
Peter Taylor

Çıktı elemanlarının sırası ile ilgili bir sorun mu var, yani biti ters çözülmüş bit çözme işlemi yapmamız gerekiyor mu yoksa çıkışı karışık düzende bırakabilir miyiz?
Paul R,

Kurallardaki düzenlemelere bakın. Çıktı, yukarıda referans olarak verilen standart DFT ifadesindeki endekslere göre sıralanan değerleri içeren bir liste / dizi olmalıdır.
jakevdp

2
Uygulamalarımızı test edebilmemiz için bazı örnek girdiler ve çıktılar gönderebilir misiniz?
FUZxxl

2
Başlık "Hızlı ve Fourier-s" (Hızlı ve Öfkeli) olmalı.
Clismique

Yanıtlar:


12

Mathematica, 95 bayt

Cooley-Tukey FFT'nin bir başka uygulaması @ chyaong'un yardımı ile .

{n=Length@#}~With~If[n>1,Join[+##,#-#2]&[#0@#[[;;;;2]],#0@#[[2;;;;2]]I^Array[-4#/n&,n/2,0]],#]&

Ungolfed

FFT[x_] := With[{N = Length[x]},
  If[N > 1,
    With[{a = FFT[ x[[1 ;; N ;; 2]] ], 
          b = FFT[ x[[2 ;; N ;; 2]] ] * Table[E^(-2*I*Pi*k/N), {k, 0, N/2 - 1}]},
      Join[a + b, a - b]],
    x]]

1
Düşünüyorum #[[;;;;2]]==#[[1;;N;;2]]ve [[2;;;;2]]==[[2;;N;;2]].
Chyanog

1
101 karakter :With[{L=Length@#},If[L>1,Join[+##,#-#2]&[#0@#[[;;;;2]],#0@#[[2;;;;2]]E^(-2I*Pi(Range[L/2]-1)/L)],#]]&
chyanog

Güzel, özyinelemeli olanla çelişmeden başka bir anonim işlevi yoğunlaştırabilirsiniz. Ayrıca Part'in eksik endeksleri doldurduğunu da öğrendim. Unicode kullanarak daha ileri gidebiliriz.
mil:

9

J, 37 bayt

_2&(0((+,-)]%_1^i.@#%#)&$:/@|:]\)~1<#

Birkaç yıl sonra bir gelişme. Hala Cooley-Tukey FFT algoritmasını kullanıyor.

@ Leaky Nun sayesinde e πi = -1 kullanılarak 4 bayt kaydedildi .

Çevrimiçi deneyin!

kullanım

   f =: _2&(0((+,-)]%_1^i.@#%#)&$:/@|:]\)~1<#
   f 1 1 1 1
4 0 0 0
   f 1 2 3 4
10 _2j2 _2 _2j_2
   f 5.24626 3.90746 3.72335 5.74429 4.7983 8.34171 4.46785 0.760139
36.9894 _6.21186j0.355661 1.85336j_5.74474 7.10778j_1.13334 _0.517839 7.10778j1.13334 1.85336j5.74474 _6.21186j_0.355661

açıklama

_2&(0((+,-)]%_1^i.@#%#)&$:/@|:]\)~1<#  Input: array A
                                    #  Length
                                  1<   Greater than one?
_2&(                            )~     Execute this if true, else return A
_2                            ]\         Get non-overlapping sublists of size 2
    0                       |:           Move axis 0 to the end, equivalent to transpose
                          /@             Reduce [even-indexed, odd-indexed]
                       &$:               Call recursively on each 
                   #                     Get the length of the odd list
                i.@                      Range from 0 to that length exclusive
                    %#                   Divide each by the odd length
             _1^                         Compute (-1)^x for each x
           ]                             Get the odd list
            %                            Divide each in that by the previous
       +                                 Add the even values and modified odd values
         -                               Subtract the even values and modified odd values
        ,                                Join the two lists and return

1

9

Python, 166 151 150 karakter

Bu radix-2 Cooley-Tukey FFT algoritmasını kullanır

from math import*
def F(x):N=len(x);t=N<2or(F(x[::2]),F(x[1::2]));return N<2and x or[
a+s*b/e**(2j*pi*n/N)for s in[1,-1]for(n,a,b)in zip(range(N),*t)]

Sonucu test etme

>>> import numpy as np
>>> x = np.random.random(512)
>>> np.allclose(F(x), np.fft.fft(x))
True

1
2 şey: kullanmak en iyisidir from x import*ve sum(([x for x in y] for y in z),[])bundan daha uzundur [x for y in z for x in y].
stand

1
Teşekkürler - bu 15 karakter kazandırır! 11 tane daha ve bu bir tweet.
jakevdp

Oh, bu kesinlikle mümkün. Genellikle bir gelişme bulduğunuzda, eski olan tökezleyen bir blok haline gelir.
stant

5

Python 3: 140 134 113 karakter

Kısa versiyon - kısa ve tatlı, bir tweet'e uyar ( miller sayesinde ):

from math import*
def f(v):
 n=len(v)
 if n<2:return v
 a,b=f(v[::2])*2,f(v[1::2])*2;return[a[i]+b[i]/1j**(i*4/n)for i in range(n)]

(Python 2'de, /her iki tarafın da tam sayılardır zaman bölünme kesiliyor edilir. Bu yüzden yerine (i*4/n)göre (i*4.0/n), 115 chars uzunluğunu çıkıntıların.)

Uzun versiyon - Klasik Cooley-Tukey FFT'un iç parçalarına daha fazla netlik:

import cmath
def transform_radix2(vector):
    n = len(vector)
    if n <= 1:  # Base case
        return vector
    elif n % 2 != 0:
        raise ValueError("Length is not a power of 2")
    else:
        k = n // 2
        even = transform_radix2(vector[0 : : 2])
        odd  = transform_radix2(vector[1 : : 2])
        return [even[i % k] + odd[i % k] * cmath.exp(i * -2j * cmath.pi / n) for i in range(n)]

1
Kullanarak 113 byte'a kısaltıldıe^(-2j * pi * i / n) = (-1)^(2 * i / n) = (1j)^(4 * i / n)
mil

@miles Çok etkileyici gözlem, teşekkür ederim! DFT'leri on yıldan uzun süredir tekrar tekrar uyguladıktan sonra, sin / cos / exp ile takıntılı hale geldim ve basit güçlerimin kullanılabileceğini unuttum. Cevabımı, yeni anlayışı içerecek ve sizi kredilendirecek şekilde düzenledim.
Nayuki

5

R: 142 133 99 95 bayt

Sayesinde @Giuseppe aşağı beni tıraş yardımcı olmak için 32 36 bayt!

f=function(x,n=sum(x|1),y=1:(n/2)*2)`if`(n>1,f(x[-y])+c(b<-f(x[y]),-b)*exp(-2i*(y/2-1)*pi/n),x)

Burada ek bir numara, bazı değişkenleri başlatmak için ana işlev varsayılan argümanlarını kullanmaktır.
Kullanımı hala aynı:

x = c(1,1,1,1)
f(x)
[1] 4+0i 0+0i 0+0i 0+0i

133 bayttaki 4 yıllık eski sürüm:

f=function(x){n=length(x);if(n>1){a=Recall(x[seq(1,n,2)]);b=Recall(x[seq(2,n,2)]);t=exp(-2i*(1:(n/2)-1)*pi/n);c(a+b*t,a-b*t)}else{x}}

Girintilerle:

f=function(x){
    n=length(x)
    if(n>1){
        a=Recall(x[seq(1,n,2)])
        b=Recall(x[seq(2,n,2)])
        t=exp(-2i*(1:(n/2)-1)*pi/n)
        c(a+b*t,a-b*t)
        }else{x}
    }

Ayrıca Cooley-Tukey algoritmasını kullanır. Buradaki tek püf noktaları Recallözyinelemeye izin veren fonksiyonun kullanılması ve gerçek hesaplamayı büyük ölçüde kısaltan R vektörizasyonunun kullanılmasıdır.

Kullanımı:

x = c(1,1,1,1)
f(x)
[1] 4+0i 0+0i 0+0i 0+0i

1
Dört yıl sonra 101 bayta indirdik . % 100 Recallzaten neden adlandırılmış bir işlev olarak kullandığınızdan emin değilsiniz , ancak hey, gezinti yapmak kolay! :) +1, çok hoş.
Giuseppe,

Evet Recall, şimdi gerçekten de gereksiz. Birkaç ay önce fark ettim ama değiştirmek için çok tembeldi :) Değiştireceğim.
plannapus

Çok hoş! Ben sıkılmış başka 4 bayt dışarı! , bunu Mathematica ile aynı seviyeye getirerek.
Giuseppe

Teşekkürler! Oraya koymayı düşündüm yama bu exp(...)kısım için de kullanılabileceğini fark etmedim .
plannapus

4

Python, 134

Bu, jakevdp'in çözümünden büyük ölçüde ödünç alıyor, bu yüzden bunu bir topluluk wiki'ye ayarladım.

from math import*
F=lambda x:x*(len(x)<2)or[a+s*b/e**(2j*pi*n/len(x))for s in(1,-1)for n,(a,b)in
enumerate(zip(F(x[::2]),F(x[1::2])))]

değişiklikler:

-12 karakter: öldür t.

def F(x):N=len(x);t=N<2or(F(x[::2]),F(x[1::2]));return ... in zip(range(N),*t)]
def F(x):N=len(x);return ... in zip(range(N),F(x[::2]),F(x[1::2]))]

-1 Char: üs hile, x*y**-z == x/y**z (bu, bazı diğerlerine yardım olabilir)

...[a+s*b*e**(-2j*pi*n/N)...
...[a+s*b/e**(2j*pi*n/N)...

-2 karakter: yerine andile*

...return N<2and x or[
...return x*(N<2)or[

+1 karakter: lambdaize, öldürmeN

def F(x):N=len(x);return x*(N<2)or[a+s*b/e**(2j*pi*n/N) ... zip(range(N) ...
F=lambda x:x*(len(x)<2)or[a+s*b/e**(2j*pi*n/len(x)) ... zip(range(len(x)) ...

-2 karakter: enumerateyerine kullanzip(range(len(

...for(n,a,b)in zip(range(len(x)),F(x[::2]),F(x[1::2]))]
...for n,(a,b)in enumerate(zip(F(x[::2]),F(x[1::2])))]

Bunun artık hızlı bir fourier dönüşümü olmadığını düşünüyorum, ancak ... onu [O
logosunu

Anlaşılan kendi yazıma oy veremiyorum. Haklısın, döngü sırasını değiştirdim ve performansı öldürdüm. Düzeltmek için bir yol bulursam, bunu şimdilik bırakacağım.
gişe

101 bayt ilef=lambda x:x*(len(x)<2)or[u+v/1j**(4*i/len(x))for i,(u,v)in enumerate(zip(f(x[::2])*2,f(x[1::2])*2))]
miller

Sipariş önemli değilse, for s in(1,-1)forile for s in 1,-1forveya hatta değiştirebilirsiniz for s in-1,1for.
Jonathan Frech

4

C, 259

typedef double complex cplx;
void fft(cplx buf[],cplx out[],int n,int step){
if(step < n){
fft(out, buf,n, step * 2);
fft(out+step,buf+step,n,step*2);
for(int i=0;i<n;i+=2*step){
cplx t=cexp(-I*M_PI*i/n)*out[i+step];
buf[i/2]=out[i]+t;
buf[(i+n)/2]=out[i]-t;
}}}

Sorun şu ki, bu tür uygulamalar işe yaramaz ve basit bir algoritma ÇOK daha hızlı.


2
Örneğin, karakterlerin amout daha düşük almak için biraz daha boşluk kaldırabilirsiniz step < niçine değiştirilebilir step<nve step * 2içine değiştirilebilir step*2.
ProgramFOX

2
tüm değişkenler ve fonksiyonlar ve typedefs çok fazla karakter kaydetmek için tek harfli isimlere sahip olmalıdır

2
Birisi bunun için bir sürü iyileştirme önerdi. Onlara bir göz atın: codegolf.stackexchange.com/review/suggested-edits/17119
Justin

1
Tüm yeni satırları kaldırabilirsiniz, yeni satırlar C
TuxCrafting

@ TùxCräftîñg Tüm yeni satırlar işe yaramaz değil. #
İnclude

3

Matlab, 128 118 107 102 101 94 93 bayt

EDIT6: teşekkürler @algmyr başka bir bayt için!

function Y=f(Y);
n=numel(Y);
k=2:2:n;
if k;
   c=f(Y(k-1));
   d=f(Y(k)).*i.^(2*(2-k)/n);
   Y=[c+d;c-d];
end

EDIT5: Hala kısalıyor :) @sanchises sayesinde

function Y=f(Y)
n=numel(Y);
k=2:2:n;
if k;
   c=f(Y(k-1));
   d=f(Y(k)).*(-1).^((2-k)/n);
   Y=[c+d;c-d];
end

EDIT4: Yay, -1 karakter daha (onlar olmadan yapmış olabilir k):

function Y=f(Y)
n=numel(Y);
if n>1;
   k=2:2:n;
   c=f(Y(k-1));
   d=f(Y(k)).*(-1).^((k/2-1)*2/n)';
   Y=[c+d;c-d];
end

EDIT2 / 3: Daha fazla iyileştirme için @ sanchises için teşekkürler!

function Y=f(Y)
n=numel(Y);  
if n>1;
   c=f(Y(1:2:n));
   d=f(Y(2:2:n)).*(-1).^(-(0:n/2-1)*2/n).';
   Y=[c+d;c-d]; 
end

EDIT: Bazı iyileştirmeler yapabilir ve ölçeklendirme sabitinin gerekli olmadığını fark eder.

Bu genişletilmiş versiyon, eğer yeni satırları / boşlukları kaldırırsanız karakter sayımı geçerlidir. (Yalnızca sütun vektörleri için çalışır.)

function y=f(Y)
n=numel(Y);  
y=Y;
if n>1;
   c=f(Y(1:2:n));
   d=f(Y(2:2:n));
   n=n/2;
   d=d.*exp(-pi*i*(0:n-1)/n).';
   y=[c+d;c-d]; 
end

İpucu: İki birleştirebilirsiniz d=birine hatları: m=n/2;d=f(Y(2:2:n)).*exp(-pi*i*(0:m-1)/m).';. Dahası, değiştirmeyi düşünün y=f(Y)için Y=f(Y)hat 3 ve remove (ve kod golf o dışında asla söz)
Sanchises

Oh teşekkürler! function Y = f(Y)Okunamayanlık dışında herhangi bir dezavantaj var mı ?
kusur

Eh, MATLAB, Y hiç değişmemiş olsa bile, bir geri dönüş değeri hakkında asla şikayet etmez. Öyle biraz ben bazı amaçlar için o kadar da kötü değil (giriş değişkeni değiştiren neredeyse hiç yani bir işlev) tahmin yüzden olsa daha hızlı
Sanchises

Şimdi, kapalı tıraş için daha: m=n/2kaldırıldı ve bunun yerine edilebilir myerini n/2ve n*2sırasıyla. Ve sonra inanıyorum ki, program MATLAB'da olabileceği kadar kısa.
Sanchises,

1
Ve sonra inanıyorum ki, program MATLAB'da olabileceği kadar kısa. - Sanchises 8 Mar 15 '21 at 21:05 Ünlü son sözler ...
Sanchises

2

Jelly, 31 30 28 26 bayt , rakipsiz

LḶ÷$N-*×,N$+ḷF
s2Z߀ç/µ¹Ṗ?

Jelly bu mücadeleden sonra yaratıldı, bu yüzden rekabet etmedi.

Bu Cooley-Tukey radix-2 özyinelemeli algoritmasını kullanır. Golf oynamayan bir sürüm için Mathematica'daki cevabımı görün.

Çevrimiçi deneyin veya Birden fazla test durumu doğrulayın .

açıklama

LḶ÷$N-*×,N$+ḷF  Helper link. Input: lists A and B
L               Get the length of A
   $            Operate on that length
 Ḷ                Make a range [0, 1, ..., length-1]
  ÷               Divide each by length
    N           Negate each
     -          The constant -1
      *         Compute -1^(x) for each x in that range
       ×        Multiply elementwise between that range and B, call it B'  
          $     Operate on that B'
         N        Negate each
        ,         Make a list [B', -B']
            ḷ   Get A
           +    Add vectorized, [B', -B'] + A = [A+B', A-B']
             F  Flatten that and return

s2Z߀ç/µ¹Ṗ?  Main link. Input: list X
         Ṗ   Curtail - Make a copy of X with the last value removed
          ?  If that list is truthy (empty lists are falsey)
       µ       Parse to the left as a monad
s2             Split X into sublists of length 2
  Z            Transpose them to get [even-index, odd-index]
   ߀          Call the main link recursively on each sublist
     ç/        Call the helper link as a dyad on the sublists and return
             Else
        ¹      Identity function on X and return

2

C (gcc) , 188 186 184 183 bayt

#define d(a,b,c)f(a,b,c,1,0)
f(a,b,c,n,k)_Complex*a,*b;{_Complex z[c];*b=*a;if(n<c)for(f(a,z,c,n*2),f(a+n,z+n,c,n*2);k<c;k+=n*2)b[k+c>>1]=z[k]*2-(b[k/2]=z[k]+z[k+n]/cpow(1i,2.*k/c));}

Çevrimiçi deneyin!

Biraz daha az golf oynadı

#define d(a,b,c)f(a,b,c,1,0)
f(a,b,c,n,k)_Complex*a,*b;{
  _Complex z[c];
  *b=*a;
  if(n<c)
    for(f(a,z,c,n*2),f(a+n,z+n,c,n*2);k<c;k+=n*2)
      b[k+c>>1]=z[k]*2-(b[k/2]=z[k]+z[k+n]/cpow(1i,2.*k/c));
}

1

Pari / GP, 76 karakter

X(v)=my(t=-2*Pi*I/#v,s);vector(#v,k,s=t*(k-1);sum(n=0,#v-1,v[n+1]*exp(s*n)))

kullanım

X([1,1,1,1])
%2 = [4.000000000000000000000000000, 0.E-27 + 0.E-28*I, 0.E-28 + 0.E-27*I, 0.E-27 + 0.E-28*I]

3
Bu saf DFT değil mi? (yani theta (N ^ 2))
mil

1

Octave , 109 103 101 100 bayt

f(f=@(f)@(x,n=rows(x)){@(d=f(f)(x(k=2:2:n)).*i.^((k*2-4)/n)')[d+(c=f(f)(x(k-1)));c-d],x}{1+(n<2)}())

Çevrimiçi deneyin!

Ooooo gözlerim bu özyineli lanetli lambdadan kanıyor . Bunun büyük kısmı @ kusurunun cevabından kalktı.

f(                                          % lambda function
  f=@(f)                                    % defined in its own argument list, 
                                            % accepts itself as parameter (for recursion)
    @(x,n=rows(x)){                         % calls another lambda,
                                            % 2nd parameter is just to define a variable
      @(d=f(f)(x(k=2:2:n)).*i.^((k*2-4)/n)')% 1/4 of FFT (argument just defines a variable)
        [d+(c=f(f)(x(k-1)));                % 2/4 of FFT
         c-d                                % 4/4 of FFT
        ],                                  % This is in a @()[] to inhibit evaluation
                                            % unless actually called
      x                                     % FFT of length 1
    }{1+(n<2)}                              % if len(x)==1, return x
                                            % else return [d+c;c-d]
  ()                                        % this is probably important too
)

Ne yaptığını anlamıyorum ama çok hoşuma gitti.
kusur

0

Aksiyom, 259 , 193 , 181 , 179 bayt

L(g,n,f)==>[g for i in 1..n|f]
h(a)==(n:=#a;n=1=>a;c:=h(L(a.i,n,odd? i));d:=h(L(a.i,n,even? i));n:=n/2;t:=1>0;v:=L(d.i*%i^(-2*(i-1)/n),n,t);append(L(c.i+v.i,n,t),L(c.i-v.i,n,t)))

H (a) tüm testi geçebilse ve bu 'yarışmaya' giriş olarak uygun olsa bile, argümanları kontrol etmek için aşağıdaki hft () yerine h () veya hlp () yazmalısınız . Bu yazılımın iyi olup olmadığını bilmiyorum, çünkü sadece başka ne yazdığını gördüm ve Axiom'da çalışabileceği bir yol buldum. Birkaç yorum ile ungolfed kodunun altında:

-- L(g,n,f)==>[g for i in 1..n|f]
-- this macro L, build one List from other list, where in g, there is the generic element of index i
-- (as a.i, or a.i*b.i or a.i*4), n build 1..n that is the range of i, f is the condition 
-- for insert the element in the list result.

hlp(a)==
    n:=#a;n=1=>a
    -- L(a.i,n,odd? i)  it means build a list getting "even indices i of a.i as starting from index 0" [so even is odd and odd is even]
    -- L(a.i,n,even? i) it means build a list getting "odd  indices i of a.i as starting from index 0"
    c:=hlp(L(a.i,n,odd? i));d:=hlp(L(a.i,n,even? i))
    n:=n/2;t:=1>0
    v:=L(d.i*%i^(-2*(i-1)/n),n,t)
    append(L(c.i+v.i,n,t),L(c.i-v.i,n,t))

-- Return Fast Fourier transform of list a, in the case #a=2^n
fft(a)==(n:=#a;n=0 or gcd(n,2^30)~=n=>[];hlp(a))

(5) -> h([1,1,1,1])
   (5)  [4,0,0,0]
                                    Type: List Expression Complex Integer
(6) -> h([1,2,3,4])
   (6)  [10,- 2 + 2%i,- 2,- 2 - 2%i]
                                    Type: List Expression Complex Integer
(7) -> h([5.24626,3.90746,3.72335,5.74429,4.7983,8.34171,4.46785,0.760139])
   (7)
   [36.989359, - 6.2118552150 341603904 + 0.3556612739 187363298 %i,
    1.85336 - 5.744741 %i, 7.1077752150 341603904 - 1.1333387260 812636702 %i,
    - 0.517839, 7.1077752150 341603904 + 1.1333387260 812636702 %i,
    1.85336 + 5.744741 %i,
    - 6.2118552150 341603904 - 0.3556612739 187363298 %i]
                                      Type: List Expression Complex Float
(8) -> h([%i+1,2,%i-2,9])
   (8)  [10 + 2%i,3 + 7%i,- 12 + 2%i,3 - 7%i]
                                    Type: List Expression Complex Integer

Birkaç tanesinde h () ya da fft () 'nin kesin bir çözüm getireceğini gördüm, ancak sadeleştirme şu şekilde iyi değilse:

(13) -> h([1,2,3,4,5,6,7,8])
   (13)
                    +--+                                   +--+
        (- 4 + 4%i)\|%i  - 4 + 4%i             (- 4 - 4%i)\|%i  - 4 + 4%i
   [36, --------------------------, - 4 + 4%i, --------------------------, - 4,
                    +--+                                   +--+
                   \|%i                                   \|%i
            +--+                                   +--+
    (- 4 + 4%i)\|%i  + 4 - 4%i             (- 4 - 4%i)\|%i  + 4 - 4%i
    --------------------------, - 4 - 4%i, --------------------------]
                +--+                                   +--+
               \|%i                                   \|%i
                                    Type: List Expression Complex Integer

tahmin edilenden daha fazla, yaklaşık çözümü bulmak için aşağıdaki 8. maddede (Float) yazdığı gibi, listenin yalnızca bir elemanının tipini değiştirin:

(14) -> h([1,2,3,4,5,6,7,8.])
   (14)
   [36.0, - 4.0000000000 000000001 + 9.6568542494 923801953 %i, - 4.0 + 4.0 %i,
    - 4.0 + 1.6568542494 92380195 %i, - 4.0, - 4.0 - 1.6568542494 92380195 %i,
    - 4.0 - 4.0 %i, - 4.0 - 9.6568542494 923801953 %i]
                                      Type: List Expression Complex Float

Ben yazdım, diğer tüm cevapları gördüm, çünkü bağlantıda, sayfa çok zordu, bu yüzden bu kodun doğru olup olmadığını bilmiyorum. Ben bir fft uzmanı değilim bu yüzden tüm bunlar (muhtemel) yanlış olabilir.


0

APL (NARS), 58 karakter, 116 bayt

{1≥k←≢⍵:⍵⋄(∇⍵[y∼⍨⍳k])(+,-)(∇⍵[y←2×⍳t])×0J1*t÷⍨2-2×⍳t←⌊k÷2}

Ölçek

  f←{1≥k←≢⍵:⍵⋄(∇⍵[y∼⍨⍳k])(+,-)(∇⍵[y←2×⍳t])×0J1*t÷⍨2-2×⍳t←⌊k÷2}
  f 1 1 1 1
4J0 0J0 0J0 0J0 
  f 1 2 3 4
10J0 ¯2J2 ¯2J0 ¯2J¯2 
  f 1J1 2 ¯2J1  9
10J2 3J7 ¯12J2 3J¯7 
  f 5.24626,3.90746,3.72335,5.74429,4.7983,8.34171,4.46785,0.760139
36.989359J0 ¯6.211855215J0.3556612739 1.85336J¯5.744741 7.107775215J¯1.133338726 ¯0.517839J0 
  7.107775215J1.133338726 1.85336J5.744741 ¯6.211855215J¯0.3556612739 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.