<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE document PUBLIC "-//CNX//DTD CNXML 0.5 plus MathML//EN" "http://cnx.rice.edu/cnxml/0.5/DTD/cnxml_mathml.dtd">
<document xmlns="http://cnx.rice.edu/cnxml" xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/" id="Module.2004-05-24.4005">
  <name>FFTs of prime length and Rader's conversion</name>
  <metadata>
  <md:version>1.3</md:version>
  <md:created>2004/05/24 16:40:05 GMT-5</md:created>
  <md:revised>2006/09/24 08:38:41.648 GMT-5</md:revised>
  <md:authorlist>
      <md:author id="dljones">
      <md:firstname>Douglas</md:firstname>
      <md:othername>L.</md:othername>
      <md:surname>Jones</md:surname>
      <md:email>dl-jones@uiuc.edu</md:email>
    </md:author>
  </md:authorlist>

  <md:maintainerlist>
    <md:maintainer id="dljones">
      <md:firstname>Douglas</md:firstname>
      <md:othername>L.</md:othername>
      <md:surname>Jones</md:surname>
      <md:email>dl-jones@uiuc.edu</md:email>
    </md:maintainer>
    <md:maintainer id="kclarks">
      <md:firstname>Kyle</md:firstname>
      <md:othername>Evan</md:othername>
      <md:surname>Clarkson</md:surname>
      <md:email>kclarks@rice.edu</md:email>
    </md:maintainer>
  </md:maintainerlist>
  
  <md:keywordlist>
    <md:keyword>chirp z-transform</md:keyword>
    <md:keyword>index map</md:keyword>
    <md:keyword>prime factor algorithm</md:keyword>
    <md:keyword>prime length FFTs</md:keyword>
    <md:keyword>Rader's conversion</md:keyword>
    <md:keyword>WFTA</md:keyword>
    <md:keyword>Winograd</md:keyword>
    <md:keyword>Winograd Fourier Transform Algorithm</md:keyword>
  </md:keywordlist>

  <md:abstract>FFTs of prime length can be computed efficiently via Rader's conversion, via the chirp z-transform, or by use of Winograd methods.</md:abstract>
</metadata>

  <content>
    <para id="element-953">The <cnxn document="m12059">power-of-two FFT algorithms</cnxn>, such as the <cnxn document="m12016">radix-2</cnxn>
and <cnxn document="m12027">radix-4</cnxn> FFTs, and the <cnxn document="m12025">common-factor</cnxn>
and <cnxn document="m12033">prime-factor</cnxn> FFTs, achieve great reductions in computational complexity
of the <cnxn document="m12019">DFT</cnxn> when the length, <m:math><m:ci>N</m:ci></m:math>,
is a composite number.
DFTs of prime length are sometimes needed, however, particularly for the short-length DFTs in
common-factor or prime-factor algorithms.
The methods described here, along with the composite-length algorithms, allow fast computation
of DFTs of <emphasis>any</emphasis> length.</para><para id="element-326">There are two main ways of performing DFTs of prime length:
	<list id="listq" type="enumerated"><name/>
          <item>Rader's conversion, which is most efficient, and the</item>
	  <item><cnxn document="m12013">Chirp-z transform</cnxn>, which is simpler and more general.</item>
	</list>
Oddly enough, both work by turning prime-length DFTs into convolution!
The resulting convolutions can then be computed efficiently by either
	<list id="listN" type="enumerated">
	  <item><cnxn document="m12022">fast convolution</cnxn> via composite-length FFTs (simpler) or by</item>
	  <item>Winograd techniques (more efficient)</item>
	</list></para>
    
    <section id="Radersconv">
      <name>Rader's Conversion</name>
      <para id="para4"><term>Rader's conversion</term> is a one-dimensional <cnxn document="m12025">index-mapping</cnxn> scheme that turns a
	length-<m:math><m:ci>N</m:ci></m:math> <cnxn document="m12032" target="DFTequation">DFT</cnxn>
	(<m:math><m:ci>N</m:ci></m:math> prime) into a
	length-(
	<m:math>
	  <m:apply>
	    <m:minus/>
	    <m:ci>N</m:ci>
	    <m:cn>1</m:cn>
	  </m:apply>
	</m:math>) convolution and a few additions.
        Rader's conversion works <emphasis>only</emphasis> for prime-length <m:math><m:ci>N</m:ci></m:math>.
      </para>
      <para id="para5">An <term>index map</term> simply rearranges the order of the sum operation in the
        <cnxn document="m12019">DFT definition</cnxn>.
        Because addition is a commutative operation, the same mathematical result is produced
        from any order, as long as all of the same terms are added once and only once.  (This is
        the condition that defines an index map.)
	Unlike the <cnxn document="m12025">multi-dimensional index maps</cnxn> used in deriving
        <cnxn document="m12025">common factor</cnxn> and <cnxn document="m12033">prime-factor FFTs</cnxn>,
        Rader's conversion uses a one-dimensional index map in a finite group of
        <m:math><m:ci>N</m:ci></m:math> integers:
	<m:math>
	  <m:apply>
	    <m:eq/>
	    <m:ci>k</m:ci>
	    <m:apply>
	      <m:rem/>
	      <m:apply>
		<m:power/>
		<m:ci>r</m:ci>
		<m:ci>m</m:ci>
	      </m:apply>
	      <m:ci>N</m:ci>
	    </m:apply>
	  </m:apply>
	</m:math>
      </para>
      <section>
	<name>Fact from number theory</name>
	<para id="para6">
	  If <m:math><m:ci>N</m:ci></m:math> is prime, there exists an
	  integer "<m:math><m:ci>r</m:ci></m:math>" called a
	  <term>primitive root</term>, such that the index map
	  <m:math>
	    <m:apply>
	      <m:eq/>
	      <m:ci>k</m:ci>
	      <m:apply>
		<m:rem/>
		<m:apply>
		  <m:power/>
		  <m:ci>r</m:ci>
		  <m:ci>m</m:ci>
		</m:apply>
		<m:ci>N</m:ci>
	      </m:apply>
	    </m:apply>
	  </m:math>, 
	  <m:math>
	    <m:apply>
	      <m:eq/>
	      <m:ci>m</m:ci>
	      <m:list>
		<m:cn>0</m:cn>
		<m:cn>1</m:cn>
		<m:cn>2</m:cn>
		<m:ci>…</m:ci>
		<m:apply>
		  <m:minus/>
		  <m:ci>N</m:ci>
		  <m:cn>2</m:cn>
		</m:apply>
	      </m:list>
	    </m:apply>
	  </m:math>, uniquely generates all elements 
	  <m:math>
	    <m:apply>
	      <m:eq/>
	      <m:ci>k</m:ci>
	      <m:list>
		<m:cn>1</m:cn>
		<m:cn>2</m:cn>
		<m:cn>3</m:cn>
		<m:ci>…</m:ci>
		<m:apply>
		  <m:minus/>
		  <m:ci>N</m:ci>
		  <m:cn>1</m:cn>
		</m:apply>
	      </m:list>
	    </m:apply>
	  </m:math>
	</para>
	<example id="exam1">
	  <para id="para7">
	    <m:math>
	      <m:apply>
		<m:eq/>
		<m:ci>N</m:ci>
		<m:cn>5</m:cn>
	      </m:apply>
	    </m:math>, 
	    <m:math>
	      <m:apply>
		<m:eq/>
		<m:ci>r</m:ci>
		<m:cn>2</m:cn>
	      </m:apply>
	    </m:math>
	    <m:math display="block">
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:rem/>
		  <m:apply>
		    <m:power/>
		    <m:cn>2</m:cn>
		    <m:cn>0</m:cn>
		  </m:apply>
		  <m:cn>5</m:cn>
		</m:apply>
		<m:cn>1</m:cn>
	      </m:apply>
	    </m:math>
	    <m:math display="block">
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:rem/>
		  <m:apply>
		    <m:power/>
		    <m:cn>2</m:cn>
		    <m:cn>1</m:cn>
		  </m:apply>
		  <m:cn>5</m:cn>
		</m:apply>
		<m:cn>2</m:cn>
	      </m:apply>
	    </m:math> 
	    <m:math display="block">
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:rem/>
		  <m:apply>
		    <m:power/>
		    <m:cn>2</m:cn>
		    <m:cn>2</m:cn>
		  </m:apply>
		  <m:cn>5</m:cn>
		</m:apply>
		<m:cn>4</m:cn>
	      </m:apply>
	    </m:math>
	    <m:math display="block">
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:rem/>
		  <m:apply>
		    <m:power/>
		    <m:cn>2</m:cn>
		    <m:cn>3</m:cn>
		  </m:apply>
		  <m:cn>5</m:cn>
		</m:apply>
		<m:cn>3</m:cn>
	      </m:apply>
	    </m:math>
	  </para>
	</example>
      </section>
      <section>
	<name>Another fact from number theory</name>
	<para id="para8">
	  For <m:math><m:ci>N</m:ci></m:math> prime, the inverse of
	  <m:math><m:ci>r</m:ci></m:math> (i.e.
	  <m:math>
	    <m:apply>
	      <m:eq/>
	      <m:apply>
		<m:rem/>
		<m:apply>
		  <m:times/>
		  <m:apply>
		    <m:inverse/>
		    <m:ci>r</m:ci>
		  </m:apply>
		  <m:ci>r</m:ci>
		</m:apply>
		<m:ci>N</m:ci>
	      </m:apply>
	      <m:cn>1</m:cn>
	    </m:apply>
	  </m:math> is also a primitive root (call it
	  <m:math>
	    <m:apply>
	      <m:inverse/>
	      <m:ci>r</m:ci>
	    </m:apply>
	  </m:math>).
	</para>
	<example id="exam2">
	  <para id="para9"><m:math>
	      <m:apply>
		<m:eq/>
		<m:ci>N</m:ci>
		<m:cn>5</m:cn>
	      </m:apply>
	    </m:math>,
	    <m:math>
	      <m:apply>
		<m:eq/>
		<m:ci>r</m:ci>
		<m:cn>2</m:cn>
	      </m:apply>
	    </m:math>
	    <m:math>
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:inverse/>
		  <m:ci>r</m:ci>
		</m:apply>
		<m:cn>3</m:cn>
	      </m:apply>
	    </m:math>
	    <m:math display="block">
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:rem/>
		  <m:apply>
		    <m:times/>
		    <m:cn>2</m:cn>
		    <m:cn>3</m:cn>
		  </m:apply>
		  <m:cn>5</m:cn>
		</m:apply>
		<m:cn>1</m:cn>
	      </m:apply>
	    </m:math>
	    <m:math display="block">
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:rem/>
		  <m:apply>
		    <m:power/>
		    <m:cn>3</m:cn>
		    <m:cn>0</m:cn>
		  </m:apply>
		  <m:cn>5</m:cn>
		</m:apply>
		<m:cn>1</m:cn>
	      </m:apply>
	    </m:math>
	    <m:math display="block">
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:rem/>
		  <m:apply>
		    <m:power/>
		    <m:cn>3</m:cn>
		    <m:cn>1</m:cn>
		  </m:apply>
		  <m:cn>5</m:cn>
		</m:apply>
		<m:cn>3</m:cn>
	      </m:apply>
	    </m:math>
	    <m:math display="block">
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:rem/>
		  <m:apply>
		    <m:power/>
		    <m:cn>3</m:cn>
		    <m:cn>2</m:cn>
		  </m:apply>
		  <m:cn>5</m:cn>
		</m:apply>
		<m:cn>4</m:cn>
	      </m:apply>
	    </m:math>
	    <m:math display="block">
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:rem/>
		  <m:apply>
		    <m:power/>
		    <m:cn>3</m:cn>
		    <m:cn>3</m:cn>
		  </m:apply>
		  <m:cn>5</m:cn>
		</m:apply>
		<m:cn>2</m:cn>
	      </m:apply>
	    </m:math>
	  </para>
	</example>
	<para id="para9a">So why do we care?  Because we can use these facts to turn a
	  <cnxn document="m12032" target="DFTequation">DFT</cnxn> into a convolution!
	</para>
      </section>
      <section>
	<name>Rader's Conversion</name>
	<para id="para10">Let
	  <m:math>
	    <m:apply>
	      <m:forall/>
	      <m:bvar>
		<m:ci>m</m:ci>
		<m:ci>n</m:ci>
	      </m:bvar>
	      <m:condition>
		<m:apply>
		  <m:and/>
		  <m:apply>
		    <m:eq/>
		    <m:ci>m</m:ci>
		    <m:list>
		      <m:cn>0</m:cn>
		      <m:cn>1</m:cn>
		      <m:ci>…</m:ci>
		      <m:apply>
			<m:minus/>
			<m:ci>N</m:ci>
			<m:cn>2</m:cn>
		      </m:apply>
		    </m:list>
		  </m:apply>
		  <m:apply>
		    <m:in/>
		    <m:ci>n</m:ci>
		    <m:list>
		      <m:cn>1</m:cn>
		      <m:cn>2</m:cn>
		      <m:ci>…</m:ci>
		      <m:apply>
			<m:minus/>
			<m:ci>N</m:ci>
			<m:cn>1</m:cn>
		      </m:apply>
		    </m:list>
		  </m:apply>
		</m:apply>
	      </m:condition>
	      <m:apply>
		<m:eq/>
		<m:ci>n</m:ci>
		<m:apply>
		  <m:rem/>
		  <m:apply>
		    <m:power/>
		    <m:ci>r</m:ci>
		    <m:apply>
		      <m:minus/>
		      <m:ci>m</m:ci>
		    </m:apply>
		  </m:apply>
		  <m:ci>N</m:ci>
		</m:apply>
	      </m:apply>
	    </m:apply>
	  </m:math>,
	  <m:math>
	    <m:apply>
	      <m:forall/>
	      <m:bvar>
		<m:ci>p</m:ci>
		<m:ci>k</m:ci>
	      </m:bvar>
	      <m:condition>
		<m:apply>
		  <m:and/>
		  <m:apply>
		    <m:eq/>
		    <m:ci>p</m:ci>
		    <m:list>
		      <m:cn>0</m:cn>
		      <m:cn>1</m:cn>
		      <m:ci>…</m:ci>
		      <m:apply>
			<m:minus/>
			<m:ci>N</m:ci>
			<m:cn>2</m:cn>
		      </m:apply>
		    </m:list>
		  </m:apply>
		  <m:apply>
		    <m:in/>
		    <m:ci>k</m:ci>
		    <m:list>
		      <m:cn>1</m:cn>
		      <m:cn>2</m:cn>
		      <m:ci>…</m:ci>
		      <m:apply>
			<m:minus/>
			<m:ci>N</m:ci>
			<m:cn>1</m:cn>
		      </m:apply>
		    </m:list>
		  </m:apply>
		</m:apply>
	      </m:condition>
	      <m:apply>
		<m:eq/>
		<m:ci>k</m:ci>
		<m:apply>
		  <m:rem/>
		  <m:apply>
		    <m:power/>
		    <m:ci>r</m:ci>
		    <m:ci>p</m:ci>
		  </m:apply>
		  <m:ci>N</m:ci>
		</m:apply>
	      </m:apply>
	    </m:apply>
	  </m:math>
	  <m:math display="block">
	    <m:apply>
	      <m:eq/>
	      <m:apply>
		<m:ci type="fn">X</m:ci>
		<m:ci>k</m:ci>
	      </m:apply>
	      <m:apply>
		<m:sum/>
		<m:bvar>
		  <m:ci>n</m:ci>
		</m:bvar>
		<m:uplimit>
		  <m:apply>
		    <m:minus/>
		    <m:ci>N</m:ci>
		    <m:cn>1</m:cn>
		  </m:apply>
		</m:uplimit>
		<m:lowlimit>
		  <m:cn>0</m:cn>
		</m:lowlimit>
		<m:apply>
		  <m:times/>
		  <m:apply>
		    <m:ci type="fn">x</m:ci>
		    <m:cn>n</m:cn>
		  </m:apply>
		  <m:ci>
		    <m:msubsup>
		      <m:mi>W</m:mi>
		      <m:mi>N</m:mi>
		      <m:mrow>
			<m:mi>n</m:mi>
			<m:mi>k</m:mi>
		      </m:mrow>
		    </m:msubsup>
		  </m:ci>
		</m:apply>
	      </m:apply>
	      <m:apply>
		<m:piecewise>
		  <m:piece>
		    <m:apply>
		      <m:plus/>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:cn>0</m:cn>
		      </m:apply>
		      <m:apply>
			<m:sum/>
			<m:bvar>
			  <m:ci>n</m:ci>
			</m:bvar>
			<m:uplimit>
			  <m:apply>
			    <m:minus/>
			    <m:ci>N</m:ci>
			    <m:cn>1</m:cn>
			  </m:apply>
			</m:uplimit>
			<m:lowlimit>
			  <m:cn>1</m:cn>
			</m:lowlimit>
			<m:apply>
			  <m:times/>
			  <m:apply>
			    <m:ci type="fn">x</m:ci>
			    <m:ci>n</m:ci>
			  </m:apply>
			  <m:ci>
			    <m:msubsup>
			      <m:mi>W</m:mi>
			      <m:mi>N</m:mi>
			      <m:mrow>
				<m:mi>n</m:mi>
				<m:mi>k</m:mi>
			      </m:mrow>
			    </m:msubsup>
			  </m:ci>
			</m:apply>
		      </m:apply>
		    </m:apply>
		    <m:apply>
		      <m:neq/>
		      <m:ci>k</m:ci>
		      <m:cn>0</m:cn>
		    </m:apply>
		  </m:piece>
		  <m:piece>
		    <m:apply>
		      <m:sum/>
		      <m:bvar>
			<m:ci>n</m:ci>
		      </m:bvar>
		      <m:uplimit>
			<m:apply>
			  <m:minus/>
			  <m:ci>N</m:ci>
			  <m:cn>1</m:cn>
			</m:apply>
		      </m:uplimit>
		      <m:lowlimit>
			<m:cn>0</m:cn>
		      </m:lowlimit>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:ci>n</m:ci>
		      </m:apply>
		    </m:apply>
		    <m:apply>
		      <m:eq/>
		      <m:ci>k</m:ci>
		      <m:cn>0</m:cn>
		    </m:apply>
		  </m:piece>
		</m:piecewise>
	      </m:apply>
	    </m:apply>
	  </m:math>
          where for convenience
<m:math>
  <m:apply>
    <m:eq/>
      <m:ci>
	<m:msubsup>
	  <m:mi>W</m:mi>
	  <m:mi>N</m:mi>
          <m:apply>
          <m:times/>
            <m:mi>n</m:mi>
	    <m:mi>k</m:mi>
          </m:apply>
	</m:msubsup>
      </m:ci>
      <m:apply>
	<m:exp/>
	  <m:apply>
	    <m:minus/>
              <m:apply>
	        <m:times/>
		  <m:imaginaryi/>
		    <m:apply>
		      <m:divide/>
		       <m:apply>
			<m:times/>
			<m:cn>2</m:cn>
			<m:pi/>
                        <m:ci>n</m:ci>
			<m:ci>k</m:ci>
		       </m:apply>
		     <m:ci>N</m:ci>
		    </m:apply>
		  </m:apply>
		</m:apply>
	      </m:apply>
        </m:apply>
	</m:math>
        in the DFT equation.
	  For
	  <m:math>
	    <m:apply>
	      <m:neq/>
	      <m:ci>k</m:ci>
	      <m:cn>0</m:cn>
	    </m:apply>
	  </m:math>
	  <equation id="eq2">
	    <m:math>
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:ci type="fn">X</m:ci>
		  <m:apply>
		    <m:rem/>
		    <m:apply>
		      <m:power/>
		      <m:ci>r</m:ci>
		      <m:ci>p</m:ci>
		    </m:apply>
		    <m:ci>N</m:ci>
		  </m:apply>
		</m:apply>
		<m:apply>
		  <m:plus/>
		  <m:apply>
		    <m:sum/>
		    <m:bvar>
		      <m:ci>m</m:ci>
		    </m:bvar>
		    <m:uplimit>
		      <m:apply>
			<m:minus/>
			<m:ci>N</m:ci>
			<m:cn>2</m:cn>
		      </m:apply>
		    </m:uplimit>
		    <m:lowlimit>
		      <m:cn>0</m:cn>
		    </m:lowlimit>
		    <m:apply>
		      <m:times/>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:apply>
			  <m:rem/>
			  <m:apply>
			    <m:power/>
			    <m:ci>r</m:ci>
			    <m:apply>
			      <m:minus/>
			      <m:ci>m</m:ci>
			    </m:apply>
			  </m:apply>
			  <m:ci>N</m:ci>
			</m:apply>
		      </m:apply>
		      <m:ci>
			<m:msup>
			  <m:mi>W</m:mi>
			  <m:mrow>
			    <m:msup>
			      <m:mi>r</m:mi>
			      <m:mi>p</m:mi>
			    </m:msup>
			    <m:msup>
			      <m:mi>r</m:mi>
			      <m:mrow>
				<m:mo>-</m:mo>
				<m:mi>m</m:mi>
			      </m:mrow>
			    </m:msup>
			  </m:mrow>
			</m:msup>
		      </m:ci>
		    </m:apply>
		  </m:apply>
		  <m:apply>
		    <m:ci type="fn">x</m:ci>
		    <m:cn>0</m:cn>
		  </m:apply>
		</m:apply>
		<m:apply>
		  <m:plus/>
		  <m:apply>
		    <m:sum/>
		    <m:bvar>
		      <m:ci>m</m:ci>
		    </m:bvar>
		    <m:uplimit>
		      <m:apply>
			<m:minus/>
			<m:ci>N</m:ci>
			<m:cn>2</m:cn>
		      </m:apply>
		    </m:uplimit>
		    <m:lowlimit>
		      <m:cn>0</m:cn>
		    </m:lowlimit>
		    <m:apply>
		      <m:times/>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:apply>
			  <m:rem/>
			  <m:apply>
			    <m:power/>
			    <m:ci>r</m:ci>
			    <m:apply>
			      <m:minus/>
			      <m:ci>m</m:ci>
			    </m:apply>
			  </m:apply>
			  <m:ci>N</m:ci>
			</m:apply>
		      </m:apply>
		      <m:ci>
			<m:msup>
			  <m:mi>W</m:mi>
			  <m:msup>
			    <m:mi>r</m:mi>
			    <m:mrow>
			      <m:mi>p</m:mi>
			      <m:mo>-</m:mo>
			      <m:mi>m</m:mi>
			    </m:mrow>
			  </m:msup>
			</m:msup>
		      </m:ci>
		    </m:apply>
		  </m:apply>
		  <m:apply>
		    <m:ci type="fn">x</m:ci>
		    <m:cn>0</m:cn>
		  </m:apply>
		</m:apply>
		<m:apply>
		  <m:plus/>
		  <m:apply>
		    <m:ci type="fn">x</m:ci>
		    <m:cn>0</m:cn>
		  </m:apply>
		  <m:apply>
		    <m:csymbol definitionURL="http://cnx.rice.edu/cd/cnxmath.ocd#convolve"/>
		    <m:apply>
		      <m:ci type="fn">x</m:ci>
		      <m:apply>
			<m:rem/>
			<m:apply>
			  <m:power/>
			  <m:ci>r</m:ci>
			  <m:apply>
			    <m:minus/>
			    <m:ci>l</m:ci>
			  </m:apply>
			</m:apply>
			<m:ci>N</m:ci>
		      </m:apply>
		    </m:apply>
		    <m:ci>
		      <m:msup>
			<m:mi>W</m:mi>
			<m:msup>
			  <m:mi>r</m:mi>
			  <m:mi>l</m:mi>
			</m:msup>
		      </m:msup>
		    </m:ci>
		  </m:apply>
		</m:apply>
	      </m:apply>
	    </m:math>
	  </equation>
	  where 
	  <m:math>
	    <m:apply>
	      <m:eq/>
	      <m:ci>l</m:ci>
	      <m:list>
		<m:cn>0</m:cn>
		<m:cn>1</m:cn>
		<m:ci>…</m:ci>
		<m:apply>
		  <m:minus/>
		  <m:ci>N</m:ci>
		  <m:cn>2</m:cn>
		</m:apply>
	      </m:list>
	    </m:apply>
	  </m:math>  
	</para>
	<example id="exam4">
	  <para id="para77"><m:math>
	      <m:apply>
		<m:eq/>
		<m:ci>N</m:ci>
		<m:cn>5</m:cn>
	      </m:apply>
	    </m:math>,
	    <m:math>
	      <m:apply>
		<m:eq/>
		<m:ci>r</m:ci>
		<m:cn>2</m:cn>
	      </m:apply>
	    </m:math>,
	    <m:math>
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:inverse/>
		  <m:ci>r</m:ci>
		</m:apply>
		<m:cn>3</m:cn>
	      </m:apply>
	    </m:math>
	    <m:math display="block">
	      <m:apply>
		<m:eq/>
		<m:matrix>
		  <m:matrixrow>
		    <m:apply>
		      <m:ci type="fn">X</m:ci>
		      <m:cn>0</m:cn>
		    </m:apply>
		  </m:matrixrow>
		  <m:matrixrow>
		    <m:apply>
		      <m:ci type="fn">X</m:ci>
		      <m:cn>1</m:cn>
		    </m:apply>
		  </m:matrixrow>
		  <m:matrixrow>
		    <m:apply>
		      <m:ci type="fn">X</m:ci>
		      <m:cn>2</m:cn>
		    </m:apply>
		  </m:matrixrow>
		  <m:matrixrow>
		    <m:apply>
		      <m:ci type="fn">X</m:ci>
		      <m:cn>3</m:cn>
		    </m:apply>
		  </m:matrixrow>
		  <m:matrixrow>
		    <m:apply>
		      <m:ci type="fn">X</m:ci>
		      <m:cn>4</m:cn>
		    </m:apply>
		  </m:matrixrow>
		</m:matrix>
		<m:apply>
		  <m:times/>
		  <m:matrix>
		    <m:matrixrow>
		      <m:cn>0</m:cn>
		      <m:cn>0</m:cn>
		      <m:cn>0</m:cn>
		      <m:cn>0</m:cn>
		      <m:cn>0</m:cn>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:cn>0</m:cn>
		      <m:cn>1</m:cn>
		      <m:cn>2</m:cn>
		      <m:cn>3</m:cn>
		      <m:cn>4</m:cn>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:cn>0</m:cn>
		      <m:cn>2</m:cn>
		      <m:cn>4</m:cn>
		      <m:cn>1</m:cn>
		      <m:cn>3</m:cn>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:cn>0</m:cn>
		      <m:cn>3</m:cn>
		      <m:cn>1</m:cn>
		      <m:cn>4</m:cn>
		      <m:cn>2</m:cn>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:cn>0</m:cn>
		      <m:cn>4</m:cn>
		      <m:cn>3</m:cn>
		      <m:cn>2</m:cn>
		      <m:cn>1</m:cn>
		    </m:matrixrow>
		  </m:matrix>
		  <m:matrix>
		    <m:matrixrow>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:cn>0</m:cn>
		      </m:apply>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:cn>1</m:cn>
		      </m:apply>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:cn>2</m:cn>
		      </m:apply>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:cn>3</m:cn>
		      </m:apply>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:cn>4</m:cn>
		      </m:apply>
		    </m:matrixrow>
		  </m:matrix>
		</m:apply>
	      </m:apply>
	    </m:math>
	    <m:math display="block">
	      <m:apply>
		<m:eq/>
		<m:matrix>
		  <m:matrixrow>
		    <m:apply>
		      <m:ci type="fn">X</m:ci>
		      <m:cn>0</m:cn>
		    </m:apply>
		  </m:matrixrow>
		  <m:matrixrow>
		    <m:apply>
		      <m:ci type="fn">X</m:ci>
		      <m:cn>1</m:cn>
		    </m:apply>
		  </m:matrixrow>
		  <m:matrixrow>
		    <m:apply>
		      <m:ci type="fn">X</m:ci>
		      <m:cn>2</m:cn>
		    </m:apply>
		  </m:matrixrow>
		  <m:matrixrow>
		    <m:apply>
		      <m:ci type="fn">X</m:ci>
		      <m:cn>4</m:cn>
		    </m:apply>
		  </m:matrixrow>
		  <m:matrixrow>
		    <m:apply>
		      <m:ci type="fn">X</m:ci>
		      <m:cn>3</m:cn>
		    </m:apply>
		  </m:matrixrow>
		</m:matrix>
		<m:apply>
		  <m:times/>
		  <m:matrix>
		    <m:matrixrow>
		      <m:cn>0</m:cn>
		      <m:cn>0</m:cn>
		      <m:cn>0</m:cn>
		      <m:cn>0</m:cn>
		      <m:cn>0</m:cn>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:cn>0</m:cn>
		      <m:cn>1</m:cn>
		      <m:cn>3</m:cn>
		      <m:cn>4</m:cn>
		      <m:cn>2</m:cn>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:cn>0</m:cn>
		      <m:cn>2</m:cn>
		      <m:cn>1</m:cn>
		      <m:cn>3</m:cn>
		      <m:cn>4</m:cn>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:cn>0</m:cn>
		      <m:cn>4</m:cn>
		      <m:cn>2</m:cn>
		      <m:cn>1</m:cn>
		      <m:cn>1</m:cn>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:cn>0</m:cn>
		      <m:cn>3</m:cn>
		      <m:cn>4</m:cn>
		      <m:cn>2</m:cn>
		      <m:cn>3</m:cn>
		    </m:matrixrow>
		  </m:matrix>
		  <m:matrix>
		    <m:matrixrow>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:cn>0</m:cn>
		      </m:apply>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:cn>1</m:cn>
		      </m:apply>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:cn>3</m:cn>
		      </m:apply>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:cn>4</m:cn>
		      </m:apply>
		    </m:matrixrow>
		    <m:matrixrow>
		      <m:apply>
			<m:ci type="fn">x</m:ci>
			<m:cn>2</m:cn>
		      </m:apply>
		    </m:matrixrow>
		  </m:matrix>
		</m:apply>
	      </m:apply>
	    </m:math>
            where for visibility the matrix entries represent only the <emphasis>power</emphasis>, <m:math><m:ci>m</m:ci></m:math> of the corresponding
            DFT term
    <m:math>
      <m:ci>
	<m:msubsup>
	  <m:mi>W</m:mi>
	  <m:mi>N</m:mi>
	  <m:mi>m</m:mi>
	</m:msubsup>
      </m:ci>
    </m:math>
	    Note that the 4-by-4 <link src="http://en.wikipedia.org/wiki/Circulant_matrix">circulant matrix</link>
	    <m:math display="block">
	      <m:matrix>
		<m:matrixrow>
		  <m:cn>1</m:cn>
		  <m:cn>3</m:cn>
		  <m:cn>4</m:cn>
		  <m:cn>2</m:cn>
		</m:matrixrow>
		<m:matrixrow>
		  <m:cn>2</m:cn>
		  <m:cn>1</m:cn>
		  <m:cn>3</m:cn>
		  <m:cn>4</m:cn>
		</m:matrixrow>
		<m:matrixrow>
		  <m:cn>4</m:cn>
		  <m:cn>2</m:cn>
		  <m:cn>1</m:cn>
		  <m:cn>1</m:cn>
		</m:matrixrow>
		<m:matrixrow>
		  <m:cn>3</m:cn>
		  <m:cn>4</m:cn>
		  <m:cn>2</m:cn>
		  <m:cn>3</m:cn>
		</m:matrixrow>
	      </m:matrix>
	    </m:math>
            corresponds to a length-4 circular convolution.
	  </para>
	</example>
	<para id="para78">Rader's conversion turns a prime-length <cnxn document="m12032" target="DFTequation">DFT</cnxn> into a few adds
	  and a <emphasis>composite-length</emphasis>
	  (<m:math>
	    <m:apply>
	      <m:minus/>
	      <m:ci>N</m:ci>
	      <m:cn>1</m:cn>
	    </m:apply>
	  </m:math>) circular convolution, which can be computed
	  efficiently using either
	  <list id="list78" type="enumerated"><item><cnxn document="m12022">fast convolution</cnxn> via FFT and IFFT</item>
	    <item>index-mapped convolution algorithms and short
	    Winograd convolution alogrithms. (Rather complicated, and trades fewer multiplies
            for many more adds, which may not be worthwile on most modern processors.) See <cite src="#Agarwal">R.C. Agarwal and J.W. Cooley</cite></item>
	  </list>
	</para>
      </section>
    </section>
      <section id="Winograd">
	<name>Winograd minimum-multiply convolution and DFT algorithms</name>
	<para id="para79">S. Winograd has proved that a
	  length-<m:math><m:ci>N</m:ci></m:math> circular or linear
	  convolution or <cnxn document="m12032" target="DFTequation">DFT</cnxn> requires less than
	  <m:math>
	    <m:apply>
	      <m:times/>
	      <m:cn>2</m:cn>
	      <m:ci>N</m:ci>
	    </m:apply>
	  </m:math> multiplies (for real data), or
	  <m:math>
	    <m:apply>
	      <m:times/>
	      <m:cn>4</m:cn>
	      <m:ci>N</m:ci>
	    </m:apply>
	  </m:math> real multiplies for complex data. (This doesn't
	  count multiplies by rational fractions, like
	  <m:math><m:cn>3</m:cn></m:math> or
	  <m:math>
	    <m:apply>
	      <m:divide/>
	      <m:cn>1</m:cn>
	      <m:ci>N</m:ci>
	    </m:apply>
	  </m:math> or 
	  <m:math>
	    <m:apply> 
	      <m:divide/>
	      <m:cn>5</m:cn>
	      <m:cn>17</m:cn>
	    </m:apply>
	  </m:math>, which can be computed with additions and one
	  overall scaling factor.) Furthermore, Winograd showed how to
	  construct algorithms achieving these counts. Winograd
	  prime-length DFTs and convolutions have the following
	  characteristics:
	  <list id="list79" type="enumerated">
	    <item>Extremely efficient for small
	      <m:math><m:ci>N</m:ci></m:math>
	      (<m:math>
		<m:apply>
		  <m:lt/>
		  <m:ci>N</m:ci>
		  <m:cn>20</m:cn>
		</m:apply>
	      </m:math>)
	    </item>
	    <item>The number of adds becomes <emphasis>huge</emphasis>
	    for large <m:math><m:ci>N</m:ci></m:math>.
	    </item>
	  </list>
	  Thus Winograd's minimum-multiply FFT's are useful only for
	  small <m:math><m:ci>N</m:ci></m:math>. They are
	  very important for <cnxn document="m12033">Prime-Factor
	  Algorithms</cnxn>, which generally use Winograd modules to
	  implement the short-length DFTs.  Tables giving the
	  multiplies and adds necessary to compute Winograd FFTs for
	  various lengths can be found in <cite src="#Burrus">C.S. Burrus (1988)</cite>. Tables and FORTRAN
	  and TMS32010 programs for these short-length transforms can
	  be found in <cite src="#BurrusandParks">C.S. Burrus and
	  T.W. Parks (1985)</cite>. The theory and derivation of these
	  algorithms is quite elegant but requires substantial
	  background in number theory and abstract algebra.
	  Fortunately for the practitioner, all of the short
	  algorithms one is likely to need have already been derived
	  and can simply be looked up without mastering the
	  details of their derivation.
      </para>
    </section>
    <section id="WFTA">
      <name>Winograd Fourier Transform Algorithm (WFTA)</name>
      <para id="para80">
        The Winograd Fourier Transform Algorithm (WFTA) is
	a technique that recombines the short Winograd modules in a
	<cnxn document="m12033">prime-factor FFT</cnxn> into a composite-<m:math><m:ci>N</m:ci></m:math> structure with
	fewer multiplies but more adds. While theoretically interesting,
        WFTAs are complicated and different for every length, and on modern
        processors with hardware multipliers the trade of multiplies for many
        more adds is very rarely useful in practice today.
      </para>
    </section>
  </content>
  <bib:file>
    <bib:entry id="Agarwal">
      <bib:article>
	<bib:author>R.C. Agarwal and J.W. Cooley</bib:author>
	<bib:title>New Algorithms for Digital Convolution</bib:title>
	<bib:journal>IEEE Trans. on Acoustics, Speech, and Signal Processing</bib:journal>
	<bib:year>1977</bib:year>
	<bib:volume>25</bib:volume>
	<bib:pages>392-410</bib:pages>
	<bib:month>Oct</bib:month>
      </bib:article>
    </bib:entry>
    <bib:entry id="Burrus">
      <bib:incollection>
	<bib:author>C.S. Burrus</bib:author>
	<bib:title>Efficient Fourier Transform and Convolution
	Algorithms</bib:title>
	<bib:booktitle>Advanced Topics in Signal Processing</bib:booktitle>
	<bib:publisher>Prentice-Hall</bib:publisher>
	<bib:year>1988</bib:year>
	<bib:editor>J.S. Lin and A.V. Oppenheim</bib:editor>
	<bib:chapter>Chapter 4</bib:chapter>
      </bib:incollection>
    </bib:entry>
    <bib:entry id="BurrusandParks">
      <bib:book>
	<bib:author>C.S. Burrus and T.W. Parks</bib:author>
	<bib:title>DFT/FFT and Convolution Algorithms</bib:title>
	<bib:publisher>Wiley-Interscience</bib:publisher>
	<bib:year>1985</bib:year>
      </bib:book>
    </bib:entry>
	
	  
  </bib:file>
</document>
