Introduction to the course:
  1. Went over Introductory Handout.
  2. Went over Course Announcement.
  3. ASSUME: You know DFTs and convolutions are useful.

    What can we do with Fast Algorithms?
  1. Combine smaller algorithms into larger algorithms
    OR: Split up large problem into smaller ones: Divide
  2. Use very efficient small algorithms: Conquer
  3. Develop new ways of solving problems: Applications

    Examples: (Numbers correspond to those above)
    1. Combine smaller into larger:
    2. Cooley-Tukey FFT: 2D DFT to 1D DFT (twiddle mults)
    3. Good-Thomas FFT: 2D DFT to 1D DFT (no twiddle mults)
    4. Winograd Convs: Chinese Remainder thm. for polynomials
    5. Block matrix multiplication: large to smaller.
    6. POINT: When nesting small algorithms into large ones,
      reducing #mults is much more important than reducing #adds,
      although mults and adds take same time. Will see why later.

    1. Efficient small algorithms:
    2. Direct computation of small DFTs (ugh).
      EXAMPLE: 5-point DFT using 16 complex mults.
    3. Prime Factor FFT: (p)point DFT to (p-1)point cyclic conv.
      EXAMPLE: 5-point DFT to 4-point cyclic convolution.
      POINT: 4 complex mults, instead of 16 complex mults.
    4. Cook-Toom fast small convolutions (trivial example below)
      (also useful for Mallat's fast wavelet algorithm).
    5. Strassen's fast 2× 2 matrix multiplication.

    1. Applications:
    2. 2D bandwidth extrapolation of finite-support image (see below).
    3. Phase retrieval and blind deconvolution.
    4. Inverse scattering (reconstruction from reflections).