COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Geometri ve sayısal algoritmalar · 44 / 53

Strassen, FFT ve sayısal maliyet

Anla → iz sür → uygula → gerekçelendir

2 dk okuma · uygulama için ayrıca zaman ayır

Klasik n×n matris çarpımı üç döngüyle Θ(n³) aritmetik işlem yapar. Strassen, bloklara bölünmüş iki matrisi sekiz yerine yedi alt çarpımla birleştirir: T(n)=7T(n/2)+Θ(n²), yani Θ(n^log₂7). Ek toplama, geçici alan, cache davranışı ve sayısal hata nedeniyle küçük matrislerde daha iyi değildir. Modern AI sistemlerinin bütün matris çarpımlarını Strassen ile yaptığı söylenemez; donanım ve kernel seçimi önemlidir.

FFT bir polinomu uygun köklerde değerlendirerek convolution hesaplamasını hızlandırır. Katsayılar arasında doğrudan convolution Θ(n²), FFT tabanlı yöntem uygun uzunlukta O(n log n) aritmetik işlemdir. Circular ve linear convolution farklıdır; yeterli zero-padding yapılmazsa sonuç sarılır. Floating-point FFT sonrası yuvarlama hatası kontrol edilmelidir.

NTT uygun asal modül ve birim köklerle exact modular convolution sağlar. CRT ile daha büyük katsayılar yeniden kurulabilir, fakat sınırları kanıtlanmalıdır. Aritmetik işlem sayısı ile büyük tamsayı bit maliyeti aynı ölçüm değildir. BLAS, SIMD, GPU ve tiling çoğu gerçek uygulamada asimptotik değişim kadar önemlidir.

Adım adım iz sürme

[1,2] ve [3,4] polinom çarpımı [3,10,8] verir: orta katsayı 1×4+2×3.

Maliyet ve varsayımlar

Doğrudan convolution O(nm); FFT O(N log N), N≥n+m−1 uygun dönüşüm uzunluğu.

Çalıştırılabilir örnek

Python 3 ile çalıştır. Assert küçük bir örneği denetler; genel doğruluk ispatı değildir. Bazı ileri örnekler özellikle küçük model veya referans oracle'dır; tam üretim uygulaması değildir.

Python 3
def convolution(a,b):
    out=[0]*(len(a)+len(b)-1)
    for i,x in enumerate(a):
        for j,y in enumerate(b): out[i+j]+=x*y
    return out
assert convolution([1,2],[3,4])==[3,10,8]

KAVRADIĞINI KONTROL ET

Sıra sende

FFT testinde yalnız rastgele küçük katsayılar yeterli mi?

Çözümün mantığını göster

Hayır. Büyük katsayı, uzun dizi, cancellation ve sınır uzunlukları ekle; küçük girdilerde exact oracle ile karşılaştır.

Bir adım ileri

  1. Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
  2. Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
  3. Belirtilen modelde maliyeti çıkar; farklı girdi büyüklüklerini ölç ve farkları gerekçelendir.

Temel kaynaklar ve ders notları

Bu eğitimde özgün anlatım kullanıldı; aşağıdaki kaynaklar ispatlar ve ileri okumalar sunar. Bağlantılar daha geniş ders modülünü kapsayabilir.

MIT 6.046J · Design and Analysis ↗
İlerlemeden önce alıştırmayı çöz.