<?xml version="1.0" encoding="utf-8"?>
<document xmlns="http://cnx.rice.edu/cnxml" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:bib="http://bibtexml.sf.net/" xmlns:q="http://cnx.rice.edu/qml/1.0" id="id2255528" module-id="" cnxml-version="0.6">
  <title>Winograd's Short DFT Algorithms</title>
  <metadata xmlns:md="http://cnx.rice.edu/mdml/0.4">
  <!-- WARNING! The 'metadata' section is read only. Do not edit below.
       Changes to the metadata section in the source will not be saved. -->
  <md:content-id>m16333</md:content-id>
  <md:title>Winograd's Short DFT Algorithms</md:title>
  <md:version>1.11</md:version>
  <md:created>2008/05/22 15:49:18 GMT-5</md:created>
  <md:revised>2009/04/03 16:33:10.655 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:fullname>C. Sidney Burrus</md:fullname>
        <md:email>csb@rice.edu</md:email>
    </md:author>
    <md:author id="selesi">
        <md:firstname>Ivan</md:firstname>
        <md:surname>Selesnick</md:surname>
        <md:fullname>Ivan Selesnick</md:fullname>
        <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:fullname>C. Sidney Burrus</md:fullname>
        <md:email>csb@rice.edu</md:email>
    </md:maintainer>
    <md:maintainer id="selesi">
        <md:firstname>Ivan</md:firstname>
        <md:surname>Selesnick</md:surname>
        <md:fullname>Ivan Selesnick</md:fullname>
        <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:fullname>Daniel Williamson</md:fullname>
        <md:email>dcwill@cnx.org</md:email>
    </md:maintainer>
  </md:maintainerlist>
  <md:license href="http://creativecommons.org/licenses/by/2.0/"/>
  <md:licensorlist>
    <md:licensor id="cburrus">
        <md:firstname>C.</md:firstname>
        <md:othername>Sidney</md:othername>
        <md:surname>Burrus</md:surname>
        <md:fullname>C. Sidney Burrus</md:fullname>
        <md:email>csb@rice.edu</md:email>
    </md:licensor>
    <md:licensor id="selesi">
        <md:firstname>Ivan</md:firstname>
        <md:surname>Selesnick</md:surname>
        <md:fullname>Ivan Selesnick</md:fullname>
        <md:email>selesi@taco.poly.edu</md:email>
    </md:licensor>
  </md:licensorlist>
  <md:subjectlist>
    <md:subject>Mathematics and Statistics</md:subject>
  </md:subjectlist>
  <md:abstract/>
  <md:language>en</md:language>
  <!-- WARNING! The 'metadata' section is read only. Do not edit above.
       Changes to the metadata section in the source will not be saved. -->
</metadata>
  <content>
    <para id="id2255538">In 1976, S. Winograd <link target-id="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 <link document="m16326">Multidimensional Index Mapping</link> 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 another module 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 <link document="m16327" target-id="uid1">Polynomial Description of Signals: Equation 1</link> to break the convolution into multiple small ones
<link target-id="bid1"/>, <link target-id="bid2"/>, <link target-id="bid3"/>, <link target-id="bid4"/>, <link target-id="bid5"/>, <link target-id="bid6"/>.</para>
    <para id="id2255605">The operation of discrete convolution defined by</para>
    <equation id="uid1"><m:math mode="display">
        <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><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><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><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><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><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><m:mi>N</m:mi></m:math>.</para>
    <para id="id2255773">Recall from <link document="m16327" target-id="uid3">Polynomial Description of Signals: Equation 3</link> that length-N cyclic convolution of
<m:math><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><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">
        <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 <link target-id="uid1"/> and <link target-id="uid2"/> can also be
expressed in terms of linear matrix operators and a simpler bilinear
operator denoted by <m:math><m:mi>o</m:mi></m:math> which may be only a simple
element-by-element multiplication of the two vectors
<link target-id="bid2"/>, <link target-id="bid6"/>, <link target-id="bid7"/>. This matrix formulation is</para>
    <equation id="uid3">
      <m:math mode="display">
        <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><m:mi>X</m:mi></m:math>, <m:math><m:mi>H</m:mi></m:math> and <m:math><m:mi>Y</m:mi></m:math> are length-N vectors with elements of
<m:math><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><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><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><m:mi>A</m:mi></m:math> and <m:math><m:mi>B</m:mi></m:math>
have dimension <m:math><m:mi>M</m:mi></m:math> x <m:math><m:mi>N</m:mi></m:math> , and <m:math><m:mi>C</m:mi></m:math> is <m:math><m:mi>N</m:mi></m:math> x <m:math><m:mi>M</m:mi></m:math> with <m:math><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><m:mi>A</m:mi></m:math>, <m:math><m:mi>B</m:mi></m:math>, and <m:math><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 <link target-id="uid2"/>.</para>
    <para id="id2256388">In order to derive a useful algorithm of the form <link target-id="uid3"/> to
calculate <link target-id="uid1"/>, consider the polynomial formulation
<link target-id="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><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
<link target-id="bid1"/>, <link target-id="bid2"/>, <link target-id="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 degrees up to
over one hundred. This means the residue reduction will generally 
require no multiplications.</para>
    <para id="id2256451">The operations of reducing <m:math><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><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 <link target-id="uid2"/> are carried
out by the matrices <m:math><m:mi>A</m:mi></m:math> and <m:math><m:mi>B</m:mi></m:math> in <link target-id="uid3"/>. The convolution of
the residue polynomials is carried out by the <m:math><m:mi>o</m:mi></m:math> operator and the
recombination by the CRT is done by the <m:math><m:mi>C</m:mi></m:math> matrix. More details are
in <link target-id="bid1"/>, <link target-id="bid2"/>, <link target-id="bid3"/>, <link target-id="bid6"/>, <link target-id="bid7"/> but the important fact is
the <m:math><m:mi>A</m:mi></m:math> and <m:math><m:mi>B</m:mi></m:math> matrices usually contain only zero and plus or minus
unity entries and the <m:math><m:mi>C</m:mi></m:math> matrix only contains rational numbers. The
only general multiplications are those represented by <m:math><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><m:mi>C</m:mi></m:math> could be a limiting factor.</para>
    <para id="id2256610">The <m:math><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><m:mi>W</m:mi></m:math> terms from <link document="m16326" target-id="uid1">Multidimensional Index Mapping: Equation 1</link> if the convolution is being
used to calculate a DFT. Because of this, <m:math><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 <link target-id="uid3"/>
can be precalculated and only the <m:math><m:mi>A</m:mi></m:math> and <m:math><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 <link target-id="bid4"/>, <link target-id="bid6"/> that the
properties of <link target-id="uid3"/> allow the exchange of the more complicated
operator <m:math><m:mi>C</m:mi></m:math> with the simpler operator <m:math><m:mi>B</m:mi></m:math>. Specifically this is
given by</para>
    <equation id="id2256717">
      <m:math mode="display">
        <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">
        <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><m:mi>H</m:mi></m:math>' has the same elements as <m:math><m:mi>H</m:mi></m:math>, but in a permuted order,
and likewise <m:math><m:mi>Y</m:mi></m:math>' and <m:math><m:mi>Y</m:mi></m:math>. This very important property allows
precomputing the more complicated <m:math><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 <link target-id="uid4"/> rather than
<m:math><m:mrow><m:mi>B</m:mi><m:mi>H</m:mi></m:mrow></m:math> as in <link target-id="uid3"/>.</para>
    <para id="id2256880">Because <m:math><m:mrow><m:mi>B</m:mi><m:mi>H</m:mi></m:mrow></m:math> or <m:math><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
<link target-id="uid3"/> and <link target-id="uid4"/> can be written as a linear form. If an
<m:math><m:mi>M</m:mi></m:math> x <m:math><m:mi>M</m:mi></m:math> diagonal matrix <m:math><m:mi>D</m:mi></m:math> is formed from <m:math><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 <link target-id="uid3"/>, <m:math><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><m:mi>o</m:mi></m:math>, <link target-id="uid4"/> becomes</para>
    <equation id="uid5">
      <m:math mode="display">
        <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 <link target-id="uid3"/> becomes</para>
    <equation id="id2257047">
      <m:math mode="display">
        <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><m:mi>X</m:mi></m:math> and <m:math><m:mi>H</m:mi></m:math>, therefore, <m:math><m:mi>B</m:mi></m:math> can be the same as <m:math><m:mi>A</m:mi></m:math> and
<link target-id="uid5"/> then becomes</para>
    <equation id="uid6">
      <m:math mode="display">
        <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 <link document="m16328" target-id="uid9">The DFT as Convolution or Filtering: Matrix 1</link> will be continued. The DFT is first converted
to a length-4 cyclic convolution by the index permutation from
<link document="m16328" target-id="uid4">The DFT as Convolution or Filtering: Equation 3</link> to give the cyclic convolution in <link document="m16328">The DFT as Convolution or Filtering</link>. To avoid
confusion from the permuted order of the data <m:math><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 <link document="m16328">The DFT as Convolution or Filtering</link>,
the cyclic convolution will first be developed without the
permutation, using the polynomial <m:math><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">
        <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">
        <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><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">
        <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">
        <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">
        <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">
        <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><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><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><m:msub><m:mi>P</m:mi><m:mn>1</m:mn></m:msub></m:math> and <m:math><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><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><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><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">
        <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">
        <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">
        <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">
        <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">
        <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 <link target-id="uid10"/> of the data polynomial <link target-id="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">
        <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 <link target-id="uid13"/> is</para>
    <equation id="uid15">
      <m:math mode="display">
        <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 <link target-id="uid14"/> and <link target-id="uid15"/> gives one operator</para>
    <equation id="uid16">
      <m:math mode="display">
        <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><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><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><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><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><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 <link target-id="uid11"/> and <link target-id="uid12"/> by</para>
    <equation id="uid17">
      <m:math mode="display">
        <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">
        <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 <link target-id="uid16"/>, <link target-id="uid17"/> and <link target-id="uid18"/> gives</para>
    <equation id="uid19">
      <m:math mode="display">
        <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><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
<link target-id="id2257391"/> is done by multiplying each residue polynomial of <m:math><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><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><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 <link document="m16327" target-id="uid10">Polynomial Description of Signals: Equation 9</link> and <link document="m16327" target-id="uid14">Polynomial Description of Signals: Equation 13</link>.</para>
    <equation id="id2259647">
      <m:math mode="display">
        <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><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:math></para>
    <para id="id2259834">where <m:math><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><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><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><m:msub><m:mi>U</m:mi><m:mn>1</m:mn></m:msub></m:math> times <m:math><m:msub><m:mi>H</m:mi><m:mn>1</m:mn></m:msub></m:math> and
<m:math><m:msub><m:mi>U</m:mi><m:mn>2</m:mn></m:msub></m:math> times <m:math><m:msub><m:mi>H</m:mi><m:mn>2</m:mn></m:msub></m:math> are easy, but multiplying <m:math><m:msub><m:mi>U</m:mi><m:mn>3</m:mn></m:msub></m:math> time <m:math><m:msub><m:mi>H</m:mi><m:mn>3</m:mn></m:msub></m:math> modulo
<m:math><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><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><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 <link target-id="bid1"/>, <link target-id="bid2"/>, <link target-id="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 <link target-id="bid1"/>, <link target-id="bid2"/>, <link target-id="bid3"/>.
For this example it can be verified that</para>
    <equation id="id2260144">
      <m:math mode="display">
        <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">
        <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><m:mi>o</m:mi></m:math> signifies point-by-point multiplication. The total <m:math><m:mi>A</m:mi></m:math>
matrix in <link target-id="uid3"/> is a combination of <link target-id="uid19"/> and
<link target-id="uid20"/> giving</para>
    <equation id="id2260545">
      <m:math mode="display">
        <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">
        <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><m:msub><m:mi>A</m:mi><m:mn>3</m:mn></m:msub></m:math> gives the residue reduction <m:math><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><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><m:msub><m:mi>A</m:mi><m:mn>2</m:mn></m:msub></m:math> gives the reduction
modulo <m:math><m:mrow><m:mi>s</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> and <m:math><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><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 <link target-id="uid4"/>. Notice that by calculating
<link target-id="uid21"/> in the three stages, seven additions are required. Also
notice that <m:math><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><m:mi>N</m:mi></m:math> multiplications to be required in <m:math><m:mi>o</m:mi></m:math> in <link target-id="uid4"/>
or <m:math><m:mi>D</m:mi></m:math> in <link target-id="uid5"/>. This staged reduction will derive the <m:math><m:mi>A</m:mi></m:math>
operator for <link target-id="uid4"/></para>
    <para id="id2261114">The method described above is very straight-forward for the
shorter DFT lengths. For <m:math><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 <link target-id="uid3"/> is
trivial. For <m:math><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 <link target-id="uid20"/>. For <m:math><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><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 <link target-id="uid6"/>. Blahut
<link target-id="bid1"/> and Nussbaumer <link target-id="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><m:mi>D</m:mi></m:math> can be found from the
CRT matrix <m:math><m:mi>C</m:mi></m:math> in <link target-id="uid4"/> using <m:math><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><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><m:mi>D</m:mi></m:math> uses the fact
that since the linear form <link target-id="uid5"/> or <link target-id="uid6"/> calculates the
DFT, it is possible to calculate a known DFT of a given <m:math><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 <link document="m16326" target-id="uid1">Multidimensional Index Mapping: Equation 1</link> and, given the <m:math><m:mi>A</m:mi></m:math> matrix in
<link target-id="uid6"/>, solve for <m:math><m:mi>D</m:mi></m:math> by solving a set of simultaneous
equations. The details of this procedure are described in
<link target-id="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><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 <link target-id="bid2"/>, <link target-id="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
<link target-id="bid2"/>, <link target-id="bid3"/>, <link target-id="bid5"/> to make the conversion and there exists a
set of length 4, 8, and 16 DFT algorithms of the form in <link target-id="uid6"/>
in <link target-id="bid2"/>.</para>
    <para id="id2261420">In <link target-id="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 <link document="m16335">The Prime Factor and Winograd Fourier Transform Algorithms</link>. 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><m:mi>D</m:mi></m:math> in <link target-id="uid6"/>. At least one of these will be unity ( the
one associated with <m:math><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><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 <link document="m16335" target-id="uid12">The Prime Factor and Winograd Fourier Transform Algorithm: The Winograd Fourier Transform Algorithm</link>.</para>
    <table id="element-176" summary="">
<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>
    <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><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><m:mi>N</m:mi></m:math> is
prime add a real to an imaginary, and that is not actually
performed. When <m:math><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><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
<link target-id="bid8"/>, <link target-id="bid9"/>, <link target-id="bid10"/>.</para>
    <para id="id2262014">The structure of these algorithms are in the form of <m:math><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><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><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 <link target-id="uid4"/> and <link target-id="uid6"/>. The
<m:math><m:mi>A</m:mi></m:math> and <m:math><m:mi>B</m:mi></m:math> matrices are generally <m:math><m:mi>M</m:mi></m:math> by <m:math><m:mi>N</m:mi></m:math> with <m:math><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><m:mrow><m:mo>±</m:mo><m:mn>1</m:mn></m:mrow></m:math>. A
pictorial description is given in <link target-id="uid23"/>.</para>
    <figure id="uid23" orient="horizontal"><media id="id17249926" alt=""><image src="File0024.png" mime-type="image/png" width="400"/><image src="File0024.eps" mime-type="application/postscript" print-width="3in"/></media><caption>Flow Graph for the Length-5 DFT</caption></figure>
    <figure id="uid24" orient="horizontal"><media id="id17249987" alt=""><image src="File0023.png" mime-type="image/png" width="400"/><image src="File0023.eps" mime-type="application/postscript" print-width="3in"/></media><caption>Block Diagram of a Winograd Short DFT</caption></figure>
    <para id="id2262191">The flow graph in <link target-id="uid23"/> should be compared with the
matrix description of <link target-id="uid6"/> and <link target-id="uid21"/>, and with the
programs in <link target-id="bid1"/>, <link target-id="bid2"/>, <link target-id="bid11"/>, <link target-id="bid3"/> and the appendices.  The shape in <link target-id="uid24"/> illustrates the expansion of the data by <m:math><m:mi>A</m:mi></m:math>. That is to
say, <m:math><m:mrow><m:mi>A</m:mi><m:mi>X</m:mi></m:mrow></m:math> has more entries than <m:math><m:mi>X</m:mi></m:math> because <m:math><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><m:mi>D</m:mi></m:math> operator gives the <m:math><m:mi>M</m:mi></m:math>
multiplications (some by one) and <m:math><m:msup><m:mi>A</m:mi><m:mi>T</m:mi></m:msup></m:math> contracts the data back to
<m:math><m:mi>N</m:mi></m:math> values with additions only. <m:math><m:mi>M</m:mi></m:math> is one half the second list of
multiplies in <link target-id="uid22"/>.</para>
    <para id="id2262343">An important characteristic of the <m:math><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><m:mi>W</m:mi></m:math> vector by <m:math><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><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 <link target-id="bid4"/>, <link target-id="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
<link document="m16338">Algorithms for Data with Restrictions</link>. The <m:math><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 <link target-id="uid24"/>
are the same for convolution. Algorithms and operation counts can be
found in <link target-id="bid1"/>, <link target-id="bid3"/>, <link target-id="bid12"/>.</para>
    <section id="uid25">
      <title>The Bilinear Structure</title>
      <para id="id2262514">The bilinear form introduced in <link target-id="uid3"/> and the related linear
form in <link target-id="uid5"/> are very powerful descriptions of both the DFT
and convolution.</para>
      <equation id="uid26">
        <m:math mode="display">
          <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">
          <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 <link target-id="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">
          <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 <link target-id="uid26"/> becomes</para>
      <equation id="uid29">
        <m:math mode="display">
          <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><m:mi>A</m:mi></m:math> is square (e.g.
<link target-id="uid19"/> and o represents multiplication of the residue
polynomials modulo the cyclotomic polynomials. If <m:math><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 <link target-id="uid21"/>, then <m:math><m:mi>A</m:mi></m:math> is
NxM and o is term-by- term simple scalar multiplication. In this
case <m:math><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><m:mi>X</m:mi></m:math> and <m:math><m:mi>C</m:mi></m:math> is the
inverse transform. This is called a rectangular transform
<link target-id="bid12"/> because <m:math><m:mi>A</m:mi></m:math> is rectangular. The transform requires
only additions and convolution is done with <m:math><m:mi>M</m:mi></m:math> multiplications. The
other extreme is when <m:math><m:mi>A</m:mi></m:math> represents reduction over the <m:math><m:mi>N</m:mi></m:math> complex
roots of <m:math><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><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><m:mi>A</m:mi></m:math>, <m:math><m:mi>B</m:mi></m:math> and <m:math><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 <link target-id="uid29"/> gives a description of most
forms of convolution.</para>
    </section>
    <section id="uid30">
      <title>Winograd's Complexity Theorems</title>
      <para id="id2262960">Because Winograd's work <link target-id="bid1"/>, <link target-id="bid2"/>, <link target-id="bid4"/>, <link target-id="bid5"/>, <link target-id="bid13"/>, <link target-id="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 <link document="m16327" target-id="uid3">Polynomial Description of Signals: Equation 3</link> or
<link target-id="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> 
<link target-id="bid4"/> Given two polynomials, <m:math><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><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><m:mi>N</m:mi></m:math> and <m:math><m:mi>M</m:mi></m:math> respectively, each with indeterminate
coefficients that are elements of a field <m:math><m:mi>H</m:mi></m:math>, <m:math><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><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><m:mi>G</m:mi></m:math> (the field of
constants), which is contained in <m:math><m:mi>H</m:mi></m:math>, are not counted and
<m:math><m:mi>G</m:mi></m:math> contains at least <m:math><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><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><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><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><m:mi>G</m:mi></m:math> which, since its degree is greater
than the product <m:math><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><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><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><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><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><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><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><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 <link target-id="bid1"/>, <link target-id="bid2"/>, <link target-id="bid3"/>, <link target-id="bid4"/>. For our
applications, <m:math><m:mi>H</m:mi></m:math> is the field of reals and <m:math><m:mi>G</m:mi></m:math> the field of
rationals.</para>
      <para id="id2263451"><emphasis>Theorem 2</emphasis> 
<link target-id="bid4"/> If an algorithm exists which computes
<m:math><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><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">
          <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><m:msub><m:mi>g</m:mi><m:mi>k</m:mi></m:msub></m:math> are distinct elements of <m:math><m:mi>G</m:mi></m:math>; and <m:math><m:msubsup><m:mi>g</m:mi><m:mi>k</m:mi><m:mo>'</m:mo></m:msubsup></m:math> and <m:math><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><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><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> 
<link target-id="bid4"/> Let <m:math><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><m:mi>N</m:mi></m:math> and
be of the form <m:math><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><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><m:mi>G</m:mi></m:math> and <m:math><m:mi>k</m:mi></m:math> is a
positive integer. Let <m:math><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><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><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><m:mi>H</m:mi></m:math>, then
<m:math><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><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><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
<link target-id="id2263020">Theorem 1</link> with the operations of the reduction of the product modulo
<m:math><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> 
<link target-id="bid4"/> Any algorithm that computes the product
<m:math><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><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><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 <link target-id="id2263451">Theorem 2</link>, this theorem
states that only a limited number of possible structures exist for
optimal algorithms.</para>
      <para id="id2264034"><emphasis>Theorem 5</emphasis> 
<link target-id="bid4"/> If the modulus polynomial <m:math><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><m:mi>N</m:mi></m:math> and is not irreducible, it can be written in a
unique factored form <m:math><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><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><m:mi>G</m:mi></m:math>. <m:math><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><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><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><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><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><m:mi>H</m:mi></m:math> and are of degree at least <m:math><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><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><m:mi>k</m:mi></m:math>
residue polynomials of <m:math><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><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><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><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><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><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><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><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><m:mi>N</m:mi></m:math>.</para>
      <para id="id2264527"><link target-id="id2264034">Theorem 5</link> is very general since it
allows a general modulus polynomial. The proof of the upper bound
involves reducing <m:math><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><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><m:mi>k</m:mi></m:math> factors of
<m:math><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><m:mi>k</m:mi></m:math> irreducible residue polynomials is then
multiplied using the method of <link target-id="id2263955">Theorem 4</link> requiring <m:math><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><m:mi>k</m:mi></m:math> parts is <m:math><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><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><m:mi>k</m:mi></m:math> is easily determined. The factors of <m:math><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
<link target-id="bid1"/>, <link target-id="bid2"/>, <link target-id="bid3"/>.</para>
      <para id="id2264738"><emphasis>Theorem 6</emphasis> 
<link target-id="bid4"/>, <link target-id="bid5"/> Consider calculating the DFT of a
prime length real-valued number sequence. If <m:math><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><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><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><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><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
<link target-id="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><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
<link target-id="id2264738"/> and count in <link target-id="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><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 <link document="m16328" target-id="uid9">The DFT as Convolution or Filtering: Matrix 1</link>. For
applications to the WFTA discussed in <link document="m16335" target-id="uid12">The Prime Factor and Winograd Fourier Transform Algorithms: The Winograd Fourier Transform Algorithm</link>, 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> 
<link target-id="bid14"/>, <link target-id="bid15"/> If <m:math><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><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">
          <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><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><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><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><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 <link target-id="uid22"/> but are not predicted by <link target-id="id2264966">Theorem 7</link>.
Experience <link target-id="bid16"/> indicates that even for <m:math><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 
<link target-id="bid15"/> If <m:math><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><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>
          <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><m:mi>N</m:mi></m:math> rather than of <m:math><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 <link target-id="bid17"/> FFT
discussed in <link document="m16334" target-id="uid16">The Cooley-Tukey Fast Fourier Transform Algorithm: The Split-Radix FFT Algorithm</link>.</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
<link target-id="id2263020">Theorem 1</link> 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
<link document="m16326">Multidimensional Index Mapping</link> to give the Prime Factor Algorithm (PFA) and the
Winograd Fourier Transform Algorithm (WFTA) discussed in <link document="m16335">The Prime Factor and Winograd Fourier Transform Algorithms</link>. 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">
      <title>The Automatic Generation of Winograd's Short DFTs</title>
      <para id="id2265384">by Ivan Selesnick, Polytechnic Institute of New York University</para>
      <section id="uid40">
        <title>Introduction</title>
        <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 <link target-id="bid18"/>, <link target-id="bid19"/>, <link target-id="bid20"/>, <link target-id="bid21"/> discusses automation of the process Winograd
used for constructing prime length FFTs <link target-id="bid1"/>, <link target-id="bid16"/> for <m:math><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 <link target-id="bid6"/> extended to <m:math><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><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 <link target-id="bid1"/>, <link target-id="bid3"/>, and the Toom-Cook
algorithm <link target-id="bid1"/>, <link target-id="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
<link target-id="bid1"/>, <link target-id="bid6"/>, <link target-id="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 <link target-id="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 <link target-id="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">
        <title>Matrix Description</title>
        
        <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><m:mi>y</m:mi></m:math> is the cyclic convolution of <m:math><m:mi>h</m:mi></m:math> and <m:math><m:mi>x</m:mi></m:math>, then <m:math><m:mi>y</m:mi></m:math> can be expressed as</para>
        <equation id="uid42">
          <m:math mode="display">
            <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><m:mrow><m:mo>.</m:mo><m:mo>*</m:mo></m:mrow></m:math> represents point by point multiplication.
When <m:math><m:mi>A</m:mi></m:math>,<m:math><m:mi>B</m:mi></m:math>, and <m:math><m:mi>C</m:mi></m:math> are allowed to be complex, <m:math><m:mi>A</m:mi></m:math> and <m:math><m:mi>B</m:mi></m:math> are seen to be the DFT operator
and <m:math><m:mi>C</m:mi></m:math>, the inverse DFT. When only real numbers are allowed, <m:math><m:mi>A</m:mi></m:math>, <m:math><m:mi>B</m:mi></m:math>, and <m:math><m:mi>C</m:mi></m:math> will be
rectangular. This form of convolution is presented with many examples in <link target-id="bid1"/>.
Using the matrix exchange property explained in <link target-id="bid1"/> and <link target-id="bid6"/> this form can be
written as</para>
        <equation id="uid43">
          <m:math mode="display">
            <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><m:mi>R</m:mi></m:math> is the permutation matrix that reverses order.</para>
        <para id="id2265864">When <m:math><m:mi>h</m:mi></m:math> is fixed, as it is when considering prime length DFTs, the term <m:math><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><m:mi>D</m:mi></m:math> formed by <m:math><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><m:mi>C</m:mi></m:math> is more complicated than <m:math><m:mi>B</m:mi></m:math>, so the ability to “hide" <m:math><m:mi>C</m:mi></m:math> saves
computation. Now <m:math><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><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><m:mi>A</m:mi></m:math> and <m:math><m:mi>B</m:mi></m:math> can be the same; they
implement a polynomial reduction. The form <m:math><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><m:mrow><m:mi>a</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> is always the sum of the coefficients. After adding the <m:math><m:msub><m:mi>x</m:mi><m:mn>0</m:mn></m:msub></m:math>
term of the original input sequence, to the <m:math><m:mrow><m:mi>s</m:mi><m:mo>-</m:mo><m:mi>l</m:mi></m:mrow></m:math> residue, the DC term is obtained.
Now <m:math><m:mrow><m:mi>D</m:mi><m:mi>F</m:mi><m:mi>T</m:mi><m:mrow><m:mo>{</m:mo><m:mi>x</m:mi><m:mo>}</m:mo></m:mrow><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>. In <link target-id="bid6"/> Johnson observes that by permuting the elements on the
diagonal of <m:math><m:mi>D</m:mi></m:math>, the output can be permuted, so that the <m:math><m:mi>R</m:mi></m:math> matrix can be hidden in <m:math><m:mi>D</m:mi></m:math>,
and <m:math><m:mrow><m:mi>D</m:mi><m:mi>F</m:mi><m:mi>T</m:mi><m:mrow><m:mo>{</m:mo><m:mi>x</m:mi><m:mo>}</m:mo></m:mrow><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>. From the knowledge of this form, once <m:math><m:mi>A</m:mi></m:math> is found, <m:math><m:mi>D</m:mi></m:math> can be found
numerically <link target-id="bid6"/>.</para>
      </section>
      <section id="uid44">
        <title>Programming the Design Procedure</title>
        <para id="id2266275">Because each of the above steps can be described by matrices, the development of a
prime length FFTs is made convenient with the use of a matrix oriented programming
language such as Matlab. After specifying the appropriate matrices that describe the
desired FFT algorithm, generating code involves compiling the matrices into the desired
code for execution.</para>
        <para id="id2266284">Each matrix is a section of one stage of the flow graph that corresponds to the DFT
program. The four stages are:</para>
        <list id="id2266290" list-type="enumerated">
          <item id="uid45">Permutation Stage: Permutes input and output sequence.
</item>
          <item id="uid46">Reduction Stage: Reduces the cyclic convolution to smaller polynomial products.
</item>
          <item id="uid47">Polynomial Product Stage: Performs the polynomial multiplications.
</item>
          <item id="uid48">Multiplication Stage: Implements the point-by-point multiplication in the bilinear form.
</item>
        </list>
        <para id="id2266339">Each of the stages can be clearly seen in the flow graphs for the DFTs. <link target-id="uid49"/>
shows the flow graph for a length 17 DFT algorithm that was automatically drawn by the program.</para>
        <figure id="uid49" orient="horizontal"><media id="id17701172" alt=""><image src="length17.png" mime-type="image/png" width="600"/><image src="length17.eps" mime-type="application/postscript" print-width="4in"/></media><caption>Flowgraph of length-17 DFT</caption></figure>
        <para id="id2266356">The programs that accomplish this process are written in Matlab and C. Those that compute
the appropriate matrices are written in Matlab. These matrices are then stored as two ASCII
flies, with the dimensions in one and the matrix elements in the second. A C program then
reads the flies and compiles them to produce the final FFT program in C <link target-id="bid19"/></para>
      </section>
      <section id="uid50">
        <title>The Reduction Stage</title>
        <para id="id2266385">The reduction of an <m:math><m:msup><m:mi>N</m:mi><m:mrow><m:mi>t</m:mi><m:mi>h</m:mi></m:mrow></m:msup></m:math> degree polynomial, <m:math><m:mrow><m:mi>X</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math>, modulo the cyclotomic polynomial factors
of <m:math><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:math> requires only additions for many N, however, the actual number of additions
depends upon the way in which the reduction proceeds. The reduction is most efficiently
performed in steps. For example, if <m:math><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>4</m:mn></m:mrow></m:math> and <m:math><m:mrow><m:mo>(</m:mo><m:msub><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:mo>)</m:mo></m:mrow><m:mrow><m:mi>s</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:msub></m:mrow></m:math>,<m:math><m:mrow><m:mo>(</m:mo><m:msub><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:mo>)</m:mo></m:mrow><m:mrow><m:mi>s</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:msub></m:mrow></m:math>and
<m:math><m:mrow><m:mo>(</m:mo><m:msub><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: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:mrow></m:math> where the double parenthesis denote polynomial reduction modulo <m:math><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>, <m:math><m:mrow><m:mi>s</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math>,
and <m:math><m:mrow><m:msup><m:mi>s</m:mi><m:mn>2</m:mn></m:msup><m:mrow><m:mo>+</m:mo><m:mn>1</m:mn><m:mo>)</m:mo></m:mrow></m:mrow></m:math>, then in the first step <m:math><m:msub><m:mrow><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: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:math>, and <m:math><m:msub><m:mrow><m:mrow><m:mo>(</m:mo><m:mrow><m:mo>(</m:mo><m:mi>X</m:mi><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:math> should be computed.
In the second step, <m:math><m:msub><m:mrow><m:mrow><m:mo>(</m:mo><m:mrow><m:mo>(</m:mo><m:mi>X</m:mi><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:mi>s</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:msub></m:math> and <m:math><m:msub><m:mrow><m:mrow><m:mo>(</m:mo><m:mrow><m:mo>(</m:mo><m:mi>X</m:mi><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:mi>s</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:msub></m:math> can be found by reducing <m:math><m:msub><m:mrow><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: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:math>
This process is described by the diagram in <link target-id="uid51"/>.</para>
        <figure id="uid51" orient="horizontal"><media id="id17701677" alt=""><image src="reduce.png" mime-type="image/png" width="200"/><image src="reduce.eps" mime-type="application/postscript" print-width="1in"/></media><caption>Factorization of <m:math><m:mrow><m:msup><m:mi>s</m:mi><m:mn>4</m:mn></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> in steps</caption></figure>
        <para id="id2266866">When <m:math><m:mi>N</m:mi></m:math> is even, the appropriate first factorization is <m:math><m:mrow><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>2</m:mn></m:mrow></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:mrow><m:mi>N</m:mi><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:mrow></m:math>, however,
the next appropriate factorization is frequently less obvious. The following procedure
has been found to generate a factorization in steps that coincides with the
factorization that minimizes the cumulative number of additions incurred by the steps.
The prime factors of <m:math><m:mi>N</m:mi></m:math> are the basis of this procedure and their importance is clear
from the useful well-known equation <m:math><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:mo>=</m:mo><m:msub><m:mo>∏</m:mo><m:mrow><m:mi>n</m:mi><m:mo>|</m:mo><m:mi>N</m:mi></m:mrow></m:msub><m:msub><m:mi>C</m:mi><m:mi>n</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> where <m:math><m:mrow><m:msub><m:mi>C</m:mi><m:mi>n</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> is the
<m:math><m:msup><m:mi>n</m:mi><m:mrow><m:mi>t</m:mi><m:mi>h</m:mi></m:mrow></m:msup></m:math> cyclotomic polynomial.</para>
        <para id="id2267038">We first introduce the following two functions defined on the positive integers,</para>
        <equation id="uid52">
          <m:math mode="display">
            <m:mrow>
              <m:mi>ψ</m:mi>
              <m:mo>(</m:mo>
              <m:mi>N</m:mi>
              <m:mo>)</m:mo>
              <m:mo>=</m:mo>
              <m:mtext>the</m:mtext>
              <m:mspace width="4.pt"/>
              <m:mtext>smallest</m:mtext>
              <m:mspace width="4.pt"/>
              <m:mtext>prime</m:mtext>
              <m:mspace width="4.pt"/>
              <m:mtext>factor</m:mtext>
              <m:mspace width="4.pt"/>
              <m:mtext>of</m:mtext>
              <m:mspace width="4.pt"/>
              <m:mi>N</m:mi>
              <m:mspace width="4.pt"/>
              <m:mtext>for</m:mtext>
              <m:mi>N</m:mi>
              <m:mo>&gt;</m:mo>
              <m:mn>1</m:mn>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2267108">and <m:math><m:mrow><m:mi>ψ</m:mi><m:mo>(</m:mo><m:mn>1</m:mn><m:mo>)</m:mo><m:mo>=</m:mo><m:mn>1</m:mn></m:mrow></m:math>.</para>
        <para id="id2267135">Suppose <m:math><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 equal to either <m:math><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:math> or an intermediate noncyclotomic polynomial
appearing in the factorization process, for example, <m:math><m:mrow><m:mo>(</m:mo><m:msup><m:mi>a</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>, above. Write <m:math><m:mrow><m:mi>P</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math> in terms
of its cyclotomic factors,</para>
        <equation id="uid53">
          <m:math mode="display">
            <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:msub>
                <m:mi>C</m:mi>
                <m:msub>
                  <m:mi>k</m:mi>
                  <m:mn>1</m:mn>
                </m:msub>
              </m:msub>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:mi>s</m:mi>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mspace width="4pt"/>
              <m:msub>
                <m:mi>C</m:mi>
                <m:msub>
                  <m:mi>k</m:mi>
                  <m:mn>2</m:mn>
                </m:msub>
              </m:msub>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:mi>s</m:mi>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mspace width="4pt"/>
              <m:mo>⋯</m:mo>
              <m:msub>
                <m:mi>C</m:mi>
                <m:msub>
                  <m:mi>k</m:mi>
                  <m:mi>L</m:mi>
                </m:msub>
              </m:msub>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2267308">define the two sets, <m:math><m:mi>G</m:mi></m:math> and <m:math><m:mrow><m:mi>G</m:mi><m:mspace width="3.33333pt"/></m:mrow></m:math>, by</para>
        <equation id="uid54">
          <m:math mode="display">
            <m:mrow>
              <m:mi>G</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:mo>,</m:mo>
                <m:mo>⋯</m:mo>
                <m:mo>,</m:mo>
                <m:msub>
                  <m:mi>k</m:mi>
                  <m:mi>L</m:mi>
                </m:msub>
                <m:mo>}</m:mo>
              </m:mrow>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:mtext>and</m:mtext>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:mi>G</m:mi>
              <m:mspace width="3.33333pt"/>
              <m:mo>=</m:mo>
              <m:mrow>
                <m:mo>{</m:mo>
                <m:mi>k</m:mi>
                <m:mo>/</m:mo>
                <m:mi>g</m:mi>
                <m:mi>c</m:mi>
                <m:mi>d</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>G</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mtext>:</m:mtext>
                <m:mspace width="4.pt"/>
                <m:mrow>
                  <m:mi>k</m:mi>
                  <m:mo>∈</m:mo>
                  <m:mi>G</m:mi>
                </m:mrow>
                <m:mo>}</m:mo>
              </m:mrow>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2267440">and define the two integers, <m:math><m:mi>t</m:mi></m:math> and <m:math><m:mi>T</m:mi></m:math>, by
</para>
        <equation id="id2267475">
          <m:math mode="display">
            <m:mrow>
              <m:mi>t</m:mi>
              <m:mo>=</m:mo>
              <m:mo movablelimits="true" form="prefix">min</m:mo>
              <m:mo>{</m:mo>
              <m:mi>ψ</m:mi>
              <m:mo>(</m:mo>
              <m:mi>k</m:mi>
              <m:mo>)</m:mo>
              <m:mo>:</m:mo>
              <m:mi>k</m:mi>
              <m:mo>∈</m:mo>
              <m:mi>G</m:mi>
              <m:mspace width="3.33333pt"/>
              <m:mo>,</m:mo>
              <m:mi>k</m:mi>
              <m:mo>&gt;</m:mo>
              <m:mn>1</m:mn>
              <m:mo>}</m:mo>
              <m:mspace width="4.pt"/>
              <m:mtext>and</m:mtext>
              <m:mspace width="4.pt"/>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:mi>T</m:mi>
              <m:mo>=</m:mo>
              <m:mo movablelimits="true" form="prefix">max</m:mo>
              <m:mi>n</m:mi>
              <m:mi>u</m:mi>
              <m:mo>(</m:mo>
              <m:mi>k</m:mi>
              <m:mo>,</m:mo>
              <m:mi>t</m:mi>
              <m:mo>)</m:mo>
              <m:mo>:</m:mo>
              <m:mi>k</m:mi>
              <m:mo>∈</m:mo>
              <m:mi>G</m:mi>
              <m:mo>}</m:mo>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2267582">Then form two new sets,</para>
        <equation id="id2267588">
          <m:math mode="display">
            <m:mrow>
              <m:mi>A</m:mi>
              <m:mo>=</m:mo>
              <m:mo>{</m:mo>
              <m:mi>k</m:mi>
              <m:mo>∈</m:mo>
              <m:mi>G</m:mi>
              <m:mo>:</m:mo>
              <m:mi>T</m:mi>
              <m:mo>∣</m:mo>
              <m:mi>k</m:mi>
              <m:mo>}</m:mo>
              <m:mspace width="4pt"/>
              <m:mspace width="4.pt"/>
              <m:mtext>and</m:mtext>
              <m:mspace width="4.pt"/>
              <m:mspace width="4pt"/>
              <m:mi>B</m:mi>
              <m:mo>=</m:mo>
              <m:mo>{</m:mo>
              <m:mi>k</m:mi>
              <m:mo>∈</m:mo>
              <m:mi>G</m:mi>
              <m:mo>:</m:mo>
              <m:mi>T</m:mi>
              <m:mo>|</m:mo>
              <m:mi>k</m:mi>
              <m:mo>}</m:mo>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2267662">The factorization of <m:math><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>
        <equation id="uid55">
          <m:math mode="display">
            <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:mrow>
                <m:mo>(</m:mo>
                <m:munder>
                  <m:mo>∏</m:mo>
                  <m:mrow>
                    <m:mi>k</m:mi>
                    <m:mo>∈</m:mo>
                    <m:mi>A</m:mi>
                  </m:mrow>
                </m:munder>
                <m:msub>
                  <m:mi>C</m:mi>
                  <m:mi>k</m:mi>
                </m:msub>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>s</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:munder>
                  <m:mo>∏</m:mo>
                  <m:mrow>
                    <m:mi>k</m:mi>
                    <m:mo>∈</m:mo>
                    <m:mi>B</m:mi>
                  </m:mrow>
                </m:munder>
                <m:msub>
                  <m:mi>C</m:mi>
                  <m:mi>k</m:mi>
                </m:msub>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>s</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>)</m:mo>
              </m:mrow>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2267773">has been found useful in the procedure for factoring <m:math><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:math>.
This is best illustrated with an example.</para>
        <para id="id2267804">Example: <m:math><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mn>36</m:mn></m:mrow></m:math></para>
        <para id="id2267821">Step 1. Let <m:math><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:mn>36</m:mn></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math>. Since <m:math><m:mrow><m:mi>P</m:mi><m:mo>=</m:mo><m:msub><m:mi>C</m:mi><m:mn>1</m:mn></m:msub><m:msub><m:mi>C</m:mi><m:mn>2</m:mn></m:msub><m:msub><m:mi>C</m:mi><m:mn>3</m:mn></m:msub><m:msub><m:mi>C</m:mi><m:mn>4</m:mn></m:msub><m:msub><m:mi>C</m:mi><m:mn>6</m:mn></m:msub><m:msub><m:mi>C</m:mi><m:mn>9</m:mn></m:msub><m:msub><m:mi>C</m:mi><m:mn>12</m:mn></m:msub><m:msub><m:mi>C</m:mi><m:mn>18</m:mn></m:msub><m:msub><m:mi>C</m:mi><m:mn>36</m:mn></m:msub></m:mrow></m:math></para>
        <equation id="id2267934">
          <m:math mode="display">
            <m:mrow>
              <m:mi>G</m:mi>
              <m:mo>=</m:mo>
              <m:mi>G</m:mi>
              <m:mspace width="3.33333pt"/>
              <m:mo>=</m:mo>
              <m:mo>{</m:mo>
              <m:mn>1</m:mn>
              <m:mo>,</m:mo>
              <m:mn>2</m:mn>
              <m:mo>,</m:mo>
              <m:mn>3</m:mn>
              <m:mo>,</m:mo>
              <m:mn>4</m:mn>
              <m:mo>,</m:mo>
              <m:mn>6</m:mn>
              <m:mo>,</m:mo>
              <m:mn>9</m:mn>
              <m:mo>,</m:mo>
              <m:mn>12</m:mn>
              <m:mo>,</m:mo>
              <m:mn>18</m:mn>
              <m:mo>,</m:mo>
              <m:mn>36</m:mn>
              <m:mo>}</m:mo>
            </m:mrow>
          </m:math>
        </equation>
        <equation id="id2267997">
          <m:math mode="display">
            <m:mrow>
              <m:mi>t</m:mi>
              <m:mo>=</m:mo>
              <m:mo movablelimits="true" form="prefix">min</m:mo>
              <m:mo>{</m:mo>
              <m:mn>2</m:mn>
              <m:mo>,</m:mo>
              <m:mn>3</m:mn>
              <m:mo>}</m:mo>
              <m:mo>=</m:mo>
              <m:mn>2</m:mn>
            </m:mrow>
          </m:math>
        </equation>
        <equation id="id2268033">
          <m:math mode="display">
            <m:mrow>
              <m:mi>A</m:mi>
              <m:mo>=</m:mo>
              <m:mo>{</m:mo>
              <m:mi>k</m:mi>
              <m:mo>∈</m:mo>
              <m:mi>G</m:mi>
              <m:mo>:</m:mo>
              <m:mn>4</m:mn>
              <m:mo>|</m:mo>
              <m:mi>k</m:mi>
              <m:mo>}</m:mo>
              <m:mo>=</m:mo>
              <m:mo>{</m:mo>
              <m:mn>1</m:mn>
              <m:mo>,</m:mo>
              <m:mn>2</m:mn>
              <m:mo>,</m:mo>
              <m:mn>3</m:mn>
              <m:mo>,</m:mo>
              <m:mn>6</m:mn>
              <m:mo>,</m:mo>
              <m:mn>9</m:mn>
              <m:mo>,</m:mo>
              <m:mn>18</m:mn>
              <m:mo>}</m:mo>
            </m:mrow>
          </m:math>
        </equation>
        <equation id="id2268098">
          <m:math mode="display">
            <m:mrow>
              <m:mi>B</m:mi>
              <m:mo>=</m:mo>
              <m:mo>{</m:mo>
              <m:mi>k</m:mi>
              <m:mo>∈</m:mo>
              <m:mi>G</m:mi>
              <m:mo>:</m:mo>
              <m:mn>4</m:mn>
              <m:mo>|</m:mo>
              <m:mi>k</m:mi>
              <m:mo>}</m:mo>
              <m:mo>=</m:mo>
              <m:mo>{</m:mo>
              <m:mn>4</m:mn>
              <m:mo>,</m:mo>
              <m:mn>12</m:mn>
              <m:mo>,</m:mo>
              <m:mn>36</m:mn>
              <m:mo>}</m:mo>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2268150">Hence the factorization of <m:math><m:mrow><m:msup><m:mi>s</m:mi><m:mn>36</m:mn></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> into two intermediate polynomials is as expected,</para>
        <equation id="id2268177">
          <m:math mode="display">
            <m:mrow>
              <m:munder>
                <m:mo>∏</m:mo>
                <m:mrow>
                  <m:mi>k</m:mi>
                  <m:mo>∈</m:mo>
                  <m:mi>A</m:mi>
                </m:mrow>
              </m:munder>
              <m:msub>
                <m:mi>C</m:mi>
                <m:mi>k</m:mi>
              </m:msub>
              <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:mn>18</m:mn>
              </m:msup>
              <m:mo>-</m:mo>
              <m:mn>1</m:mn>
              <m:mo>,</m:mo>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:munder>
                <m:mo>∏</m:mo>
                <m:mrow>
                  <m:mi>k</m:mi>
                  <m:mo>∈</m:mo>
                  <m:mi>B</m:mi>
                </m:mrow>
              </m:munder>
              <m:msub>
                <m:mi>C</m:mi>
                <m:mi>k</m:mi>
              </m:msub>
              <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:mn>18</m:mn>
              </m:msup>
              <m:mo>+</m:mo>
              <m:mn>1</m:mn>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2268282">If a 36th
 degree polynomial, <m:math><m:mrow><m:mi>X</m:mi><m:mo>(</m:mo><m:mi>s</m:mi><m:mo>)</m:mo></m:mrow></m:math>, is represented by a vector of coefficients,
<m:math><m:mrow><m:mi>X</m:mi><m:mo>=</m:mo><m:msup><m:mrow><m:mo>(</m:mo><m:msub><m:mi>x</m:mi><m:mn>35</m:mn></m:msub><m:mo>,</m:mo><m:mo>⋯</m:mo><m:mo>,</m:mo><m:msub><m:mi>x</m:mi><m:mn>0</m:mn></m:msub><m:mo>)</m:mo></m:mrow><m:mo>'</m:mo></m:msup></m:mrow></m:math>, then <m:math><m:mrow><m:mo>(</m:mo><m:msub><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:mo>)</m:mo></m:mrow><m:mrow><m:msup><m:mi>s</m:mi><m:mn>18</m:mn></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:msub></m:mrow></m:math> (represented by X') and
<m:math><m:mrow><m:mo>(</m:mo><m:msub><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:mo>)</m:mo></m:mrow><m:mrow><m:msup><m:mi>s</m:mi><m:mn>18</m:mn></m:msup><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:msub></m:mrow></m:math> (represented by X") is given
by</para>
        <equation id="id2268436">
          <m:math mode="display">
            <m:mrow>
              <m:mi>t</m:mi>
              <m:mi>e</m:mi>
              <m:mi>s</m:mi>
              <m:mi>t</m:mi>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2268454">which entails 36 additions.</para>
        <para id="id2268460">Step 2. This procedure is repeated with <m:math><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:mn>18</m:mn></m:msup><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> and <m:math><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:mn>18</m:mn></m:msup><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math>.
We will just show it for the later. Let <m:math><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:mn>18</m:mn></m:msup><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:math>. Since <m:math><m:mrow><m:mi>P</m:mi><m:mo>=</m:mo><m:msub><m:mi>C</m:mi><m:mn>4</m:mn></m:msub><m:msub><m:mi>C</m:mi><m:mn>12</m:mn></m:msub><m:msub><m:mi>C</m:mi><m:mn>36</m:mn></m:msub></m:mrow></m:math></para>
        <equation id="id2268593">
          <m:math mode="display">
            <m:mrow>
              <m:mi>G</m:mi>
              <m:mo>=</m:mo>
              <m:mrow>
                <m:mo>{</m:mo>
                <m:mn>4</m:mn>
                <m:mo>,</m:mo>
                <m:mn>12</m:mn>
                <m:mo>,</m:mo>
                <m:mn>36</m:mn>
                <m:mo>}</m:mo>
              </m:mrow>
              <m:mo>,</m:mo>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:msup>
                <m:mi>G</m:mi>
                <m:mo>'</m:mo>
              </m:msup>
              <m:mo>=</m:mo>
              <m:mrow>
                <m:mo>{</m:mo>
                <m:mi>l</m:mi>
                <m:mo>,</m:mo>
                <m:mn>3</m:mn>
                <m:mo>,</m:mo>
                <m:mn>9</m:mn>
                <m:mo>}</m:mo>
              </m:mrow>
            </m:mrow>
          </m:math>
        </equation>
        <equation id="id2268664">
          <m:math mode="display">
            <m:mrow>
              <m:mi>t</m:mi>
              <m:mo>=</m:mo>
              <m:mo movablelimits="true" form="prefix">min</m:mo>
              <m:mn>3</m:mn>
              <m:mo>=</m:mo>
              <m:mn>3</m:mn>
            </m:mrow>
          </m:math>
        </equation>
        <equation id="id2268691">
          <m:math mode="display">
            <m:mrow>
              <m:mi>T</m:mi>
              <m:mo>=</m:mo>
              <m:mo movablelimits="true" form="prefix">max</m:mo>
              <m:mrow>
                <m:mi>ν</m:mi>
                <m:mo>(</m:mo>
                <m:mi>k</m:mi>
                <m:mo>,</m:mo>
                <m:mn>3</m:mn>
                <m:mo>)</m:mo>
                <m:mo>:</m:mo>
                <m:mi>k</m:mi>
                <m:mo>∈</m:mo>
                <m:mi>G</m:mi>
              </m:mrow>
              <m:mo>=</m:mo>
              <m:mo movablelimits="true" form="prefix">max</m:mo>
              <m:mrow>
                <m:mi>l</m:mi>
                <m:mo>,</m:mo>
                <m:mn>3</m:mn>
                <m:mo>,</m:mo>
                <m:mn>9</m:mn>
              </m:mrow>
              <m:mo>=</m:mo>
              <m:mn>9</m:mn>
            </m:mrow>
          </m:math>
        </equation>
        <equation id="id2268760">
          <m:math mode="display">
            <m:mrow>
              <m:mi>A</m:mi>
              <m:mo>=</m:mo>
              <m:mi>k</m:mi>
              <m:mo>∈</m:mo>
              <m:mi>G</m:mi>
              <m:mo>:</m:mo>
              <m:mn>9</m:mn>
              <m:mo>|</m:mo>
              <m:mi>k</m:mi>
              <m:mo>}</m:mo>
              <m:mo>=</m:mo>
              <m:mo>{</m:mo>
              <m:mn>4</m:mn>
              <m:mo>,</m:mo>
              <m:mn>12</m:mn>
              <m:mo>}</m:mo>
            </m:mrow>
          </m:math>
        </equation>
        <equation id="id2268805">
          <m:math mode="display">
            <m:mrow>
              <m:mi>B</m:mi>
              <m:mo>=</m:mo>
              <m:mi>k</m:mi>
              <m:mo>∈</m:mo>
              <m:mi>G</m:mi>
              <m:mo>:</m:mo>
              <m:mn>9</m:mn>
              <m:mo>|</m:mo>
              <m:mi>k</m:mi>
              <m:mo>}</m:mo>
              <m:mo>=</m:mo>
              <m:mo>{</m:mo>
              <m:mn>36</m:mn>
              <m:mo>}</m:mo>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2268846">This yields the two intermediate polynomials,</para>
        <equation id="id2268850">
          <m:math mode="display">
            <m:mrow>
              <m:msup>
                <m:mi>s</m:mi>
                <m:mn>6</m:mn>
              </m:msup>
              <m:mo>+</m:mo>
              <m:mn>1</m:mn>
              <m:mo>,</m:mo>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:mtext>and</m:mtext>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:mspace width="4pt"/>
              <m:msup>
                <m:mi>s</m:mi>
                <m:mn>12</m:mn>
              </m:msup>
              <m:mo>-</m:mo>
              <m:msup>
                <m:mi>s</m:mi>
                <m:mn>6</m:mn>
              </m:msup>
              <m:mo>+</m:mo>
              <m:mn>1</m:mn>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2268916">In the notation used above,</para>
        <equation id="id2268920">
          <m:math mode="display">
            <m:mrow>
              <m:mfenced separators="" open="[" close="]">
                <m:mtable>
                  <m:mtr>
                    <m:mtd>
                      <m:msup>
                        <m:mi>X</m:mi>
                        <m:mo>'</m:mo>
                      </m:msup>
                    </m:mtd>
                  </m:mtr>
                  <m:mtr>
                    <m:mtd>
                      <m:msup>
                        <m:mi>X</m:mi>
                        <m:mrow>
                          <m:mo>'</m:mo>
                          <m:mo>'</m:mo>
                        </m:mrow>
                      </m:msup>
                    </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>I</m:mi>
                        <m:mn>6</m:mn>
                      </m:msub>
                    </m:mtd>
                    <m:mtd>
                      <m:mrow>
                        <m:mo>-</m:mo>
                        <m:msub>
                          <m:mi>I</m:mi>
                          <m:mn>6</m:mn>
                        </m:msub>
                      </m:mrow>
                    </m:mtd>
                    <m:mtd>
                      <m:msub>
                        <m:mi>I</m:mi>
                        <m:mn>6</m:mn>
                      </m:msub>
                    </m:mtd>
                  </m:mtr>
                  <m:mtr>
                    <m:mtd>
                      <m:msub>
                        <m:mi>I</m:mi>
                        <m:mn>6</m:mn>
                      </m:msub>
                    </m:mtd>
                    <m:mtd>
                      <m:msub>
                        <m:mi>I</m:mi>
                        <m:mn>6</m:mn>
                      </m:msub>
                    </m:mtd>
                    <m:mtd/>
                  </m:mtr>
                  <m:mtr>
                    <m:mtd>
                      <m:mrow>
                        <m:mo>-</m:mo>
                        <m:msub>
                          <m:mi>I</m:mi>
                          <m:mn>6</m:mn>
                        </m:msub>
                      </m:mrow>
                    </m:mtd>
                    <m:mtd/>
                    <m:mtd>
                      <m:msub>
                        <m:mi>I</m:mi>
                        <m:mn>6</m:mn>
                      </m:msub>
                    </m:mtd>
                  </m:mtr>
                </m:mtable>
              </m:mfenced>
              <m:mi>X</m:mi>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2269045">entailing 24 additions. Continuing this process results in a factorization in steps</para>
        <para id="id2269052">In order to see the number of additions this scheme uses for numbers of the
form <m:math><m:mrow><m:mi>N</m:mi><m:mo>=</m:mo><m:mi>P</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math> (which is relevant to prime length FFT algorithms) figure 4
shows the number of additions the reduction process uses when the polynomial
X(s) is real.</para>
        <para id="id2269079">Figure 4: Number of Additions for Reduction Stage</para>
      </section>
      <section id="uid56">
        <title>The Polynomial Product Stage</title>
        <para id="id2269093">The iterated convolution algorithm can be used to construct an <m:math><m:mi>N</m:mi></m:math> point linear
convolution algorithm from shorter linear convolution algorithms <link target-id="bid1"/>.
Suppose the linear convolution <m:math><m:mi>y</m:mi></m:math>, of the <m:math><m:mi>n</m:mi></m:math> point vectors <m:math><m:mi>x</m:mi></m:math> and <m:math><m:mi>h</m:mi></m:math> (<m:math><m:mi>h</m:mi></m:math> known)
is described by</para>
        <equation id="id2269160">
          <m:math mode="display">
            <m:mrow>
              <m:mi>y</m:mi>
              <m:mo>=</m:mo>
              <m:msubsup>
                <m:mi>E</m:mi>
                <m:mi>n</m:mi>
                <m:mi>T</m:mi>
              </m:msubsup>
              <m:mspace width="4pt"/>
              <m:mi>D</m:mi>
              <m:mspace width="4pt"/>
              <m:msub>
                <m:mi>E</m:mi>
                <m:mi>n</m:mi>
              </m:msub>
              <m:mspace width="4pt"/>
              <m:mi>x</m:mi>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2269205">where <m:math><m:msub><m:mi>E</m:mi><m:mi>n</m:mi></m:msub></m:math> is an “expansion" matrix the elements of which are <m:math><m:mrow><m:mo>±</m:mo><m:mi>l</m:mi></m:mrow></m:math>'s and 0's and
<m:math><m:mi>D</m:mi></m:math> is an appropriate diagonal matrix. Because the only multiplications in this
expression are by the elements of <m:math><m:mi>D</m:mi></m:math>, the number of multiplications required,
<m:math><m:mrow><m:mi>M</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math>, is equal to the number of rows of <m:math><m:msub><m:mi>E</m:mi><m:mi>n</m:mi></m:msub></m:math>. The number of additions is denoted
by <m:math><m:mrow><m:mi>A</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math>.</para>
        <para id="id2269309">Given a matrix <m:math><m:msub><m:mi>E</m:mi><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub></m:msub></m:math> and a matrix <m:math><m:msub><m:mi>E</m:mi><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub></m:msub></m:math>, the iterated algorithm gives a method
for combining <m:math><m:msub><m:mi>E</m:mi><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub></m:msub></m:math> and <m:math><m:msub><m:mi>E</m:mi><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub></m:msub></m:math> to construct a valid expansion matrix, <m:math><m:msub><m:mi>E</m:mi><m:mi>n</m:mi></m:msub></m:math>, for
<m:math><m:mrow><m:mi>N</m:mi><m:mo>≤</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub></m:mrow></m:math>. Specifically,</para>
        <equation id="id2269434">
          <m:math mode="display">
            <m:mrow>
              <m:msub>
                <m:mi>E</m:mi>
                <m:mrow>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                  <m:mo>,</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>2</m:mn>
                  </m:msub>
                </m:mrow>
              </m:msub>
              <m:mo>=</m:mo>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:msub>
                  <m:mi>I</m:mi>
                  <m:mrow>
                    <m:mi>M</m:mi>
                    <m:mo>(</m:mo>
                    <m:msub>
                      <m:mi>n</m:mi>
                      <m:mn>2</m:mn>
                    </m:msub>
                    <m:mo>)</m:mo>
                  </m:mrow>
                </m:msub>
                <m:mo>⊗</m:mo>
                <m:msub>
                  <m:mi>E</m:mi>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:msub>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:msub>
                  <m:mi>E</m:mi>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>2</m:mn>
                  </m:msub>
                </m:msub>
                <m:mo>×</m:mo>
                <m:msub>
                  <m:mi>I</m:mi>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                </m:msub>
                <m:mo>)</m:mo>
              </m:mrow>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2269544">The product <m:math><m:mrow><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub></m:mrow></m:math> may be greater than <m:math><m:mi>N</m:mi></m:math>, for zeros can be (conceptually)
appended to <m:math><m:mi>x</m:mi></m:math>. The operation count associated with <m:math><m:msub><m:mi>E</m:mi><m:mrow><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub></m:mrow></m:msub></m:math> is</para>
        <equation id="id2269621">
          <m:math mode="display">
            <m:mrow>
              <m:mi>A</m:mi>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:msub>
                  <m:mi>n</m:mi>
                  <m:mn>1</m:mn>
                </m:msub>
                <m:mo>,</m:mo>
                <m:msub>
                  <m:mi>n</m:mi>
                  <m:mn>2</m:mn>
                </m:msub>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mo>=</m:mo>
              <m:mi>n</m:mi>
              <m:mo>!</m:mo>
              <m:mi>A</m:mi>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:msub>
                  <m:mi>n</m:mi>
                  <m:mn>2</m:mn>
                </m:msub>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mo>+</m:mo>
              <m:mi>A</m:mi>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:msub>
                  <m:mi>n</m:mi>
                  <m:mn>1</m:mn>
                </m:msub>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mi>M</m:mi>
              <m:msub>
                <m:mi>n</m:mi>
                <m:mn>2</m:mn>
              </m:msub>
              <m:mrow>
                <m:mo>)</m:mo>
              </m:mrow>
            </m:mrow>
          </m:math>
        </equation>
        <equation id="id2269706">
          <m:math mode="display">
            <m:mrow>
              <m:mi>M</m:mi>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:msub>
                  <m:mi>n</m:mi>
                  <m:mn>1</m:mn>
                </m:msub>
                <m:mo>,</m:mo>
                <m:msub>
                  <m:mi>n</m:mi>
                  <m:mn>2</m:mn>
                </m:msub>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mo>=</m:mo>
              <m:mi>M</m:mi>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:msub>
                  <m:mi>n</m:mi>
                  <m:mn>1</m:mn>
                </m:msub>
                <m:mo>)</m:mo>
              </m:mrow>
              <m:mspace width="4pt"/>
              <m:mi>M</m:mi>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:msub>
                  <m:mi>n</m:mi>
                  <m:mn>2</m:mn>
                </m:msub>
                <m:mo>)</m:mo>
              </m:mrow>
            </m:mrow>
          </m:math>
        </equation>
        <para id="id2269776">Although they are both valid expansion matrices, <m:math><m:mrow><m:msub><m:mi>E</m:mi><m:mrow><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub></m:mrow></m:msub><m:mo>≠</m:mo><m:msub><m:mi>E</m:mi><m:mrow><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub></m:mrow></m:msub></m:mrow></m:math> and <m:math><m:mrow><m:msub><m:mi>A</m:mi><m:mrow><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub></m:mrow></m:msub><m:mo>≠</m:mo><m:msub><m:mi>A</m:mi><m:mrow><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub></m:mrow></m:msub></m:mrow></m:math>
Because <m:math><m:mrow><m:msub><m:mi>M</m:mi><m:mrow><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub></m:mrow></m:msub><m:mo>≠</m:mo><m:msub><m:mi>M</m:mi><m:mrow><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub></m:mrow></m:msub></m:mrow></m:math> it is desirable to chose an ordering of
factors to minimize the additions incurred by the expansion matrix.
The following <link target-id="bid12"/>, <link target-id="bid3"/> follows from above.</para>
        <section id="uid57">
          <title>Multiple Factors</title>
          <para id="id2269980">Note that a valid expansion matrix, <m:math><m:msub><m:mi>E</m:mi><m:mi>N</m:mi></m:msub></m:math>, can be constructed from <m:math><m:msub><m:mi>E</m:mi><m:mrow><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub></m:mrow></m:msub></m:math>
and <m:math><m:msub><m:mi>E</m:mi><m:msub><m:mi>n</m:mi><m:mn>3</m:mn></m:msub></m:msub></m:math>, for <m:math><m:mrow><m:mi>N</m:mi><m:mo>≤</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub><m:msub><m:mi>n</m:mi><m:mn>3</m:mn></m:msub></m:mrow></m:math>. In general, any number of factors can be used to
create larger expansion matrices.
The operation count associated with <m:math><m:msub><m:mi>E</m:mi><m:mrow><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>3</m:mn></m:msub></m:mrow></m:msub></m:math> is</para>
          <equation id="id2270127">
            <m:math mode="display">
              <m:mrow>
                <m:mi>A</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                  <m:mo>,</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>2</m:mn>
                  </m:msub>
                  <m:mo>,</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>3</m:mn>
                  </m:msub>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>=</m:mo>
                <m:msub>
                  <m:mi>n</m:mi>
                  <m:mn>1</m:mn>
                </m:msub>
                <m:msub>
                  <m:mi>n</m:mi>
                  <m:mn>2</m:mn>
                </m:msub>
                <m:mi>A</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>3</m:mn>
                  </m:msub>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>+</m:mo>
                <m:msub>
                  <m:mi>n</m:mi>
                  <m:mn>1</m:mn>
                </m:msub>
                <m:mi>A</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>2</m:mn>
                  </m:msub>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mi>M</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>3</m:mn>
                  </m:msub>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>+</m:mo>
                <m:mi>A</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mi>M</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>2</m:mn>
                  </m:msub>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mi>M</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>3</m:mn>
                  </m:msub>
                  <m:mo>)</m:mo>
                </m:mrow>
              </m:mrow>
            </m:math>
          </equation>
          <equation id="id2270289">
            <m:math mode="display">
              <m:mrow>
                <m:mi>M</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                  <m:mo>,</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>2</m:mn>
                  </m:msub>
                  <m:mo>,</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>3</m:mn>
                  </m:msub>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>=</m:mo>
                <m:mi>M</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>1</m:mn>
                  </m:msub>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mi>M</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>2</m:mn>
                  </m:msub>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mi>M</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:msub>
                    <m:mi>n</m:mi>
                    <m:mn>3</m:mn>
                  </m:msub>
                  <m:mo>)</m:mo>
                </m:mrow>
              </m:mrow>
            </m:math>
          </equation>
          <para id="id2270380">These equations generalize in the predicted way when more factors are considered.
Because the ordering of the factors is relevant in the equation for <m:math><m:mrow><m:mi>A</m:mi><m:mo>(</m:mo><m:mo>.</m:mo><m:mo>)</m:mo></m:mrow></m:math>
but not for <m:math><m:mrow><m:mi>M</m:mi><m:mo>(</m:mo><m:mo>.</m:mo><m:mo>)</m:mo></m:mrow></m:math>, it is again desirable to order the factors to minimize
the number of additions. By exploiting the following property of the expressions
for <m:math><m:mrow><m:mi>A</m:mi><m:mo>(</m:mo><m:mo>.</m:mo><m:mo>)</m:mo></m:mrow></m:math> and <m:math><m:mrow><m:mi>M</m:mi><m:mo>(</m:mo><m:mo>.</m:mo><m:mo>)</m:mo></m:mrow></m:math>, the optimal ordering can be found <link target-id="bid12"/>.</para>
          <para id="id2270467">reservation of Optimal Ordering.
Suppose <m:math><m:mrow><m:mi>A</m:mi><m:mrow><m:mo>(</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>2</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mn>3</m:mn></m:msub><m:mo>)</m:mo></m:mrow><m:mrow><m:mo>≤</m:mo><m:mo movablelimits="true" form="prefix">min</m:mo><m:mo>{</m:mo><m:mi>A</m:mi></m:mrow><m:mrow><m:mo>(</m:mo><m:msub><m:mi>n</m:mi><m:msub><m:mi>k</m:mi><m:mn>1</m:mn></m:msub></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:msub><m:mi>k</m:mi><m:mn>2</m:mn></m:msub></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:msub><m:mi>k</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>k</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>k</m:mi><m:mn>2</m:mn></m:msub><m:mo>,</m:mo><m:msub><m:mi>k</m:mi><m:mn>3</m:mn></m:msub><m:mo>∈</m:mo><m:mrow><m:mo>{</m:mo><m:mn>1</m:mn><m:mo>,</m:mo><m:mn>2</m:mn><m:mo>,</m:mo><m:mn>3</m:mn><m:mo>}</m:mo></m:mrow></m:mrow></m:math> and distinct}, then</para>
          <list id="id2270625" list-type="enumerated">
            <item id="uid58">
              <equation id="id2270632">
                <m:math>
                  <m:mrow>
                    <m:mi>A</m:mi>
                    <m:mrow>
                      <m:mo>(</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>1</m:mn>
                      </m:msub>
                      <m:mo>,</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>2</m:mn>
                      </m:msub>
                      <m:mo>)</m:mo>
                    </m:mrow>
                    <m:mo>≤</m:mo>
                    <m:mi>A</m:mi>
                    <m:mrow>
                      <m:mo>(</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>2</m:mn>
                      </m:msub>
                      <m:mo>,</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>1</m:mn>
                      </m:msub>
                      <m:mo>)</m:mo>
                    </m:mrow>
                  </m:mrow>
                </m:math>
              </equation>
            </item>
            <item id="uid59">
              <equation id="id2270699">
                <m:math>
                  <m:mrow>
                    <m:mi>A</m:mi>
                    <m:mrow>
                      <m:mo>(</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>2</m:mn>
                      </m:msub>
                      <m:mo>,</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>3</m:mn>
                      </m:msub>
                      <m:mo>)</m:mo>
                    </m:mrow>
                    <m:mo>≤</m:mo>
                    <m:mi>A</m:mi>
                    <m:mrow>
                      <m:mo>(</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>3</m:mn>
                      </m:msub>
                      <m:mo>,</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>2</m:mn>
                      </m:msub>
                      <m:mo>)</m:mo>
                    </m:mrow>
                  </m:mrow>
                </m:math>
              </equation>
            </item>
            <item id="uid60">
              <equation id="id2270766">
                <m:math>
                  <m:mrow>
                    <m:mi>A</m:mi>
                    <m:mrow>
                      <m:mo>(</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>1</m:mn>
                      </m:msub>
                      <m:mo>,</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>3</m:mn>
                      </m:msub>
                      <m:mo>)</m:mo>
                    </m:mrow>
                    <m:mo>≤</m:mo>
                    <m:mi>A</m:mi>
                    <m:mrow>
                      <m:mo>(</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>3</m:mn>
                      </m:msub>
                      <m:mo>,</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>1</m:mn>
                      </m:msub>
                      <m:mo>)</m:mo>
                    </m:mrow>
                  </m:mrow>
                </m:math>
              </equation>
            </item>
          </list>
          <para id="id2270830">The generalization of this property to more than two factors reveals that
an optimal ordering of <m:math><m:mrow><m:mo>{</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:mo>⋯</m:mo><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mrow><m:mi>L</m:mi><m:mo>-</m:mo><m:mi>i</m:mi></m:mrow></m:msub><m:mo>}</m:mo></m:mrow></m:math> is preserved in an optimal ordering
of <m:math><m:mrow><m:mo>{</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:mo>⋯</m:mo><m:msub><m:mi>n</m:mi><m:mi>L</m:mi></m:msub><m:mo>}</m:mo></m:mrow></m:math>. Therefore, if <m:math><m:mrow><m:mo>(</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:mo>⋯</m:mo><m:msub><m:mi>n</m:mi><m:mi>L</m:mi></m:msub><m:mo>)</m:mo></m:mrow></m:math> is an optimal ordering
of <m:math><m:mrow><m:mo>{</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:mo>⋯</m:mo><m:msub><m:mi>n</m:mi><m:mi>L</m:mi></m:msub><m:mo>}</m:mo></m:mrow></m:math>, then <m:math><m:mrow><m:mo>(</m:mo><m:msub><m:mi>n</m:mi><m:mi>k</m:mi></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mrow><m:mi>k</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:msub><m:mo>)</m:mo></m:mrow></m:math> is an optimal ordering of <m:math><m:mrow><m:mo>{</m:mo><m:msub><m:mi>n</m:mi><m:mi>k</m:mi></m:msub><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mrow><m:mi>k</m:mi><m:mo>+</m:mo><m:mn>1</m:mn></m:mrow></m:msub><m:mo>}</m:mo></m:mrow></m:math>
and consequently</para>
          <equation id="id2271042">
            <m:math mode="display">
              <m:mrow>
                <m:mfrac>
                  <m:mrow>
                    <m:mi>A</m:mi>
                    <m:mo>(</m:mo>
                    <m:msub>
                      <m:mi>n</m:mi>
                      <m:mi>k</m:mi>
                    </m:msub>
                    <m:mo>)</m:mo>
                  </m:mrow>
                  <m:mrow>
                    <m:mi>M</m:mi>
                    <m:mrow>
                      <m:mo>(</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mi>k</m:mi>
                      </m:msub>
                      <m:mo>)</m:mo>
                    </m:mrow>
                    <m:mo>-</m:mo>
                    <m:msub>
                      <m:mi>n</m:mi>
                      <m:mi>k</m:mi>
                    </m:msub>
                  </m:mrow>
                </m:mfrac>
                <m:mo>≤</m:mo>
                <m:mfrac>
                  <m:mrow>
                    <m:mi>A</m:mi>
                    <m:mo>(</m:mo>
                    <m:msub>
                      <m:mi>n</m:mi>
                      <m:mrow>
                        <m:mi>k</m:mi>
                        <m:mo>+</m:mo>
                        <m:mn>1</m:mn>
                      </m:mrow>
                    </m:msub>
                    <m:mo>)</m:mo>
                  </m:mrow>
                  <m:mrow>
                    <m:mi>M</m:mi>
                    <m:mrow>
                      <m:mo>(</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mrow>
                          <m:mi>k</m:mi>
                          <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>n</m:mi>
                      <m:mrow>
                        <m:mi>k</m:mi>
                        <m:mo>+</m:mo>
                        <m:mn>1</m:mn>
                      </m:mrow>
                    </m:msub>
                  </m:mrow>
                </m:mfrac>
              </m:mrow>
            </m:math>
          </equation>
          <para id="id2271156">for all <m:math><m:mrow><m:mi>k</m:mi><m:mo>=</m:mo><m:mn>1</m:mn><m:mo>,</m:mo><m:mn>2</m:mn><m:mo>,</m:mo><m:mo>⋯</m:mo><m:mo>,</m:mo><m:mi>L</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math>.</para>
          <para id="id2271193">This immediately suggests that an optimal ordering of <m:math><m:mrow><m:mo>{</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:mo>⋯</m:mo><m:msub><m:mi>n</m:mi><m:mi>L</m:mi></m:msub><m:mo>}</m:mo></m:mrow></m:math> is one
for which</para>
          <equation id="id2271229">
            <m:math mode="display">
              <m:mrow>
                <m:mfrac>
                  <m:mrow>
                    <m:mi>A</m:mi>
                    <m:mo>(</m:mo>
                    <m:msub>
                      <m:mi>n</m:mi>
                      <m:mn>1</m:mn>
                    </m:msub>
                    <m:mo>)</m:mo>
                  </m:mrow>
                  <m:mrow>
                    <m:mi>M</m:mi>
                    <m:mrow>
                      <m:mo>(</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mn>1</m:mn>
                      </m:msub>
                      <m:mo>)</m:mo>
                    </m:mrow>
                    <m:mo>-</m:mo>
                    <m:msub>
                      <m:mi>n</m:mi>
                      <m:mn>1</m:mn>
                    </m:msub>
                  </m:mrow>
                </m:mfrac>
                <m:mo>⋯</m:mo>
                <m:mfrac>
                  <m:mrow>
                    <m:mi>A</m:mi>
                    <m:mo>(</m:mo>
                    <m:msub>
                      <m:mi>n</m:mi>
                      <m:mi>L</m:mi>
                    </m:msub>
                    <m:mo>)</m:mo>
                  </m:mrow>
                  <m:mrow>
                    <m:mi>M</m:mi>
                    <m:mrow>
                      <m:mo>(</m:mo>
                      <m:msub>
                        <m:mi>n</m:mi>
                        <m:mi>L</m:mi>
                      </m:msub>
                      <m:mo>)</m:mo>
                    </m:mrow>
                    <m:mo>-</m:mo>
                    <m:msub>
                      <m:mi>n</m:mi>
                      <m:mi>L</m:mi>
                    </m:msub>
                  </m:mrow>
                </m:mfrac>
              </m:mrow>
            </m:math>
          </equation>
          <para id="id2271327">is nondecreasing. Hence, ordering the factors, <m:math><m:mrow><m:mo>{</m:mo><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:mo>⋯</m:mo><m:msub><m:mi>n</m:mi><m:mi>L</m:mi></m:msub><m:mo>}</m:mo></m:mrow></m:math>,
to minimize the number of additions incurred by <m:math><m:msub><m:mi>E</m:mi><m:mrow><m:msub><m:mi>n</m:mi><m:mn>1</m:mn></m:msub><m:mo>,</m:mo><m:mo>⋯</m:mo><m:mo>,</m:mo><m:msub><m:mi>n</m:mi><m:mi>L</m:mi></m:msub></m:mrow></m:msub></m:math>
simply involves computing the appropriate ratios.</para>
        </section>
      </section>
      <section id="uid61">
        <title>Discussion and Conclusion</title>
        <para id="id2271413">We have designed prime length FFTs up to length 53 that are as good
as the previous designs that only went up to 19. Table 1 gives the
operation counts for the new and previously designed modules,
assuming complex inputs.</para>
        <para id="id2271420">It is interesting to note that the operation counts depend on the
factorability of <m:math><m:mrow><m:mi>P</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math>. The primes 11, 23, and 47 are all of the
form <m:math><m:mrow><m:mn>1</m:mn><m:mo>+</m:mo><m:mn>2</m:mn><m:msub><m:mi>P</m:mi><m:mn>1</m:mn></m:msub></m:mrow></m:math> making the design of efficient FFTs for these lengths
more difficult.</para>
        <para id="id2271463">Further deviations from the original Winograd approach than we have
made could prove useful for longer lengths. We investigated, for example,
the use of twiddle factors at appropriate points in the decomposition
stage; these can sometimes be used to divide the cyclic convolution
into smaller convolutions. Their use means, however, that the 'center*
multiplications would no longer be by purely real or imaginary numbers.</para>
        <table id="uid62" summary="">
          <tgroup cols="3">
            <tbody>
              <row>
                <entry>N</entry>
                <entry>Mult</entry>
                <entry>Adds</entry>
              </row>
              <row>
                <entry>7</entry>
                <entry>16</entry>
                <entry>72</entry>
              </row>
              <row>
                <entry>11</entry>
                <entry>40</entry>
                <entry>168</entry>
              </row>
              <row>
                <entry>13</entry>
                <entry>40</entry>
                <entry>188</entry>
              </row>
              <row>
                <entry>17</entry>
                <entry>82</entry>
                <entry>274</entry>
              </row>
              <row>
                <entry>19</entry>
                <entry>88</entry>
                <entry>360</entry>
              </row>
              <row>
                <entry>23</entry>
                <entry>174</entry>
                <entry>672</entry>
              </row>
              <row>
                <entry>29</entry>
                <entry>190</entry>
                <entry>766</entry>
              </row>
              <row>
                <entry>31</entry>
                <entry>160</entry>
                <entry>984</entry>
              </row>
              <row>
                <entry>37</entry>
                <entry>220</entry>
                <entry>920</entry>
              </row>
              <row>
                <entry>41</entry>
                <entry>282</entry>
                <entry>1140</entry>
              </row>
              <row>
                <entry>43</entry>
                <entry>304</entry>
                <entry>1416</entry>
              </row>
              <row>
                <entry>47</entry>
                <entry>640</entry>
                <entry>2088</entry>
              </row>
              <row>
                <entry>53</entry>
                <entry>556</entry>
                <entry>2038</entry>
              </row>
            </tbody>
          </tgroup>
          <caption>Operation counts for prime length DFTs</caption>
        </table>
        <para id="id2271739">The approach in writing a program that writes another program is a valuable
one for several reasons. Programming the design process for the design of
prime length FFTs has the advantages of being practical, error-free, and
flexible. The flexibility is important because it allows for modification
and experimentation with different algorithmic ideas. Above all, it has
allowed longer DFTs to be reliably designed.</para><para id="element-166">More details on the generation of programs for prime length FFTs can be found in the 1993 Technical Report.</para>
      </section>
    </section>
  </content>
  <bib:file>
    <bib:entry id="bid12">
      <bib:article>
<!--required fields-->
        <bib:author>Agarwal, R. C. and Cooley, J. W.</bib:author>
        <bib:title>New Algorithms for Digital Convolution</bib:title>
        <bib:journal>IEEE Trans. on ASSP</bib:journal>
        <bib:year>1977</bib:year>
<!--optional fields-->
        <bib:volume>25</bib:volume>
        <bib:number>2</bib:number>
        <bib:pages>392–410</bib:pages>
        <bib:month>October</bib:month>
        <bib:note/>
      </bib:article>
    </bib:entry>
    <bib:entry id="bid1">
      <bib:book>
<!--required fields-->
        <bib:author>Blahut, Richard E.</bib:author>
        <bib:title>Fast Algorithms for Digital Signal Processing</bib:title>
        <bib:publisher>Addison-Wesley</bib:publisher>
        <bib:year>1985</bib:year>
<!--optional fields-->
        <bib:volume/>
        <bib:series/>
        <bib:address>Reading, Mass.</bib:address>
        <bib:edition/>
        <bib:month/>
        <bib:note/>
      </bib:book>
    </bib:entry>
    <bib:entry id="bid11">
      <bib:book>
<!--required fields-->
        <bib:author>Burrus, C. S. and Parks, T. W.</bib:author>
        <bib:title>DFT/FFT and Convolution Algorithms</bib:title>
        <bib:publisher>John Wiley &amp; Sons</bib:publisher>
        <bib:year>1985</bib:year>
<!--optional fields-->
        <bib:volume/>
        <bib:series/>
        <bib:address>New York</bib:address>
        <bib:edition/>
        <bib:month/>
        <bib:note/>
      </bib:book>
    </bib:entry>
    <bib:entry id="bid17">
      <bib:article>
<!--required fields-->
        <bib:author>Duhamel, P. and Hollmann, H.</bib:author>
        <bib:title>Split Radix FFT Algorithm</bib:title>
        <bib:journal>Electronic Letters</bib:journal>
        <bib:year>1984</bib:year>
<!--optional fields-->
        <bib:volume>20</bib:volume>
        <bib:number>1</bib:number>
        <bib:pages>14–16</bib:pages>
        <bib:month>January 5</bib:month>
        <bib:note/>
      </bib:article>
    </bib:entry>
    <bib:entry id="bid8">
      <bib:article>
<!--required fields-->
        <bib:author>Duhamel, P.</bib:author>
        <bib:title>Implementation of `Split-Radix' FFT Algorithms for Complex, Real, and Real-Symmetric Data</bib:title>
        <bib:journal>IEEE Trans. on ASSP</bib:journal>
        <bib:year>1986</bib:year>
<!--optional fields-->
        <bib:volume>34</bib:volume>
        <bib:number/>
        <bib:pages>285–295</bib:pages>
        <bib:month>April</bib:month>
        <bib:note>A shorter version appeared in the ICASSP-85 Proceedings, p. 20.6, March 1985</bib:note>
      </bib:article>
    </bib:entry>
    <bib:entry id="bid15">
      <bib:article>
<!--required fields-->
        <bib:author>Heideman, M. T. and Burrus, C. S.</bib:author>
        <bib:title>On the Number of Multiplications Necessary to Compute a Length-<!--Math is not currently allowed within BibTeXML.--> DFT</bib:title>
        <bib:journal>IEEE Transactions on Acoustics, Speech, and Signal Processing</bib:journal>
        <bib:year>1986</bib:year>
<!--optional fields-->
        <bib:volume>34</bib:volume>
        <bib:number>1</bib:number>
        <bib:pages>91–95</bib:pages>
        <bib:month>February</bib:month>
        <bib:note/>
      </bib:article>
    </bib:entry>
    <bib:entry id="bid9">
      <bib:inproceedings>
<!--required fields-->
        <bib:author>Heideman, M. T. and Johnson, H. W. and Burrus, C. S.</bib:author>
        <bib:title>Prime Factor FFT Algorithms for Real–Valued Series</bib:title>
        <bib:booktitle>Proceedings of the IEEE International Conference on Acoustics, Speech, and Signal Processing</bib:booktitle>
        <bib:year>1984</bib:year>
<!--optional fields-->
        <bib:editor/>
        <bib:number/>
        <bib:series/>
        <bib:pages>28A.7.1–4</bib:pages>
        <bib:address>San Diego, CA</bib:address>
        <bib:month>March</bib:month>
        <bib:organization/>
        <bib:publisher/>
        <bib:note/>
      </bib:inproceedings>
    </bib:entry>
    <bib:entry id="bid16">
      <bib:techreport>
<!--required fields-->
        <bib:author>Johnson, H. W. and Burrus, C. S.</bib:author>
        <bib:title>Large DFT Modules: N = 11, 13, 17, 19, and 25</bib:title>
        <bib:institution>Department of Electrical Engineering, Rice University, Houston, TX 77251–1892</bib:institution>
        <bib:year>1981</bib:year>
<!--optional fields-->
        <bib:type>Technical report</bib:type>
        <bib:number>8105</bib:number>
        <bib:address/>
        <bib:month/>
        <bib:note/>
      </bib:techreport>
    </bib:entry>
    <bib:entry id="bid6">
      <bib:article>
<!--required fields-->
        <bib:author>Johnson, Howard W. and Burrus, C. S.</bib:author>
        <bib:title>On the Structure of Efficient DFT Algorithms</bib:title>
        <bib:journal>IEEE Transactions on Acoustics, Speech, and Signal Processing</bib:journal>
        <bib:year>1985</bib:year>
<!--optional fields-->
        <bib:volume>33</bib:volume>
        <bib:number>1</bib:number>
        <bib:pages>248–254</bib:pages>
        <bib:month>February</bib:month>
        <bib:note/>
      </bib:article>
    </bib:entry>
    <bib:entry id="bid7">
      <bib:article>
<!--required fields-->
        <bib:author>Kolba, D. P. and Parks, T. W.</bib:author>
        <bib:title>A Prime Factor FFT Algorithm Using High Speed Convolution</bib:title>
        <bib:journal>IEEE Trans. on ASSP</bib:journal>
        <bib:year>1977</bib:year>
<!--optional fields-->
        <bib:volume>25</bib:volume>
        <bib:number/>
        <bib:pages>281–294</bib:pages>
        <bib:month>August</bib:month>
        <bib:note>also in </bib:note>
      </bib:article>
    </bib:entry>
    <bib:entry id="bid23">
      <bib:book>
<!--required fields-->
        <bib:author>Lim, J. S. and Oppenheim, A. V.</bib:author>
        <bib:title>Advanced Topics in Signal Processing</bib:title>
        <bib:publisher>Prentice-Hall</bib:publisher>
        <bib:year>1988</bib:year>
<!--optional fields-->
        <bib:volume/>
        <bib:series/>
        <bib:address>Englewood Cliffs, NJ</bib:address>
        <bib:edition/>
        <bib:month/>
        <bib:note/>
      </bib:book>
    </bib:entry>
    <bib:entry id="bid2">
      <bib:book>
<!--required fields-->
        <bib:author>McClellan, J. H. and Rader, C. M.</bib:author>
        <bib:title>Number Theory in Digital Signal Processing</bib:title>
        <bib:publisher>Prentice-Hall</bib:publisher>
        <bib:year>1979</bib:year>
<!--optional fields-->
        <bib:volume/>
        <bib:series/>
        <bib:address>Englewood Cliffs, NJ</bib:address>
        <bib:edition/>
        <bib:month/>
        <bib:note/>
      </bib:book>
    </bib:entry>
    <bib:entry id="bid22">
      <bib:book>
<!--required fields-->
        <bib:author>Myers, Douglas G.</bib:author>
        <bib:title>Digital Signal Processing, Efficient Convolution and Fourier Transform Techniques</bib:title>
        <bib:publisher>Prentice-Hall</bib:publisher>
        <bib:year>1990</bib:year>
<!--optional fields-->
        <bib:volume/>
        <bib:series/>
        <bib:address>Sydney, Australia</bib:address>
        <bib:edition/>
        <bib:month/>
        <bib:note/>
      </bib:book>
    </bib:entry>
    <bib:entry id="bid3">
      <bib:book>
<!--required fields-->
        <bib:author>Nussbaumer, H. J.</bib:author>
        <bib:title>Fast Fourier Transform and Convolution Algorithms</bib:title>
        <bib:publisher>Springer-Verlag</bib:publisher>
        <bib:year>1981, 1982</bib:year>
<!--optional fields-->
        <bib:volume/>
        <bib:series/>
        <bib:address>Heidelberg, Germany</bib:address>
        <bib:edition>Second</bib:edition>
        <bib:month/>
        <bib:note/>
      </bib:book>
    </bib:entry>
    <bib:entry id="bid18">
      <bib:inproceedings>
<!--required fields-->
        <bib:author>Selesnick, I. W. and Burrus, C. S.</bib:author>
        <bib:title>Automating the Design of Prime Length FFT Programs</bib:title>
        <bib:booktitle>Proceedings of the IEEE International Symposium on Circuits and Systems</bib:booktitle>
        <bib:year>1992</bib:year>
<!--optional fields-->
        <bib:editor/>
        <bib:volume>1</bib:volume>
        <bib:series/>
        <bib:pages>133–136</bib:pages>
        <bib:address>ISCAS-92, San Diego, CA</bib:address>
        <bib:month>May</bib:month>
        <bib:organization/>
        <bib:publisher/>
        <bib:note/>
      </bib:inproceedings>
    </bib:entry>
    <bib:entry id="bid20">
      <bib:inproceedings>
<!--required fields-->
        <bib:author>Selesnick, I. W. and Burrus, C. S.</bib:author>
        <bib:title>Multidimensional Mapping Techniques for Convolution</bib:title>
        <bib:booktitle>Proceedings of the IEEE International Conference on Signal Processing</bib:booktitle>
        <bib:year>1993</bib:year>
<!--optional fields-->
        <bib:editor/>
        <bib:volume>III</bib:volume>
        <bib:series/>
        <bib:pages>III-288–291</bib:pages>
        <bib:address>IEEE ICASSP-93, Minneapolis</bib:address>
        <bib:month>April</bib:month>
        <bib:organization/>
        <bib:publisher/>
        <bib:note/>
      </bib:inproceedings>
    </bib:entry>
    <bib:entry id="bid21">
      <bib:inproceedings>
<!--required fields-->
        <bib:author>Selesnick, I. W. and Burrus, C. S.</bib:author>
        <bib:title>Extending Winograd's Small Convolution Algorithm to Longer Lengths</bib:title>
        <bib:booktitle>Proceedings of the IEEE International Symposium on Circuits and Systems</bib:booktitle>
        <bib:year>1994</bib:year>
<!--optional fields-->
        <bib:editor/>
        <bib:volume>2</bib:volume>
        <bib:series/>
        <bib:pages>2.449–452</bib:pages>
        <bib:address>IEEE ISCAS-94, London</bib:address>
        <bib:month>June 30</bib:month>
        <bib:organization/>
        <bib:publisher/>
        <bib:note/>
      </bib:inproceedings>
    </bib:entry>
    <bib:entry id="bid19">
      <bib:article>
<!--required fields-->
        <bib:author>Selesnick, Ivan W. and Burrus, C. Sidney</bib:author>
        <bib:title>Automatic Generation of Prime Length FFT Programs</bib:title>
        <bib:journal>IEEE Transactions on Signal Processing</bib:journal>
        <bib:year>1996</bib:year>
<!--optional fields-->
        <bib:volume>44</bib:volume>
        <bib:number>1</bib:number>
        <bib:pages>14–24</bib:pages>
        <bib:month>January</bib:month>
        <bib:note/>
      </bib:article>
    </bib:entry>
    <bib:entry id="bid10">
      <bib:article>
<!--required fields-->
        <bib:author>Sorensen, H. V. and Jones, D. L. and Heideman, M. T. and Burrus, C. S.</bib:author>
        <bib:title>Real Valued Fast Fourier Transform Algorithms</bib:title>
        <bib:journal>IEEE Transactions on Acoustics, Speech, and Signal Processing</bib:journal>
        <bib:year>1987</bib:year>
<!--optional fields-->
        <bib:volume>35</bib:volume>
        <bib:number>6</bib:number>
        <bib:pages>849–863</bib:pages>
        <bib:month>June</bib:month>
        <bib:note/>
      </bib:article>
    </bib:entry>
    <bib:entry id="bid0">
      <bib:article>
<!--required fields-->
        <bib:author>Winograd, S.</bib:author>
        <bib:title>On Computing the Discrete Fourier Transform</bib:title>
        <bib:journal>Proc. National Academy of Sciences, USA</bib:journal>
        <bib:year>1976</bib:year>
<!--optional fields-->
        <bib:volume>73</bib:volume>
        <bib:number/>
        <bib:pages>1006–1006</bib:pages>
        <bib:month>April</bib:month>
        <bib:note/>
      </bib:article>
    </bib:entry>
    <bib:entry id="bid5">
      <bib:article>
<!--required fields-->
        <bib:author>Winograd, S.</bib:author>
        <bib:title>On Computing the Discrete Fourier Transform</bib:title>
        <bib:journal>Mathematics of Computation</bib:journal>
        <bib:year>1978</bib:year>
<!--optional fields-->
        <bib:volume>32</bib:volume>
        <bib:number/>
        <bib:pages>175–199</bib:pages>
        <bib:month>January</bib:month>
        <bib:note/>
      </bib:article>
    </bib:entry>
    <bib:entry id="bid13">
      <bib:article>
<!--required fields-->
        <bib:author>Winograd, S.</bib:author>
        <bib:title>On the Multiplicative Complexity of the Discrete Fourier Transform</bib:title>
        <bib:journal>Advances in Mathematics</bib:journal>
        <bib:year>1979</bib:year>
<!--optional fields-->
        <bib:volume>32</bib:volume>
        <bib:number>2</bib:number>
        <bib:pages>83–117</bib:pages>
        <bib:month>May</bib:month>
        <bib:note>also in </bib:note>
      </bib:article>
    </bib:entry>
    <bib:entry id="bid4">
      <bib:book>
<!--required fields-->
        <bib:author>Winograd, S.</bib:author>
        <bib:title>Arithmetic Complexity of Computation</bib:title>
        <bib:publisher>SIAM</bib:publisher>
        <bib:year>1980</bib:year>
<!--optional fields-->
        <bib:volume/>
        <bib:series>SIAM CBMS-NSF Series, No. 33</bib:series>
        <bib:address>Philadelphia</bib:address>
        <bib:edition/>
        <bib:month/>
        <bib:note/>
      </bib:book>
    </bib:entry>
    <bib:entry id="bid14">
      <bib:inproceedings>
<!--required fields-->
        <bib:author>Winograd, S.</bib:author>
        <bib:title>Signal Processing and Complexity of Computation</bib:title>
        <bib:booktitle>Proceedings of the IEEE International Conference on Acoustics, Speech, and Signal Processing</bib:booktitle>
        <bib:year>1980</bib:year>
<!--optional fields-->
        <bib:editor/>
        <bib:number/>
        <bib:series/>
        <bib:pages>1381–1384</bib:pages>
        <bib:address>ICASSP-80, Denver</bib:address>
        <bib:month>April</bib:month>
        <bib:organization/>
        <bib:publisher/>
        <bib:note/>
      </bib:inproceedings>
    </bib:entry>
  </bib:file>
</document>
