<?xml version="1.0" encoding="utf-8"?>
<!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:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/" xmlns:md="http://cnx.rice.edu/mdml/0.4" id="id2255528">
  <name>Winograd's Short DFT Algorithms</name>
  <metadata>
  <md:version>1.5</md:version>
  <md:created>2008/05/22 15:49:18 GMT-5</md:created>
  <md:revised>2008/07/25 08:47:05.405 GMT-5</md:revised>
  <md:authorlist>
      <md:author id="cburrus">
      <md:firstname>C.</md:firstname>
      <md:othername>Sidney</md:othername>
      <md:surname>Burrus</md:surname>
      <md:email>csb@rice.edu</md:email>
    </md:author>
      <md:author id="selesi">
      <md:firstname>Ivan</md:firstname>
      
      <md:surname>Selesnick</md:surname>
      <md:email>selesi@taco.poly.edu</md:email>
    </md:author>
  </md:authorlist>

  <md:maintainerlist>
    <md:maintainer id="cburrus">
      <md:firstname>C.</md:firstname>
      <md:othername>Sidney</md:othername>
      <md:surname>Burrus</md:surname>
      <md:email>csb@rice.edu</md:email>
    </md:maintainer>
    <md:maintainer id="selesi">
      <md:firstname>Ivan</md:firstname>
      
      <md:surname>Selesnick</md:surname>
      <md:email>selesi@taco.poly.edu</md:email>
    </md:maintainer>
    <md:maintainer id="dcwill">
      <md:firstname>Daniel</md:firstname>
      <md:othername>Collins</md:othername>
      <md:surname>Williamson</md:surname>
      <md:email>dwilliamson1285@gmail.com</md:email>
    </md:maintainer>
  </md:maintainerlist>
  
  

  <md:abstract/>
</metadata>
  <content>
    <para id="id2255538">In 1976, S. Winograd <cnxn target="bid0"/> presented a new DFT algorithm
which had significantly fewer multiplications than the Cooley-Tukey
FFT which had been published eleven years earlier. This new Winograd
Fourier Transform Algorithm (WFTA) is based on the type- one index
map from <cnxn document="m16326">Multidimensional Index Mapping</cnxn> with each of the relatively prime length
short DFT's calculated by very efficient special algorithms. It is
these short algorithms that this section will develop. They use the
index permutation of Rader described in the previous section to
convert the prime length short DFT's into cyclic convolutions.
Winograd developed a method for calculating digital convolution with
the minimum number of multiplications. These optimal algorithms are
based on the polynomial residue reduction techniques of <cnxn document="m16327" target="uid1">Polynomial Description of Signals: Equation 1</cnxn> to break the convolution into multiple small ones
<cnxn target="bid1"/>, <cnxn target="bid2"/>, <cnxn target="bid3"/>, <cnxn target="bid4"/>, <cnxn target="bid5"/>, <cnxn target="bid6"/>.</para>
    <para id="id2255605">The operation of discrete convolution defined by</para>
    <equation id="uid1"><m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>y</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>n</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:munder>
            <m:mo>∑</m:mo>
            <m:mi>k</m:mi>
          </m:munder>
          <m:mi>h</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>n</m:mi>
            <m:mo>-</m:mo>
            <m:mi>k</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mspace width="4pt"/>
          <m:mi>x</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>k</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2255671">is called a <emphasis>bilinear</emphasis> operation because, for a fixed <m:math overflow="scroll"><m:mrow><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math>,
<m:math overflow="scroll"><m:mrow><m:mi>y</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math> is a linear function of <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math> and for a fixed <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math> it is a
linear function of <m:math overflow="scroll"><m:mrow><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math>. The operation of cyclic convolution is
the same but with all indices evaluated modulo <m:math overflow="scroll"><m:mi>N</m:mi></m:math>.</para>
    <para id="id2255773">Recall from <cnxn document="m16327" target="uid3">Polynomial Description of Signals: Equation 3</cnxn> that length-N cyclic convolution of
<m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math> can be represented by polynomial multiplication</para>
    <equation id="uid2">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>Y</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:mi>X</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mspace width="4pt"/>
          <m:mi>H</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mspace width="4pt"/>
          <m:mspace width="4pt"/>
          <m:mtext>mod</m:mtext>
          <m:mspace width="4pt"/>
          <m:mspace width="4pt"/>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msup>
              <m:mi>s</m:mi>
              <m:mi>N</m:mi>
            </m:msup>
            <m:mo>-</m:mo>
            <m:mn>1</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2256131">This bilinear operation of <cnxn target="uid1"/> and <cnxn target="uid2"/> can also be
expressed in terms of linear matrix operators and a simpler bilinear
operator denoted by <m:math overflow="scroll"><m:mi>o</m:mi></m:math> which may be only a simple
element-by-element multiplication of the two vectors
<cnxn target="bid2"/>, <cnxn target="bid6"/>, <cnxn target="bid7"/>. This matrix formulation is</para>
    <equation id="uid3">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>Y</m:mi>
          <m:mo>=</m:mo>
          <m:mi>C</m:mi>
          <m:mo>[</m:mo>
          <m:mi>A</m:mi>
          <m:mi>X</m:mi>
          <m:mi>o</m:mi>
          <m:mi>B</m:mi>
          <m:mi>H</m:mi>
          <m:mo>]</m:mo>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2256203">where <m:math overflow="scroll"><m:mi>X</m:mi></m:math>, <m:math overflow="scroll"><m:mi>H</m:mi></m:math> and <m:math overflow="scroll"><m:mi>Y</m:mi></m:math> are length-N vectors with elements of
<m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math>, <m:math overflow="scroll"><m:mrow><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mi>y</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math> respectively. The matrices <m:math overflow="scroll"><m:mi>A</m:mi></m:math> and <m:math overflow="scroll"><m:mi>B</m:mi></m:math>
have dimension <m:math overflow="scroll"><m:mi>M</m:mi></m:math> x <m:math overflow="scroll"><m:mi>N</m:mi></m:math> , and <m:math overflow="scroll"><m:mi>C</m:mi></m:math> is <m:math overflow="scroll"><m:mi>N</m:mi></m:math> x <m:math overflow="scroll"><m:mi>M</m:mi></m:math> with <m:math overflow="scroll"><m:mrow><m:mi>M</m:mi><m:mo>≥</m:mo><m:mi>N</m:mi></m:mrow></m:math>.
The elements of <m:math overflow="scroll"><m:mi>A</m:mi></m:math>, <m:math overflow="scroll"><m:mi>B</m:mi></m:math>, and <m:math overflow="scroll"><m:mi>C</m:mi></m:math> are constrained to be simple;
typically small integers or rational numbers. It will be these
matrix operators that do the equivalent of the residue reduction on
the polynomials in <cnxn target="uid2"/>.</para>
    <para id="id2256388">In order to derive a useful algorithm of the form <cnxn target="uid3"/> to
calculate <cnxn target="uid1"/>, consider the polynomial formulation
<cnxn target="uid2"/> again. To use the residue reduction scheme, the modulus
is factored into relatively prime factors. Fortunately the factoring
of this particular polynomial, <m:math overflow="scroll"><m:mrow><m:msup><m:mi>s</m:mi><m:mi>N</m:mi></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math>, has been extensively studied
and it has considerable structure. When factored over the rationals,
which means that the only coefficients allowed are rational numbers,
the factors are called cyclotomic polynomials
<cnxn target="bid1"/>, <cnxn target="bid2"/>, <cnxn target="bid3"/>. The most interesting property for our
purposes is that most of the coefficients of cyclotomic polynomials
are zero and the others are plus or minus unity for orders up to
over one hundred. This means the residue reduction will generally
not require multiplications.</para>
    <para id="id2256451">The operations of reducing <m:math overflow="scroll"><m:mrow><m:mi>X</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mi>H</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> in <cnxn target="uid2"/> are carried
out by the matrices <m:math overflow="scroll"><m:mi>A</m:mi></m:math> and <m:math overflow="scroll"><m:mi>B</m:mi></m:math> in <cnxn target="uid3"/>. The convolution of
the residue polynomials is carried out by the <m:math overflow="scroll"><m:mi>o</m:mi></m:math> operator and the
recombination by the CRT is done by the <m:math overflow="scroll"><m:mi>C</m:mi></m:math> matrix. More details are
in <cnxn target="bid1"/>, <cnxn target="bid2"/>, <cnxn target="bid3"/>, <cnxn target="bid6"/>, <cnxn target="bid7"/> but the important fact is
the <m:math overflow="scroll"><m:mi>A</m:mi></m:math> and <m:math overflow="scroll"><m:mi>B</m:mi></m:math> matrices usually contain only zero and plus or minus
unity entries and the <m:math overflow="scroll"><m:mi>C</m:mi></m:math> matrix only contains rational numbers. The
only general multiplications are those represented by <m:math overflow="scroll"><m:mi>o</m:mi></m:math>. Indeed,
in the theoretical results from computational complexity theory,
these real or complex multiplications are usually the only ones
counted. In practical algorithms, the rational multiplications
represented by <m:math overflow="scroll"><m:mi>C</m:mi></m:math> could be a limiting factor.</para>
    <para id="id2256610">The <m:math overflow="scroll"><m:mrow><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math> terms are fixed for a digital filter, or they
represent the <m:math overflow="scroll"><m:mi>W</m:mi></m:math> terms from <cnxn document="m16326" target="uid1">Multidimensional Index Mapping: Equation 1</cnxn> if the convolution is being
used to calculate a DFT. Because of this, <m:math overflow="scroll"><m:mrow><m:mi>d</m:mi><m:mo>=</m:mo><m:mi>B</m:mi><m:mi>H</m:mi></m:mrow></m:math> in <cnxn target="uid3"/>
can be precalculated and only the <m:math overflow="scroll"><m:mi>A</m:mi></m:math> and <m:math overflow="scroll"><m:mi>C</m:mi></m:math> operators represent
the mathematics done at execution of the algorithm. In order to
exploit this feature, it was shown <cnxn target="bid4"/>, <cnxn target="bid6"/> that the
properties of <cnxn target="uid3"/> allow the exchange of the more complicated
operator <m:math overflow="scroll"><m:mi>C</m:mi></m:math> with the simpler operator <m:math overflow="scroll"><m:mi>B</m:mi></m:math>. Specifically this is
given by</para>
    <equation id="id2256717">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>Y</m:mi>
          <m:mo>=</m:mo>
          <m:mi>C</m:mi>
          <m:mo>[</m:mo>
          <m:mi>A</m:mi>
          <m:mi>X</m:mi>
          <m:mi>o</m:mi>
          <m:mi>B</m:mi>
          <m:mi>H</m:mi>
          <m:mo>]</m:mo>
        </m:mrow>
      </m:math>
    </equation>
    <equation id="uid4">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:msup>
            <m:mi>Y</m:mi>
            <m:mo>'</m:mo>
          </m:msup>
          <m:mo>=</m:mo>
          <m:msup>
            <m:mi>B</m:mi>
            <m:mi>T</m:mi>
          </m:msup>
          <m:mrow>
            <m:mo>[</m:mo>
            <m:mi>A</m:mi>
            <m:mi>X</m:mi>
            <m:mi>o</m:mi>
            <m:msup>
              <m:mi>C</m:mi>
              <m:mi>T</m:mi>
            </m:msup>
            <m:msup>
              <m:mi>H</m:mi>
              <m:mo>'</m:mo>
            </m:msup>
            <m:mo>]</m:mo>
          </m:mrow>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2256803">where <m:math overflow="scroll"><m:mi>H</m:mi></m:math>' has the same elements as <m:math overflow="scroll"><m:mi>H</m:mi></m:math>, but in a permuted order,
and likewise <m:math overflow="scroll"><m:mi>Y</m:mi></m:math>' and <m:math overflow="scroll"><m:mi>Y</m:mi></m:math>. This very important property allows
precomputing the more complicated <m:math overflow="scroll"><m:mrow><m:msup><m:mi>C</m:mi><m:mi>T</m:mi></m:msup><m:mi>H</m:mi></m:mrow></m:math>' in <cnxn target="uid4"/> rather than
<m:math overflow="scroll"><m:mrow><m:mi>B</m:mi><m:mi>H</m:mi></m:mrow></m:math> as in <cnxn target="uid3"/>.</para>
    <para id="id2256880">Because <m:math overflow="scroll"><m:mrow><m:mi>B</m:mi><m:mi>H</m:mi></m:mrow></m:math> or <m:math overflow="scroll"><m:mrow><m:msup><m:mi>C</m:mi><m:mi>T</m:mi></m:msup><m:mi>H</m:mi></m:mrow></m:math>' can be precomputed, the bilinear form of
<cnxn target="uid3"/> and <cnxn target="uid4"/> can be written as a linear form. If an
<m:math overflow="scroll"><m:mi>M</m:mi></m:math> x <m:math overflow="scroll"><m:mi>M</m:mi></m:math> diagonal matrix <m:math overflow="scroll"><m:mi>D</m:mi></m:math> is formed from <m:math overflow="scroll"><m:mrow><m:mi>d</m:mi><m:mo>=</m:mo><m:msup><m:mi>C</m:mi><m:mi>T</m:mi></m:msup><m:mi>H</m:mi></m:mrow></m:math>, or in the
case of <cnxn target="uid3"/> <m:math overflow="scroll"><m:mrow><m:mi>d</m:mi><m:mo>=</m:mo><m:mi>B</m:mi><m:mi>H</m:mi></m:mrow></m:math>, assuming a commutative property for
<m:math overflow="scroll"><m:mi>o</m:mi></m:math>, <cnxn target="uid4"/> becomes</para>
    <equation id="uid5">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:msup>
            <m:mi>Y</m:mi>
            <m:mo>'</m:mo>
          </m:msup>
          <m:mo>=</m:mo>
          <m:msup>
            <m:mi>B</m:mi>
            <m:mi>T</m:mi>
          </m:msup>
          <m:mi>D</m:mi>
          <m:mi>A</m:mi>
          <m:mi>X</m:mi>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2257040">and <cnxn target="uid3"/> becomes</para>
    <equation id="id2257047">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>Y</m:mi>
          <m:mo>=</m:mo>
          <m:mi>C</m:mi>
          <m:mi>D</m:mi>
          <m:mi>A</m:mi>
          <m:mi>X</m:mi>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2257069">In most cases there is no reason not to use the same reduction
operations on <m:math overflow="scroll"><m:mi>X</m:mi></m:math> and <m:math overflow="scroll"><m:mi>H</m:mi></m:math>, therefore, <m:math overflow="scroll"><m:mi>B</m:mi></m:math> can be the same as <m:math overflow="scroll"><m:mi>A</m:mi></m:math> and
<cnxn target="uid5"/> then becomes</para>
    <equation id="uid6">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:msup>
            <m:mi>Y</m:mi>
            <m:mo>'</m:mo>
          </m:msup>
          <m:mo>=</m:mo>
          <m:msup>
            <m:mi>A</m:mi>
            <m:mi>T</m:mi>
          </m:msup>
          <m:mi>D</m:mi>
          <m:mi>A</m:mi>
          <m:mi>X</m:mi>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2257148">In order to illustrate how the residue reduction is carried
out and how the A matrix is obtained, the length-5 DFT algorithm
started in <cnxn document="m16328" target="uid9">The DFT as Convolution or Filtering: Matrix 1</cnxn> will be continued. The DFT is first converted
to a length-4 cyclic convolution by the index permutation from
<cnxn document="m16328" target="uid4">The DFT as Convolution or Filtering: Equation 3</cnxn> to give the cyclic convolution in <cnxn document="m16328">The DFT as Convolution or Filtering</cnxn>. To avoid
confusion from the permuted order of the data <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math> in <cnxn document="m16328">The DFT as Convolution or Filtering</cnxn>,
the cyclic convolution will first be developed without the
permutation, using the polynomial <m:math overflow="scroll"><m:mrow><m:mi>U</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math></para>
    <equation id="id2257199">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>U</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:mi>x</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mn>1</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>+</m:mo>
          <m:mi>x</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mn>3</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mi>s</m:mi>
          <m:mo>+</m:mo>
          <m:mi>x</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mn>4</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:msup>
            <m:mi>s</m:mi>
            <m:mn>2</m:mn>
          </m:msup>
          <m:mo>+</m:mo>
          <m:mi>x</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mn>2</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:msup>
            <m:mi>s</m:mi>
            <m:mn>3</m:mn>
          </m:msup>
        </m:mrow>
      </m:math>
    </equation>
    <equation id="uid7">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>U</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:mi>u</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mn>0</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>+</m:mo>
          <m:mi>u</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mn>1</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mi>s</m:mi>
          <m:mo>+</m:mo>
          <m:mi>u</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mn>2</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:msup>
            <m:mi>s</m:mi>
            <m:mn>2</m:mn>
          </m:msup>
          <m:mo>+</m:mo>
          <m:mi>u</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mn>3</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:msup>
            <m:mi>s</m:mi>
            <m:mn>3</m:mn>
          </m:msup>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2257369">and then the results will be converted back to the permuted <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math>.
The length-4 cyclic convolution in terms of polynomials is</para>
    <equation id="id2257391">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>Y</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:mi>U</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mspace width="4pt"/>
          <m:mi>H</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mspace width="4pt"/>
          <m:mspace width="4pt"/>
          <m:mtext>mod</m:mtext>
          <m:mspace width="4pt"/>
          <m:mspace width="4pt"/>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msup>
              <m:mi>s</m:mi>
              <m:mn>4</m:mn>
            </m:msup>
            <m:mo>-</m:mo>
            <m:mn>1</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2257466">and the modulus factors into three cyclotomic polynomials</para>
    <equation id="id2257470">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>s</m:mi>
          <m:mn>4</m:mn>
          <m:mo>-</m:mo>
          <m:mn>1</m:mn>
          <m:mo>=</m:mo>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msup>
              <m:mi>s</m:mi>
              <m:mn>2</m:mn>
            </m:msup>
            <m:mo>-</m:mo>
            <m:mn>1</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msup>
              <m:mi>s</m:mi>
              <m:mn>2</m:mn>
            </m:msup>
            <m:mo>+</m:mo>
            <m:mn>1</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
        </m:mrow>
      </m:math>
    </equation>
    <equation id="uid8">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mo>=</m:mo>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>-</m:mo>
            <m:mn>1</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>+</m:mo>
            <m:mn>1</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msup>
              <m:mi>s</m:mi>
              <m:mn>2</m:mn>
            </m:msup>
            <m:mo>+</m:mo>
            <m:mn>1</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
        </m:mrow>
      </m:math>
    </equation>
    <equation id="id2257579">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mo>=</m:mo>
          <m:msub>
            <m:mi>P</m:mi>
            <m:mn>1</m:mn>
          </m:msub>
          <m:mspace width="4pt"/>
          <m:msub>
            <m:mi>P</m:mi>
            <m:mn>2</m:mn>
          </m:msub>
          <m:mspace width="4pt"/>
          <m:msub>
            <m:mi>P</m:mi>
            <m:mn>3</m:mn>
          </m:msub>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2257620">Both <m:math overflow="scroll"><m:mrow><m:mi>U</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mi>H</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> are reduced modulo these three polynomials.
The reduction modulo <m:math overflow="scroll"><m:msub><m:mi>P</m:mi><m:mn>1</m:mn></m:msub></m:math> and <m:math overflow="scroll"><m:msub><m:mi>P</m:mi><m:mn>2</m:mn></m:msub></m:math> is done in two stages. First it
is done modulo <m:math overflow="scroll"><m:mrow><m:mo>(</m:mo><m:msup><m:mi>s</m:mi><m:mn>2</m:mn></m:msup><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math>, then that residue is further reduced
modulo <m:math overflow="scroll"><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>+</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math>.</para>
    <equation id="uid9">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>U</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:mi>u</m:mi>
          <m:mn>0</m:mn>
          <m:mo>+</m:mo>
          <m:mi>u</m:mi>
          <m:mn>1</m:mn>
          <m:mi>s</m:mi>
          <m:mo>+</m:mo>
          <m:msub>
            <m:mi>u</m:mi>
            <m:mn>2</m:mn>
          </m:msub>
          <m:msup>
            <m:mi>s</m:mi>
            <m:mn>2</m:mn>
          </m:msup>
          <m:mo>+</m:mo>
          <m:msub>
            <m:mi>u</m:mi>
            <m:mn>3</m:mn>
          </m:msub>
          <m:msup>
            <m:mi>s</m:mi>
            <m:mn>3</m:mn>
          </m:msup>
        </m:mrow>
      </m:math>
    </equation>
    <equation id="uid10">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:msup>
            <m:mi>U</m:mi>
            <m:mo>'</m:mo>
          </m:msup>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:msub>
            <m:mrow>
              <m:mo>(</m:mo>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:mi>U</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>s</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mo>)</m:mo>
            </m:mrow>
            <m:mrow>
              <m:mo>(</m:mo>
              <m:msup>
                <m:mi>s</m:mi>
                <m:mn>2</m:mn>
              </m:msup>
              <m:mo>-</m:mo>
              <m:mn>1</m:mn>
              <m:mo>)</m:mo>
            </m:mrow>
          </m:msub>
          <m:mo>=</m:mo>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>0</m:mn>
            </m:msub>
            <m:mo>+</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>2</m:mn>
            </m:msub>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>+</m:mo>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>1</m:mn>
            </m:msub>
            <m:mo>+</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>3</m:mn>
            </m:msub>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mi>s</m:mi>
        </m:mrow>
      </m:math>
    </equation>
    <equation id="uid11">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>U</m:mi>
          <m:mn>1</m:mn>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:msub>
            <m:mrow>
              <m:mo>(</m:mo>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:msup>
                  <m:mi>U</m:mi>
                  <m:mo>'</m:mo>
                </m:msup>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>s</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mo>)</m:mo>
            </m:mrow>
            <m:msub>
              <m:mi>P</m:mi>
              <m:mn>1</m:mn>
            </m:msub>
          </m:msub>
          <m:mo>=</m:mo>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>0</m:mn>
            </m:msub>
            <m:mo>+</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>1</m:mn>
            </m:msub>
            <m:mo>+</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>2</m:mn>
            </m:msub>
            <m:mo>+</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>3</m:mn>
            </m:msub>
            <m:mo>)</m:mo>
          </m:mrow>
        </m:mrow>
      </m:math>
    </equation>
    <equation id="uid12">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>U</m:mi>
          <m:mn>2</m:mn>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:msub>
            <m:mrow>
              <m:mo>(</m:mo>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:msup>
                  <m:mi>U</m:mi>
                  <m:mo>'</m:mo>
                </m:msup>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>s</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mo>)</m:mo>
            </m:mrow>
            <m:msub>
              <m:mi>P</m:mi>
              <m:mn>2</m:mn>
            </m:msub>
          </m:msub>
          <m:mo>=</m:mo>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>0</m:mn>
            </m:msub>
            <m:mo>-</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>1</m:mn>
            </m:msub>
            <m:mo>+</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>2</m:mn>
            </m:msub>
            <m:mo>-</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>3</m:mn>
            </m:msub>
            <m:mo>)</m:mo>
          </m:mrow>
        </m:mrow>
      </m:math>
    </equation>
    <equation id="uid13">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>U</m:mi>
          <m:mn>3</m:mn>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:msub>
            <m:mrow>
              <m:mo>(</m:mo>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:mi>U</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>s</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mo>)</m:mo>
            </m:mrow>
            <m:msub>
              <m:mi>P</m:mi>
              <m:mn>3</m:mn>
            </m:msub>
          </m:msub>
          <m:mo>=</m:mo>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>0</m:mn>
            </m:msub>
            <m:mo>-</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>2</m:mn>
            </m:msub>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>+</m:mo>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>1</m:mn>
            </m:msub>
            <m:mo>-</m:mo>
            <m:msub>
              <m:mi>u</m:mi>
              <m:mn>3</m:mn>
            </m:msub>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mi>s</m:mi>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2258262">The reduction in <cnxn target="uid10"/> of the data polynomial <cnxn target="uid9"/> can
be denoted by a matrix operation on a vector which has the data as
entries.</para>
    <equation id="uid14">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>2</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>3</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mo>=</m:mo>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>0</m:mn>
                    </m:msub>
                    <m:mo>+</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>2</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>1</m:mn>
                    </m:msub>
                    <m:mo>+</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>3</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2258426">and the reduction in <cnxn target="uid13"/> is</para>
    <equation id="uid15">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>2</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>3</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mo>=</m:mo>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>0</m:mn>
                    </m:msub>
                    <m:mo>-</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>2</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>1</m:mn>
                    </m:msub>
                    <m:mo>-</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>3</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2258589">Combining <cnxn target="uid14"/> and <cnxn target="uid15"/> gives one operator</para>
    <equation id="uid16">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>0</m:mn>
                    </m:msub>
                    <m:mo>+</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>2</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>1</m:mn>
                    </m:msub>
                    <m:mo>+</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>3</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>0</m:mn>
                    </m:msub>
                    <m:mo>-</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>2</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>1</m:mn>
                    </m:msub>
                    <m:mo>-</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>3</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mo>=</m:mo>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>0</m:mn>
                    </m:msub>
                    <m:mo>+</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>2</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>1</m:mn>
                    </m:msub>
                    <m:mo>+</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>3</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>0</m:mn>
                    </m:msub>
                    <m:mo>-</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>2</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>1</m:mn>
                    </m:msub>
                    <m:mo>-</m:mo>
                    <m:msub>
                      <m:mi>u</m:mi>
                      <m:mn>3</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mo>=</m:mo>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>w</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>w</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>v</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>v</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2258913">Further reduction of <m:math overflow="scroll"><m:mrow><m:msub><m:mi>v</m:mi><m:mn>0</m:mn></m:msub><m:mo>+</m:mo><m:msub><m:mi>v</m:mi><m:mn>1</m:mn></m:msub><m:mi>s</m:mi></m:mrow></m:math> is not possible because <m:math overflow="scroll"><m:mrow><m:msub><m:mi>P</m:mi><m:mn>3</m:mn></m:msub><m:mo>=</m:mo><m:msup><m:mi>s</m:mi><m:mn>2</m:mn></m:msup><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math> cannot be factored over the rationals. However <m:math overflow="scroll"><m:mrow><m:msup><m:mi>s</m:mi><m:mn>2</m:mn></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> can be
factored into <m:math overflow="scroll"><m:mrow><m:msub><m:mi>P</m:mi><m:mn>1</m:mn></m:msub><m:msub><m:mi>P</m:mi><m:mn>2</m:mn></m:msub><m:mo>=</m:mo><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>+</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:mrow></m:math> and, therefore, <m:math overflow="scroll"><m:mrow><m:msub><m:mi>w</m:mi><m:mn>0</m:mn></m:msub><m:mo>+</m:mo><m:msub><m:mi>w</m:mi><m:mn>1</m:mn></m:msub><m:mi>s</m:mi></m:mrow></m:math> can
be further reduced as was done in <cnxn target="uid11"/> and <cnxn target="uid12"/> by</para>
    <equation id="uid17">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mfenced open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>w</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>w</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mo>=</m:mo>
          <m:msub>
            <m:mi>w</m:mi>
            <m:mn>0</m:mn>
          </m:msub>
          <m:mo>+</m:mo>
          <m:msub>
            <m:mi>w</m:mi>
            <m:mn>1</m:mn>
          </m:msub>
          <m:mo>=</m:mo>
          <m:msub>
            <m:mi>u</m:mi>
            <m:mn>0</m:mn>
          </m:msub>
          <m:mo>+</m:mo>
          <m:msub>
            <m:mi>u</m:mi>
            <m:mn>2</m:mn>
          </m:msub>
          <m:mo>+</m:mo>
          <m:msub>
            <m:mi>u</m:mi>
            <m:mn>1</m:mn>
          </m:msub>
          <m:mo>+</m:mo>
          <m:msub>
            <m:mi>u</m:mi>
            <m:mn>3</m:mn>
          </m:msub>
        </m:mrow>
      </m:math>
    </equation>
    <equation id="uid18">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mfenced open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>w</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>w</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mo>=</m:mo>
          <m:msub>
            <m:mi>w</m:mi>
            <m:mn>0</m:mn>
          </m:msub>
          <m:mo>-</m:mo>
          <m:msub>
            <m:mi>w</m:mi>
            <m:mn>1</m:mn>
          </m:msub>
          <m:mo>=</m:mo>
          <m:msub>
            <m:mi>u</m:mi>
            <m:mn>0</m:mn>
          </m:msub>
          <m:mo>+</m:mo>
          <m:msub>
            <m:mi>u</m:mi>
            <m:mn>2</m:mn>
          </m:msub>
          <m:mo>-</m:mo>
          <m:msub>
            <m:mi>u</m:mi>
            <m:mn>1</m:mn>
          </m:msub>
          <m:mo>-</m:mo>
          <m:msub>
            <m:mi>u</m:mi>
            <m:mn>3</m:mn>
          </m:msub>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2259305">Combining <cnxn target="uid16"/>, <cnxn target="uid17"/> and <cnxn target="uid18"/> gives</para>
    <equation id="uid19">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>2</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>3</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mo>=</m:mo>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>r</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>r</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>v</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>v</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2259566">The same reduction is done to <m:math overflow="scroll"><m:mrow><m:mi>H</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> and then the convolution of
<cnxn target="id2257391"/> is done by multiplying each residue polynomial of <m:math overflow="scroll"><m:mrow><m:mi>X</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math>
and <m:math overflow="scroll"><m:mrow><m:mi>H</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> modulo each corresponding cyclotomic factor of <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> and
finally a recombination using the polynomial Chinese Remainder
Theorem (CRT) as in <cnxn document="m16327" target="uid10">Polynomial Description of Signals: Equation 9</cnxn> and <cnxn document="m16327" target="uid14">Polynomial Description of Signals: Equation 13</cnxn>.</para>
    <equation id="id2259647">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>Y</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:msub>
            <m:mi>K</m:mi>
            <m:mn>1</m:mn>
          </m:msub>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:msub>
            <m:mi>U</m:mi>
            <m:mn>1</m:mn>
          </m:msub>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:msub>
            <m:mi>H</m:mi>
            <m:mn>1</m:mn>
          </m:msub>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>+</m:mo>
          <m:msub>
            <m:mi>K</m:mi>
            <m:mn>2</m:mn>
          </m:msub>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:msub>
            <m:mi>U</m:mi>
            <m:mn>2</m:mn>
          </m:msub>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:msub>
            <m:mi>H</m:mi>
            <m:mn>2</m:mn>
          </m:msub>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>+</m:mo>
          <m:msub>
            <m:mi>K</m:mi>
            <m:mn>3</m:mn>
          </m:msub>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:msub>
            <m:mi>U</m:mi>
            <m:mn>3</m:mn>
          </m:msub>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:msub>
            <m:mi>H</m:mi>
            <m:mn>3</m:mn>
          </m:msub>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>s</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2259807">mod <m:math overflow="scroll"><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mn>4</m:mn><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math> (73)</para>
    <para id="id2259834">where <m:math overflow="scroll"><m:mrow><m:msub><m:mi>U</m:mi><m:mn>1</m:mn></m:msub><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow><m:mo>=</m:mo><m:msub><m:mi>r</m:mi><m:mn>1</m:mn></m:msub></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:msub><m:mi>U</m:mi><m:mn>2</m:mn></m:msub><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow><m:mo>=</m:mo><m:msub><m:mi>r</m:mi><m:mn>2</m:mn></m:msub></m:mrow></m:math> are constants and <m:math overflow="scroll"><m:mrow><m:msub><m:mi>U</m:mi><m:mn>3</m:mn></m:msub><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow><m:mo>=</m:mo><m:msub><m:mi>v</m:mi><m:mn>0</m:mn></m:msub><m:mo>+</m:mo><m:msub><m:mi>v</m:mi><m:mn>1</m:mn></m:msub><m:mi>s</m:mi></m:mrow></m:math> is a first degree polynomial. <m:math overflow="scroll"><m:msub><m:mi>U</m:mi><m:mn>1</m:mn></m:msub></m:math> times <m:math overflow="scroll"><m:msub><m:mi>H</m:mi><m:mn>1</m:mn></m:msub></m:math> and
<m:math overflow="scroll"><m:msub><m:mi>U</m:mi><m:mn>2</m:mn></m:msub></m:math> times <m:math overflow="scroll"><m:msub><m:mi>H</m:mi><m:mn>2</m:mn></m:msub></m:math> are easy, but multiplying <m:math overflow="scroll"><m:msub><m:mi>U</m:mi><m:mn>3</m:mn></m:msub></m:math> time <m:math overflow="scroll"><m:msub><m:mi>H</m:mi><m:mn>3</m:mn></m:msub></m:math> modulo
<m:math overflow="scroll"><m:mrow><m:mo>(</m:mo><m:msup><m:mi>s</m:mi><m:mn>2</m:mn></m:msup><m:mo>+</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math> is more difficult.</para>
    <para id="id2260057">The multiplication of <m:math overflow="scroll"><m:mrow><m:msub><m:mi>U</m:mi><m:mn>3</m:mn></m:msub><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:mrow></m:math> times <m:math overflow="scroll"><m:mrow><m:msub><m:mi>H</m:mi><m:mn>3</m:mn></m:msub><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:mrow></m:math> can be done by the
Toom-Cook algorithm <cnxn target="bid1"/>, <cnxn target="bid2"/>, <cnxn target="bid3"/> which can be viewed as
Lagrange interpolation or polynomial multiplication modulo a special
polynomial with three arbitrary coefficients. To simplify the
arithmetic, the constants are chosen to be plus and minus one and
zero. The details of this can be found in <cnxn target="bid1"/>, <cnxn target="bid2"/>, <cnxn target="bid3"/>.
For this example it can be verified that</para>
    <equation id="id2260144">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:msub>
            <m:mrow>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>v</m:mi>
                  <m:mn>0</m:mn>
                  <m:mo>+</m:mo>
                  <m:mi>v</m:mi>
                  <m:mn>1</m:mn>
                  <m:mi>s</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>h</m:mi>
                  <m:mn>0</m:mn>
                  <m:mo>+</m:mo>
                  <m:mi>h</m:mi>
                  <m:mn>1</m:mn>
                  <m:mi>s</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mo>)</m:mo>
            </m:mrow>
            <m:mrow>
              <m:msup>
                <m:mi>s</m:mi>
                <m:mn>2</m:mn>
              </m:msup>
              <m:mo>+</m:mo>
              <m:mn>1</m:mn>
            </m:mrow>
          </m:msub>
          <m:mo>=</m:mo>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msub>
              <m:mi>v</m:mi>
              <m:mn>0</m:mn>
            </m:msub>
            <m:msub>
              <m:mi>h</m:mi>
              <m:mn>0</m:mn>
            </m:msub>
            <m:mo>-</m:mo>
            <m:msub>
              <m:mi>v</m:mi>
              <m:mn>1</m:mn>
            </m:msub>
            <m:msub>
              <m:mi>h</m:mi>
              <m:mn>1</m:mn>
            </m:msub>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>+</m:mo>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:msub>
              <m:mi>v</m:mi>
              <m:mn>0</m:mn>
            </m:msub>
            <m:msub>
              <m:mi>h</m:mi>
              <m:mn>1</m:mn>
            </m:msub>
            <m:mo>+</m:mo>
            <m:msub>
              <m:mi>v</m:mi>
              <m:mn>1</m:mn>
            </m:msub>
            <m:msub>
              <m:mi>h</m:mi>
              <m:mn>0</m:mn>
            </m:msub>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mi>s</m:mi>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2260297">which by the Toom-Cook algorithm or inspection is</para>
    <equation id="uid20">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mfenced separators="" open="[" close="]">
            <m:mfenced separators="" open="[" close="]">
              <m:mtable>
                <m:mtr>
                  <m:mtd>
                    <m:mn>1</m:mn>
                  </m:mtd>
                  <m:mtd>
                    <m:mn>0</m:mn>
                  </m:mtd>
                </m:mtr>
                <m:mtr>
                  <m:mtd>
                    <m:mn>0</m:mn>
                  </m:mtd>
                  <m:mtd>
                    <m:mn>1</m:mn>
                  </m:mtd>
                </m:mtr>
                <m:mtr>
                  <m:mtd>
                    <m:mn>1</m:mn>
                  </m:mtd>
                  <m:mtd>
                    <m:mn>1</m:mn>
                  </m:mtd>
                </m:mtr>
              </m:mtable>
            </m:mfenced>
            <m:mfenced separators="" open="[" close="]">
              <m:mtable>
                <m:mtr>
                  <m:mtd>
                    <m:msub>
                      <m:mi>v</m:mi>
                      <m:mn>0</m:mn>
                    </m:msub>
                  </m:mtd>
                </m:mtr>
                <m:mtr>
                  <m:mtd>
                    <m:msub>
                      <m:mi>v</m:mi>
                      <m:mn>1</m:mn>
                    </m:msub>
                  </m:mtd>
                </m:mtr>
              </m:mtable>
            </m:mfenced>
            <m:mi>o</m:mi>
            <m:mfenced separators="" open="[" close="]">
              <m:mtable>
                <m:mtr>
                  <m:mtd>
                    <m:mn>1</m:mn>
                  </m:mtd>
                  <m:mtd>
                    <m:mn>0</m:mn>
                  </m:mtd>
                </m:mtr>
                <m:mtr>
                  <m:mtd>
                    <m:mn>0</m:mn>
                  </m:mtd>
                  <m:mtd>
                    <m:mn>1</m:mn>
                  </m:mtd>
                </m:mtr>
                <m:mtr>
                  <m:mtd>
                    <m:mn>1</m:mn>
                  </m:mtd>
                  <m:mtd>
                    <m:mn>1</m:mn>
                  </m:mtd>
                </m:mtr>
              </m:mtable>
            </m:mfenced>
            <m:mfenced separators="" open="[" close="]">
              <m:mtable>
                <m:mtr>
                  <m:mtd>
                    <m:msub>
                      <m:mi>h</m:mi>
                      <m:mn>0</m:mn>
                    </m:msub>
                  </m:mtd>
                </m:mtr>
                <m:mtr>
                  <m:mtd>
                    <m:msub>
                      <m:mi>h</m:mi>
                      <m:mn>1</m:mn>
                    </m:msub>
                  </m:mtd>
                </m:mtr>
              </m:mtable>
            </m:mfenced>
          </m:mfenced>
          <m:mo>=</m:mo>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>y</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>y</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2260509">where <m:math overflow="scroll"><m:mi>o</m:mi></m:math> signifies point-by-point multiplication. The total <m:math overflow="scroll"><m:mi>A</m:mi></m:math>
matrix in <cnxn target="uid3"/> is a combination of <cnxn target="uid19"/> and
<cnxn target="uid20"/> giving</para>
    <equation id="id2260545">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>A</m:mi>
          <m:mi>X</m:mi>
          <m:mo>=</m:mo>
          <m:msub>
            <m:mi>A</m:mi>
            <m:mn>1</m:mn>
          </m:msub>
          <m:msub>
            <m:mi>A</m:mi>
            <m:mn>2</m:mn>
          </m:msub>
          <m:msub>
            <m:mi>A</m:mi>
            <m:mn>3</m:mn>
          </m:msub>
          <m:mi>X</m:mi>
        </m:mrow>
      </m:math>
    </equation>
    <equation id="uid21">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mo>=</m:mo>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>1</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mn>0</m:mn>
                </m:mtd>
                <m:mtd>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>2</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>u</m:mi>
                    <m:mn>3</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
          <m:mo>=</m:mo>
          <m:mfenced separators="" open="[" close="]">
            <m:mtable>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>r</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>r</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>v</m:mi>
                    <m:mn>0</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
              <m:mtr>
                <m:mtd>
                  <m:msub>
                    <m:mi>v</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:mtd>
              </m:mtr>
            </m:mtable>
          </m:mfenced>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2260911">where the matrix <m:math overflow="scroll"><m:msub><m:mi>A</m:mi><m:mn>3</m:mn></m:msub></m:math> gives the residue reduction <m:math overflow="scroll"><m:mrow><m:msup><m:mi>s</m:mi><m:mn>2</m:mn></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> and
<m:math overflow="scroll"><m:mrow><m:msup><m:mi>s</m:mi><m:mn>2</m:mn></m:msup><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math>, the upper left-hand part of <m:math overflow="scroll"><m:msub><m:mi>A</m:mi><m:mn>2</m:mn></m:msub></m:math> gives the reduction
modulo <m:math overflow="scroll"><m:mrow><m:mi>s</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mi>s</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math>, and the lower right-hand part of A1
carries out the Toom-Cook algorithm modulo <m:math overflow="scroll"><m:mrow><m:msup><m:mi>s</m:mi><m:mn>2</m:mn></m:msup><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math> with the
multiplication in <cnxn target="uid4"/>. Notice that by calculating
<cnxn target="uid21"/> in the three stages, seven additions are required. Also
notice that <m:math overflow="scroll"><m:msub><m:mi>A</m:mi><m:mn>1</m:mn></m:msub></m:math> is not square. It is this “expansion" that causes
more than <m:math overflow="scroll"><m:mi>N</m:mi></m:math> multiplications to be required in <m:math overflow="scroll"><m:mi>o</m:mi></m:math> in <cnxn target="uid4"/>
or <m:math overflow="scroll"><m:mi>D</m:mi></m:math> in <cnxn target="uid5"/>. This staged reduction will derive the <m:math overflow="scroll"><m:mi>A</m:mi></m:math>
operator for <cnxn target="uid4"/></para>
    <para id="id2261114">The method described above is very straight-forward for the
shorter DFT lengths. For <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>3</m:mn></m:mrow></m:math>, both of the residue polynomials
are constants and the multiplication given by o in <cnxn target="uid3"/> is
trivial. For <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>5</m:mn></m:mrow></m:math>, which is the example used here, there is one
first degree polynomial multiplication required but the Toom-Cook
algorithm uses simple constants and, therefore, works well as
indicated in <cnxn target="uid20"/>. For <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>7</m:mn></m:mrow></m:math>, there are two first degree
residue polynomials which can each be multiplied by the same
techniques used in the <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>5</m:mn></m:mrow></m:math> example. Unfortunately, for any
longer lengths, the residue polynomials have an order of three or
greater which causes the Toom-Cook algorithm to require constants of
plus and minus two and worse. For that reason, the Toom-Cook method
is not used, and other techniques such as index mapping are used
that require more than the minimum number of multiplications, but do
not require an excessive number of additions. The resulting
algorithms still have the structure of <cnxn target="uid6"/>. Blahut
<cnxn target="bid1"/> and Nussbaumer <cnxn target="bid3"/> have a good collection of
algorithms for polynomial multiplication that can be used with the
techniques discussed here to construct a wide variety of DFT
algorithms.</para>
    <para id="id2261219">The constants in the diagonal matrix <m:math overflow="scroll"><m:mi>D</m:mi></m:math> can be found from the
CRT matrix <m:math overflow="scroll"><m:mi>C</m:mi></m:math> in <cnxn target="uid4"/> using <m:math overflow="scroll"><m:mrow><m:mi>d</m:mi><m:mo>=</m:mo><m:msup><m:mi>C</m:mi><m:mi>T</m:mi></m:msup><m:mi>H</m:mi></m:mrow></m:math>' for the diagonal
terms in <m:math overflow="scroll"><m:mi>D</m:mi></m:math>. As mentioned above, for the smaller prime lengths of
3, 5, and 7 this works well but for longer lengths the CRT becomes
very complicated. An alternate method for finding <m:math overflow="scroll"><m:mi>D</m:mi></m:math> uses the fact
that since the linear form <cnxn target="uid5"/> or <cnxn target="uid6"/> calculates the
DFT, it is possible to calculate a known DFT of a given <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math> from
the definition of the DFT in <cnxn document="m16326" target="uid1">Multidimensional Index Mapping: Equation 1</cnxn> and, given the <m:math overflow="scroll"><m:mi>A</m:mi></m:math> matrix in
<cnxn target="uid6"/>, solve for <m:math overflow="scroll"><m:mi>D</m:mi></m:math> by solving a set of simultaneous
equations. The details of this procedure are described in
<cnxn target="bid6"/>.</para>
    <para id="id2261351">A modification of this approach also works for a length
which is an odd prime raised to some power: <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:msup><m:mi>P</m:mi><m:mi>M</m:mi></m:msup></m:mrow></m:math>. This is a
bit more complicated <cnxn target="bid2"/>, <cnxn target="bid4"/> but has been done for lengths
of 9 and 25. For longer lengths, the conventional Cooley-Tukey type-
two index map algorithm seems to be more efficient. For powers of
two, there is no primitive root, and therefore, no simple conversion
of the DFT into convolution. It is possible to use two generators
<cnxn target="bid2"/>, <cnxn target="bid3"/>, <cnxn target="bid5"/> to make the conversion and there exists a
set of length 4, 8, and 16 DFT algorithms of the form in <cnxn target="uid6"/>
in <cnxn target="bid2"/>.</para>
    <para id="id2261420">In <cnxn target="uid22"/> an operation count of several short DFT
algorithms is presented. These are practical algorithms that can be
used alone or in conjunction with the index mapping to give longer
DFT's as shown in <cnxn document="m16335">The Prime Factor and Winograd Fourier Transform Algorithms</cnxn>. Most are optimized in having
either the theoretical minimum number of multiplications or the
minimum number of multiplications without requiring a very large
number of additions. Some allow other reasonable trade-offs between
numbers of multiplications and additions. There are two lists of the
number of multiplications. The first is the number of actual
floating point multiplications that must be done for that length
DFT. Some of these (one or two in most cases) will be by rational
constants and the others will be by irrational constants. The second
list is the total number of multiplications given in the diagonal
matrix <m:math overflow="scroll"><m:mi>D</m:mi></m:math> in <cnxn target="uid6"/>. At least one of these will be unity ( the
one associated with <m:math overflow="scroll"><m:mrow><m:mi>X</m:mi><m:mo>(</m:mo><m:mn>0</m:mn><m:mo>)</m:mo></m:mrow></m:math>) and in some cases several will be unity
( for <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:msup><m:mn>2</m:mn><m:mi>M</m:mi></m:msup></m:mrow></m:math> ). The second list is important in programming the
WFTA in <cnxn document="m16335" target="uid12">The Prime Factor and Winograd Fourier Transform Algorithm: The Winograd Fourier Transform Algorithm</cnxn>.</para>
    <figure id="element-176"><table id="uid22">
<tgroup cols="4"><tbody>
          <row>
            <entry>Length</entry>
            <entry>Mult</entry>
            <entry>Mult</entry>
            <entry>Adds</entry>
          </row>
          <row>
            <entry>N</entry>
            <entry>Non-one</entry>
            <entry>Total</entry>
            <entry/>
          </row>
          <row>
            <entry>2</entry>
            <entry>0</entry>
            <entry>4</entry>
            <entry>4</entry>
          </row>
          <row>
            <entry>3</entry>
            <entry>4</entry>
            <entry>6</entry>
            <entry>12</entry>
          </row>
          <row>
            <entry>4</entry>
            <entry>0</entry>
            <entry>8</entry>
            <entry>16</entry>
          </row>
          <row>
            <entry>5</entry>
            <entry>10</entry>
            <entry>12</entry>
            <entry>34</entry>
          </row>
          <row>
            <entry>7</entry>
            <entry>16</entry>
            <entry>18</entry>
            <entry>72</entry>
          </row>
          <row>
            <entry>8</entry>
            <entry>4</entry>
            <entry>16</entry>
            <entry>52</entry>
          </row>
          <row>
            <entry>9</entry>
            <entry>20</entry>
            <entry>22</entry>
            <entry>84</entry>
          </row>
          <row>
            <entry>11</entry>
            <entry>40</entry>
            <entry>42</entry>
            <entry>168</entry>
          </row>
          <row>
            <entry>13</entry>
            <entry>40</entry>
            <entry>42</entry>
            <entry>188</entry>
          </row>
          <row>
            <entry>16</entry>
            <entry>20</entry>
            <entry>36</entry>
            <entry>148</entry>
          </row>
          <row>
            <entry>17</entry>
            <entry>70</entry>
            <entry>72</entry>
            <entry>314</entry>
          </row>
          <row>
            <entry>19</entry>
            <entry>76</entry>
            <entry>78</entry>
            <entry>372</entry>
          </row>
          <row>
            <entry>25</entry>
            <entry>132</entry>
            <entry>134</entry>
            <entry>420</entry>
          </row>
          <row>
            <entry>32</entry>
            <entry>68</entry>
            <entry>-</entry>
            <entry>388</entry>
          </row>
        </tbody>
      
</tgroup>
<caption>Number of Real Multiplications and Additions for a Length-N
DFT of Complex Data</caption>
</table></figure>
    <para id="id2261923">Because of the structure of the short DFTs, the number of real multiplications required for the DFT of
real data is exactly half that required for complex data. The number
of real additions required is slightly less than half that required
for complex data because <m:math overflow="scroll"><m:mrow><m:mo>(</m:mo><m:mi>N</m:mi><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math> of the additions needed when <m:math overflow="scroll"><m:mi>N</m:mi></m:math> is
prime add a real to an imaginary, and that is not actually
performed. When <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>2</m:mn><m:mi>m</m:mi></m:mrow></m:math>, there are <m:math overflow="scroll"><m:mrow><m:mo>(</m:mo><m:mi>N</m:mi><m:mo>-</m:mo><m:mn>2</m:mn><m:mo>)</m:mo></m:mrow></m:math> of these pseudo
additions. The special case for real data is discussed in
<cnxn target="bid8"/>, <cnxn target="bid9"/>, <cnxn target="bid10"/>.</para>
    <para id="id2262014">The structure of these algorithms are in the form of <m:math overflow="scroll"><m:mrow><m:msup><m:mi>X</m:mi><m:mo>'</m:mo></m:msup><m:mo>=</m:mo><m:mi>C</m:mi><m:mi>D</m:mi><m:mi>A</m:mi><m:mi>X</m:mi></m:mrow></m:math> or <m:math overflow="scroll"><m:mrow><m:msup><m:mi>B</m:mi><m:mi>T</m:mi></m:msup><m:mi>D</m:mi><m:mi>A</m:mi><m:mi>X</m:mi></m:mrow></m:math> or <m:math overflow="scroll"><m:mrow><m:msup><m:mi>A</m:mi><m:mi>T</m:mi></m:msup><m:mi>D</m:mi><m:mi>A</m:mi><m:mi>X</m:mi></m:mrow></m:math> from <cnxn target="uid4"/> and <cnxn target="uid6"/>. The
<m:math overflow="scroll"><m:mi>A</m:mi></m:math> and <m:math overflow="scroll"><m:mi>B</m:mi></m:math> matrices are generally <m:math overflow="scroll"><m:mi>M</m:mi></m:math> by <m:math overflow="scroll"><m:mi>N</m:mi></m:math> with <m:math overflow="scroll"><m:mrow><m:mi>M</m:mi><m:mo>≥</m:mo><m:mi>N</m:mi></m:mrow></m:math> and
have elements that are integers, generally 0 or <m:math overflow="scroll"><m:mrow><m:mo>±</m:mo><m:mn>1</m:mn></m:mrow></m:math>. A
pictorial description is given in <cnxn target="uid23"/>.</para>
    <figure id="uid23" orient="horizontal"><media type="image/png" src="File0024.png">
<param name="print-width" value="3in"/>
<!-- NOTE: width parameter changes size of image online (pixels). original width is 1107. --><param name="width" value="500"/></media><caption>Flow Graph for the Length-5 DFT</caption></figure>
    <figure id="uid24" orient="horizontal">
       

        <media type="image/png" src="File0023.png">
<param name="print-width" value="3in"/>
<!-- NOTE: width parameter changes size of image online (pixels). original width is 1014. --><param name="width" value="500"/></media><caption>Block Diagram of a Winograd Short DFT</caption></figure>
    <para id="id2262191">The flow graph in <cnxn target="uid23"/> should be compared with the
matrix description of <cnxn target="uid6"/> and <cnxn target="uid21"/>, and with the
programs in <cnxn target="bid1"/>, <cnxn target="bid2"/>, <cnxn target="bid11"/>, <cnxn target="bid3"/>. The shape in <cnxn target="uid24"/> illustrates the expansion of the data by <m:math overflow="scroll"><m:mi>A</m:mi></m:math>. That is to
say, <m:math overflow="scroll"><m:mrow><m:mi>A</m:mi><m:mi>X</m:mi></m:mrow></m:math> has more entries than <m:math overflow="scroll"><m:mi>X</m:mi></m:math> because <m:math overflow="scroll"><m:mrow><m:mi>M</m:mi><m:mo>&gt;</m:mo><m:mi>N</m:mi></m:mrow></m:math>. The A operator
consists of additions, the <m:math overflow="scroll"><m:mi>D</m:mi></m:math> operator gives the <m:math overflow="scroll"><m:mi>M</m:mi></m:math>
multiplications (some by one) and <m:math overflow="scroll"><m:msup><m:mi>A</m:mi><m:mi>T</m:mi></m:msup></m:math> contracts the data back to
<m:math overflow="scroll"><m:mi>N</m:mi></m:math> values with additions only. <m:math overflow="scroll"><m:mi>M</m:mi></m:math> is one half the second list of
multiplies in <cnxn target="uid22"/>.</para>
    <para id="id2262343">An important characteristic of the <m:math overflow="scroll"><m:mi>D</m:mi></m:math> operator in the
calculation of the DFT is its entries are either purely real or
imaginary. The reduction of the <m:math overflow="scroll"><m:mi>W</m:mi></m:math> vector by <m:math overflow="scroll"><m:mrow><m:mo>(</m:mo><m:msup><m:mi>s</m:mi><m:mrow><m:mo>(</m:mo><m:mi>N</m:mi><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo><m:mo>/</m:mo><m:mn>2</m:mn></m:mrow></m:msup><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mo>(</m:mo><m:msup><m:mi>s</m:mi><m:mrow><m:mo>(</m:mo><m:mi>N</m:mi><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo><m:mo>/</m:mo><m:mn>2</m:mn></m:mrow></m:msup><m:mo>+</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math> separates the real and the imaginary
constants. This is discussed in <cnxn target="bid4"/>, <cnxn target="bid6"/>. The number of
multiplications for complex data is only twice those necessary for
real data, not four times.</para>
    <para id="id2262456">Although this discussion has been on the calculation of the
DFT, very similar results are true for the calculation of
convolution and correlation, and these will be further developed in
<cnxn document="m16338">Algorithms for Data with Restrictions</cnxn>. The <m:math overflow="scroll"><m:mrow><m:msup><m:mi>A</m:mi><m:mi>T</m:mi></m:msup><m:mi>D</m:mi><m:mi>A</m:mi></m:mrow></m:math> structure and the picture in <cnxn target="uid24"/>
are the same for convolution. Algorithms and operation counts can be
found in <cnxn target="bid1"/>, <cnxn target="bid3"/>, <cnxn target="bid12"/>.</para>
    <section id="uid25">
      <name>The Bilinear Structure</name>
      <para id="id2262514">The bilinear form introduced in <cnxn target="uid3"/> and the related linear
form in <cnxn target="uid5"/> are very powerful descriptions of both the DFT
and convolution.</para>
      <equation id="uid26">
        <m:math mode="display" overflow="scroll">
          <m:mrow>
            <m:mtext>Bilinear:</m:mtext>
            <m:mspace width="4.pt"/>
            <m:mi>Y</m:mi>
            <m:mo>=</m:mo>
            <m:mi>C</m:mi>
            <m:mo>[</m:mo>
            <m:mi>A</m:mi>
            <m:mi>X</m:mi>
            <m:mspace width="4pt"/>
            <m:mi>o</m:mi>
            <m:mspace width="4pt"/>
            <m:mi>B</m:mi>
            <m:mi>H</m:mi>
            <m:mo>]</m:mo>
          </m:mrow>
        </m:math>
      </equation>
      <equation id="uid27">
        <m:math mode="display" overflow="scroll">
          <m:mrow>
            <m:mtext>Linear:</m:mtext>
            <m:mspace width="4.pt"/>
            <m:mi>Y</m:mi>
            <m:mo>=</m:mo>
            <m:mi>C</m:mi>
            <m:mi>D</m:mi>
            <m:mi>A</m:mi>
            <m:mspace width="4pt"/>
            <m:mi>X</m:mi>
          </m:mrow>
        </m:math>
      </equation>
      <para id="id2262609">Since <cnxn target="uid26"/> is a bilinear operation defined in terms of a
second bilinear operator  o , this formulation can be nested. For
example if o is itself defined in terms of a second bilinear
operator  @, by</para>
      <equation id="uid28">
        <m:math mode="display" overflow="scroll">
          <m:mrow>
            <m:mi>X</m:mi>
            <m:mspace width="4pt"/>
            <m:mi>o</m:mi>
            <m:mspace width="4pt"/>
            <m:mi>H</m:mi>
            <m:mo>=</m:mo>
            <m:msup>
              <m:mi>C</m:mi>
              <m:mo>'</m:mo>
            </m:msup>
            <m:mrow>
              <m:mo>[</m:mo>
              <m:msup>
                <m:mi>A</m:mi>
                <m:mo>'</m:mo>
              </m:msup>
              <m:mi>X</m:mi>
              <m:mspace width="4pt"/>
              <m:mo>@</m:mo>
              <m:mspace width="4pt"/>
              <m:msup>
                <m:mi>B</m:mi>
                <m:mo>'</m:mo>
              </m:msup>
              <m:mi>H</m:mi>
              <m:mo>]</m:mo>
            </m:mrow>
          </m:mrow>
        </m:math>
      </equation>
      <para id="id2262688">then <cnxn target="uid26"/> becomes</para>
      <equation id="uid29">
        <m:math mode="display" overflow="scroll">
          <m:mrow>
            <m:mi>Y</m:mi>
            <m:mo>=</m:mo>
            <m:mi>C</m:mi>
            <m:msup>
              <m:mi>C</m:mi>
              <m:mo>'</m:mo>
            </m:msup>
            <m:mrow>
              <m:mo>[</m:mo>
              <m:msup>
                <m:mi>A</m:mi>
                <m:mo>'</m:mo>
              </m:msup>
              <m:mi>A</m:mi>
              <m:mi>X</m:mi>
              <m:mspace width="4pt"/>
              <m:mo>@</m:mo>
              <m:mspace width="4pt"/>
              <m:msup>
                <m:mi>B</m:mi>
                <m:mo>'</m:mo>
              </m:msup>
              <m:mi>B</m:mi>
              <m:mi>H</m:mi>
              <m:mo>]</m:mo>
            </m:mrow>
          </m:mrow>
        </m:math>
      </equation>
      <para id="id2262760">For convolution, if A represents the polynomial residue reduction
modulo the cyclotomic polynomials, then <m:math overflow="scroll"><m:mi>A</m:mi></m:math> is square (e.g.
<cnxn target="uid19"/> and o represents multiplication of the residue
polynomials modulo the cyclotomic polynomials. If <m:math overflow="scroll"><m:mi>A</m:mi></m:math> represents the
reduction modulo the cyclotomic polynomials plus the Toom-Cook
reduction as was the case in the example of <cnxn target="uid21"/>, then <m:math overflow="scroll"><m:mi>A</m:mi></m:math> is
NxM and o is term-by- term simple scalar multiplication. In this
case <m:math overflow="scroll"><m:mrow><m:mi>A</m:mi><m:mi>X</m:mi></m:mrow></m:math> can be thought of as a transform of <m:math overflow="scroll"><m:mi>X</m:mi></m:math> and <m:math overflow="scroll"><m:mi>C</m:mi></m:math> is the
inverse transform. This is called a rectangular transform
<cnxn target="bid12"/> because <m:math overflow="scroll"><m:mi>A</m:mi></m:math> is rectangular. The transform requires
only additions and convolution is done with <m:math overflow="scroll"><m:mi>M</m:mi></m:math> multiplications. The
other extreme is when <m:math overflow="scroll"><m:mi>A</m:mi></m:math> represents reduction over the <m:math overflow="scroll"><m:mi>N</m:mi></m:math> complex
roots of <m:math overflow="scroll"><m:mrow><m:msup><m:mi>s</m:mi><m:mi>N</m:mi></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math>. In this case <m:math overflow="scroll"><m:mi>A</m:mi></m:math> is the DFT itself, as in the
example of (43), and  o  is point by point complex multiplication
and C is the inverse DFT. A trivial case is where <m:math overflow="scroll"><m:mi>A</m:mi></m:math>, <m:math overflow="scroll"><m:mi>B</m:mi></m:math> and <m:math overflow="scroll"><m:mi>C</m:mi></m:math>
are identity operators and  o  is the cyclic convolution.</para>
      <para id="id2262942">This very general and flexible bilinear formulation coupled
with the idea of nesting in <cnxn target="uid29"/> gives a description of most
forms of convolution.</para>
    </section>
    <section id="uid30">
      <name>Winograd's Complexity Theorems</name>
      <para id="id2262960">Because Winograd's work <cnxn target="bid1"/>, <cnxn target="bid2"/>, <cnxn target="bid4"/>, <cnxn target="bid5"/>, <cnxn target="bid13"/>, <cnxn target="bid14"/>
has been the foundation of the modern results in efficient
convolution and DFT algorithms, it is worthwhile to look at his
theoretical conclusions on optimal algorithms. Most of his results
are stated in terms of polynomial multiplication as <cnxn document="m16327" target="uid3">Polynomial Description of Signals: Equation 3</cnxn> or
<cnxn target="id2257391"/>. The measure of computational complexity is usually the
number of multiplications, and only certain multiplications are
counted. This must be understood in order not to misinterpret the
results.</para>
      <para id="id2263011">This section will simply give a statement of the pertinent
results and will not attempt to derive or prove anything. A short
interpretation of each theorem will be given to relate the result to
the algorithms developed in this chapter. The indicated references
should be consulted for background and detail.</para>
      <para id="id2263020"><emphasis>Theorem 1</emphasis> 
<cnxn target="bid4"/> Given two polynomials, <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math>, of
degree <m:math overflow="scroll"><m:mi>N</m:mi></m:math> and <m:math overflow="scroll"><m:mi>M</m:mi></m:math> respectively, each with indeterminate
coefficients that are elements of a field <m:math overflow="scroll"><m:mi>H</m:mi></m:math>, <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>+</m:mo><m:mi>M</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math>
multiplications are necessary to compute the
coefficients of the product polynomial <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math>.
Multiplication by elements of the field <m:math overflow="scroll"><m:mi>G</m:mi></m:math> (the field of
constants), which is contained in <m:math overflow="scroll"><m:mi>H</m:mi></m:math>, are not counted and
<m:math overflow="scroll"><m:mi>G</m:mi></m:math> contains at least <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>+</m:mo><m:mi>M</m:mi></m:mrow></m:math> distinct elements.</para>
      <para id="id2263183">The upper bound in this theorem can be
realized by choosing an arbitrary modulus polynomial <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> of
degree <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>+</m:mo><m:mi>M</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math> composed of <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>+</m:mo><m:mi>M</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math> distinct linear polynomial
factors with coefficients in <m:math overflow="scroll"><m:mi>G</m:mi></m:math> which, since its degree is greater
than the product <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math>, has no effect on the product, and by
reducing <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> to <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>+</m:mo><m:mi>M</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math> residues modulo the <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>+</m:mo><m:mi>M</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math>
factors of <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi></m:mrow></m:math>). These residues are multiplied by each other,
requiring <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>+</m:mo><m:mi>M</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math> multiplications, and the results recombined using
the Chinese remainder theorem (CRT). The operations required in the
reduction and recombination are not counted, while the residue
multiplications are. Since the modulus <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> is arbitrary, its
factors are chosen to be simple so as to make the reduction and CRT
simple. Factors of zero, plus and minus unity, and infinity are the
simplest. Plus and minus two and other factors complicate the actual
calculations considerably, but the theorem does not take that into
account. This algorithm is a form of the Toom-Cook algorithm and of
Lagrange interpolation <cnxn target="bid1"/>, <cnxn target="bid2"/>, <cnxn target="bid3"/>, <cnxn target="bid4"/>. For our
applications, <m:math overflow="scroll"><m:mi>H</m:mi></m:math> is the field of reals and <m:math overflow="scroll"><m:mi>G</m:mi></m:math> the field of
rationals.</para>
      <para id="id2263451"><emphasis>Theorem 2</emphasis> 
<cnxn target="bid4"/> If an algorithm exists which computes
<m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> in <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>+</m:mo><m:mi>M</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math> multiplications, all but one of its
multiplication steps must necessarily be of the form</para>
      <equation id="id2263509">
        <m:math mode="display" overflow="scroll">
          <m:mrow>
            <m:mi>m</m:mi>
            <m:mi>k</m:mi>
            <m:mo>=</m:mo>
            <m:mrow>
              <m:mo>(</m:mo>
              <m:mi>g</m:mi>
              <m:msup>
                <m:mi>k</m:mi>
                <m:mo>'</m:mo>
              </m:msup>
              <m:mo>+</m:mo>
              <m:mi>x</m:mi>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:mi>g</m:mi>
                <m:mi>k</m:mi>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mo>)</m:mo>
            </m:mrow>
            <m:mrow>
              <m:mo>(</m:mo>
              <m:mi>g</m:mi>
              <m:mi>k</m:mi>
              <m:mo>"</m:mo>
              <m:mo>+</m:mo>
              <m:mi>h</m:mi>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:mi>g</m:mi>
                <m:mi>k</m:mi>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mo>)</m:mo>
            </m:mrow>
            <m:mspace width="4pt"/>
            <m:mspace width="4pt"/>
            <m:mtext>for</m:mtext>
            <m:mspace width="4pt"/>
            <m:mi>k</m:mi>
            <m:mo>=</m:mo>
            <m:mn>0</m:mn>
            <m:mo>,</m:mo>
            <m:mn>1</m:mn>
            <m:mo>,</m:mo>
            <m:mo>.</m:mo>
            <m:mo>.</m:mo>
            <m:mo>.</m:mo>
            <m:mo>,</m:mo>
            <m:mi>N</m:mi>
            <m:mo>+</m:mo>
            <m:mi>M</m:mi>
          </m:mrow>
        </m:math>
      </equation>
      <para id="id2263619">where <m:math overflow="scroll"><m:msub><m:mi>g</m:mi><m:mi>k</m:mi></m:msub></m:math> are distinct elements of <m:math overflow="scroll"><m:mi>G</m:mi></m:math>; and <m:math overflow="scroll"><m:msubsup><m:mi>g</m:mi><m:mi>k</m:mi><m:mo>'</m:mo></m:msubsup></m:math> and <m:math overflow="scroll"><m:mrow><m:msub><m:mi>g</m:mi><m:mi>k</m:mi></m:msub><m:mo>"</m:mo></m:mrow></m:math>
are arbitrary elements of <m:math overflow="scroll"><m:mi>G</m:mi></m:math></para>
      <para id="id2263693">This theorem states that the structure of
an optimal algorithm is essentially unique although the factors of
<m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> may be chosen arbitrarily.</para>
      <para id="id2263715"><emphasis>Theorem 3</emphasis> 
<cnxn target="bid4"/> Let <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi></m:mrow></m:math>) be a polynomial of degree <m:math overflow="scroll"><m:mi>N</m:mi></m:math> and
be of the form <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo><m:mo>=</m:mo><m:mi>Q</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo><m:mi>k</m:mi></m:mrow></m:math>, where <m:math overflow="scroll"><m:mrow><m:mi>Q</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> is an
irreducible polynomial with coefficients in <m:math overflow="scroll"><m:mi>G</m:mi></m:math> and <m:math overflow="scroll"><m:mi>k</m:mi></m:math> is a
positive integer. Let <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi></m:mrow></m:math>) be two polynomials
of degree at least <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> with coefficients from <m:math overflow="scroll"><m:mi>H</m:mi></m:math>, then
<m:math overflow="scroll"><m:mrow><m:mn>2</m:mn><m:mi>N</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> multiplications are required to compute the product
<m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> modulo <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math>.</para>
      <para id="id2263931">This theorem is similar to
<cnxn target="id2263020">Theorem 1</cnxn> with the operations of the reduction of the product modulo
<m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi></m:mrow></m:math>) not being counted.</para>
      <para id="id2263955"><emphasis>Theorem 4</emphasis> 
<cnxn target="bid4"/> Any algorithm that computes the product
<m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi></m:mrow></m:math>) modulo <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi></m:mrow></m:math>) according to the conditions stated
in Theorem 3 and requires <m:math overflow="scroll"><m:mrow><m:mn>2</m:mn><m:mi>N</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> multiplications will
necessarily be of one of three structures, each of which
has the form of Theorem 2 internally.</para>
      <para id="id2264025">As in <cnxn target="id2263451">Theorem 2</cnxn>, this theorem
states that only a limited number of possible structures exist for
optimal algorithms.</para>
      <para id="id2264034"><emphasis>Theorem 5</emphasis> 
<cnxn target="bid4"/> If the modulus polynomial <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> has
degree <m:math overflow="scroll"><m:mi>N</m:mi></m:math> and is not irreducible, it can be written in a
unique factored form <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow><m:mo>=</m:mo><m:msubsup><m:mi>P</m:mi><m:mn>1</m:mn><m:msub><m:mi>m</m:mi><m:mn>1</m:mn></m:msub></m:msubsup><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow><m:msubsup><m:mi>P</m:mi><m:mn>2</m:mn><m:msub><m:mi>m</m:mi><m:mn>2</m:mn></m:msub></m:msubsup><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow><m:mo>.</m:mo><m:mo>.</m:mo><m:mo>.</m:mo><m:msubsup><m:mi>P</m:mi><m:mi>k</m:mi><m:msub><m:mi>m</m:mi><m:mi>k</m:mi></m:msub></m:msubsup><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:mrow></m:math> where each of the <m:math overflow="scroll"><m:mrow><m:msub><m:mi>P</m:mi><m:mi>i</m:mi></m:msub><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:mrow></m:math> are
irreducible over the allowed coefficient field <m:math overflow="scroll"><m:mi>G</m:mi></m:math>. <m:math overflow="scroll"><m:mrow><m:mn>2</m:mn><m:mi>N</m:mi><m:mo>-</m:mo><m:mi>k</m:mi></m:mrow></m:math>
multiplications are necessary to compute the product
<m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> modulo <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> where <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> have
coefficients in <m:math overflow="scroll"><m:mi>H</m:mi></m:math> and are of degree at least <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math>. All
algorithms that calculate this product in <m:math overflow="scroll"><m:mrow><m:mn>2</m:mn><m:mi>N</m:mi><m:mo>-</m:mo><m:mi>k</m:mi></m:mrow></m:math>
multiplications must be of a form where each of the <m:math overflow="scroll"><m:mi>k</m:mi></m:math>
residue polynomials of <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> are separately
multiplied modulo the factors of <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> via the CRT.</para>
      <para id="id2264398">Corollary: If the modulus polynomial is <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow><m:mo>=</m:mo><m:msup><m:mi>s</m:mi><m:mi>N</m:mi></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math>,
then <m:math overflow="scroll"><m:mrow><m:mn>2</m:mn><m:mi>N</m:mi><m:mo>-</m:mo><m:mi>t</m:mi><m:mo>(</m:mo><m:mi>N</m:mi><m:mo>)</m:mo></m:mrow></m:math> multiplications are necessary to compute
<m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> modulo <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math>, where <m:math overflow="scroll"><m:mrow><m:mi>t</m:mi><m:mo>(</m:mo><m:mi>N</m:mi><m:mo>)</m:mo></m:mrow></m:math> is the number of
positive divisors of <m:math overflow="scroll"><m:mi>N</m:mi></m:math>.</para>
      <para id="id2264527"><cnxn target="id2264034">Theorem 5</cnxn> is very general since it
allows a general modulus polynomial. The proof of the upper bound
involves reducing <m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> and <m:math overflow="scroll"><m:mrow><m:mi>h</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> modulo the <m:math overflow="scroll"><m:mi>k</m:mi></m:math> factors of
<m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math>. Each of the <m:math overflow="scroll"><m:mi>k</m:mi></m:math> irreducible residue polynomials is then
multiplied using the method of <cnxn target="id2263955">Theorem 4</cnxn> requiring <m:math overflow="scroll"><m:mrow><m:mn>2</m:mn><m:mi>N</m:mi><m:mi>i</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math>
multiplies and the products are combined using the CRT. The total
number of multiplies from the <m:math overflow="scroll"><m:mi>k</m:mi></m:math> parts is <m:math overflow="scroll"><m:mrow><m:mn>2</m:mn><m:mi>N</m:mi><m:mo>-</m:mo><m:mi>k</m:mi></m:mrow></m:math>. The theorem also
states the structure of these optimal algorithms is essentially
unique. The special case of <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow><m:mo>=</m:mo><m:msup><m:mi>s</m:mi><m:mi>N</m:mi></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> is interesting since it
corresponds to cyclic convolution and, as stated in the corollary,
<m:math overflow="scroll"><m:mi>k</m:mi></m:math> is easily determined. The factors of <m:math overflow="scroll"><m:mrow><m:msup><m:mi>s</m:mi><m:mi>N</m:mi></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> are called
cyclotomic polynomials and have interesting properties
<cnxn target="bid1"/>, <cnxn target="bid2"/>, <cnxn target="bid3"/>.</para>
      <para id="id2264738"><emphasis>Theorem 6</emphasis> 
<cnxn target="bid4"/>, <cnxn target="bid5"/> Consider calculating the DFT of a
prime length real-valued number sequence. If <m:math overflow="scroll"><m:mi>G</m:mi></m:math> is chosen
as the field of rational numbers, the number of real
multiplications necessary to calculate a length-P DFT is
<m:math overflow="scroll"><m:mrow><m:mi>u</m:mi><m:mo>(</m:mo><m:mi>D</m:mi><m:mi>F</m:mi><m:mi>T</m:mi><m:mo>(</m:mo><m:mi>N</m:mi><m:mo>)</m:mo><m:mo>)</m:mo><m:mo>=</m:mo><m:mn>2</m:mn><m:mi>P</m:mi><m:mo>-</m:mo><m:mn>3</m:mn><m:mo>-</m:mo><m:mi>t</m:mi><m:mo>(</m:mo><m:mi>P</m:mi><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math> where <m:math overflow="scroll"><m:mrow><m:mi>t</m:mi><m:mo>(</m:mo><m:mi>P</m:mi><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math> is the number of
divisors of <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math>.</para>
      <para id="id2264856">This theorem not only gives a lower limit
on any practical prime length DFT algorithm, it also gives practical
algorithms for <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>3</m:mn><m:mo>,</m:mo><m:mn>5</m:mn></m:mrow></m:math>, and 7. Consider the operation counts in
<cnxn target="uid22"/> to understand this theorem. In addition to the real
multiplications counted by complexity theory, each optimal
prime-length algorithm will have one multiplication by a rational
constant. That constant corresponds to the residue modulo (s-1)
which always exists for the modulus <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mrow><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow><m:mo>=</m:mo><m:msup><m:mi>s</m:mi><m:mrow><m:mi>N</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math>. In a
practical algorithm, this multiplication must be carried out, and
that accounts for the difference in the prediction of Theorem 6
<cnxn target="id2264738"/> and count in <cnxn target="uid22"/>. In addition, there is another
operation that for certain applications must be counted as a
multiplication. That is the calculation of the zero frequency term
<m:math overflow="scroll"><m:mrow><m:mi>X</m:mi><m:mo>(</m:mo><m:mn>0</m:mn><m:mo>)</m:mo></m:mrow></m:math> in the first row of the example in <cnxn document="m16328" target="uid9">The DFT as Convolution or Filtering: Matrix 1</cnxn>. For
applications to the WFTA discussed in <cnxn document="m16335" target="uid12">The Prime Factor and Winograd Fourier Transform Algorithms: The Winograd Fourier Transform Algorithm</cnxn>, that
operation must be counted as a multiply. For lengths longer than 7,
optimal algorithms require too many additions, so compromise
structures are used.</para>
      <para id="id2264966"><emphasis>Theorem 7</emphasis> 
<cnxn target="bid14"/>, <cnxn target="bid15"/> If <m:math overflow="scroll"><m:mi>G</m:mi></m:math> is chosen as the field of
rational numbers, the number of real multiplications
necessary to calculate a length-N DFT where N is a prime
number raised to an integer power: <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mi>P</m:mi><m:mi>m</m:mi></m:mrow></m:math> , is given by</para>
      <equation id="id2265013">
        <m:math mode="display" overflow="scroll">
          <m:mrow>
            <m:mi>u</m:mi>
            <m:mo>(</m:mo>
            <m:mi>D</m:mi>
            <m:mi>F</m:mi>
            <m:mi>T</m:mi>
            <m:mo>(</m:mo>
            <m:mi>N</m:mi>
            <m:mo>)</m:mo>
            <m:mo>)</m:mo>
            <m:mo>=</m:mo>
            <m:mn>2</m:mn>
            <m:mi>N</m:mi>
            <m:mo>-</m:mo>
            <m:mo>(</m:mo>
            <m:mo>(</m:mo>
            <m:mi>m</m:mi>
            <m:mn>2</m:mn>
            <m:mo>+</m:mo>
            <m:mi>m</m:mi>
            <m:mo>)</m:mo>
            <m:mo>/</m:mo>
            <m:mn>2</m:mn>
            <m:mo>)</m:mo>
            <m:mi>t</m:mi>
            <m:mo>(</m:mo>
            <m:mi>P</m:mi>
            <m:mo>-</m:mo>
            <m:mn>1</m:mn>
            <m:mo>)</m:mo>
            <m:mo>-</m:mo>
            <m:mi>m</m:mi>
            <m:mo>-</m:mo>
            <m:mn>1</m:mn>
          </m:mrow>
        </m:math>
      </equation>
      <para id="id2265093">where <m:math overflow="scroll"><m:mrow><m:mi>t</m:mi><m:mo>(</m:mo><m:mi>P</m:mi><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math> is the number of divisors of <m:math overflow="scroll"><m:mrow><m:mo>(</m:mo><m:mi>P</m:mi><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:math>.</para>
      <para id="id2265139">This result seems to be practically
achievable only for <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>9</m:mn></m:mrow></m:math>, or perhaps 25. In the case of <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>9</m:mn></m:mrow></m:math>,
there are two rational multiplies that must be carried out and are
counted in <cnxn target="uid22"/> but are not predicted by <cnxn target="id2264966">Theorem 7</cnxn>.
Experience <cnxn target="bid16"/> indicates that even for <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>25</m:mn></m:mrow></m:math>, an
algorithm based on a Cooley-Tukey FFT using a type 2 index map gives
an over-all more balanced result.</para>
      <para id="id2265206">Theorem 8 
<cnxn target="bid15"/> If <m:math overflow="scroll"><m:mi>G</m:mi></m:math> is chosen as the field of rational
numbers, the number of real multiplications necessary to
calculate a length-N DFT where <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>2</m:mn><m:mi>m</m:mi></m:mrow></m:math> is given by</para>
      <equation id="id2265245">
        <m:math overflow="scroll">
          <m:mrow>
            <m:mi>u</m:mi>
            <m:mo>(</m:mo>
            <m:mi>D</m:mi>
            <m:mi>F</m:mi>
            <m:mi>T</m:mi>
            <m:mo>(</m:mo>
            <m:mi>N</m:mi>
            <m:mo>)</m:mo>
            <m:mo>)</m:mo>
            <m:mo>=</m:mo>
            <m:mn>2</m:mn>
            <m:mi>N</m:mi>
            <m:mo>-</m:mo>
            <m:mi>m</m:mi>
            <m:mn>2</m:mn>
            <m:mo>-</m:mo>
            <m:mi>m</m:mi>
            <m:mo>-</m:mo>
            <m:mn>2</m:mn>
          </m:mrow>
        </m:math>
      </equation>
      <para id="id2265295">This result is not practically useful because the number of
additions necessary to realize this minimum of multiplications
becomes very large for lengths greater than 16. Nevertheless, it
proves the minimum number of multiplications required of an optimal
algorithm is a linear function of <m:math overflow="scroll"><m:mi>N</m:mi></m:math> rather than of <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo form="prefix">log</m:mo><m:mi>N</m:mi></m:mrow></m:math>
which is that required of practical algorithms. The best practical
power-of-two algorithm seems to the Split-Radix <cnxn target="bid17"/> FFT
discussed in <cnxn document="m16334" target="uid16">The Cooley-Tukey Fast Fourier Transform Algorithm: The Split-Radix FFT Algorithm</cnxn>.</para>
      <para id="id2265339">All of these theorems use ideas based on residue reduction,
multiplication of the residues, and then combination by the CRT. It
is remarkable that this approach finds the minimum number of
required multiplications by a constructive proof which generates an
algorithm that achieves this minimum; and the structure of the
optimal algorithm is, within certain variations, unique. For shorter
lengths, the optimal algorithms give practical programs. For longer
lengths the uncounted operations involved with the multiplication of
the higher degree residue polynomials become very large and
impractical. In those cases, efficient suboptimal algorithms can be
generated by using the same residue reduction as for the optimal
case, but by using methods other than the Toom-Cook algorithm of
<cnxn target="id2263020">Theorem 1</cnxn> to multiply the residue polynomials.</para>
      <para id="id2265360">Practical long DFT algorithms are produced by combining
short prime length optimal DFT's with the Type 1 index map from
<cnxn document="m16326">Multidimensional Index Mapping</cnxn> to give the Prime Factor Algorithm (PFA) and the
Winograd Fourier Transform Algorithm (WFTA) discussed in <cnxn document="m16335">The Prime Factor and Winograd Fourier Transform Algorithms</cnxn>. It is interesting to note that the index mapping technique
is useful inside the short DFT algorithms to replace the Toom-Cook
algorithm and outside to combine the short DFT's to calculate long
DFT's.</para>
    </section>
    <section id="uid39">
      <name>The Automatic Generation of Winograd's Short DFTs</name>
      <para id="id2265384">by Ivan Selesnick, Polytechnic Institute of New York University</para>
      <section id="uid40">
        <name>Introduction</name>
        <para id="id2265397">Efficient prime length DFTs are important for two reasons. A particular
application may require a prime length DFT and secondly, the maximum length
and the variety of lengths of a PFA or WFTA algorithm depend upon the
availability of prime length modules.</para>
        <para id="id2265409">This <cnxn target="bid18"/>, <cnxn target="bid19"/>, <cnxn target="bid20"/>, <cnxn target="bid21"/> discusses automation of the process Winograd
used for constructing prime length FFTs <cnxn target="bid1"/>, <cnxn target="bid16"/> for <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>&lt;</m:mo><m:mn>7</m:mn></m:mrow></m:math>
and that Johnson and Burrus <cnxn target="bid6"/> extended to <m:math overflow="scroll"><m:mrow><m:mi>N</m:mi><m:mo>&lt;</m:mo><m:mn>19</m:mn></m:mrow></m:math>.
It also describes a program that will design any prime length FFT in principle,
and will also automatically generate the algorithm as a C program and draw
the corresponding flow graph.</para>
        <para id="id2265487">Winograd's approach uses Rader's method to convert a prime length DFT into
a <m:math overflow="scroll"><m:mrow><m:mi>P</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> length cyclic convolution, polynomial residue reduction to decompose
the problem into smaller convolutions <cnxn target="bid1"/>, <cnxn target="bid3"/>, and the Toom-Cook
algorithm <cnxn target="bid1"/>, <cnxn target="bid22"/>.
The Chinese Remainder Theorem (CRT) for polynomials is then used to recombine the
shorter convolutions. Unfortunately, the design procedure derived directly from
Winograd's theory becomes cumbersome for longer length DFTs, and this has often
prevented the design of DFT programs for lengths greater than 19.</para>
        <para id="id2265536">Here we use three methods to facilitate the construction of prime
length FFT modules. First, the matrix exchange property
<cnxn target="bid1"/>, <cnxn target="bid6"/>, <cnxn target="bid23"/> is used so
that the transpose of the reduction operator can be used rather than the more
complicated CRT reconstruction operator. This is then combined with the
numerical method <cnxn target="bid6"/> for obtaining the multiplication coefficients rather
than the direct use of the CRT. We also deviate from the Toom-Cook algorithm,
because it requires too many additions for the lengths in which we are interested.
Instead we use an iterated polynomial multiplication algorithm <cnxn target="bid1"/>. We have
incorporated these three ideas into a single structural procedure that automates
the design of prime length FFTs.</para>
      </section>
      <section id="uid41">
        <name>Matrix Description</name>
        
        <para id="id2265591">It is important that each step in the Winograd FFT can be described using matrices.
By expressing cyclic convolution as a bilinear form, a compact form of prime length
DFTs can be obtained.</para>
        <para id="id2265598">If <m:math overflow="scroll"><m:mi>y</m:mi></m:math> is the cyclic convolution of <m:math overflow="scroll"><m:mi>h</m:mi></m:math> and <m:math overflow="scroll"><m:mi>x</m:mi></m:math>, then <m:math overflow="scroll"><m:mi>y</m:mi></m:math> can be expressed as</para>
        <equation id="uid42">
          <m:math mode="display" overflow="scroll">
            <m:mrow>
              <m:mi>y</m:mi>
              <m:mo>=</m:mo>
              <m:mi>C</m:mi>
              <m:mo>[</m:mo>
              <m:mi>A</m:mi>
              <m:mi>x</m:mi>
              <m:mo>.</m:mo>
              <m:mo>*</m:mo>
              <m:mi>B</m:mi>
              <m:mi>h</m:mi>
              <m:mo>]</m:mo>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2265674">where, using the Matlab convention, <m:math overflow="scroll"><m:mrow><m:mo>.</m:mo><m:mo>*</m:mo></m:mrow></m:math> represents point by point multiplication.
When <m:math overflow="scroll"><m:mi>A</m:mi></m:math>,<m:math overflow="scroll"><m:mi>B</m:mi></m:math>, and <m:math overflow="scroll"><m:mi>C</m:mi></m:math> are allowed to be complex, <m:math overflow="scroll"><m:mi>A</m:mi></m:math> and <m:math overflow="scroll"><m:mi>B</m:mi></m:math> are seen to be the DFT operator
and <m:math overflow="scroll"><m:mi>C</m:mi></m:math>, the inverse DFT. When only real numbers are allowed, <m:math overflow="scroll"><m:mi>A</m:mi></m:math>, <m:math overflow="scroll"><m:mi>B</m:mi></m:math>, and <m:math overflow="scroll"><m:mi>C</m:mi></m:math> will be
rectangular. This form of convolution is presented with many examples in <cnxn target="bid1"/>.
Using the matrix exchange property explained in <cnxn target="bid1"/> and <cnxn target="bid6"/> this form can be
written as</para>
        <equation id="uid43">
          <m:math mode="display" overflow="scroll">
            <m:mrow>
              <m:mi>y</m:mi>
              <m:mo>=</m:mo>
              <m:mi>R</m:mi>
              <m:msup>
                <m:mi>B</m:mi>
                <m:mi>T</m:mi>
              </m:msup>
              <m:mrow>
                <m:mo>[</m:mo>
                <m:msup>
                  <m:mi>C</m:mi>
                  <m:mi>T</m:mi>
                </m:msup>
                <m:mi>R</m:mi>
                <m:mi>h</m:mi>
                <m:mo>.</m:mo>
                <m:mo>*</m:mo>
                <m:mi>A</m:mi>
                <m:mi>x</m:mi>
                <m:mo>]</m:mo>
              </m:mrow>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2265848">where <m:math overflow="scroll"><m:mi>R</m:mi></m:math> is the permutation matrix that reverses order.</para>
        <para id="id2265864">When <m:math overflow="scroll"><m:mi>h</m:mi></m:math> is fixed, as it is when considering prime length DFTs, the term <m:math overflow="scroll"><m:mrow><m:msup><m:mi>C</m:mi><m:mi>T</m:mi></m:msup><m:mi>R</m:mi><m:mi>h</m:mi></m:mrow></m:math> can be
precomputed and a diagonal matrix <m:math overflow="scroll"><m:mi>D</m:mi></m:math> formed by <m:math overflow="scroll"><m:mrow><m:mi>D</m:mi><m:mo>=</m:mo><m:mi>d</m:mi><m:mi>i</m:mi><m:mi>a</m:mi><m:mi>g</m:mi><m:mo>{</m:mo><m:msup><m:mi>C</m:mi><m:mi>T</m:mi></m:msup><m:mi>R</m:mi><m:mi>h</m:mi><m:mo>}</m:mo></m:mrow></m:math>. This is advantageous
because in general, <m:math overflow="scroll"><m:mi>C</m:mi></m:math> is more complicated than <m:math overflow="scroll"><m:mi>B</m:mi></m:math>, so the ability to “hide" <m:math overflow="scroll"><m:mi>C</m:mi></m:math> saves
computation. Now <m:math overflow="scroll"><m:mrow><m:mi>y</m:mi><m:mo>=</m:mo><m:mi>R</m:mi><m:msup><m:mi>B</m:mi><m:mi>T</m:mi></m:msup><m:mi>D</m:mi><m:mi>A</m:mi><m:mi>x</m:mi></m:mrow></m:math> or <m:math overflow="scroll"><m:mrow><m:mi>y</m:mi><m:mo>=</m:mo><m:mi>R</m:mi><m:msup><m:mi>A</m:mi><m:mi>T</m:mi></m:msup><m:mi>D</m:mi><m:mi>A</m:mi><m:mi>x</m:mi></m:mrow></m:math> since <m:math overflow="scroll"><m:mi>A</m:mi></m:math> and <m:math overflow="scroll"><m:mi>B</m:mi></m:math> can be the same; they
implement a polynomial reduction. The form <m:math overflow="scroll"><m:mrow><m:mi>y</m:mi><m:mo>=</m:mo><m:msup><m:mi>R</m:mi><m:mi>T</m:mi></m:msup><m:mi>D</m:mi><m:mi>A</m:mi><m:mi>x</m:mi><m:mi>T</m:mi></m:mrow></m:math> can also be used for the prime
length DFTs, it is only necessary to permute the entries of x and to ensure that the
DC term is computed correctly. The computation of the DC term is simple, for the residue
of a polynomial modulo <m:math overflow="scr