<TeXmacs|1.0.4>

<style|book>

<\body>
  <surround|<assign|comment|<macro|1|>><assign|edit|<macro|1|<with|font-series|bold|[[Todo:
  <arg|1>]]>>><assign|examplesession|<macro|1|>><assign|gzero|<macro|\<Gamma\><rsub|0>(N)>><assign|esM|<macro|<overline|<sM>>>><assign|sM|<macro|<with|math-font|Bbb|M>>><assign|sS|<macro|<with|math-font|Bbb|S>>><assign|sB|<macro|<with|math-font|Bbb|B>>><assign|eE|<macro|<with|math-font-family|bf|E>>><assign|Adual|<macro|A<rsup|\<vee\>>>><assign|Bdual|<macro|B<rsup|\<vee\>>>><assign|defn|<macro|1|<with|font-shape|italic|<index*|<arg|1>>>>><assign|solution|<macro|1|<vspace|1em><vspace|1fn><no-indent><with|font-series|bold|Solution
  <arg|1>.> >><assign|todo|<macro|1|<no-indent><with|mode|math|\<bullet\>>
  <with|font-size|0.84|font-family|ss|<arg|1>>
  <with|mode|math|\<bullet\>><next-line>>><assign|done|<macro|1|<no-indent><with|font-size|0.84|font-family|ss|Done:
  <arg|1>><next-line>>><assign|danger|<macro|1|<marginpar|<with|font-size|0.84|font-shape|slanted|<arg|1>>>>><assign|div|<macro|<with|mode|text|font-family|rm|div>>><assign|unity|<macro|<with|math-font-family|bf|1>>><assign|an|<macro|<with|font-family|rm|an>>><assign|dz|<macro|dz>><assign|Re|<macro|<with|mode|text|font-family|rm|Re>>><assign|pfSel|<macro|<wide|<Sel>|^>>><assign|qe|<macro|<above|=|<with|mode|text|font-size|0.59|?>>>><assign|isog|<macro|\<simeq\>>><assign|e|<macro|<with|math-font-family|bf|e>>><assign|bN|<macro|<with|math-font-family|bf|N>>><assign|textcyr|<macro|1|<fontencoding|OT2><fontfamily|wncyr><fontseries|m><fontshape|n><selectfont>
  <arg|1>>><assign|Sha|<macro|<with|mode|text|<textcyr|Sh>>>><assign|set|<macro|\<leftarrow\>>><assign|Shaan|<macro|<Sha><rsub|<with|mode|text|font-size|0.59|font-family|rm|an>>>><assign|TS|<macro|Shafarevich-Tate
  group>><assign|Gam|<macro|\<Gamma\>>><assign|Im|<macro|<with|mode|text|Im>>><assign|X|<macro|<with|math-font|cal|X>>><assign|cH|<macro|<with|math-font|cal|H>>><assign|cA|<macro|<with|math-font|cal|A>>><assign|cF|<macro|<with|math-font|cal|F>>><assign|cG|<macro|<with|math-font|cal|G>>><assign|cJ|<macro|<with|math-font|cal|J>>><assign|cL|<macro|<with|math-font|cal|L>>><assign|cV|<macro|<with|math-font|cal|V>>><assign|cO|<macro|<with|math-font|cal|O>>><assign|cQ|<macro|<with|math-font|cal|Q>>><assign|cX|<macro|<with|math-font|cal|X>>><assign|ds|<macro|>><assign|M|<macro|<with|math-font|cal|M>>><assign|B|<macro|<with|math-font|cal|B>>><assign|E|<macro|<with|math-font|cal|E>>><assign|L|<macro|<with|math-font|cal|L>>><assign|J|<macro|<with|math-font|cal|J>>><assign|dw|<macro|\<delta\>(w)>><assign|dwh|<macro|<wide|\<delta\>(w)|^>>><assign|dlwh|<macro|<wide|\<delta\><rsub|<l>>(w)|^>>><assign|dash|<macro|-<space|-0.25spc><space|-0.25spc><space|-0.25spc><space|-0.25spc>-<space|-0.25spc><space|-0.25spc><space|-0.25spc><space|-0.25spc>-<space|-0.25spc><space|-0.25spc><space|-0.25spc><space|-0.25spc>->><assign|Frobl|<macro|<Frob><rsub|\<ell\>>>><assign|tE|<macro|<wide|E|~>>><assign|l|<macro|\<ell\>>><assign|t|<macro|\<tau\>>><assign|N|<macro|<with|math-font|cal|N>>><assign|U|<macro|<with|math-font|cal|U>>><assign|Kbar|<macro|<overline|K>>><assign|Lbar|<macro|<overline|L>>><assign|gammabar|<macro|<overline|\<gamma\>>>><assign|q|<macro|<with|math-font-family|bf|q>>><assign|star|<macro|\<times\>>><assign|gM|<macro|<with|math-font|Euler|M>>><assign|gA|<macro|<with|math-font|Euler|A>>><assign|gP|<macro|<with|math-font|Euler|P>>><assign|bmu|<macro|<boldsymbol|\<mu\>>>><assign|union|<macro|\<cup\>>><assign|Tl|<macro|T<rsub|\<ell\>>>><assign|into|<macro|\<rightarrow\>>><assign|onto|<macro|\<rightarrow\><space|-0.25spc><space|-0.25spc><space|-0.25spc><space|-0.25spc>\<rightarrow\>>><assign|intersect|<macro|\<cap\>>><assign|meet|<macro|\<cap\>>><assign|cross|<macro|\<times\>>><assign|rb|<macro|<overline|\<rho\>>>><assign|ra|<macro|\<rightarrow\>>><assign|xra|<macro|1|<xrightarrow|<arg|1>>>><assign|hra|<macro|\<hookrightarrow\>>><assign|kr|<macro|1|2|<left|(><frac|<arg|1>|<arg|2>><right|)>>><assign|la|<macro|\<leftarrow\>>><assign|lra|<macro|\<longrightarrow\>>><assign|riso|<macro|<xrightarrow|\<sim\>>>><assign|da|<macro|\<downarrow\>>><assign|ua|<macro|\<uparrow\>>><assign|con|<macro|\<equiv\>>><assign|Gm|<macro|<with|math-font|Bbb|G><rsub|m>>><assign|pni|<macro|<vspace|1fn><no-indent>>><assign|iv|<macro|<rsup|-1>>><assign|alp|<macro|\<alpha\>>><assign|bq|<macro|<with|math-font-family|bf|q>>><assign|cpp|<macro|<with|font-family|tt|C++>>><assign|tensor|<macro|\<otimes\>>><assign|bg|<macro|<with|font-family|tt|BruceGenus>>><assign|abcd|<macro|1|2|3|4|<left|(>
  <smallmatrix|<tformat|<table|<row|<cell|<arg|1>>|<cell|<arg|2>>>|<row|<cell|<arg|3>>|<cell|<arg|4>>>>>><right|)>>><assign|mthree|<macro|1|2|3|4|5|6|7|8|9|<left|(>
  <tabular*|<tformat|<table|<row|<cell|<arg|1>>|<cell|<arg|2>>|<cell|<arg|3>>>|<row|<cell|<arg|4>>|<cell|<arg|5>>|<cell|<arg|6>>>|<row|<cell|<arg|7>>|<cell|<arg|8>>|<cell|<arg|9>
  >>>>><right|)>>><assign|mtwo|<macro|1|2|3|4|<left|(>
  <tabular*|<tformat|<table|<row|<cell|<arg|1>>|<cell|<arg|2>>>|<row|<cell|<arg|3>>|<cell|<arg|4>
  >>>>><right|)>>><assign|vtwo|<macro|1|2|<left|(>
  <tabular*|<tformat|<table|<row|<cell|<arg|1>>>|<row|<cell|<arg|2>
  >>>>><right|)>>><assign|smallmtwo|<macro|1|2|3|4|<left|(>
  <smallmatrix|<tformat|<table|<row|<cell|<arg|1>>|<cell|<arg|2>>>|<row|<cell|<arg|3>>|<cell|<arg|4>
  >>>>><right|)>>><assign|twopii|<macro|2\<pi\>i>><assign|eps|<macro|\<varepsilon\>>><assign|vphi|<macro|\<varphi\>>><assign|gp|<macro|<with|math-font|Euler|p>>><assign|W|<macro|<with|math-font|cal|W>>><assign|oz|<macro|<overline|z>>><assign|Zpstar|<macro|<Zp><rsup|\<star\>>>><assign|Zhat|<macro|<wide|<Z>|^>>><assign|Zbar|<macro|<overline|<Z>>>><assign|Zl|<macro|<Z><rsub|\<ell\>>>><assign|Q|<macro|<with|math-font|Bbb|Q>>><assign|GQ|<macro|G<rsub|<Q>>>><assign|R|<macro|<with|math-font|Bbb|R>>><assign|D|<macro|<with|math-font-family|bf|D>>><assign|cC|<macro|<with|math-font|cal|C>>><assign|cD|<macro|<with|math-font|cal|D>>><assign|cP|<macro|<with|math-font|cal|P>>><assign|cS|<macro|<with|math-font|cal|S>>><assign|Sbar|<macro|<overline|S>>><assign|K|<macro|<with|math-font-family|bf|K>>><assign|C|<macro|<with|math-font|Bbb|C>>><assign|Cp|<macro|<with|math-font-family|bf|C><rsub|p>>><assign|Sets|<macro|<with|mode|text|font-family|rm|font-series|bold|Sets>>><assign|bcC|<macro|<boldsymbol|<with|math-font|cal|C>>>><assign|P|<macro|<with|math-font|Bbb|P>>><assign|Qbar|<macro|<overline|<Q>>>><assign|kbar|<macro|<overline|k>>><assign|dual|<macro|\<bot\>>><assign|T|<macro|<with|math-font|Bbb|T>>><assign|calT|<macro|<with|math-font|cal|T>>><assign|cT|<macro|<with|math-font|cal|T>>><assign|cbT|<macro|<with|math-font-family|bf|math-font|cal|T>>><assign|cU|<macro|<with|math-font|cal|U>>><assign|Z|<macro|<with|math-font|Bbb|Z>>><assign|F|<macro|<with|math-font|Bbb|F>>><assign|Fl|<macro|<F><rsub|\<ell\>>>><assign|Fell|<macro|<Fl>>><assign|Flbar|<macro|<overline|<F>><rsub|\<ell\>>>><assign|Flnu|<macro|<F><rsub|\<ell\><rsup|\<nu\>>>>><assign|Fbar|<macro|<overline|<F>>>><assign|Fpbar|<macro|<overline|<F>><rsub|p>>><assign|fbar|<macro|<overline|f>>><assign|Qp|<macro|<Q><rsub|p>>><assign|Ql|<macro|<Q><rsub|\<ell\>>>><assign|Qell|<macro|<Q><rsub|\<ell\>>>><assign|Qlbar|<macro|<overline|<Q>><rsub|\<ell\>>>><assign|Qlnr|<macro|<Q><rsub|\<ell\>><rsup|<with|mode|text|nr>>>><assign|Qlur|<macro|<Q><rsub|\<ell\>><rsup|<with|mode|text|ur>>>><assign|Qltm|<macro|<Q><rsub|\<ell\>><rsup|<with|mode|text|tame>>>><assign|Qv|<macro|<Q><rsub|v>>><assign|Qpbar|<macro|<Qbar><rsub|p>>><assign|Zp|<macro|<Z><rsub|p>>><assign|Fp|<macro|<F><rsub|p>>><assign|Fq|<macro|<F><rsub|q>>><assign|Fqbar|<macro|<overline|<F>><rsub|q>>><assign|Ad|<macro|Ad>><assign|adz|<macro|<Ad><rsup|0>>><assign|O|<macro|<with|math-font|cal|O>>><assign|A|<macro|<with|math-font|cal|A>>><assign|Og|<macro|O<rsub|\<gamma\>>>><assign|isom|<macro|\<cong\>>><assign|ncisom|<macro|\<approx\>>><assign|galq|<macro|<Gal>(<Qbar>/<Q>)>><assign|rhobar|<macro|<overline|\<rho\>>>><assign|cM|<macro|<with|math-font|cal|M>>><assign|cB|<macro|<with|math-font|cal|B>>><assign|cE|<macro|<with|math-font|cal|E>>><assign|cR|<macro|<with|math-font|cal|R>>><assign|et|<macro|<with|mode|text|font-family|rm|ét>>><assign|sltwoz|<macro|<SL><rsub|2>(<Z>)>><assign|sltwo|<macro|<SL><rsub|2>>><assign|gltwoz|<macro|<GL><rsub|2>(<Z>)>><assign|mtwoz|<macro|M<rsub|2>(<Z>)>><assign|gltwoq|<macro|<GL><rsub|2>(<Q>)>><assign|gltwo|<macro|<GL><rsub|2>>><assign|gln|<macro|<GL><rsub|n>>><assign|psltwoz|<macro|<PSL><rsub|2>(<Z>)>><assign|psltwo|<macro|<PSL><rsub|2>>><assign|h|<macro|<with|math-font|Euler|h>>><assign|a|<macro|<with|math-font|Euler|a>>><assign|p|<macro|<with|math-font|Euler|p>>><assign|m|<macro|<with|math-font|Euler|m>>><assign|trho|<macro|<wide|\<rho\>|~>>><assign|rhol|<macro|\<rho\><rsub|\<ell\>>>><assign|rhoss|<macro|\<rho\><rsup|<with|mode|text|ss>>>><assign|dbd|<macro|1|\<langle\>
  <arg|1> \<rangle\>>><assign|H|<macro|<HH>>><assign|smallzero|<macro|<left|(><smallmatrix|<tformat|<table|<row|<cell|0>|<cell|0>>|<row|<cell|0>|<cell|0
  >>>>><right|)>>><assign|smallone|<macro|<left|(><smallmatrix|<tformat|<table|<row|<cell|1>|<cell|0>>|<row|<cell|0>|<cell|1
  >>>>><right|)>>><assign|pari|<macro|<with|font-shape|small-caps|Pari><index|Pari>>><assign|python|<macro|<with|font-shape|small-caps|Python><index|Python>>><assign|magma|<macro|<with|font-shape|small-caps|Magma><index|Magma>>><assign|manin|<macro|<with|font-shape|small-caps|Manin><index|Manin>>><assign|zbar|<macro|<overline|z>>><assign|dzbar|<macro|d<overline|z>>><assign|exref|<macro|1|2|Exercise
  <reference|1>.<reference|2>>><assign|hd|<macro|1|<vspace|1ex><no-indent><with|font-series|bold|<arg|1>>
  >><assign|nf|<macro|1|<underline|<arg|1>>>><assign|cbar|<macro|<overline|c>>>
  ||<\make-title>
    <title|Algorithms For Computing With Modular Forms>

    <author|William Stein>

    <address|>

    <title-date|<date|>>
  </make-title>>

  <htab|1fn>

  <\center>
    Copyright (c) 2004 William Stein<next-line>
  </center>

  The author grants permission to copy, distribute and/or modify this
  document under the terms of the GNU Free Documentation License, Version 1.2
  or any later version published by the Free Software Foundation; with no
  Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy
  of the license is included in the Appendix.

  <htab|1fn>

  <tableofcontents>

  <\table-of-contents|toc>
    \;
  </table-of-contents>

  <chapter*|Preface> <addcontentsline|toc|chapter|<numberline|>Preface>

  This is a book about algorithms for computing with modular forms. I am
  writing it for a Fall 2004 graduate course at Harvard University. This book
  is meant to answer the question ``How do <with|font-shape|italic|you>
  compute spaces <with|mode|math|M<rsub|k>(N,<eps>)> of modular forms'',
  which theoretical mathematicians often ask me, and to provide a rigorous
  foundation for the specific algorithms I use, some of which have until now
  never been formally stated or proven to be correct, except in my head while
  I typed them into a computer language.

  I have spent several years trying to find the best ways to compute with
  classical modular forms for congruence subgroups of
  <with|mode|math|<SL><rsub|2>(<Z>)>, and have implemented most of these
  algorithms several times, first in C++ <cite|stein:hecke>, then in MAGMA
  <cite|magma>, and most recently in Python/C++ (see Chapter
  <reference|ch:manin>). Much of this work has involved turning formulas and
  constructions burried in books and papers into precise computable recipes,
  then testing these in many cases and eliminating subtle inaccuracies
  (published theorems often contain very small mistakes that are greatly
  magnified when implemented and run on a computer). The goal of this book is
  to explain what I have learned along the way, and also describe unsolved
  problems whose solution would move the theory forward.

  The author is aware of no other books on computing with modular forms, the
  closest work being Cremona's book <cite|cremona:algs>, which is about
  computing with elliptic curves, and Cohen's book <cite|cohen:course> about
  algebraic number theory. This field is not mature, and there are some
  missing details and potential improvements to many of the algorithms, which
  you the reader might fill in, and which would be greatly appreciated by
  other mathematicians. Also, it seems that nobody has tried to analyze the
  formal complexity of any of the algorithms in this book (the author intends
  to do this as he writes the book) again this is somewhere you might
  contribute.

  This book focuses on how best to compute the spaces
  <with|mode|math|M<rsub|k>(N,<eps>)> of modular forms, where
  <with|mode|math|k\<geq\>2> is an integer and <with|mode|math|<eps>> is a
  Dirichlet character modulo <with|mode|math|N>. I will spend the most effort
  explaining the algorithms that appear so far to be the best for such
  computations. I will not discuss computing half-integral weight forms,
  weight one forms, forms for non-congruence subgroups or groups other than
  <with|mode|math|<GL><rsub|2>>, Hilbert and Siegel modular forms, trace
  formulas, or <with|mode|math|p>-adic modular forms. I will also write very
  little about computing with modular abelian varieties. These are topics for
  another book or two.

  The reader is not assumed to have prior exposure to modular forms, but
  should have a firm grasp of abstract algebra, and be familiar with
  algebraic number theory, geometry of curves, algebraic topology of Riemann
  surfaces, and complex analysis. For Chapter <reference|ch:manin>, the
  reader should be familiar with the Python <cite|python> programming
  language.

  The text of this book is licensed under the GNU Free Documentation License,
  Version 1.2, November 2002. This means that you may freely copy this book.
  For the precise details, see the Appendix.

  <vspace|2ex><no-indent><with|font-series|bold|Acknowledgement.> Kevin
  Buzzard made many helpful remarks which were helpful in finding the
  algorithms in Chapter <reference|ch:dirichlet>. <with|font-series|bold|Noam
  Elkies:> Remarks throughout chapters 1 and 2. The students in Math 257.

  <\itemize>
    <item>Abhinav Kumar (abhinav@math.harvard.edu): Discussions about
    computing width of cusp.

    <item>Thomas James Barnet-Lamb (tbl@math.harvard.edu): About how to
    represent Dirichlet characters in the computer.

    <item>Tseno V. Tselkov (tselkov@fas.harvard.edu)

    <item>Jennifer Balakrishnan (jbalakr@fas.harvard.edu)

    <item>Jesse Kass (kass@math.harvard.edu)
  </itemize>

  <chapter|Modular Forms of Level One><label|ch:levelone>This chapter follows
  parts of <cite|serre:arithmetic> (Ch. VII) closely, though we adjust the
  notation, definitions, and order of presentation to be more in line with
  what we will do in the rest of the book. Note that Serre writes
  <with|mode|math|2k> everywhere instead of <with|mode|math|k>, which may
  seem like a good idea if one is only interested in modular forms of level
  <with|mode|math|1>, since there are no nonzero level <with|mode|math|1>
  forms of odd weight.

  <section|Basic Definitions> The complex upper half plane
  <with|mode|math|<h>> is equipped with an action of

  <\equation*>
    <SL><rsub|2>(<R>)=<left|{><abcd|a|b|c|d>:a*d-b*c=1,<with|mode|text|and
    >a,b,c,d\<in\><R><right|}>
  </equation*>

  via linear fractional transformations. The <defn|modular group> is the
  subgroup <with|mode|math|<SL><rsub|2>(<Z>)> of
  <with|mode|math|<SL><rsub|2>(<R>)> of matrices with integer entries. It
  acts on the upper half plane and has as fundamental domain the set
  <with|mode|math|D> of elements of <with|mode|math|<h>> that satisfy
  <with|mode|math|\|z\|\<geq\>1> and <with|mode|math|\<Re\>(z)\<leq\>1/2>
  (see <cite|serre:arithmetic> (S)). Using this fundamental domain, one sees
  that <with|mode|math|<SL><rsub|2>(<Z>)> is generated as a group by the
  matrices <with|mode|math|S=<abcd|0|-1|1|0>> and
  <with|mode|math|T=<abcd|1|1|0|1>>.

  <\definition>
    [Weakly Modular Function] A <defn|weakly modular function> of weight
    <with|mode|math|k> is a meromorphic function <with|mode|math|f> on
    <with|mode|math|<h>> that satisfies

    <\equation>
      <label|eqn:modfunc>f(z)=(c*z+d)<rsup|-k>f(\<gamma\>(z))
    </equation>

    for all <with|mode|math|\<gamma\>=<abcd|a|b|c|d>\<in\><SL><rsub|2>(<Z>)>.
  </definition>

  Note that there are no modular forms of odd weight, since
  (<reference|eqn:modfunc>) implies <with|mode|math|f(z)=(-1)<rsup|k>f(z)>.
  When <with|mode|math|k> is even (<reference|eqn:modfunc>) is the same as

  <\equation*>
    f(\<gamma\>(z))d(\<gamma\>(z))<rsup|k/2>=f(z)d*z<rsup|k/2>,
  </equation*>

  so the weight <with|mode|math|k> differential form
  <with|mode|math|f(z)d*z<rsup|k/2>> is fixed by
  <with|mode|math|<SL><rsub|2>(<Z>)>. Note also that the product of two
  weakly modular functions of weights <with|mode|math|k<rsub|1>> and
  <with|mode|math|k<rsub|2>> is a weakly modular function of weight
  <with|mode|math|k<rsub|1>+k<rsub|2>>.

  Since <with|mode|math|<SL><rsub|2>(<Z>)> is generated by <with|mode|math|S>
  and <with|mode|math|T>, we can show that a meromorphic function
  <with|mode|math|f> is a weakly modular function by checking that

  <\equation>
    <label|eqn:modfunc2>f(z+1)=f(z)<space|2fn><with|mode|text|and><space|2fn>f(-1/z)=z<rsup|k>f(z).
  </equation>

  Let <with|mode|math|q=e<rsup|2\<pi\>i*z>>. Since
  <with|mode|math|f(z+1)=f(z)>, there is a set-theoretic function
  <with|mode|math|<wide|f|~>(q)> such that
  <with|mode|math|<wide|f|~>(q)=f(z)>. If, moreover,

  <\equation*>
    <wide|f|~>(q)=<big|sum><rsub|n=m><rsup|\<infty\>>a<rsub|n>q<rsup|n>
  </equation*>

  for some <with|mode|math|m\<in\><Z>> and all <with|mode|math|q> in a
  neighborhood of <with|mode|math|0>, we say that <with|mode|math|f> is
  <defn|meromorphic at <with|mode|math|\<infty\>>>. If also
  <with|mode|math|m\<geq\>0>, then we say that <with|mode|math|f> is
  <defn|holomorphic at <with|mode|math|\<infty\>>>.

  <\definition>
    [Modular Function] A <defn|modular function> of weight <with|mode|math|k>
    is a weakly modular function of weight <with|mode|math|k> that is
    meromorphic at <with|mode|math|\<infty\>>.
  </definition>

  <\definition>
    [Modular Form] A <defn|modular form> of weight <with|mode|math|k> is a
    modular function of weight <with|mode|math|k> that is holomorphic on
    <with|mode|math|<h>> and at <with|mode|math|\<infty\>>.
  </definition>

  If <with|mode|math|f> is a modular form, then there are complex numbers
  <with|mode|math|a<rsub|n>> such that

  <\equation*>
    f=<big|sum><rsub|n=0><rsup|\<infty\>>a<rsub|n>q<rsup|n>,
  </equation*>

  and the above series converges for all <with|mode|math|z\<in\><h>> (since
  <with|mode|math|f(q)> is holomorphic on the punctured open unit disk, its
  Laurent series converges absolutely in the punctured open unit; see also
  <cite|serre:arithmetic> (S) for a bound on <with|mode|math|\|a<rsub|n>\|>).
  Also we set <with|mode|math|f(\<infty\>)=a<rsub|0>>, since
  <with|mode|math|q<rsup|2\<pi\>i*z>\<to\>0> as
  <with|mode|math|z\<to\>\<infty\>>.

  <\definition>
    [Modular Form] A <defn|modular form> (of level 1) of weight
    <with|mode|math|k> is a modular function of weight <with|mode|math|k>
    that is holomorphic on <with|mode|math|<h>> and at
    <with|mode|math|\<infty\>>.
  </definition>

  <\definition>
    [Cusp Form] A <defn|cusp form> (of level 1) of weight <with|mode|math|k>
    is a modular form of weight <with|mode|math|k> such that
    <with|mode|math|f(\<infty\>)=0>, i.e., <with|mode|math|a<rsub|0>=0>.
  </definition>

  If <with|mode|math|f> is a nonzero meromorphic function on
  <with|mode|math|<h>> and <with|mode|math|w\<in\><h>>, let
  <with|mode|math|<ord><rsub|w>(f)> be the largest integer <with|mode|math|n>
  such that <with|mode|math|f/(w-z)<rsup|n>> is holomorphic at
  <with|mode|math|w>. If <with|mode|math|f=<big|sum><rsub|n=m><rsup|\<infty\>>a<rsub|n>q<rsup|n>>
  with <with|mode|math|a<rsub|m>\<neq\>0>, let
  <with|mode|math|<ord><rsub|\<infty\>>(f)=m>. We will use the following
  theorem to give a presentation for the vector space of modular forms of
  weight <with|mode|math|k>, which will make it possible to computable a
  basis for that space.

  <\theorem>
    [Valence Formula]<label|thm:valence>Suppose <with|mode|math|f> is a
    modular form. Then

    <\equation*>
      <ord><rsub|\<infty\>>(f)+<frac|1|2><ord><rsub|i>(f)+<frac|1|3><ord><rsub|\<rho\>>(f)+<big|sum><rsub|w\<in\>D><rsup|\<ast\>><ord><rsub|w>(f)=<frac|k|12>,
    </equation*>

    where <with|mode|math|<big|sum><rsup|\<ast\>>> is the sum over elements
    of the fundamental domain <with|mode|math|D> other than
    <with|mode|math|i> or <with|mode|math|\<rho\>>.
  </theorem>

  Serre proves this theorem in <cite|serre:arithmetic> (S) using the residue
  theorem from complex analysis. We will not prove it in this book.

  <section|Eisenstein Series and Delta><label|sec:level>For an even integer
  <with|mode|math|k\<geq\>4>, define the (not-normalized) <defn|weight
  <with|mode|math|k> Eisenstein series> to be

  <\equation*>
    G<rsub|k>(z)=<big|sum><rsub|m,n\<in\><Z>><rsup|\<ast\>><frac|1|(m*z+n)<rsup|k>>,
  </equation*>

  where the sum is over all <with|mode|math|m,n\<in\><Z>> such that
  <with|mode|math|m*z+n\<neq\>0>.

  <\proposition>
    The function <with|mode|math|G<rsub|k>(z)> is a modular form of weight
    <with|mode|math|k>.
  </proposition>

  See <cite|serre:arithmetic> (S), where he proves that
  <with|mode|math|G<rsub|k>(z)> defines a holomorphic function on
  <with|mode|math|<h><union>{\<infty\>}>. To see that
  <with|mode|math|G<rsub|k>> is modular, note that

  <\equation*>
    G<rsub|k>(z+1)=<big|sum><rsup|\<ast\>><frac|1|(m(z+1)+n)<rsup|k>>=<big|sum><rsup|\<ast\>><frac|1|(m*z+(n+m))<rsup|k>>=<big|sum><rsup|\<ast\>><frac|1|(m*z+n)<rsup|k>>,
  </equation*>

  and

  <\equation*>
    G<rsub|k>(-1/z)=<big|sum><rsup|\<ast\>><frac|1|(-m/z+n)<rsup|k>>=<big|sum><rsup|\<ast\>><frac|z<rsup|k>|(-m+n*z)<rsup|k>>=z<rsup|k><big|sum><rsup|\<ast\>><frac|1|(m*z+n)<rsup|k>>=z<rsup|k>G<rsub|k>(z).
  </equation*>

  <\proposition>
    <with|mode|math|G<rsub|k>(\<infty\>)=2\<zeta\>(k)>, where
    <with|mode|math|\<zeta\>> is the Riemann zeta function.
  </proposition>

  <\proof>
    Taking the limit as <with|mode|math|z\<to\>i\<infty\>> in the definition
    of <with|mode|math|G<rsub|k>(z)>, we obtain
    <with|mode|math|<big|sum><rsup|\<ast\>><rsub|n\<in\><Z>><frac|1|n<rsup|k>>>,
    since the terms involving <with|mode|math|z> all go to <with|mode|math|0>
    as <with|mode|math|z\<mapsto\>i\<infty\>>. This sum is twice
    <with|mode|math|\<zeta\>(k)=<big|sum><rsub|n\<geq\>1><frac|1|n<rsup|k>>>.
  </proof>

  For example, one can show that

  <\equation*>
    G<rsub|4>(\<infty\>)=2\<zeta\>(4)=<frac|1|3<rsup|2>\<cdot\>5>\<pi\><rsup|4>
  </equation*>

  and

  <\equation*>
    G<rsub|6>(\<infty\>)=2\<zeta\>(6)=<frac|2|3<rsup|3>\<cdot\>5\<cdot\>7>\<pi\><rsup|6>.
  </equation*>

  Suppose <with|mode|math|E=<C>/\<Lambda\>> is an elliptic curve over
  <with|mode|math|<C>>, viewed as a quotient of <with|mode|math|<C>> by a
  lattice <with|mode|math|\<Lambda\>=<Z>\<omega\><rsub|1>+<Z>\<omega\><rsub|2>>,
  with <with|mode|math|\<omega\><rsub|1>/\<omega\><rsub|2>\<in\><h>>. Then

  <\equation*>
    \<wp\><rsub|\<Lambda\>>(u)=<frac|1|u<rsup|2>>+<big|sum><rsub|k=4,<with|mode|text|even>><rsup|\<infty\>>(k-1)G<rsub|k>(\<omega\><rsub|1>/\<omega\><rsub|2>)u<rsup|k-2>,
  </equation*>

  and

  <\equation*>
    (\<wp\><rprime|'>)<rsup|2>=4\<wp\><rsup|3>-60G<rsub|4>(\<omega\><rsub|1>/\<omega\><rsub|2>)\<wp\>-140G<rsub|6>(\<omega\><rsub|1>/\<omega\><rsub|2>).
  </equation*>

  The discriminant of the cubic <with|mode|math|4x<rsup|3>-60G<rsub|4>(\<omega\><rsub|1>/\<omega\><rsub|2>)x-140G<rsub|6>(\<omega\><rsub|1>/\<omega\><rsub|2>)>
  is <with|mode|math|16\<Delta\>(\<omega\><rsub|1>/\<omega\><rsub|2>)>, where

  <\equation*>
    \<Delta\>=(60G<rsub|4>)<rsup|3>-27(140G<rsub|6>)<rsup|2>
  </equation*>

  is a cusp form of weight <with|mode|math|12>. Since <with|mode|math|E> is
  an elliptic curve, <with|mode|math|\<Delta\>(\<omega\><rsub|1>/\<omega\><rsub|2>)\<neq\>0>.

  <\proposition>
    <label|prop:qexpGk>For every even integer <with|mode|math|k\<geq\>2>, we
    have

    <\equation*>
      G<rsub|k>(z)=2\<zeta\>(k)+2\<cdot\><frac|(2\<pi\>i)<rsup|k>|(k-1)!>\<cdot\><big|sum><rsub|n=1><rsup|\<infty\>>\<sigma\><rsub|k-1>(n)q<rsup|n>,
    </equation*>

    where <with|mode|math|\<sigma\><rsub|d>(n)> is the sum of the
    <with|mode|math|d>th powers of the divisors of <with|mode|math|n>.
  </proposition>

  For the proof, see <cite|serre:arithmetic> (S), which uses clever
  manipulations of various series, starting with the identity

  <\equation*>
    \<pi\>cot(\<pi\>z)=<frac|1|z>+<big|sum><rsub|m=1><rsup|\<infty\>><left|(><frac|1|z+m>+<frac|1|z-m><right|)>.
  </equation*>

  From a computational point of view, the <with|mode|math|q>-expansion for
  <with|mode|math|G<rsub|k>> from Proposition <reference|prop:qexpGk> is
  unsatisfactory, because it involves transcendental numbers. To understand
  more clearly what is going on, we introduce the <defn|Bernoulli numbers>
  <with|mode|math|B<rsub|n>> for <with|mode|math|n\<geq\>0>
  <with|font-shape|italic|defined> by the following equality of formal power
  series:

  <\equation>
    <label|eqn:def><frac|x|e<rsup|x>-1>=<big|sum><rsub|n=0><rsup|\<infty\>>B<rsub|n><frac|x<rsup|n>|n!>.
  </equation>

  Expanding the power series on the left we have

  <\equation*>
    <frac|x|e<rsup|x>-1>=1-<frac|x|2>+<frac|x<rsup|2>|12>-<frac|x<rsup|4>|720>+<frac|x<rsup|6>|30240>-<frac|x<rsup|8>|1209600>+\<cdots\>
  </equation*>

  As this expansion suggests, the Bernoulli numbers
  <with|mode|math|B<rsub|n>> with <with|mode|math|n\<gtr\>1> odd are
  <with|mode|math|0> (see <exref|ch:levelone|ex:odd<rsub|b>ernoulli>).
  Expanding the series further, we obtain the following table: <vspace|0.5ex>

  <no-indent><with|mode|math|<ds>B<rsub|0>=1,<space|1fn>B<rsub|1>=-<frac|1|2>,<space|1fn>B<rsub|2>=<frac|1|6>,<space|1fn>B<rsub|4>=-<frac|1|30>,<space|1fn>B<rsub|6>=<frac|1|42>,<space|1fn>B<rsub|8>=-<frac|1|30>,<space|1fn>><vspace|1.5ex>

  <no-indent><with|mode|math|<ds>B<rsub|10>=<frac|5|66>,<space|1fn>B<rsub|12>=-<frac|691|2730>,<space|1fn>B<rsub|14>=<frac|7|6>,<space|1fn>B<rsub|16>=-<frac|3617|510>,<space|1fn>B<rsub|18>=<frac|43867|798>,<space|1fn>><vspace|1.5ex>

  <no-indent><with|mode|math|<ds><space|-0.25spc><space|-0.25spc>B<rsub|20>=-<frac|174611|330>,<space|1fn>B<rsub|22>=<frac|854513|138>,<space|1fn>B<rsub|24>=-<frac|236364091|2730>,<space|1fn>B<rsub|26>=<frac|8553103|6>.><vspace|1ex>

  For us the significance of the Bernoulli numbers is their connection with
  values of <with|mode|math|\<zeta\>> at positive even integers.

  <\proposition>
    <label|prop:zeta>If <with|mode|math|k\<geq\>2> is an
    <with|font-series|bold|even> integer, then

    <\equation*>
      \<zeta\>(k)=-<frac|(2\<pi\>i)<rsup|k>|2\<cdot\>k!>\<cdot\>B<rsub|k>.
    </equation*>
  </proposition>

  The proof involves manipulating a power series expansion for
  <with|mode|math|z*cot(z)> (see <cite|serre:arithmetic> (S)).

  <\definition>
    [Normalized Eisenstein Series] The <defn|normalized Eisenstein series> of
    even weight <with|mode|math|k\<geq\>4> is

    <\equation*>
      E<rsub|k>=<frac|(k-1)!|2\<cdot\>(2\<pi\>i)<rsup|k>>\<cdot\>G<rsub|k>
    </equation*>
  </definition>

  Combining Propositions <reference|prop:qexpGk> and <reference|prop:zeta> we
  see that

  <\equation>
    <label|eqn:ekexp>E<rsub|k>=-<frac|B<rsub|k>|2k>+q+<big|sum><rsub|n=2><rsup|\<infty\>>\<sigma\><rsub|k-1>(n)q<rsup|n>.
  </equation>

  <\remark>
    <with|font-series|bold|Warning: > Our series <with|mode|math|E<rsub|k>>
    is normalized so that the coefficient of <with|mode|math|q> is
    <with|mode|math|1>, but most books normalize <with|mode|math|E<rsub|k>>
    so that the constant coefficient is <with|mode|math|1>. We use the
    normalization with the coefficient of <with|mode|math|q> equal to
    <with|mode|math|1>, because then the eigenvalue of the
    <with|mode|math|n>th Hecke operator (see Section <reference|sec:hecke>)
    is the coefficient of <with|mode|math|q<rsup|n>>. Our normalization will
    also be convenient when we consider congruences between cusp forms and
    Eisenstein series.
  </remark>

  <section|Structure Theorem> Let <with|mode|math|M<rsub|k>> denote the
  complex vector space of modular forms of weight <with|mode|math|k>, and let
  <with|mode|math|S<rsub|k>> denote the subspace of cusp forms. We have an
  exact sequence

  <\equation*>
    0\<to\>S<rsub|k>\<to\>M<rsub|k>\<to\><C>
  </equation*>

  that sends <with|mode|math|f\<in\>M<rsub|k>> to
  <with|mode|math|f(\<infty\>)>. When <with|mode|math|k\<geq\>4> is even, the
  space <with|mode|math|M<rsub|k>> contains <with|mode|math|G<rsub|k>> and
  <with|mode|math|G<rsub|k>(\<infty\>)=2\<zeta\>(k)\<neq\>0>, so the map
  <with|mode|math|M<rsub|k>\<to\><C>> is surjective, and
  <with|mode|math|dim(S<rsub|k>)=dim(M<rsub|k>)-1>, so

  <\equation*>
    M<rsub|k>=S<rsub|k>\<oplus\><C>G<rsub|k>.
  </equation*>

  <\proposition>
    <label|prop:mk>For <with|mode|math|k\<less\>0> and <with|mode|math|k=2>,
    we have <with|mode|math|M<rsub|k>=0>.
  </proposition>

  <\proof>
    Suppose <with|mode|math|f\<in\>M<rsub|k>> is nonzero yet
    <with|mode|math|k=2> or <with|mode|math|k\<less\>0>. By Theorem
    <reference|thm:valence>,

    <\equation*>
      <ord><rsub|\<infty\>>(f)+<frac|1|2><ord><rsub|i>(f)+<frac|1|3><ord><rsub|\<rho\>>(f)+<big|sum><rsub|w\<in\>D><rsup|\<ast\>><ord><rsub|w>(f)=<frac|k|12>\<leq\>1/6.
    </equation*>

    This is impossible because each quantity on the left-hand side is
    nonnegative so whatever the sum is, it is too big (or <with|mode|math|0>,
    in which <with|mode|math|k=0>).
  </proof>

  <\theorem>
    <label|thm:delta>Multiplication by <with|mode|math|\<Delta\>> defines an
    isomorphism <with|mode|math|M<rsub|k-12>\<to\>S<rsub|k>>.
  </theorem>

  <\proof>
    (We follow <cite|serre:arithmetic> (S) closely.) We apply Theorem
    <reference|thm:valence> to <with|mode|math|G<rsub|4>> and
    <with|mode|math|G<rsub|6>>. If <with|mode|math|f=G<rsub|4>>, then

    <\equation*>
      <ord><rsub|\<infty\>>(f)+<frac|1|2><ord><rsub|i>(f)+<frac|1|3><ord><rsub|\<rho\>>(f)+<big|sum><rsub|w\<in\>D><rsup|\<ast\>><ord><rsub|w>(f)=<frac|4|12>=<frac|1|3>,
    </equation*>

    with the <with|mode|math|<ord>>s all nonnegative, so
    <with|mode|math|<ord><rsub|\<rho\>>(G<rsub|4>)=1> and
    <with|mode|math|<ord><rsub|w>(G<rsub|4>)=0> for all
    <with|mode|math|w\<neq\>\<rho\>>. Likewise
    <with|mode|math|<ord><rsub|i>(G<rsub|6>)=1> and
    <with|mode|math|<ord><rsub|w>(G<rsub|6>)=0> for all
    <with|mode|math|w\<neq\>i>. Thus <with|mode|math|\<Delta\>(i)\<neq\>0>,
    so <with|mode|math|\<Delta\>> is not identically <with|mode|math|0> (we
    also saw this above using the Weierstrass <with|mode|math|\<wp\>>
    function). Since <with|mode|math|\<Delta\>> has weight
    <with|mode|math|12> and <with|mode|math|<ord><rsub|\<infty\>>(\<Delta\>)\<geq\>1>,
    Theorem <reference|thm:valence> implies that <with|mode|math|\<Delta\>>
    has a simple zero at <with|mode|math|\<infty\>> and does not vanish on
    <with|mode|math|<h>>. Thus if <with|mode|math|f\<in\>S<rsub|k>> and we
    let <with|mode|math|g=f/\<Delta\>>, then <with|mode|math|g> is
    holomorphic and satisfies the appropriate transformation formula, so
    <with|mode|math|g> is a modular form of weight <with|mode|math|k-12>.
  </proof>

  <\corollary>
    For <with|mode|math|k=0,4,6,8,10,14>, the vector space
    <with|mode|math|M<rsub|k>> has dimension <with|mode|math|1>, with basis
    <with|mode|math|1>, <with|mode|math|G<rsub|4>>,
    <with|mode|math|G<rsub|6>>, <with|mode|math|E<rsub|8>>,
    <with|mode|math|E<rsub|10>>, and <with|mode|math|E<rsub|14>>,
    respectively, and <with|mode|math|S<rsub|k>=0>.
  </corollary>

  <\proof>
    Combining Proposition <reference|prop:mk> with Theorem
    <reference|thm:delta> we see that the spaces <with|mode|math|M<rsub|k>>
    for <with|mode|math|k\<leq\>10> can not have dimension bigger than
    <with|mode|math|1>, since then <with|mode|math|M<rsub|k<rprime|'>>\<neq\>0>
    for some <with|mode|math|k<rprime|'>\<less\>0>. Also
    <with|mode|math|M<rsub|14>> has dimension at most <with|mode|math|1>,
    since <with|mode|math|M<rsub|2>> has dimension <with|mode|math|0>. Each
    of the indicated spaces of weight <with|mode|math|\<geq\>4> contains the
    indicated Eisenstein series, so has dimension <with|mode|math|1>, as
    claimed.
  </proof>

  <\corollary>
    <label|cor:dim1><with|mode|math|dim M<rsub|k>=<cases|<tformat|<table|<row|<cell|0>|<cell|<with|mode|text|if
    >k<with|mode|text|is odd>,>>|<row|<cell|\<lfloor\>k/12\<rfloor\>>|<cell|<with|mode|text|if
    >k<con>2<pmod|12>,>>|<row|<cell|\<lfloor\>k/12\<rfloor\>+1>|<cell|<with|mode|text|if
    >k<neg|<con>>2<pmod|12>,>>>>>> where <with|mode|math|\<lfloor\>x\<rfloor\>>
    is the biggest integer <with|mode|math|\<leq\>x>.
  </corollary>

  <\proof>
    As we have seen above, the formula is true when
    <with|mode|math|k\<leq\>12>. By Theorem <reference|thm:delta>, the
    dimension increases by <with|mode|math|1> when <with|mode|math|k> is
    replaced by <with|mode|math|k+12>.
  </proof>

  <\theorem>
    <label|thm:mk>The space <with|mode|math|M<rsub|k>> has as basis the
    modular forms <with|mode|math|G<rsub|4><rsup|a>G<rsub|6><rsup|b>>, where
    <with|mode|math|a,b> are all pairs of nonnegative integers such that
    <with|mode|math|4a+6b=k>.
  </theorem>

  <\proof>
    We first prove by induction that the modular forms
    <with|mode|math|G<rsub|4><rsup|a>G<rsub|6><rsup|b>> generate
    <with|mode|math|M<rsub|k>>, the cases <with|mode|math|k\<leq\>12> being
    clear (e.g., when <with|mode|math|k=0> we have <with|mode|math|a=b=0> and
    basis <with|mode|math|1>). Choose some pair of integers
    <with|mode|math|a,b> such that <with|mode|math|4a+6b=k> (it is an
    elementary exercise to show these exist). The form
    <with|mode|math|g=G<rsub|4><rsup|a>G<rsub|6><rsup|b>> is not a cusp form,
    since it is nonzero at <with|mode|math|\<infty\>>. Now suppose
    <with|mode|math|f\<in\>M<rsub|k>> is arbitrary. Since
    <with|mode|math|M<rsub|k>=S<rsub|k>\<oplus\><C>G<rsub|k>>, there is
    <with|mode|math|\<alpha\>\<in\><C>> such that
    <with|mode|math|f-\<alpha\>g\<in\>S<rsub|k>>. Then by Theorem
    <reference|thm:delta>, there is <with|mode|math|h\<in\>M<rsub|k-12>> such
    that <with|mode|math|f-\<alpha\>g=\<Delta\>h>. By induction,
    <with|mode|math|h> is a polynomial in <with|mode|math|G<rsub|4>> and
    <with|mode|math|G<rsub|6>> of the required type, and so is
    <with|mode|math|\<Delta\>>, so <with|mode|math|f> is as well.

    Suppose there is a nontrivial linear relation between the
    <with|mode|math|G<rsub|4><rsup|a>G<rsub|6><rsup|b>> for a given
    <with|mode|math|k>. By multiplying the linear relation by a suitable
    power of <with|mode|math|G<rsub|4>> and <with|mode|math|G<rsub|6>>, we
    may assume that that we have such a nontrivial relation with
    <with|mode|math|k<con>0<pmod|12>>. Now divide the linear relation by
    <with|mode|math|G<rsub|6><rsup|k/12>> to see that
    <with|mode|math|G<rsub|4><rsup|3>/G<rsub|6><rsup|2>> satisfies a
    polynomial with coefficients in <with|mode|math|<C>>. Hence
    <with|mode|math|G<rsub|4><rsup|3>/G<rsub|6><rsup|2>> is a root of a
    polynomial, hence a constant, which is a contradiction since the
    <with|mode|math|q>-expansion of <with|mode|math|G<rsub|4><rsup|3>/G<rsub|6><rsup|2>>
    is not constant.
  </proof>

  <algorithm|Basis|<label|alg:basis>Given integers <with|mode|math|n> and
  <with|mode|math|k>, this algorithm computes a basis of
  <with|mode|math|q>-expansions for the complex vector space
  <with|mode|math|M<rsub|k>> mod <with|mode|math|q<rsup|n>>. The
  <with|mode|math|q>-expansions output by this algorithm have coefficients in
  <with|mode|math|<Q>>. <\steps>
    <item>[Simple Case] If <with|mode|math|k=0> output the basis with just
    <with|mode|math|1> in it, and terminate; otherwise if
    <with|mode|math|k\<less\>4> or <with|mode|math|k> is odd, output the
    empty basis and terminate.

    <item>[Power Series] Compute <with|mode|math|E<rsub|4>> and
    <with|mode|math|E<rsub|6>> mod <with|mode|math|q<rsup|n>> using the
    formula from (<reference|eqn:ekexp>) and the definition
    (<reference|eqn:def>) of Bernoulli numbers.

    <item>[Initialize] Set <with|mode|math|b<set>0>.

    <item>[Enumerate Basis] For each integer <with|mode|math|b> between
    <with|mode|math|0> and <with|mode|math|\<lfloor\>k/6\<rfloor\>>, compute
    <with|mode|math|a=(k-6b)/4>. If <with|mode|math|a> is an integer, compute
    and output the basis element <with|mode|math|E<rsub|4><rsup|a>E<rsub|6><rsup|b><mod|q<rsup|n>>>.
    When we compute, e.g., <with|mode|math|E<rsub|4><rsup|a>>, do the
    computation by finding <with|mode|math|E<rsub|4><rsup|m><pmod|q<rsup|n>>>
    for each <with|mode|math|m\<leq\>a>, and save these intermediate powers,
    so they can be reused later, and likewise for powers of
    <with|mode|math|E<rsub|6>>.\ 
  </steps> >

  <\proof>
    This is simply a translation of Theorem <reference|thm:mk> into an
    algorithm, since <with|mode|math|E<rsub|k>> is a nonzero scalar multiple
    of <with|mode|math|G<rsub|k>>. That the <with|mode|math|q>-expansions
    have coefficients in <with|mode|math|<Q>> is Equation
    <reference|eqn:ekexp>.
  </proof>

  <\example>
    We compute a basis for <with|mode|math|M<rsub|24>>, which is the space
    with smallest weight whose dimension is bigger than <with|mode|math|1>.
    It has as basis <with|mode|math|E<rsub|4><rsup|6>>,
    <with|mode|math|E<rsub|4><rsup|3>E<rsub|6><rsup|2>>, and
    <with|mode|math|E<rsub|6><rsup|4>>, whose explicit expansions are

    <\align*>
      <tformat|<table|<row|<cell|E<rsub|4><rsup|6>>|<cell|=<frac|1|191102976000000>+<frac|1|132710400000>q+<frac|203|44236800000>q<rsup|2>+\<cdots\>>>|<row|<cell|E<rsub|4><rsup|3>E<rsub|6><rsup|2>>|<cell|=<frac|1|3511517184000>-<frac|1|12192768000>q-<frac|377|4064256000>q<rsup|2>+\<cdots\>>>|<row|<cell|E<rsub|6><rsup|4>>|<cell|=<frac|1|64524128256>-<frac|1|32006016>q+<frac|241|10668672>q<rsup|2>+\<cdots\>>>>>
    </align*>
  </example>

  In Section <reference|sec:vmthesis>, we will discuss properties of the
  reduced row echelon form of any basis for <with|mode|math|M<rsub|k>>, which
  have better properties than the above basis.

  <section|Hecke Operators><label|sec:hecke>Let <with|mode|math|k> be an
  integer. Define the weight <with|mode|math|k> right action of
  <with|mode|math|<GL><rsub|2>(<Q>)> on functions <with|mode|math|f> on
  <with|mode|math|<h>> as follows. If <with|mode|math|\<gamma\>=<abcd|a|b|c|d>\<in\><GL><rsub|2>(<Q>)>,
  let

  <\equation*>
    f\|[\<gamma\>]<rsub|k>=det(\<gamma\>)<rsup|k-1>(c*z+d)<rsup|-k>f(\<gamma\>(z)).
  </equation*>

  One checks as an exercise that

  <\equation*>
    f\|[\<gamma\><rsub|1>\<gamma\><rsub|2>]<rsub|k>=(f\|[\<gamma\><rsub|1>]<rsub|k>)\|[\<gamma\><rsub|2>]<rsub|k>,
  </equation*>

  i.e., that this is a right group action. Also <with|mode|math|f> is a
  weakly modular function if <with|mode|math|f> is meromorphic and
  <with|mode|math|f\|[\<gamma\>]<rsub|k>=f> for all
  <with|mode|math|\<gamma\>\<in\><SL><rsub|2>(<Z>)>.

  For any positive integer <with|mode|math|n>, let

  <\equation*>
    S<rsub|n>=<left|{><mtwo|a|b|0|d>\<in\>M<rsub|2>(<Z>)<space|0.25spc><space|0.25spc>:<space|0.25spc><space|0.25spc>a\<geq\>1,<space|0.25spc><space|0.25spc>a*d=n,<with|mode|text|and
    >0\<leq\>b\<less\>d<right|}>.
  </equation*>

  Note that the set <with|mode|math|S<rsub|n>> is in bijection with the set
  of sublattices of <with|mode|math|<Z><rsup|2>> of index <with|mode|math|n>,
  where <with|mode|math|<abcd|a|b|c|d>> corresponds to
  <with|mode|math|L=<Z>\<cdot\>(a,b)+<Z>\<cdot\>(0,d)>, as one can see, e.g.,
  by using Hermite normal form (the analogue of reduced row echelon form over
  <with|mode|math|<Z>>).

  <\definition>
    [Hecke Operator <with|mode|math|T<rsub|n,k>>] The <with|mode|math|n>th
    Hecke operator <with|mode|math|T<rsub|n,k>> of weight <with|mode|math|k>
    is the operator on functions on <with|mode|math|<h>> defined by

    <\equation*>
      T<rsub|n,k>(f)=<big|sum><rsub|\<gamma\>\<in\>S<rsub|n>>f\|[\<gamma\>]<rsub|k>.
    </equation*>
  </definition>

  <\remark>
    It would make more sense to write <with|mode|math|T<rsub|n,k>> on the
    right, e.g., <with|mode|math|f\|T<rsub|n,k>>, since
    <with|mode|math|T<rsub|n,k>> is defined using a right group action.
    However, if <with|mode|math|n,m> are integers, then
    <with|mode|math|T<rsub|n,k>> and <with|mode|math|T<rsub|m,k>> commute, so
    it doesn't matter whether we consider the Hecke operators as acting on
    the right or left.
  </remark>

  <\proposition>
    <label|prop:tn>If <with|mode|math|f> is a weakly modular function of
    weight <with|mode|math|k>, so is <with|mode|math|T<rsub|n,k>(f)>, and if
    <with|mode|math|f> is also a modular function, then so is
    <with|mode|math|T<rsub|n,k>(f)>.
  </proposition>

  <\proof>
    Suppose <with|mode|math|\<gamma\>\<in\><SL><rsub|2>(<Z>)>. Since
    <with|mode|math|\<gamma\>> induces an automorphism of
    <with|mode|math|<Z><rsup|2>>, the set

    <\equation*>
      S<rsub|n>\<cdot\>\<gamma\>={\<delta\>\<gamma\>:\<delta\>\<in\>S<rsub|n>}
    </equation*>

    is also in bijection with the sublattices of <with|mode|math|<Z><rsup|2>>
    of index <with|mode|math|n>. Then for each element
    <with|mode|math|\<delta\>\<gamma\>\<in\>S<rsub|n>\<cdot\>\<gamma\>>,
    there is <with|mode|math|\<sigma\>\<in\><SL><rsub|2>(<Z>)> such that
    <with|mode|math|\<sigma\>\<delta\>\<gamma\>\<in\>S<rsub|n>> (the element
    <with|mode|math|\<sigma\>> is the transformation of
    <with|mode|math|\<delta\>\<gamma\>> to Hermite normal form), and the set
    of elements <with|mode|math|\<sigma\>\<delta\>\<gamma\>> is equal to
    <with|mode|math|S<rsub|n>>. Thus

    <\equation*>
      T<rsub|n,k>(f)=<big|sum><rsub|\<sigma\>\<delta\>\<gamma\>\<in\>S<rsub|n>>f\|[\<sigma\>\<delta\>\<gamma\>]<rsub|k>=<big|sum><rsub|\<delta\>\<in\>S<rsub|n>>f\|[\<delta\>\<gamma\>]<rsub|k>=T<rsub|n,k>(f)\|[\<gamma\>]<rsub|k>.
    </equation*>

    That <with|mode|math|f> being holomorphic on <with|mode|math|<h>> implies
    <with|mode|math|T<rsub|n,k>(f)> is holomorphic on <with|mode|math|<h>>
    follows because each <with|mode|math|f\|[\<gamma\>]<rsub|k>> is
    holomorphic on <with|mode|math|<h>>, and a finite sum of holomorphic
    functions is holomorphic.
  </proof>

  We will frequently drop <with|mode|math|k> from the notation in
  <with|mode|math|T<rsub|n,k>>, since the weight <with|mode|math|k> is
  implicit in the modular function to which we apply the Hecke operator. Thus
  we henceforth make the convention that if we write
  <with|mode|math|T<rsub|n>(f)> and <with|mode|math|f> is modular, then we
  mean <with|mode|math|T<rsub|n,k>(f)>, where <with|mode|math|k> is the
  weight of <with|mode|math|f>.

  <\proposition>
    On weight <with|mode|math|k> modular functions we have

    <\equation>
      <label|eqn:hecke>T<rsub|m*n>=T<rsub|n>T<rsub|m><space|2fn><space|2fn><space|2fn><space|2fn><space|1fn><with|mode|text|if
      >(n,m)=1,
    </equation>

    and

    <\equation>
      <label|eqn:hecke>T<rsub|p<rsup|n>>=T<rsub|p<rsup|n-1>>T<rsub|p><space|0.25spc>-<space|0.25spc>p<rsup|k-1>T<rsub|p<rsup|n-2>>,<space|2fn><space|-0.25spc><space|-0.25spc><with|mode|text|if
      <with|mode|math|p> is prime>.
    </equation>
  </proposition>

  <\proof>
    Let <with|mode|math|L> be a lattice of index <with|mode|math|m*n>. The
    quotient <with|mode|math|<Z><rsup|2>/L> is an abelian group of order
    <with|mode|math|m*n>, and <with|mode|math|(m,n)=1>, so
    <with|mode|math|<Z><rsup|2>/L> decomposes uniquely as a direct sum of a
    subgroup order <with|mode|math|m> with a subgroup of order
    <with|mode|math|n>. Thus there exists a unique lattice
    <with|mode|math|L<rprime|'>> such that
    <with|mode|math|L\<subset\>L<rprime|'>\<subset\><Z><rsup|2>>, and
    <with|mode|math|L<rprime|'>> has index <with|mode|math|m> in
    <with|mode|math|<Z><rsup|2>>. Thus <with|mode|math|L<rprime|'>>
    corresponds to an element of <with|mode|math|S<rsub|m>>, and the index
    <with|mode|math|n> subgroup <with|mode|math|L\<subset\>L<rprime|'>>
    corresponds to multiplying that element on the right by some uniquely
    determined element of <with|mode|math|S<rsub|n>>. We thus have

    <\equation*>
      <SL><rsub|2>(<Z>)\<cdot\>S<rsub|m>\<cdot\>S<rsub|n>=<SL><rsub|2>(<Z>)\<cdot\>S<rsub|m*n>
    </equation*>

    i.e., the set products of elements in <with|mode|math|S<rsub|m>> with
    elements of <with|mode|math|S<rsub|n>> equal the elements of
    <with|mode|math|S<rsub|m*n>>, up to <with|mode|math|<SL><rsub|2>(<Z>)>-equivalence.
    It then follows from the definitions that for any <with|mode|math|f>, we
    have <with|mode|math|T<rsub|m*n>(f)=T<rsub|n>(T<rsub|m>(f))>.

    We will show that <with|mode|math|T<rsub|p<rsup|n>>+p<rsup|k-1>T<rsub|p<rsup|n-2>>=T<rsub|p>T<rsub|p<rsup|n-1>>>.
    Suppose <with|mode|math|f> is a weight <with|mode|math|k> weakly modular
    function. Using that <with|mode|math|f\|[p]<rsub|k>=(p<rsup|2>)<rsup|k-1>p<rsup|-k>f=p<rsup|k-2>f>,
    we have

    <\equation*>
      <big|sum><rsub|x\<in\>S<rsub|p<rsup|n>>>f\|[x]<rsub|k><space|0.25spc><space|0.25spc>+<space|0.25spc><space|0.25spc>p<rsup|k-1><space|-0.25spc><space|-0.25spc><space|-0.25spc><big|sum><rsub|x\<in\>S<rsub|p<rsup|n-2>>>f\|[x]<rsub|k>=<big|sum><rsub|x\<in\>S<rsub|p<rsup|n>>>f\|[x]<rsub|k><space|0.25spc><space|0.25spc><space|0.25spc>+<space|0.25spc>p<space|-0.25spc><space|-0.25spc><space|-0.25spc><space|-0.25spc><big|sum><rsub|x\<in\>p*S<rsub|p<rsup|n-2>>>f\|[x]<rsub|k>.
    </equation*>

    Also

    <\equation*>
      T<rsub|p>T<rsub|p<rsup|n-1>>(f)=<big|sum><rsub|y\<in\>S<rsub|p>><big|sum><rsub|x\<in\>S<rsub|p<rsup|n-1>>>f\|[x]<rsub|k>\|[y]<rsub|k>=<big|sum><rsub|x\<in\>S<rsub|p<rsup|n-1>>\<cdot\>S<rsub|p>>f\|[x]<rsub|k>.
    </equation*>

    Thus it suffices to show that <with|mode|math|S<rsub|p<rsup|n>>> union
    <with|mode|math|p> copies of <with|mode|math|p*S<rsub|p<rsup|n-2>>> is
    equal to <with|mode|math|S<rsub|p<rsup|n-1>>\<cdot\>S<rsub|p>>, where we
    consider elements up to <with|mode|math|<SL><rsub|2>(<Z>)>-equivalence.

    Suppose <with|mode|math|L> is a sublattice of
    <with|mode|math|<Z><rsup|2>> of index <with|mode|math|p<rsup|n>>, so
    <with|mode|math|L> corresponds to an element of
    <with|mode|math|S<rsub|p<rsup|n>>>. First suppose <with|mode|math|L> is
    not contained in <with|mode|math|p<Z><rsup|2>>. Then the image of
    <with|mode|math|L> in <with|mode|math|<Z><rsup|2>/p<Z><rsup|2>=(<Z>/p<Z>)<rsup|2>>
    is of order <with|mode|math|p>, so if
    <with|mode|math|L<rprime|'>=p<Z><rsup|2>+L>, then
    <with|mode|math|[<Z><rsup|2>:L<rprime|'>]=p> and
    <with|mode|math|[L:L<rprime|'>]=p<rsup|n-1>>, and
    <with|mode|math|L<rprime|'>> is the only lattice with this property.
    Second suppose that <with|mode|math|L\<subset\>p<Z><rsup|2>> if of index
    <with|mode|math|p<rsup|n>>, and that <with|mode|math|x\<in\>S<rsub|p<rsup|n>>>
    corresponds to <with|mode|math|L>. Then every one of the
    <with|mode|math|p+1> lattices <with|mode|math|L<rprime|'>\<subset\><Z><rsup|2>>
    of index <with|mode|math|p> contains <with|mode|math|L>. Thus there are
    <with|mode|math|p+1> chains <with|mode|math|L\<subset\>L<rprime|'>\<subset\><Z><rsup|2>>
    with <with|mode|math|[<Z><rsup|2>:L<rprime|'>]=p>.

    The chains <with|mode|math|L\<subset\>L<rprime|'>\<subset\><Z><rsup|2>>
    with <with|mode|math|[<Z><rsup|2>:L<rprime|'>]=p> and
    <with|mode|math|[<Z><rsup|2>:L]=p<rsup|n-1>> are in bijection with the
    elements of <with|mode|math|S<rsub|p<rsup|n-1>>\<cdot\>S<rsub|p>>. On the
    other hand the union of <with|mode|math|S<rsub|p<rsup|n>>> with
    <with|mode|math|p> copies of <with|mode|math|p*S<rsub|p<rsup|n-2>>>
    corresponds to the lattices <with|mode|math|L> of index
    <with|mode|math|p<rsup|n>>, but with those that contain
    <with|mode|math|p<Z><rsup|2>> counted <with|mode|math|p+1> times. The
    structure of the set of chains <with|mode|math|L\<subset\>L<rprime|'>\<subset\><Z><rsup|2>>
    that we derived in the previous paragraph gives the result.
  </proof>

  <\corollary>
    The Hecke operator <with|mode|math|T<rsub|p<rsup|n>>>, for prime
    <with|mode|math|p>, is a polynomial in <with|mode|math|T<rsub|p>>. If
    <with|mode|math|n,m> are any integers then
    <with|mode|math|T<rsub|n>T<rsub|m>=T<rsub|m>T<rsub|n>>.
  </corollary>

  <\proof>
    The first statement is clear from (<reference|eqn:hecke>), and this gives
    commutativity when <with|mode|math|m> and <with|mode|math|n> are both
    powers of <with|mode|math|p>. Combining this with (<reference|eqn:hecke>)
    gives the second statement in general.
  </proof>

  <\remark>
    <surround|Emmanuel Kowalski made the following remark on the number
    theory lists in June 2004 when asked about the polynomials
    <with|mode|math|f<rsub|n>(X)> such that
    <with|mode|math|T<rsub|p<rsup|n>>=f<rsub|n>(T<rsub|p>)>. ||<\quote-env>
      \ If you normalize the Hecke operators by considering

      <\equation*>
        S<rsub|n,k>=n<rsup|-(k-1)/2>T<rsub|n,k>
      </equation*>

      then the recursion on the polynomials <with|mode|math|P<rsub|r>(X)>
      such that <with|mode|math|S<rsub|p<rsup|r>,k>=P<rsub|r>(S<rsub|p,k>)>
      becomes

      <\equation*>
        X*P<rsub|r>=P<rsub|r+1>+P<rsub|r-1>,
      </equation*>

      which is the recursion satisfied by the Chebychev polynomials
      <with|mode|math|U<rsub|r>> such that

      <\equation*>
        U<rsub|r>(2cos t)=<frac|sin((r+1)t)|sin(t)>.
      </equation*>

      Alternatively, those give the characters of the symmetric powers of the
      standard representation of <with|mode|math|<SL><rsub|2>(<R>)>,
      evaluated on a rotation matrix

      <\equation*>
        <mtwo|cos(t)|-sin(t)|sin(t)|<htab|1fn>cos(t)>.
      </equation*>

      For references, see for instance <cite|iwaniec:topics> (p. 97) or
      <cite|serre:asymptotique> (p. 78, p. 81), and there are certainly many
      others.\ 
    </quote-env>>
  </remark>

  <\proposition>
    <label|prop:qexpTn>Suppose <with|mode|math|f=<big|sum><rsub|n\<in\><Z>>a<rsub|n>q<rsup|n>>
    is a modular function of weight <with|mode|math|k>. Then

    <\equation*>
      T<rsub|n>(f)=<big|sum><rsub|m\<in\><Z>><left|(><big|sum><rsub|1\<leq\>c<space|0.25spc>\<mid\><space|0.25spc>(n,m)>c<rsup|k-1>a<rsub|m*n/c<rsup|2>><right|)>q<rsup|m>.
    </equation*>

    In particular, if <with|mode|math|n=p> is prime, then

    <\equation*>
      T<rsub|p>(f)=<big|sum><rsub|m\<in\><Z>><left|(>a<rsub|m*p>+p<rsup|k-1>a<rsub|m/p><right|)>q<rsup|m>,
    </equation*>

    where <with|mode|math|a<rsub|m/p>=0> if
    <with|mode|math|m/p<neg|\<in\>><Z>>.
  </proposition>

  The proposition is not that difficult to prove (or at least the proof is
  easy to follow), and is proved in <cite|serre:arithmetic> (S) by writing
  out <with|mode|math|T<rsub|n>(f)> explicitly and using that
  <with|mode|math|<big|sum><rsub|0\<leq\>b\<less\>d>e<rsup|2\<pi\>i*b*m/d>>
  is <with|mode|math|d> if <with|mode|math|d\<mid\>m> and <with|mode|math|0>
  otherwise. A corollary of Proposition <reference|prop:qexpTn> is that
  <with|mode|math|T<rsub|n>> preserves <with|mode|math|M<rsub|k>> and
  <with|mode|math|S<rsub|k>>.

  <\corollary>
    The Hecke operators preserve <with|mode|math|M<rsub|k>> and
    <with|mode|math|S<rsub|k>>.
  </corollary>

  <\remark>
    (Elkies) We knew this already---for <with|mode|math|M<rsub|k>> it's
    Proposition <reference|prop:tn>, and for <with|mode|math|S<rsub|k>> it's
    easy to show directly that if <with|mode|math|f(i\<infty\>)=0> then
    <with|mode|math|T<rsub|n>f> also vanishes at <with|mode|math|i\<infty\>>.
  </remark>

  <\example>
    Recall that

    <\equation*>
      E<rsub|4>=<frac|1|240>+q+9q<rsup|2>+28q<rsup|3>+73q<rsup|4>+126q<rsup|5>+252q<rsup|6>+344q<rsup|7>+\<cdots\>.
    </equation*>

    Using the formula of Proposition <reference|prop:qexpTn>, we see that

    <\equation*>
      T<rsub|2>(E<rsub|4>)=(1/240+2<rsup|3>\<cdot\>(1/240))+9q+(73+2<rsup|3>\<cdot\>1)q<rsup|2>+\<cdots\><next-line>=9E<rsub|4>.
    </equation*>

    Since <with|mode|math|M<rsub|k>> has dimension <with|mode|math|1>, and we
    have proved that <with|mode|math|T<rsub|2>> preserves
    <with|mode|math|M<rsub|k>>, we know that <with|mode|math|T<rsub|2>> acts
    as a scalar. Thus we know just from the constant coefficient of
    <with|mode|math|T<rsub|2>(E<rsub|4>)> that
    <with|mode|math|T<rsub|2>(E<rsub|4>)=9E<rsub|4>>. More generally,
    <with|mode|math|T<rsub|p>(E<rsub|4>)=(1+p<rsup|3>)E<rsub|4>>, and even
    more generally

    <\equation*>
      T<rsub|n>(E<rsub|k>)=\<sigma\><rsub|k-1>(n)E<rsub|k>,
    </equation*>

    for any integer <with|mode|math|n\<geq\>1> and even weight
    <with|mode|math|k\<geq\>4>.
  </example>

  <\example>
    The Hecke operators <with|mode|math|T<rsub|n>> also preserve the subspace
    <with|mode|math|S<rsub|k>> of <with|mode|math|M<rsub|k>>. Since
    <with|mode|math|S<rsub|12>> has dimension <with|mode|math|1>, this means
    that <with|mode|math|\<Delta\>> is an eigenvector for all
    <with|mode|math|T<rsub|n>>. Since the coefficient of <with|mode|math|q>
    in the <with|mode|math|q>-expansion of <with|mode|math|\<Delta\>> is
    <with|mode|math|1>, the eigenvalue of <with|mode|math|T<rsub|n>> on
    <with|mode|math|\<Delta\>> is the <with|mode|math|n>th coefficient of
    <with|mode|math|\<Delta\>>. Moreover the function
    <with|mode|math|\<tau\>(n)> that gives the <with|mode|math|n>th
    coefficient of <with|mode|math|\<Delta\>> is a multiplicative function.
    Likewise, one can show that the series <with|mode|math|E<rsub|k>> are
    eigenvectors for all <with|mode|math|T<rsub|n>>, and because in this book
    we normalize <with|mode|math|E<rsub|k>> so that the coefficient of
    <with|mode|math|q> is <with|mode|math|1>, the eigenvalue of
    <with|mode|math|T<rsub|n>> on <with|mode|math|E<rsub|k>> is the
    coefficient <with|mode|math|\<sigma\><rsub|k-1>(n)> of
    <with|mode|math|q<rsup|n>>.
  </example>

  <section|The Victor Miller Basis><label|sec:vmthesis>

  <\lemma>
    [Victor Miller]<label|lem:vm>The space <with|mode|math|S<rsub|k>> has a
    basis <with|mode|math|f<rsub|1>,\<ldots\>,f<rsub|d>> such that if
    <with|mode|math|a<rsub|i>(f<rsub|j>)> is the <with|mode|math|i>th
    coefficient of <with|mode|math|f<rsub|j>>, then
    <with|mode|math|a<rsub|i>(f<rsub|j>)=\<delta\><rsub|i,j>> for
    <with|mode|math|i=1,\<ldots\>,d>. Moreover the <with|mode|math|f<rsub|j>>
    all lie in <with|mode|math|<Z>[[q]]>.
  </lemma>

  This is a straightforward construction involving
  <with|mode|math|E<rsub|4>>, <with|mode|math|E<rsub|6>> and
  <with|mode|math|\<Delta\>>. The following proof is copied almost verbatim
  from <cite|lang:modular> (Ch. X, Thm. 4.4), which is in turn presumably
  copied from the first lemma of Victor Miller's thesis.

  <\proof>
    Let <with|mode|math|d=dim S<rsub|k>>. Since
    <with|mode|math|B<rsub|4>=-1/30> and <with|mode|math|B<rsub|6>=1/42>, we
    note that

    <\equation*>
      F<rsub|4>=-8/B<rsub|4>\<cdot\>E<rsub|4>=1+240q+2160q<rsup|2>+6720q<rsup|3>+17520q<rsup|4>+\<cdots\>
    </equation*>

    and

    <\equation*>
      F<rsub|6>=-12/B<rsub|6>\<cdot\>E<rsub|6>=1-504q-16632q<rsup|2>-122976q<rsup|3>-532728q<rsup|4>+\<cdots\>
    </equation*>

    have <with|mode|math|q>-expansions in <with|mode|math|<Z>[[q]]> with
    leading coefficient <with|mode|math|1>. Choose integers
    <with|mode|math|a,b\<geq\>0> such that

    <\equation*>
      4a+6b\<leq\>14<space|2fn><with|mode|text|and><space|2fn>4a+6b<con>k<pmod|12>,
    </equation*>

    with <with|mode|math|a=b=0> when <with|mode|math|k<con>0<pmod|12>>, and
    let

    <\equation*>
      g<rsub|j>=\<Delta\><rsup|j>F<rsub|6><rsup|2(d-j)+a>F<rsub|4><rsup|b>,<space|2fn><space|2fn><with|mode|text|for
      >j=1,\<ldots\>,d.
    </equation*>

    Then

    <\equation*>
      a<rsub|j>(g<rsub|j>)=1,<space|2fn><with|mode|text|and><space|2fn>a<rsub|i>(g<rsub|j>)=0<space|2fn><with|mode|text|when><space|2fn>i\<less\>j.
    </equation*>

    Hence the <with|mode|math|g<rsub|j>> are linearly independent over
    <with|mode|math|<C>>, and thus form a basis for
    <with|mode|math|S<rsub|k>>. Since <with|mode|math|F<rsub|4>,F<rsub|6>>,
    and <with|mode|math|\<Delta\>> are all in <with|mode|math|<Z>[[q]]>, so
    are the <with|mode|math|g<rsub|j>>. The <with|mode|math|f<rsub|i>> may
    then be constructed from the <with|mode|math|g<rsub|j>> by Gauss
    elimination. The coefficients of the resulting power series lie in
    <with|mode|math|<Z>> because each time we clear a column we use the power
    series <with|mode|math|g<rsub|j>> whose leading coefficient is
    <with|mode|math|1> (so no denominators are introduced).
  </proof>

  <\remark>
    The basis coming from Victor Miller's lemma is canonical, since it is
    just the reduced row echelon form of any basis. Also the
    <with|font-shape|italic|integral> linear combinations are precisely the
    modular forms of level <with|mode|math|1> with integral
    <with|mode|math|q>-expansion.
  </remark>

  <\remark>
    (Elkies)

    <\enumerate>
      <item>If you have just a single form <with|mode|math|f> in
      <with|mode|math|M<rsub|k>> to write as a polynomial in
      <with|mode|math|E<rsub|4>> and <with|mode|math|E<rsub|6>>, then it is
      wasteful to compute the Victor Miller basis. Instead, use the upper
      triangular basis <with|mode|math|\<Delta\><rsup|j>F<rsub|6><rsup|2(d-j)+a>F<rsub|4><rsup|b>>,
      and match coefficients from <with|mode|math|q<rsup|0>> to
      <with|mode|math|q<rsup|d>>. (Or use ``my'' recursion if
      <with|mode|math|f> happens to be the Eisenstein series.)

      <item>When <with|mode|math|4\<mid\>k>, the zeroth form
      <with|mode|math|f<rsub|0>> in the Miller basis is also the theta
      function of an extremal self-dual even lattice of dimension
      <with|mode|math|2k> (if one exists). More generally, if a lattice is
      with <with|mode|math|c> of extremality then its theta function differs
      from <with|mode|math|f<rsub|0>> by a linear combination of
      <with|mode|math|f<rsub|d>,f<rsub|d-1>,...,f<rsub|d+1-c>>.
    </enumerate>
  </remark>

  We extend the Victor Miller basis to all <with|mode|math|M<rsub|k>> by
  taking a multiple of <with|mode|math|G<rsub|k>> with constant term
  <with|mode|math|1>, and subtracting off the <with|mode|math|f<rsub|i>> from
  the Victor Miller basis so that the coefficients of
  <with|mode|math|q,q<rsup|2>,\<ldots\>q<rsup|d>> of the resulting expansion
  are <with|mode|math|0>. We call the extra basis element
  <with|mode|math|f<rsub|0>>.

  <\example>
    If <with|mode|math|k=24>, then <with|mode|math|d=2>. Choose
    <with|mode|math|a=b=0>, since <with|mode|math|k<con>0<pmod|12>>. Then

    <\equation*>
      g<rsub|1>=\<Delta\>F<rsub|6><rsup|2>=q-1032q<rsup|2>+245196q<rsup|3>+10965568q<rsup|4>+60177390q<rsup|5>-\<cdots\>
    </equation*>

    and

    <\equation*>
      g<rsub|2>=\<Delta\><rsup|2>=q<rsup|2>-48q<rsup|3>+1080q<rsup|4>-15040q<rsup|5>+\<cdots\>
    </equation*>

    We let <with|mode|math|f<rsub|2>=g<rsub|2>> and

    <\equation*>
      f<rsub|1>=g<rsub|1>+1032g<rsub|2>=q+195660q<rsup|3>+12080128q<rsup|4>+44656110q<rsup|5>-\<cdots\>.
    </equation*>
  </example>

  <\examplesession>
    \<gtr\> n4 := Newforms(MF(1,4))[1][1]; \<gtr\> F4 := n4*240; \<gtr\> F4;
    1 + 240*q + 2160*q<rsup|2> + 6720*q<rsup|3> + 17520*q<rsup|4> +
    30240*q<rsup|5> + 60480*q<rsup|6> + 82560*q<rsup|7> + O(q<rsup|8>)
    \<gtr\> n6 := Newforms(MF(1,6))[1][1]; \<gtr\> n6 \<gtr\> ';

    \<gtr\>\<gtr\> '; <rsup|U>ser error: Unexpected newline in literal
    identifier \<gtr\> n6; -1/504 + q + 33*q<rsup|2> + 244*q<rsup|3> +
    1057*q<rsup|4> + 3126*q<rsup|5> + 8052*q<rsup|6> + 16808*q<rsup|7> +
    O(q<rsup|8>) \<gtr\> F6 := n6*(-504); \<gtr\> F4; 1 + 240*q +
    2160*q<rsup|2> + 6720*q<rsup|3> + 17520*q<rsup|4> + 30240*q<rsup|5> +
    60480*q<rsup|6> + 82560*q<rsup|7> + O(q<rsup|8>) \<gtr\> F6; 1 - 504*q -
    16632*q<rsup|2> - 122976*q<rsup|3> - 532728*q<rsup|4> - 1575504*q<rsup|5>
    - 4058208*q<rsup|6> - 8471232*q<rsup|7> + O(q<rsup|8>) \<gtr\> Delta :=
    Newforms(CS(MF(1,12)))[1][1]; \<gtr\> Delta; q - 24*q<rsup|2> +
    252*q<rsup|3> - 1472*q<rsup|4> + 4830*q<rsup|5> - 6048*q<rsup|6> -
    16744*q<rsup|7> + O(q<rsup|8>) \<gtr\> Delta*F6<rsup|2>; q -
    1032*q<rsup|2> + 245196*q<rsup|3> + 10965568*q<rsup|4> +
    60177390*q<rsup|5> - 1130921568*q<rsup|6> + 870123128*q<rsup|7> +
    O(q<rsup|8>) \<gtr\> Delta<rsup|2>; q<rsup|2> - 48*q<rsup|3> +
    1080*q<rsup|4> - 15040*q<rsup|5> + 143820*q<rsup|6> - 985824*q<rsup|7> +
    O(q<rsup|8>) \<gtr\> 1032*Delta<rsup|2> + Delta*F6<rsup|2>; q +
    195660*q<rsup|3> + 12080128*q<rsup|4> + 44656110*q<rsup|5> -
    982499328*q<rsup|6> - 147247240*q<rsup|7> + O(q<rsup|8>) \<gtr\> S :=
    CS(MF(1,36)); \<gtr\> Basis(S); [ q + 57093088*q<rsup|4> +
    37927345230*q<rsup|5> + 5681332472832*q<rsup|6> +
    288978305864000*q<rsup|7> + O(q<rsup|8>), q<rsup|2> + 194184*q<rsup|4> +
    7442432*q<rsup|5> - 197264484*q<rsup|6> + 722386944*q<rsup|7> +
    O(q<rsup|8>), q<rsup|3> - 72*q<rsup|4> + 2484*q<rsup|5> - 54528*q<rsup|6>
    + 852426*q<rsup|7> + O(q<rsup|8>) ]\ 
  </examplesession>

  <\example>
    When <with|mode|math|k=36>, the Victor Miller basis, including
    <with|mode|math|f<rsub|0>>, is

    <\align*>
      <tformat|<table|<row|<cell|f<rsub|0>>|<cell|=1+<space|1fn><space|0.25spc><space|0.25spc><space|0.25spc>6218175600q<rsup|4>+15281788354560q<rsup|5>+\<cdots\>>>|<row|<cell|f<rsub|1>>|<cell|=<space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc>q+<space|1fn><space|0.25spc><space|0.25spc>57093088q<rsup|4>+37927345230q<rsup|5>+\<cdots\>>>|<row|<cell|f<rsub|2>>|<cell|=<space|2fn>q<rsup|2>+<space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc>194184q<rsup|4>+<space|1fn><space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc>7442432q<rsup|5>+\<cdots\>>>|<row|<cell|f<rsub|3>>|<cell|=<space|2fn><space|1fn><space|0.25spc><space|0.25spc>q<rsup|3>-<space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc>72q<rsup|4>+<space|2fn><space|1fn><space|0.25spc><space|0.25spc>2484q<rsup|5>+\<cdots\>>>>>
    </align*>
  </example>

  <algorithm|Hecke Operator| This algorithm computes a matrix for the Hecke
  operator <with|mode|math|T<rsub|n>> on the Victor Miller basis for
  <with|mode|math|M<rsub|k>>. <\steps>
    <item>[Compute dimension] Set <with|mode|math|d<set>dim(S<rsub|k>)>,
    which we compute using Corollary <reference|cor:dim1>.

    <item>[Compute basis] Using the algorithm implicit in Lemma
    <reference|lem:vm>, compute a basis <with|mode|math|f<rsub|0>,\<ldots\>,f<rsub|d>>
    for <with|mode|math|M<rsub|k>> modulo <with|mode|math|q<rsup|d*n+1>>.

    <item>[Compute Hecke operator] Using the formula from Proposition
    <reference|prop:qexpTn>, compute <with|mode|math|T<rsub|n>(f<rsub|i>)<pmod|q<rsup|d+1>>>
    for each <with|mode|math|i>.

    <item>[Write in terms of basis]<label|usevm>The elements
    <with|mode|math|T<rsub|n>(f<rsub|i>)<pmod|q<rsup|d+1>>> uniquely
    determine linear combinations of <with|mode|math|f<rsub|0>,f<rsub|1>,\<ldots\>,f<rsub|d><pmod|q<rsup|d>>>.
    These linear combinations are trivial to find, since the basis of
    <with|mode|math|f<rsub|i>> are in reduced row echelon form. I.e., the
    combinations are just the first few coefficients of the power series
    <with|mode|math|T<rsub|n>(f<rsub|i>)>.

    <item>[Write down matrix] The matrix of <with|mode|math|T<rsub|n>> acting
    from the left is the matrix whose rows are the linear combinations found
    in the previous step, i.e., whose rows are the coefficients of
    <with|mode|math|T<rsub|n>(f<rsub|i>)>.\ 
  </steps> >

  <\proof>
    First note that we only have to compute a modular form <with|mode|math|f>
    modulo <with|mode|math|q<rsup|d*n+1>> in order to compute
    <with|mode|math|T<rsub|n>(f)> modulo <with|mode|math|q<rsup|d+1>>. This
    follows from Proposition <reference|prop:qexpTn>, since in the formula
    the <with|mode|math|d>th coefficient of <with|mode|math|T<rsub|n>(f)>
    involves only <with|mode|math|a<rsub|d*n>>, and smaller-indexed
    coefficients of <with|mode|math|f>. The uniqueness assertion of Step
    <reference|usevm> follows from Lemma <reference|lem:vm> above.
  </proof>

  <\example>
    This is the Hecke operator <with|mode|math|T<rsub|2>> on
    <with|mode|math|M<rsub|36>>:

    <\equation*>
      <left|(><tabular*|<tformat|<table|<row|<cell|<htab|1fn>34359738369>|<cell|<htab|1fn>0>|<cell|<htab|1fn>6218175600>|<cell|<htab|1fn>9026867482214400>>|<row|<cell|0>|<cell|<htab|1fn>0>|<cell|<htab|1fn>34416831456>|<cell|<htab|1fn>5681332472832>>|<row|<cell|0>|<cell|<htab|1fn>1>|<cell|<htab|1fn>194184>|<cell|<htab|1fn>-197264484>>|<row|<cell|0>|<cell|<htab|1fn>0>|<cell|<htab|1fn>-72>|<cell|<htab|1fn>-54528>>>>><right|)>
    </equation*>

    It has characteristic polynomial

    <\equation*>
      (x-34359738369)\<cdot\>(x<rsup|3>-139656x<rsup|2>-59208339456x-1467625047588864),
    </equation*>

    where the cubic factor is irreducible.
  </example>

  <\conjecture>
    [Maeda] The characteristic polynomial of <with|mode|math|T<rsub|2>> on
    <with|mode|math|S<rsub|k>> is irreducible for any <with|mode|math|k>.\ 
  </conjecture>

  Kevin Buzzard even observed that in many specific cases the Galois group of
  the characteristic polynomial of <with|mode|math|T<rsub|2>> is the full
  symmetric group (see <cite|buzzard:t2>). See also <cite|farmer-james:maeda>
  for more evidence for Maeda's conjecture.

  <section|Can One Compute the Coefficients of <with|mode|math|\<Delta\>> in
  Polynomial Time?> Let

  <\align*>
    <tformat|<table|<row|<cell|\<Delta\>>|<cell|=<big|sum><rsub|n=1><rsup|\<infty\>>\<tau\>(n)q<rsup|n>>>|<row|<cell|>|<cell|=q-24q<rsup|2>+252q<rsup|3>-1472q<rsup|4>+4830q<rsup|5>-6048q<rsup|6>-16744q<rsup|7>>>|<row|<cell|>|<cell|<space|2fn>+84480q<rsup|8>-113643q<rsup|9>-115920q<rsup|10>+534612q<rsup|11>->>|<row|<cell|>|<cell|<space|2fn>370944q<rsup|12>-577738q<rsup|13>+401856q<rsup|14>+1217160q<rsup|15>+>>|<row|<cell|>|<cell|<space|2fn>987136q<rsup|16>-6905934q<rsup|17>+2727432q<rsup|18>+10661420q<rsup|19>+\<cdots\>>>>>
  </align*>

  <surround|be the <with|mode|math|\<Delta\>>-function. | Bas Edixhoven and
  his students have been working intensely for years to apply sophisticated
  techniques from arithmetic geometry (e.g., étale cohomology, motives,
  Arakelov theory) in order to prove that such an algorithm exists (among
  other things), and he believes they are almost there. There is evidently a
  significant gap between proving <with|font-shape|italic|existence> of an
  algorithm that shold be polynomial time, and actually writing down such an
  algorithm with explicitly bounded running times. The ideas Edixhoven uses
  are very similar to the ones used for counting points on elliptic curves in
  polynomial time (the algorithm of Schoof, with refinements by Atkins and
  Elkies).|<conjecture|[Edixhoven] There is an algorithm to compute
  <with|mode|math|\<tau\>(p)>, for prime <with|mode|math|p>, that is
  polynomial-time in the number of digits of <with|mode|math|p>. >>

  <chapter|Dirichlet Characters><label|ch:dirichlet>

  Fix an integral domain <with|mode|math|R> and a root
  <with|mode|math|\<zeta\>> of unity in <with|mode|math|R>.

  <\definition>
    [Dirichlet Character] A <defn|Dirichlet character> modulo
    <with|mode|math|N> over <with|mode|math|R> with given choice of
    <with|mode|math|\<zeta\>\<in\>R> is a map
    <with|mode|math|<eps>:<Z>\<to\>R> such that there is a homomorphism
    <with|mode|math|f:(<Z>/N<Z>)<rsup|\<ast\>>\<to\>\<langle\>\<zeta\>\<rangle\>>
    for which

    <\equation*>
      <eps>(a)=<cases|<tformat|<table|<row|<cell|0>|<cell|<with|mode|text|if
      >(a,N)\<gtr\>1,>>|<row|<cell|f<space|0.25spc>(a<space|-0.25spc><space|-0.25spc><space|-0.25spc><space|-0.25spc><mod|N>)>|<cell|<with|mode|text|if
      >(a,N)=1.>>>>>
    </equation*>
  </definition>

  We denote the group of such Dirichlet characters by
  <with|mode|math|D(N,R,\<zeta\>)>, or by just <with|mode|math|D(N,R)>, when
  the choice of <with|mode|math|\<zeta\>> is clear. It follows immediately
  from the definition that elements of <with|mode|math|D(N,R)> are in
  bijection with homomorphisms <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>\<to\>\<langle\>\<zeta\>\<rangle\>>.

  In this chapter we develop a systematic theory for computing with Dirichlet
  characters. These will be extremely important everywhere in the rest of
  this book, when we compute with spaces <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))>
  of modular forms for

  <\equation*>
    \<Gamma\><rsub|1>(N)=<left|{><mtwo|a|b|c|d>\<in\><SL><rsub|2>(<Z>):<mtwo|a|b|c|d><con><mtwo|1|\<ast\>|0|1><pmod|N><right|}>.
  </equation*>

  For example, Eisenstein series in <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))>
  are associated to pairs of Dirichlet characters. Also the complex vector
  space <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))> with its structure
  as a module over the Hecke algebra decomposes as a direct sum

  <\equation*>
    M<rsub|k>(\<Gamma\><rsub|1>(N))=<big|oplus><rsub|<eps>\<in\>D(N,<C>)>M<rsub|k>(\<Gamma\><rsub|1>(N))(<eps>).
  </equation*>

  Each space <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))(<eps>)> is
  frequently much easier to compute with than the full
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))>. For example,
  <with|mode|math|M<rsub|2>(\<Gamma\><rsub|1>(100))> has dimension
  <with|mode|math|370>, whereas <with|mode|math|M<rsub|2>(\<Gamma\><rsub|1>(100))(1)>
  has dimension only <with|mode|math|24>, and
  <with|mode|math|M<rsub|2>(\<Gamma\><rsub|1>(389))> has dimension
  <with|mode|math|6499>, whereas <with|mode|math|M<rsub|2>(\<Gamma\><rsub|1>(389))(1)>
  has dimension only <with|mode|math|33>.

  <\remark>
    If

    <\equation*>
      \<Gamma\><rsub|0>(N)=<left|{><mtwo|a|b|c|d>\<in\><SL><rsub|2>(<Z>):<mtwo|a|b|c|d><con><mtwo|\<ast\>|\<ast\>|0|\<ast\>><pmod|N><right|}>,
    </equation*>

    then <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))(1)=M<rsub|k>(\<Gamma\><rsub|0>(N))>.
  </remark>

  <section|Representation and Arithmetic>

  <\lemma>
    <label|lem:dual>The groups <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>> and
    <with|mode|math|<Hom>((<Z>/N<Z>)<rsup|\<ast\>>,<C><rsup|\<ast\>>)<isom>D(N,<C><rsup|\<ast\>>)>
    are non-canonically isomorphic.
  </lemma>

  <\proof>
    This follows from the more general fact that for any abelian group
    <with|mode|math|G>, we have that <with|mode|math|G<ncisom><Hom>(G,<C><rsup|\<ast\>>)>.
    To prove that this latter non-canonical isomorphism exists, first reduce
    to the case when <with|mode|math|G> is cyclic of order
    <with|mode|math|n>, in which case the statement follows because
    <with|mode|math|\<zeta\><rsub|n>\<in\><C><rsup|\<ast\>>>, so
    <with|mode|math|<Hom>(G,<C><rsup|\<ast\>>)<isom><Hom>(G,\<langle\>\<zeta\><rsub|n>\<rangle\>)>
    is also cyclic of order <with|mode|math|n>.
  </proof>

  <\corollary>
    <label|cor:dir>We have <with|mode|math|#D(N,R)\<mid\><vphi>(N)>, with
    equality if and only if the order of our choice of
    <with|mode|math|\<zeta\>\<in\>R> is a multiple of the exponent of the
    group <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>.
  </corollary>

  <\example>
    The group <with|mode|math|D(5,<C>)> has elements
    <with|mode|math|{[1],[i],[-1],[-i]}>, so is cyclic of order
    <with|mode|math|<vphi>(5)=4>. In contrast, the group
    <with|mode|math|D(5,<Q>)> has only the two elements <with|mode|math|[1]>
    and <with|mode|math|[-1]> and order <with|mode|math|2>.
  </example>

  Fix a positive integer <with|mode|math|N>, and write
  <with|mode|math|N=<big|prod><rsub|i=1><rsup|n>p<rsub|i><rsup|e<rsub|i>>>
  where <with|mode|math|p<rsub|1>\<less\>p<rsub|2>\<less\>\<cdots\>\<less\>p<rsub|n>>
  are the prime divisors of <with|mode|math|N>. By
  <exref|ch:dirichlet|ex:cyclic>, each factor
  <with|mode|math|(<Z>/p<rsub|i><rsup|e<rsub|i>><Z>)<rsup|\<ast\>>> is a
  cyclic group <with|mode|math|C<rsub|i>=\<langle\>g<rsub|i>\<rangle\>>,
  except if <with|mode|math|p<rsub|1>=2> and
  <with|mode|math|e<rsub|1>\<geq\>3>, in which case
  <with|mode|math|(<Z>/p<rsub|1><rsup|e<rsub|1>><Z>)<rsup|\<ast\>>> is a
  product of the cyclic subgroup <with|mode|math|C<rsub|0>=\<langle\>-1\<rangle\>>
  of order <with|mode|math|2> with the cyclic subgroup
  <with|mode|math|C<rsub|1>=\<langle\>5\<rangle\>>. In all cases we have

  <\equation*>
    (<Z>/N<Z>)<rsup|\<ast\>><isom><big|prod><rsub|0\<leq\>i\<leq\>n>C<rsub|i>=<big|prod><rsub|0\<leq\>i\<leq\>n>\<langle\>g<rsub|i>\<rangle\>.
  </equation*>

  For <with|mode|math|i> such that <with|mode|math|p<rsub|i>\<gtr\>2>, choose
  the generator <with|mode|math|g<rsub|i>> of <with|mode|math|C<rsub|i>> to
  be the element of <with|mode|math|{2,3,\<ldots\>,p<rsub|i><rsup|e<rsub|i>>-1}>
  that is smallest and generates. Finally, use the Chinese Remainder Theorem
  (see <cite|cohen:course> (S))) to lift each <with|mode|math|g<rsub|i>> to
  an element in <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>, also denoted
  <with|mode|math|g<rsub|i>>, that is <with|mode|math|1> modulo each
  <with|mode|math|p<rsub|j><rsup|e<rsub|j>>> for <with|mode|math|j\<neq\>i>.

  <algorithm|Minimal generator for <with|mode|math|(<Z>/p<rsup|r><Z>)<rsup|\<ast\>>>|<label|alg:mingens>Given
  an odd prime power <with|mode|math|p<rsup|r>>, this algorithm computes a
  minimal generator for <with|mode|math|(<Z>/p<rsup|r><Z>)<rsup|\<ast\>>>.
  <\steps>
    <item>[Factor Group Order] Factor <with|mode|math|n=\<phi\>(p<rsup|r>)=p<rsup|r-1>\<cdot\>2\<cdot\>((p-1)/2)>
    as a product <with|mode|math|<big|prod>p<rsub|i><rsup|e<rsub|i>>> of
    primes. This is equivalent in difficulty to factoring
    <with|mode|math|(p-1)/2>. (See chapters 8 and 10 of <cite|cohen:course>
    for integer factorization algorithms.)

    <item>[Initialize]<label|step:gen>Set <with|mode|math|g<set>2>.

    <item>[Generator?] Using the binary powering algorithm (see
    <cite|cohen:course> (S)), compute <with|mode|math|g<rsup|n/p<rsub|i>><pmod|p<rsup|r>>>,
    for each prime divisor <with|mode|math|p<rsub|i>> of <with|mode|math|n>.
    If any of these powers are <with|mode|math|1>, set
    <with|mode|math|g<set>g+1> and go to Step <reference|step:gen>. If no
    powers are <with|mode|math|1>, output <with|mode|math|g> and terminate.\ 
  </steps> > For the proof, see <exref|ch:dirichlet|ex:orderalg>.

  <\example>
    A minimal generator for <with|mode|math|(<Z>/49<Z>)<rsup|\<ast\>>> is
    <with|mode|math|3>. We have <with|mode|math|n=<vphi>(49)=42=2\<cdot\>3\<cdot\>7>,
    and

    <\equation*>
      2<rsup|n/2><con>1,<space|2fn>2<rsup|n/3><con>18,<space|2fn>2<rsup|n/7><con>15<pmod|49>.
    </equation*>

    so <with|mode|math|2> is not a generator for
    <with|mode|math|(<Z>/49<Z>)<rsup|\<ast\>>>. (We see this just from
    <with|mode|math|2<rsup|n/2><con>1<pmod|49>>.) However

    <\equation*>
      3<rsup|n/2><con>48,<space|2fn>3<rsup|n/3><con>30,<space|2fn>3<rsup|n/7><con>43<pmod|49>.
    </equation*>
  </example>

  <\example>
    <label|ex:mingens>In this example we compute minimal generators for
    <with|mode|math|N=25>, <with|mode|math|100>, and <with|mode|math|200>:

    <\enumerate>
      <item>The minimal generator for <with|mode|math|(<Z>/25<Z>)<rsup|\<ast\>>>
      is <with|mode|math|2>.

      <item>Minimal generators for <with|mode|math|(<Z>/100<Z>)<rsup|\<ast\>>>,
      lifted to numbers modulo <with|mode|math|100>, are
      <with|mode|math|g<rsub|0>=51>, <with|mode|math|g<rsub|1>=1> and
      <with|mode|math|g<rsub|2>=77>. Notice that
      <with|mode|math|g<rsub|0><con>-1<pmod|4>> and
      <with|mode|math|g<rsub|0><con>1<pmod|25>>, that
      <with|mode|math|g<rsub|1>=1> since <with|mode|math|2\<mid\>N>, but
      <with|mode|math|8\<nmid\>N>, and <with|mode|math|g<rsub|2><con>2<pmod|25>>
      is the minimal generator modulo <with|mode|math|25>.

      <item>Minimal generators for <with|mode|math|(<Z>/200<Z>)<rsup|\<ast\>>>,
      lifted to numbers modulo <with|mode|math|200>, are
      <with|mode|math|g<rsub|0>=151>, <with|mode|math|g<rsub|1>=101>, and
      <with|mode|math|g<rsub|2>=177>. Note that
      <with|mode|math|g<rsub|0><con>-1<pmod|4>>, that
      <with|mode|math|g<rsub|1><con>5<pmod|8>>, and
      <with|mode|math|g<rsub|2><con>2<pmod|25>>.
    </enumerate>
  </example>

  Fix an element <with|mode|math|\<zeta\>> of finite multiplicative order in
  a ring <with|mode|math|R>, and let <with|mode|math|D(N,R)> denote the group
  of Dirichlet characters modulo <with|mode|math|N> over <with|mode|math|R>,
  with image in <with|mode|math|\<langle\>\<zeta\>\<rangle\><union>{0}>. We
  specify an element <with|mode|math|<eps>\<in\>D(N,R)> by giving the list

  <\equation>
    <label|eqn:epslist>[<eps>(g<rsub|0>),<eps>(g<rsub|1>),\<ldots\>,<eps>(g<rsub|n>)]
  </equation>

  of images of the generators of <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>.
  (Note if <with|mode|math|N> is even, the number of elements of the list
  (<reference|eqn:epslist>) does <with|font-shape|italic|not> depend on
  whether or not <with|mode|math|8\<mid\>N>---there are always two factors
  corresponding to <with|mode|math|2>.) This representation completely
  determines <with|mode|math|<eps>> and is convenient for arithmetic
  operations with Dirichlet characters. It is analogous to representing a
  linear transformation by a matrix. See Section <reference|sec:alter> for a
  discussion of alternative ways to represent Dirichlet characters.

  <\example>
    <label|ex:char>If <with|mode|math|N=200>, then
    <with|mode|math|g<rsub|0>=151>, <with|mode|math|g<rsub|1>=101> and
    <with|mode|math|g<rsub|2>=177>, as we saw in Example
    <reference|ex:mingens>. The exponent of
    <with|mode|math|(<Z>/200<Z>)<rsup|\<ast\>>> is <with|mode|math|20>, since
    that is the least common multiple of the exponents of
    <with|mode|math|4=#(<Z>/8<Z>)<rsup|\<ast\>>> and
    <with|mode|math|20=#(<Z>/25<Z>)<rsup|\<ast\>>>. The orders of
    <with|mode|math|g<rsub|0>>, <with|mode|math|g<rsub|1>> and
    <with|mode|math|g<rsub|2>> are <with|mode|math|2>, <with|mode|math|2>,
    and <with|mode|math|20>. Let <with|mode|math|\<zeta\>=\<zeta\><rsub|20>>
    be a primitive <with|mode|math|20>th root of unity in
    <with|mode|math|<C>>. Then the following are generators for
    <with|mode|math|D(20,<C>)>:

    <\equation*>
      <eps><rsub|0>=[-1,1,1],<space|2fn><eps><rsub|1>=[1,-1,1],<space|2fn><eps><rsub|2>=[1,1,\<zeta\>],
    </equation*>

    and <with|mode|math|<eps>=[1,-1,\<zeta\><rsup|5>]> is an example element
    of order <with|mode|math|4>. To evaluate <with|mode|math|<eps>(3)>, we
    write <with|mode|math|3> in terms of <with|mode|math|g<rsub|0>>,
    <with|mode|math|g<rsub|1>>, and <with|mode|math|g<rsub|2>>. First,
    reducing <with|mode|math|3> modulo <with|mode|math|8>, we see that
    <with|mode|math|3<con>g<rsub|0>\<cdot\>g<rsub|1><pmod|8>>. Next reducing
    <with|mode|math|3> modulo <with|mode|math|25>, and trying powers of
    <with|mode|math|g<rsub|2>=2>, we find that
    <with|mode|math|e<con>g<rsub|2><rsup|7><pmod|25>>. Thus

    <\align*>
      <tformat|<table|<row|<cell|<eps>(3)>|<cell|=<eps>(g<rsub|0>\<cdot\>g<rsub|1>\<cdot\>g<rsub|2><rsup|7>)>>|<row|<cell|>|<cell|=<eps>(g<rsub|0>)<eps>(g<rsub|1>)<eps>(g<rsub|2>)<rsup|7>>>|<row|<cell|>|<cell|=1\<cdot\>(-1)\<cdot\>(\<zeta\><rsup|5>)<rsup|7>>>|<row|<cell|>|<cell|=-\<zeta\><rsup|35>=-\<zeta\><rsup|15>.>>>>
    </align*>
  </example>

  Example <reference|ex:char> illustrates that if <with|mode|math|<eps>> is
  represented using a list as described above, evaluation of
  <with|mode|math|<eps>> on an arbitrary integer is inefficient without extra
  information; it requires solving the discrete log problem in
  <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>. In fact, for a general character
  <with|mode|math|<eps>> calculation of <with|mode|math|<eps>> will probably
  be at least as hard as finding discrete logarithms no matter what
  representation we use (quadratic characters are easier---see Algorithm
  <reference|alg:kronecker>). <algorithm|Evaluate
  <with|mode|math|<eps>>|<label|alg:eval>Given a Dirichlet character
  <with|mode|math|<eps>> modulo <with|mode|math|N>, represented by a list
  <with|mode|math|[<eps>(g<rsub|0>),<eps>(g<rsub|1>),\<ldots\>,<eps>(g<rsub|n>)]>,
  and an integer <with|mode|math|a>, this algorithm computes
  <with|mode|math|<eps>(a)>. <\steps>
    <item>[GCD] Compute <with|mode|math|g=gcd(a,N)>. If
    <with|mode|math|g\<gtr\>1>, output <with|mode|math|0> and terminate.

    <item>[Discrete Log]<label|step:eval>For each <with|mode|math|i>, write
    <with|mode|math|a<pmod|p<rsub|i><rsup|e<rsub|i>>>> as a power
    <with|mode|math|m<rsub|i>> of <with|mode|math|g<rsub|i>> using some
    algorithm for solving the discrete log problem (see below). (If
    <with|mode|math|p<rsub|i>=2>, write <with|mode|math|a<pmod|p<rsub|i><rsup|e<rsub|i>>>>
    as <with|mode|math|(-1)<rsup|m<rsub|0>>\<cdot\>5<rsup|m<rsub|1>>>.) This
    step is analogous to writing a vector in terms of a basis.

    <item>[Multiply] Compute and output <with|mode|math|<big|prod><eps>(g<rsub|i>)<rsup|m<rsub|i>>>
    as an element of <with|mode|math|R>, and terminate. This is analogous to
    multiplying a matrix times a vector.\ 
  </steps> > By <exref|ch:dirichlet|ex:dlogadd> we have an isomorphism of
  groups

  <\equation*>
    (1+p<rsup|n-1>(<Z>/p<rsup|n><Z>),<space|0.25spc>\<times\>)<isom>(<Z>/p<Z>,<space|0.25spc>+),
  </equation*>

  so one sees by induction that Step <reference|step:eval> is ``about as
  difficult'' as finding a discrete log in
  <with|mode|math|(<Z>/p<Z>)<rsup|\<ast\>>>. There is an algorithm called
  ``baby-step giant-step'', which solves the discrete log problem in
  <with|mode|math|(<Z>/p<Z>)<rsup|\<ast\>>> in time
  <with|mode|math|O(<sqrt|\<ell\>>)>, where <with|mode|math|\<ell\>> is the
  largest prime factor of <with|mode|math|p-1=#(<Z>/p<Z>)<rsup|\<ast\>>>
  (note that the discrete log problem in <with|mode|math|(<Z>/p<Z>)<rsup|\<ast\>>>
  reduces to a series of discrete log problems in each prime order cyclic
  factor). This is unfortunately still exponential in the number of digits of
  <with|mode|math|\<ell\>>. <algorithm|Baby-Step Giant Step Discrete
  Log|<label|alg:baby>Given a prime <with|mode|math|p>, a generator
  <with|mode|math|g> of <with|mode|math|(<Z>/p<Z>)<rsup|\<ast\>>>, and an
  element <with|mode|math|a\<in\>(<Z>/p<Z>)<rsup|\<ast\>>>, this algorithm
  finds an <with|mode|math|n> such that <with|mode|math|g<rsup|n>=a>. (Note
  that this algorithm works in any cyclic group, not just
  <with|mode|math|(<Z>/p<Z>)<rsup|\<ast\>>>.) <\steps>
    <item>[Make Lists] Let <with|mode|math|m=\<lceil\><sqrt|p>\<rceil\>> be
    the ceiling of <with|mode|math|<sqrt|p>>, and construct two lists

    <\equation*>
      g,<space|0.25spc>g<rsup|m>,<space|0.25spc>\<ldots\>,<space|0.25spc>g<rsup|(m-1)m>,g<rsup|m<rsup|2>><space|2fn><space|2fn><with|mode|text|(giant
      steps)>
    </equation*>

    and

    <\equation*>
      a*g,<space|0.25spc>a*g<rsup|2>,<space|0.25spc>\<ldots\>,<space|0.25spc>a*g<rsup|m-1>,a*g<rsup|m><space|2fn><space|2fn><with|mode|text|(baby
      steps)>.
    </equation*>

    <item>[Find Match]<label|step:find>Sort the two lists and find a match
    <with|mode|math|g<rsup|i*m>=a*g<rsup|j>>. Then
    <with|mode|math|a=g<rsup|i*m-j>>.\ 
  </steps> >

  <\proof>
    We prove that there will always be a match. Since we know that
    <with|mode|math|a=g<rsup|k>> for some <with|mode|math|k> with
    <with|mode|math|0\<leq\>k\<leq\>p-1> and any such <with|mode|math|k> can
    be written in the form <with|mode|math|i*m-j> for
    <with|mode|math|0\<leq\>i,j\<leq\>m-1>, we will find such a match.
  </proof>

  Algorithm <reference|alg:baby> uses nothing special about
  <with|mode|math|(<Z>/p<Z>)<rsup|\<ast\>>>, so it works in a generic group.
  It is a theorem that there is no faster algorithm to find discrete logs in
  a ``generic group'' (see <cite|shoup:lower|nechaev:lower>). Fortunately
  there are much better subexponential algorithms for solving the discrete
  log problem in <with|mode|math|(<Z>/p<Z>)<rsup|\<ast\>>>, which use the
  special structure of this group. They use the number field sieve (see e.g.,
  <cite|gordon:dlog>), which is also the best known algorithm for factoring
  integers. This class of algorithms has been very well studied by
  cryptographers; though sub-exponential, solving discrete log problems when
  <with|mode|math|p> is large is still extremely difficult. For a more
  in-depth survey see <cite|gordon:dlp>.

  <\example>
    MAGMA contains an algorithm to compute discrete logarithms in
    <with|mode|math|(<Z>/p<Z>)<rsup|\<ast\>>> for small <with|mode|math|p>.
    Using a Pentium-M 1.8Ghz, I used MAGMA to compute a few discrete logs.
    The commands below create <with|mode|math|<Z>/p<Z>> in MAGMA, then let
    <with|mode|math|U> be the unit group <with|mode|math|(<Z>/p<Z>)<rsup|\<ast\>>>,
    and finally find the power of the minimal generator that equals
    <with|mode|math|100>. The resulting timings below are horrible. After a
    few seconds of discussion with Allan Steel of MAGMA, it emerged that the
    MAGMA code below causes MAGMA V2.11-8 to use an <with|mode|math|O(p)>
    check through all possibilities. Presumably, this will be fixed soon.\ 

    <\verbatim>
      \<gtr\> G := Integers(NextPrime(10^5)); U,f := UnitGroup(G);

      \<gtr\> time 100@@f;

      54580*U.1

      Time: 0.000

      \<gtr\> G := Integers(NextPrime(10^6)); U,f := UnitGroup(G);

      \<gtr\> time 100@@f;

      584760*U.1

      Time: 0.020

      \<gtr\> G := Integers(NextPrime(10^7)); U,f := UnitGroup(G);

      \<gtr\> time 100@@f;

      9305132*U.1

      Time: 0.320

      \<gtr\> G := Integers(NextPrime(10^8)); U,f := UnitGroup(G);

      \<gtr\> time 100@@f;

      83605942*U.1

      Time: 2.940

      \<gtr\> G := Integers(NextPrime(10^9)); U,f := UnitGroup(G);\ 

      \<gtr\> time 100@@f;

      763676566*U.1

      Time: 27.780

      \<gtr\> G := Integers(NextPrime(10^10)); U,f := UnitGroup(G);

      \<gtr\> time 100@@f;

      8121975284*U.1

      Time: 3150.470
    </verbatim>

    Currently the <with|font-shape|italic|right> way to request computation
    of a discrete logarithm in MAGMA is to use the <with|font-family|tt|Log>
    command. Using this command we obtain the above logarithms much more
    quickly:\ 

    <\verbatim>
      \<gtr\> p := NextPrime(10^5); k := GF(p); a := k!PrimitiveRoot(p);

      \<gtr\> time Log(k!a, k!100);

      54580

      Time: 0.000

      \<gtr\> p := NextPrime(10^8); k := GF(p); a := k!PrimitiveRoot(p);

      \<gtr\> time Log(k!a, k!100);

      83605942

      Time: 0.000

      \<gtr\> p := NextPrime(10^12); k := GF(p); a := k!PrimitiveRoot(p);

      \<gtr\> time Log(k!a, k!100);

      837165108486

      Time: 0.000

      \<gtr\> p := NextPrime(10^15); k := GF(p); a := k!PrimitiveRoot(p);

      \<gtr\> time Log(k!a, k!100);

      543584576740840

      Time: 0.060

      \<gtr\> p := NextPrime(10^20); k := GF(p); a := k!PrimitiveRoot(p);

      \<gtr\> time Log(k!a, k!100);

      55635183831704631320

      Time: 0.210

      \<gtr\> p := NextPrime(10^25); k := GF(p); a := k!PrimitiveRoot(p);

      \<gtr\> time Log(k!a, k!100);

      8669816947492932609764592

      Time: 0.480

      \<gtr\> p := NextPrime(10^35); k := GF(p); a := k!PrimitiveRoot(p);

      \<gtr\> time Log(k!a, k!100);

      28138566543929117345335749648530454

      Time: 5.610

      \<gtr\> Factorization(p-1);

      [ \<less\>2, 2\<gtr\>, \<less\>3, 1\<gtr\>, \<less\>31, 1\<gtr\>,
      \<less\>59, 1\<gtr\>, \<less\>36289857533, 1\<gtr\>,\ 

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \<less\>125550886981850531627,
      1\<gtr\> ]

      \<gtr\> p := NextPrime(p);

      \<gtr\> Factorization(p-1);

      [ \<less\>2, 1\<gtr\>, \<less\>72229, 1\<gtr\>,
      \<less\>692242727990142463553420371319, 1\<gtr\> ]

      \<gtr\> k := GF(p); a := k!PrimitiveRoot(p);

      \<gtr\> time Log(k!a, k!100);

      23346611965343882546546326674895020

      Time: 4.940
    </verbatim>

    Thus one can deal with primes having around <with|mode|math|35> digits in
    a few seconds. Moral: Having an understanding of the theoretical
    complexity of an algorithm, is much better than just some timing with an
    implementation, becuause you might unwittingly misuse the implementation.
  </example>

  The specific applications of Dirichlet characters in this book involve
  computing modular forms, and for these applications <with|mode|math|N> will
  be fairly small, e.g., <with|mode|math|N\<less\>10<rsup|6>>. Also we will
  evaluate <with|mode|math|<eps>> on a <with|font-shape|italic|huge> number
  of random elements, inside inner loops of algorithms. Thus for our purposes
  it will often be better to make a table of all values of
  <with|mode|math|<eps>>, so that evaluation of <with|mode|math|<eps>> is
  extremely fast. The following algorithm computes a table of all values of
  <with|mode|math|<eps>>, and it does not require computing any discrete logs
  since we are computing <with|font-shape|italic|all> values.

  <\algorithm|Values of <with|mode|math|<eps>>>
    \ Given a Dirichlet character <with|mode|math|<eps>> represented by the
    list of values of <with|mode|math|<eps>> on the minimal generators
    <with|mode|math|g<rsub|i>> of <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>,
    this algorithm creates a list of all the values of
    <with|mode|math|<eps>>. <\steps>
      <item>[Initialize] For each minimal generator
      <with|mode|math|g<rsub|i>>, set <with|mode|math|a<rsub|i><set>0>. Let
      <with|mode|math|n=<big|prod>g<rsub|i><rsup|a<rsub|i>>>, and set
      <with|mode|math|z<set>1>. Create a list <with|mode|math|v> of
      <with|mode|math|N> values, all initially set equal to
      <with|mode|math|0>. When this algorithm terminates the list
      <with|mode|math|v> will have the property that

      <\equation*>
        v<space|0.25spc><space|0.25spc>[x<space|-0.25spc><space|-0.25spc><space|-0.25spc><space|-0.25spc><space|-0.25spc><pmod|N>]=<eps>(x).
      </equation*>

      Notice that we index <with|mode|math|v> starting at <with|mode|math|0>.

      <item>[Add Value to Table]<label|step:add>Set
      <with|mode|math|v[n]<set>z>.

      <item>[Finished?] If each <with|mode|math|a<rsub|i>> is one less than
      the order of <with|mode|math|g<rsub|i>>, output <with|mode|math|v> and
      terminate.

      <item>[Increment] Set <with|mode|math|a<rsub|0><set>a<rsub|0>+1>,
      <with|mode|math|n<set>n\<cdot\>g<rsub|0><pmod|N>>, and
      <with|mode|math|z<set>z\<cdot\><eps>(g<rsub|0>)>. If
      <with|mode|math|a<rsub|0>\<geq\><ord>(g<rsub|0>)>, set
      <with|mode|math|a<rsub|0>\<to\>0>, then set
      <with|mode|math|a<rsub|1><set>a<rsub|1>+1>,
      <with|mode|math|n<set>n\<cdot\>g<rsub|1><pmod|N>>, and
      <with|mode|math|z<set>z\<cdot\><eps>(g<rsub|1>)>. If
      <with|mode|math|a<rsub|1>\<geq\><ord>(g<rsub|1>)>, do what you just did
      with <with|mode|math|a<rsub|0>>, but with all subscripts replaced by
      <with|mode|math|1>. Etc. (Imagine a car odometer.) Go to Step
      <reference|step:add>.\ 
    </steps>\ 
  </algorithm>

  Frequently people describe quadratic characters in terms of the Kronecker
  symbol. The following algorithm gives a way to go between the two
  representations.

  <algorithm|Kronecker Symbol|<label|alg:kronecker>Given an integer
  <with|mode|math|N>, this algorithm computes a representation of the
  Kronecker symbol <with|mode|math|<kr|a|N>> as a Dirichlet character.
  <\steps>
    <item>Compute the minimal generators <with|mode|math|g<rsub|i>> of
    <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>> using Algorithm
    <reference|alg:mingens>.

    <item>Compute <with|mode|math|<kr|g<rsub|i>|N>> for each
    <with|mode|math|g<rsub|i>> using one of the algorithms of
    <cite|cohen:course> (S).\ 
  </steps> >

  <\remark>
    The algorithms in <cite|cohen:course> (S) for computing the Kronecker
    symbol run in time quadratic in the number of digits of the input, so
    they do not require computing discrete logarithms. (They use, e.g., that
    <with|mode|math|<kr|a|p><con>a<rsup|(p-1)/2><pmod|p>>, when
    <with|mode|math|p> is an odd prime.) If <with|mode|math|N> is very large
    and we are only interested in evaluating
    <with|mode|math|<eps>(a)=<kr|a|N>> for a few <with|mode|math|a>, then
    viewing <with|mode|math|<eps>> as a Dirichlet character in the sense of
    this chapter leads to a less efficient way to compute with
    <with|mode|math|<eps>>. The algorithmic discussion of characters in this
    chapter is most useful for working with the full group of characters, and
    characters that cannot be expressed in terms of Kronecker characters.
  </remark>

  <\example>
    We compute the Dirichlet character associated to the Kronecker symbol
    <with|mode|math|<kr|a|200>>. Using PARI, we find that
    <with|mode|math|<kr|g<rsub|i>|200>>, for <with|mode|math|i=0,1,2>, where
    the <with|mode|math|g<rsub|i>> are as in Example <reference|ex:char>:\ 

    <\verbatim>
      ? kronecker(151,200)

      1

      ? kronecker(101,200)

      -1

      ? kronecker(177,200)

      1
    </verbatim>

    Thus the corresponding character is defined by <with|mode|math|[1,-1,1]>.
  </example>

  <\remark>
    [Elkies] Jacobi reciprocity must be used to efficiently compute the
    Jacobi symbol <with|mode|math|<kr|m|n>>. It's faster than computing
    <with|mode|math|a<rsup|(p-1)/2>> when <with|mode|math|p> is prime, but
    more significantly it makes it possible to compute Jacobi symbols
    <with|mode|math|<kr|m|n>> for all <with|mode|math|m,n> without knowing
    the factorization of <with|mode|math|n>---which of course would be a
    computation much longer than quadratic.
  </remark>

  <\example>
    We compute the character associated to <with|mode|math|<kr|a|420>>. We
    have <with|mode|math|420=4\<cdot\>3\<cdot\>5\<cdot\>7>, and minimal
    generators are

    <\equation*>
      g<rsub|0>=211,<space|1fn>g<rsub|1>=1,<space|1fn>g<rsub|2>=281,<space|1fn>g<rsub|3>=337,<space|1fn>g<rsub|4>=241.
    </equation*>

    We have <with|mode|math|g<rsub|0><con>-1<pmod|4>>,
    <with|mode|math|g<rsub|2><con>2<pmod|3>>,
    <with|mode|math|g<rsub|3><con>2<pmod|5>> and
    <with|mode|math|g<rsub|4><con>3<pmod|7>>. Using PARI again we find
    <with|mode|math|<kr|g<rsub|0>|420>=<kr|g<rsub|1>|420>=1> and
    <with|mode|math|<kr|g<rsub|2>|420>=<kr|g<rsub|3>|420>=<kr|g<rsub|4>|420>=-1>,
    so the corresponding character is <with|mode|math|[1,1,-1,-1,-1]>.
  </example>

  <section|Algorithms>

  The following algorithm for computing the order of <with|mode|math|<eps>>
  reduces the problem to computing the orders of powers of
  <with|mode|math|\<zeta\>> in <with|mode|math|R>. <algorithm|Order of
  Character|<label|alg:dir>This algorithm computes the order of a Dirichlet
  character <with|mode|math|<eps>\<in\>D(N,R)>. <\steps>
    <item>Compute the order <with|mode|math|r<rsub|i>> of each
    <with|mode|math|<eps>(g<rsub|i>)>, for each minimal generator
    <with|mode|math|g<rsub|i>> of <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>.
    Since the order of <with|mode|math|<eps>(g<rsub|i>)> is divisor of
    <with|mode|math|n=#(<Z>/p<rsub|i><rsup|e<rsub|i>><Z>)<rsup|\<ast\>>>, we
    can compute its order by factoring <with|mode|math|n> and considering the
    divisors of <with|mode|math|n>.

    <item>Compute and output the least commmon multiple of the integers
    <with|mode|math|r<rsub|i>>.\ 
  </steps> >

  <\remark>
    Computing the order of <with|mode|math|<eps>(g<rsub|i>)\<in\>R> is
    potentially difficult and tedious. Using a different (simultaneous)
    representation of Dirichlet characters avoids having to compute the order
    of elements of <with|mode|math|R>. See Section <reference|sec:alter>.
  </remark>

  The next algorithm factors <with|mode|math|<eps>> as a product of ``local''
  characters, one for each prime divisor of <with|mode|math|N>. It is useful
  for other algorithms, and also for explicit computations with the Hijikita
  trace formula (see <cite|hijikata:trace>). This factorization is easy to
  compute because of how we represent <with|mode|math|<eps>>.

  <algorithm|Factorization of Character|<label|alg:dirfac>Given a Dirichlet
  character <with|mode|math|<eps>\<in\>D(N,R)>, with
  <with|mode|math|N=<big|prod>p<rsub|i><rsup|e<rsub|i>>>, this algorithm
  finds Dirichlet characters <with|mode|math|<eps><rsub|i>> modulo
  <with|mode|math|p<rsub|i><rsup|e<rsub|i>>>, such that for all
  <with|mode|math|a\<in\>(<Z>/N<Z>)<rsup|\<ast\>>>, we have
  <with|mode|math|<eps>(a)=<big|prod><eps><rsub|i>(a<space|-0.25spc><space|-0.25spc><pmod|p<rsub|i><rsup|e<rsub|i>>>)>.
  If <with|mode|math|2\<mid\>N>, the steps are as follows: <\steps>
    <item>Let <with|mode|math|g<rsub|i>> be the minimal generators of
    <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>, so <with|mode|math|<eps>> is
    given by a list

    <\equation*>
      [<eps>(g<rsub|0>),\<ldots\>,<eps>(g<rsub|n>)].
    </equation*>

    <item><label|step:singletons>For <with|mode|math|i=2,\<ldots\>,n>, let
    <with|mode|math|<eps><rsub|i>> be the element of
    <with|mode|math|D(p<rsub|i><rsup|e<rsub|i>>,R)> defined by the singleton
    list <with|mode|math|[<eps>(g<rsub|i>)]>.

    <item><label|step:extra2>Let <with|mode|math|<eps><rsub|1>> be the
    element of <with|mode|math|D(2<rsup|e<rsub|1>>,R)> defined by the list
    <with|mode|math|[<eps>(g<rsub|0>),<eps>(g<rsub|1>)]> of length
    <with|mode|math|2>. Output the <with|mode|math|<eps><rsub|i>> and
    terminate.\ 
  </steps> If <with|mode|math|2\<nmid\>N>, then omit Step
  <reference|step:extra2>, and include all <with|mode|math|i> in Step
  <reference|step:singletons>. > The factorization of Algorithm
  <reference|alg:dirfac> is unique since each <with|mode|math|<eps><rsub|i>>
  is determined by the image of the canonical map
  <with|mode|math|(<Z>/p<rsub|i><rsup|e<rsub|i>><Z>)<rsup|\<ast\>>> in
  <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>, which sends
  <with|mode|math|a<pmod|p<rsub|i><rsup|e<rsub|i>>>> to the element of
  <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>> that is
  <with|mode|math|a<pmod|p<rsub|i><rsup|e<rsub|i>>>> and
  <with|mode|math|1<pmod|p<rsub|j><rsup|e<rsub|j>>>> for
  <with|mode|math|j\<neq\>i>.

  <\example>
    <label|ex:prodlocal>If <with|mode|math|<eps>=[1,-1,\<zeta\><rsup|5>]\<in\>D(200,<C>)>,
    then <with|mode|math|<eps><rsub|1>=[1,-1]\<in\>D(8,<C>)> and
    <with|mode|math|<eps><rsub|2>=[\<zeta\><rsup|5>]\<in\>D(25,<C>)>.
  </example>

  <\definition>
    [Conductor] The <defn|conductor> of a Dirichlet character
    <with|mode|math|<eps>\<in\>D(N,R)> is the smallest positive divisor
    <with|mode|math|c\<mid\>N> such that there is a character
    <with|mode|math|<eps><rprime|'>\<in\>D(c,R)> for which
    <with|mode|math|<eps>(a)=<eps><rprime|'>(a)> for all
    <with|mode|math|a\<in\><Z>> with <with|mode|math|(a,N)=1>. A Dirichlet
    character is <defn|primitive> if its modulus equals its conductor. The
    character <with|mode|math|<eps><rprime|'>> associated to
    <with|mode|math|<eps>> with modulus equal to the conductor of
    <with|mode|math|<eps>> is called the <defn|primitive character associated
    to> <with|mode|math|<eps>>.
  </definition>

  We will be interested in conductors later, when computing new subspaces of
  spaces of modular forms with character. Also certain formulas for special
  values of <with|mode|math|L> functions are only valid for primitive
  characters.

  <algorithm|Conductor|<label|alg:conductor>This algorithm computes the
  conductor of a Dirichlet character <with|mode|math|<eps>\<in\>D(N,R)>.
  <\steps>
    <item>[Factor Character]<label|step:factor>Using Algorithm
    <reference|alg:dirfac>, find characters <with|mode|math|<eps><rsub|i>>
    whose product is <with|mode|math|<eps>>.

    <item>[Compute Orders] Using Algorithm <reference|alg:dir>, compute the
    orders <with|mode|math|r<rsub|i>> of each <with|mode|math|<eps><rsub|i>>.

    <item>[Conductors of Factors]<label|step:cond>For each
    <with|mode|math|i>, either set <with|mode|math|c<rsub|i>\<to\>1> if
    <with|mode|math|<eps><rsub|i>> is the trivial character (i.e., of order
    <with|mode|math|1>), or set <with|mode|math|c<rsub|i><set>p<rsub|i><rsup|<ord><rsub|p<rsub|i>>(r<rsub|i>)+1>>,
    where <with|mode|math|<ord><rsub|p>(n)> is the largest power of
    <with|mode|math|p> that divides <with|mode|math|n>.

    <item>[Adjust at <with|mode|math|2>?] If <with|mode|math|p<rsub|1>=2> and
    <with|mode|math|<eps><rsub|1>(5)\<neq\>1>, set
    <with|mode|math|c<rsub|1><set>2c<rsub|1>>.

    <item>[Finished] Output <with|mode|math|c=<big|prod>c<rsub|i>> and
    terminate.\ 
  </steps> >

  <\proof>
    Let <with|mode|math|<eps><rsub|i>> be the local factors of
    <with|mode|math|<eps>>, as in Step <reference|step:factor>. We first show
    that the product of the conductors <with|mode|math|f<rsub|i>> of the
    <with|mode|math|<eps><rsub|i>> is the conductor <with|mode|math|f> of
    <with|mode|math|<eps>>. Since <with|mode|math|<eps><rsub|i>> factors
    through <with|mode|math|(<Z>/f<rsub|i><Z>)<rsup|\<ast\>>>, the product
    <with|mode|math|<eps>> of the <with|mode|math|<eps><rsub|i>> factors
    through <with|mode|math|(<Z>/<big|prod>f<rsub|i><Z>)<rsup|\<ast\>>>, so
    the conductor of <with|mode|math|<eps>> divides
    <with|mode|math|<big|prod>f<rsub|i>>. Conversely, if
    <with|mode|math|<ord><rsub|p<rsub|i>>(f)\<less\><ord><rsub|p<rsub|i>>(f<rsub|i>)>
    for some <with|mode|math|i>, then we could factor <with|mode|math|<eps>>
    as a product of local (prime power) characters differently, which
    contradicts that this factorization is unique.

    It remains to prove that if <with|mode|math|<eps>> is a nontrivial
    character modulo <with|mode|math|p<rsup|n>>, where <with|mode|math|p> is
    a prime, and <with|mode|math|r> is the order of <with|mode|math|<eps>>,
    then the conductor of <with|mode|math|<eps>> is
    <with|mode|math|p<rsup|<ord><rsub|p>(r)+1>>, except possibly if
    <with|mode|math|8\<mid\>p<rsup|n>>. Since the order and conductor of
    <with|mode|math|<eps>> and of the associated primitive character
    <with|mode|math|<eps><rprime|'>> are the same, we may assume
    <with|mode|math|<eps>> is primitive, i.e., that
    <with|mode|math|p<rsup|n>> is the conductor of <with|mode|math|<eps>>;
    note that that <with|mode|math|n\<gtr\>0>, since <with|mode|math|<eps>>
    is nontrivial.

    First suppose <with|mode|math|p> is odd. Then the abelian group
    <with|mode|math|D(p<rsup|n>,R)> splits as a direct sum
    <with|mode|math|D(p,R)\<oplus\>D(p<rsup|n>,R)<rprime|'>>, where
    <with|mode|math|D(p<rsup|n>,R)<rprime|'>> is the <with|mode|math|p>-power
    torsion subgroup of <with|mode|math|D(p<rsup|n>,R)>. Also
    <with|mode|math|<eps>> has order <with|mode|math|u\<cdot\>p<rsup|m>>,
    where <with|mode|math|u>, which is coprime to <with|mode|math|p>, is the
    order of the image of <with|mode|math|<eps>> in <with|mode|math|D(p,R)>
    and <with|mode|math|p<rsup|m>> is the order of the image in
    <with|mode|math|D(p<rsup|n>,R)<rprime|'>>. If <with|mode|math|m=0>, then
    the order of <with|mode|math|<eps>> is coprime to <with|mode|math|p>, so
    <with|mode|math|<eps>> is in <with|mode|math|D(p,R)>, which means that
    <with|mode|math|n=1>, so <with|mode|math|n=m+1>, as required. If
    <with|mode|math|m\<gtr\>0>, then <with|mode|math|\<zeta\>\<in\>R> must
    have order divisible by <with|mode|math|p>, so <with|mode|math|R> has
    characteristic not equal to <with|mode|math|p>. The conductor of
    <with|mode|math|<eps>> does not change if we adjoin roots of unity to
    <with|mode|math|R>, so in light of Lemma <reference|lem:dual> we may
    assume that <with|mode|math|D(N,R)<ncisom>(<Z>/N<Z>)<rsup|\<ast\>>>. It
    follows that for each <with|mode|math|n<rprime|'>\<leq\>n>, the
    <with|mode|math|p>-power subgroup <with|mode|math|D(p<rsup|n<rprime|'>>,R)<rprime|'>>
    of <with|mode|math|D(p<rsup|n<rprime|'>>,R)> is the
    <with|mode|math|p<rsup|n<rprime|'>-1>>-torsion subgroup of
    <with|mode|math|D(p<rsup|n>,R)<rprime|'>>. Thus <with|mode|math|m=n-1>,
    since <with|mode|math|D(p<rsup|n>,R)<rprime|'>> is by assumption the
    smallest such group that contains the projection of
    <with|mode|math|<eps>>. This proves the formula of Step
    <reference|step:cond>. We leave the argument when <with|mode|math|p=2> as
    an exercise (see <exref|ch:dirichlet|ex:cond2>).
  </proof>

  <\example>
    <label|ex:char>If <with|mode|math|<eps>=[1,-1,\<zeta\><rsup|5>]\<in\>D(200,<C>)>,
    then as we saw in Example <reference|ex:prodlocal>,
    <with|mode|math|<eps>> is the product of
    <with|mode|math|<eps><rsub|1>=[1,-1]> and
    <with|mode|math|<eps><rsub|2>=[\<zeta\><rsup|5>]>. Because
    <with|mode|math|<eps><rsub|1>(5)=-1>, the conductor of
    <with|mode|math|<eps><rsub|1>> is <with|mode|math|8>. The order of
    <with|mode|math|<eps><rsub|2>> is <with|mode|math|4> (since
    <with|mode|math|\<zeta\>> is a <with|mode|math|20>th root of unity), so
    the conductor of <with|mode|math|<eps><rsub|2>> is <with|mode|math|5>.
    Thus the conductor of <with|mode|math|<eps>> is
    <with|mode|math|40=8\<cdot\>5>.
  </example>

  The following two algorithms restrict and extend characters to a compatible
  modulus. Using them it is easy to define multiplication of two characters
  <with|mode|math|<eps>\<in\>D(N,R)> and <with|mode|math|<eps><rprime|'>\<in\>D(N<rprime|'>,R<rprime|'>)>,
  as long as <with|mode|math|R> and <with|mode|math|R<rprime|'>> are subrings
  of a common ring. To carry out the multiplication, just extend bother
  characters to characters modulo <with|mode|math|<lcm>(N,N<rprime|'>)>, then
  multiply.

  <algorithm|Restriction of Character|<label|alg:restrict>Given a Dirichlet
  character <with|mode|math|<eps>\<in\>D(N,R)> and a divisor
  <with|mode|math|N<rprime|'>> of <with|mode|math|N> that is a multiple of
  the conductor of <with|mode|math|<eps>>, this algorithm finds a characters
  <with|mode|math|<eps><rprime|'>\<in\>D(N<rprime|'>,R)>, such that
  <with|mode|math|<eps><rprime|'>(a)=<eps>(a)>, for all
  <with|mode|math|a\<in\><Z>> with <with|mode|math|(a,N)=1>. <\steps>
    <item>[Conductor] Compute the conductor of <with|mode|math|<eps>> using
    Algorithm <reference|alg:conductor>, and verify that indeed
    <with|mode|math|N<rprime|'>> is divisible by the conductor and divides
    <with|mode|math|N>.

    <item>[Minimal Generators] Compute the minimal generators
    <with|mode|math|g<rsub|i>> for <with|mode|math|(<Z>/N<rprime|'><Z>)<rsup|\<ast\>>>.

    <item>[Values of Restriction]<label|step:addmod>For each
    <with|mode|math|i>, compute <with|mode|math|<eps><rprime|'>(g<rsub|i>)>
    as follows. Find a multiple <with|mode|math|a*N<rprime|'>> of
    <with|mode|math|N<rprime|'>> such that
    <with|mode|math|(g<rsub|i>+a*N<rprime|'>,<space|0.25spc>N)=1>; then
    <with|mode|math|<eps><rprime|'>(g<rsub|i>)=<eps>(g<rsub|i>+a*N<rprime|'>)>.

    <item>[Output Character] Output the Dirichlet character modulo
    <with|mode|math|N<rprime|'>> defined by
    <with|mode|math|[<eps><rprime|'>(g<rsub|0>),\<ldots\>,<eps><rprime|'>(g<rsub|n>)]>.
    </steps> >

  <\proof>
    The only part that is not clear is that in Step <reference|step:addmod>
    there is an <with|mode|math|a> such that
    <with|mode|math|(g<rsub|i>+a*N<rprime|'>,N)=1>. If we write
    <with|mode|math|N=N<rsub|1>\<cdot\>N<rsub|2>>, with
    <with|mode|math|(N<rsub|1>,N<rsub|2>)=1>, and <with|mode|math|N<rsub|1>>
    divisible by all primes that divide <with|mode|math|N<rprime|'>>, then
    <with|mode|math|(g<rsub|i>,N<rsub|1>)=1> since
    <with|mode|math|(g<rsub|i>,N<rprime|'>)=1>. By the Chinese Remainder
    Theorem, there is an <with|mode|math|x\<in\><Z>> such that
    <with|mode|math|x<con>g<rsub|i><pmod|N<rsub|1>>> and
    <with|mode|math|x<con>1<pmod|N<rsub|2>>>. Then
    <with|mode|math|x=g<rsub|i>+b*N<rsub|1>=g<rsub|i>+(b*N<rsub|1>/N<rprime|'>)\<cdot\>N<rprime|'>>
    and <with|mode|math|(x,N)=1>, which completes the proof.
  </proof>

  <\algorithm|Extension of Character>
    <label|alg:extend>Given a Dirichlet character
    <with|mode|math|<eps>\<in\>D(N,R)> and a multiple
    <with|mode|math|N<rprime|'>> of <with|mode|math|N>, this algorithm finds
    a characters <with|mode|math|<eps><rprime|'>\<in\>D(N<rprime|'>,R)>, such
    that <with|mode|math|<eps><rprime|'>(a)=<eps>(a)>, for all
    <with|mode|math|a\<in\><Z>> with <with|mode|math|(a,N<rprime|'>)=1>.
    <\steps>
      <item>[Minimal Generators] Compute the minimal generators
      <with|mode|math|g<rsub|i>> for <with|mode|math|(<Z>/N<rprime|'><Z>)<rsup|\<ast\>>>.

      <item>[Evaluate] Compute <with|mode|math|<eps>(g<rsub|i>)> for each
      <with|mode|math|i>. Since <with|mode|math|(g<rsub|i>,N<rprime|'>)=1>,
      we also have <with|mode|math|(g<rsub|i>,N)=1>.

      <item>[Output Character] Output the character defined by
      <with|mode|math|[<eps>(g<rsub|0>),\<ldots\>,<eps>(g<rsub|n>)]>.\ 
    </steps>\ 
  </algorithm>

  We finish with an algorithm that computes the Galois orbit of an element in
  <with|mode|math|D(N,R)>. This can be used to divide <with|mode|math|D(N,R)>
  up into Galois orbits, which is useful for modular forms computations,
  because, e.g., the spaces <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))(<eps>)>
  and <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))(<eps><rprime|'>)> are
  canonically isomorphic if <with|mode|math|<eps>> and
  <with|mode|math|<eps><rprime|'>> are conjugate. <algorithm|Galois Orbit|
  Given a Dirichlet character <with|mode|math|<eps>\<in\>D(N,R)>, this
  algorithm computes the orbit of <with|mode|math|<eps>> under the action of
  <with|mode|math|G=<Gal>(<overline|F>/F)>, where <with|mode|math|F> is the
  prime subfield of <with|mode|math|<Frac>(R)>, so <with|mode|math|F=<Fp>> or
  <with|mode|math|<Q>>. <\steps>
    <item>[Order of <with|mode|math|\<zeta\>>] Let <with|mode|math|n> be the
    order of the chosen root <with|mode|math|\<zeta\>\<in\>R>.

    <item>[Nontrivial Automorphisms]<label|step:nontriv>If
    <with|mode|math|<Char>(R)=0>, let

    <\equation*>
      A={a:2\<leq\>a\<less\>n<with|mode|text|and >(a,n)=1}.
    </equation*>

    If <with|mode|math|<Char>(R)=p\<gtr\>0>, compute the multiplicative order
    <with|mode|math|r> of <with|mode|math|p> modulo <with|mode|math|n>, and
    let

    <\equation*>
      A={p<rsup|m>:1\<leq\>m\<less\>r}.
    </equation*>

    <item>[Compute Orbit] Compute and output the <with|font-shape|italic|set>
    of unique elements <with|mode|math|<eps><rsup|a>> for each
    <with|mode|math|a\<in\>A> (there could be repeats, so we output unique
    elements only).\ 
  </steps> >

  <\proof>
    We prove that the nontrivial automorphisms of
    <with|mode|math|\<langle\>\<zeta\>\<rangle\>> in characteristic
    <with|mode|math|p> are as in Step <reference|step:nontriv>. It is
    well-known that every automorphism in characteristic <with|mode|math|p>
    on <with|mode|math|\<zeta\>\<in\><Fpbar>> is of the form
    <with|mode|math|x\<mapsto\>x<rsup|p<rsup|s>>>, for some
    <with|mode|math|s>. The images of <with|mode|math|\<zeta\>> under such
    automorphisms are

    <\equation*>
      \<zeta\>,\<zeta\><rsup|p>,\<zeta\><rsup|p<rsup|2>>,\<ldots\>.
    </equation*>

    Suppose <with|mode|math|r\<gtr\>0> is minimal such that
    <with|mode|math|\<zeta\>=\<zeta\><rsup|p<rsup|r>>>. Then the orbit of
    <with|mode|math|\<zeta\>> is <with|mode|math|\<zeta\>,\<ldots\>,\<zeta\><rsup|p<rsup|r-1>>>.
    Also <with|mode|math|p<rsup|r><con>1<pmod|n>>, where <with|mode|math|n>
    is the multiplicative order of <with|mode|math|\<zeta\>>, so
    <with|mode|math|r> is the multiplicative order of <with|mode|math|p>
    modulo <with|mode|math|n>, which completes the proof.
  </proof>

  <\example>
    The Galois orbits of characters in <with|mode|math|D(20,<C><rsup|\<ast\>>)>
    are as follows:

    <\align*>
      <tformat|<table|<row|<cell|G<rsub|0>>|<cell|={[1,1,1]},>>|<row|<cell|G<rsub|1>>|<cell|={[-1,1,1]},>>|<row|<cell|G<rsub|2>>|<cell|={[1,1,\<zeta\><rsub|4>],<space|0.25spc><space|0.25spc>[1,1,-\<zeta\><rsub|4>]}>>|<row|<cell|G<rsub|3>>|<cell|={[-1,1,\<zeta\><rsub|4>],<space|0.25spc><space|0.25spc>[-1,1,-\<zeta\><rsub|4>]}>>|<row|<cell|G<rsub|4>>|<cell|={[1,1,-1]},>>|<row|<cell|G<rsub|5>>|<cell|={[-1,1,-1]}>>>>
    </align*>

    The conductors of the characters in orbit <with|mode|math|G<rsub|0>> are
    <with|mode|math|1>, in order <with|mode|math|G<rsub|1>> are
    <with|mode|math|4>, in orbit <with|mode|math|G<rsub|2>> they are
    <with|mode|math|5>, in <with|mode|math|G<rsub|3>> they are
    <with|mode|math|20>, in <with|mode|math|G<rsub|4>> the conductor is
    <with|mode|math|5>, and in <with|mode|math|G<rsub|5>> the conductor is
    <with|mode|math|20>. (You should verify this.)
  </example>

  <section|Alternative Representations of Characters><label|sec:alter>Let
  <with|mode|math|N> be a positive integer and <with|mode|math|R> an integral
  domain, with fixed root of unity <with|mode|math|\<zeta\>> order
  <with|mode|math|n>, and let <with|mode|math|D(N,R)=D(N,R,\<zeta\>)>. As in
  the rest of this chapter, write <with|mode|math|N=<big|prod>p<rsub|i><rsup|e<rsub|i>>>,
  and let <with|mode|math|C<rsub|i>=\<langle\>g<rsub|i>\<rangle\>> be the
  corresponding cyclic factors of <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>.
  In this section we discuss other ways to represent elements
  <with|mode|math|<eps>\<in\>D(N,R)>. Each representation has advantages and
  disadvantages, and no single representation is best. It emerged while
  writing this chapter that simultaneously using more than one representation
  of elements of <with|mode|math|D(N,R)> would be best. It is easy to convert
  between them, and some algorithms are much easier using one representation,
  than when using another. In this section we present two other
  representations, each which has advantages and disadvantages. But, we
  emphasize that there is frequently no reason to restrict to only one
  representation!

  We could represent <with|mode|math|<eps>> by giving a list
  <with|mode|math|[b<rsub|0>,\<ldots\>,b<rsub|n>]>, where each
  <with|mode|math|b<rsub|i>\<in\><Z>/n<Z>> and
  <with|mode|math|<eps>(g<rsub|i>)=\<zeta\><rsup|b<rsub|i>>>. Then arithmetic
  in <with|mode|math|D(N,R)> is arithmetic in
  <with|mode|math|(<Z>/n<Z>)<rsup|n+1>>, which is very efficient. A drawback
  to this approach is that it is easy to accidently consider sequences that
  do not actually correspond to elements of <with|mode|math|D(N,R)>, though
  it is not really any easier to do this than with the representation we use
  elsewhere in this chapter. Also the choice of <with|mode|math|\<zeta\>> is
  less clear, which can cause confusion. Finally, the orders of the local
  factors is more opaque, e.g., compare <with|mode|math|[-1,\<zeta\><rsub|40>]>
  with <with|mode|math|[20,1]>. Overall this representation is not too bad,
  and is more like representing a linear transformation by a matrix. It has
  the <with|font-series|bold|advantage> over the representation discussed
  earlier in this chapter that arithmetic in <with|mode|math|D(N,R)> is very
  efficient, and doesn't require any operations in the ring
  <with|mode|math|R>; such operations could be quite slow, e.g., if
  <with|mode|math|R> were a large cyclotomic field.

  Another way to represent <with|mode|math|<eps>> would be to give a list
  <with|mode|math|[b<rsub|0>,\<ldots\>,b<rsub|n>]> of integers, but this time
  with <with|mode|math|b<rsub|i>\<in\><Z>/gcd(s<rsub|i>,n)<Z>>, where
  <with|mode|math|s<rsub|i>> is the order of <with|mode|math|g<rsub|i>>. Then

  <\equation*>
    <eps>(g<rsub|i>)=\<zeta\><rsup|b<rsub|i>\<cdot\>n/(gcd(s<rsub|i>,n))>,
  </equation*>

  which is already complicated enough to ring warning bells. With this
  representation we set up an identification

  <\equation*>
    D(N,R)<isom><big|oplus><rsub|i><Z>/gcd(s<rsub|i>,n)<Z>,
  </equation*>

  and arithmetic is efficient. This approach is seductive because every
  sequence of integers determines a character, and the sizes of the integers
  in the sequence nicely indicate the local orders of the character. However,
  giving analogues of many of the algorithms discussed in this chapter that
  operate on characters represented this way is tricky. For example, the
  representation depends very much on the order of <with|mode|math|\<zeta\>>,
  so it is difficult to correctly compute natural maps
  <with|mode|math|D(N,R)\<to\>D(N,S)>, for <with|mode|math|R\<subset\>S>
  rings, whereas for the representation elsewhere in this chapter such maps
  are trivial to compute. This was the representation the author (Stein)
  implemented in MAGMA.

  <surround|The PARI documentation says the following (where we have
  preserved the incorrect typesetting): | This means that the abelian group
  has independent generators <with|mode|math|g<rsub|i>> of order
  <with|mode|math|N<rsub|i>>. This definition says that, e.g., the value of
  the character on <with|mode|math|g<rsub|1>> is|<quote-env| ``A
  <with|font-shape|italic|character> on the Abelian group
  <with|mode|math|\<oplus\>(<Z>/N<rsub|i><Z>)g<rsub|i>> is given by a row
  vector <with|mode|math|\<chi\>=[a<rsub|1>,\<ldots\>,a<rsub|n>]> such that
  <with|mode|math|\<chi\>(<big|prod>g<rsub|i><rsup|n<rsub|i>>)=e*x*p(2i\<pi\><big|sum>a<rsub|i>n<rsub|i>/N<rsub|i>)>.''
  >>

  <\equation*>
    \<chi\>(g<rsub|1>)=(e<rsup|2\<pi\>i/N<rsub|1>>)<rsup|a<rsub|1>>.
  </equation*>

  Thus the integers <with|mode|math|a<rsub|i>> are integers modulo
  <with|mode|math|N<rsub|i>>, and this representation is basically the same
  as the one we described in the previous paragraph (and which the author
  does not like).

  <\exercises>
    <item><label|ex:cyclic>This exercise is about the structure of the units
    of <with|mode|math|<Z>/p<rsup|n><Z>>.

    <\enumerate>
      <item>If <with|mode|math|p> is odd and <with|mode|math|n> is a positive
      integer, prove that <with|mode|math|(<Z>/p<rsup|n><Z>)<rsup|\<ast\>>>
      is cyclic.

      <item>If <with|mode|math|n\<geq\>3> prove that
      <with|mode|math|(<Z>/2<rsup|n><Z>)<rsup|\<ast\>>> is a direct sum of
      the cylclic subgroups <with|mode|math|\<langle\>-1\<rangle\>> and
      <with|mode|math|\<langle\>5\<rangle\>>, of orders 2 and
      <with|mode|math|2<rsup|n-2>>, respectively.
    </enumerate>

    <item><label|ex:orderalg>Prove that Algorithm <reference|alg:mingens>
    works, i.e., that if <with|mode|math|g\<in\>(<Z>/p<rsup|r><Z>)<rsup|\<ast\>>>
    and <with|mode|math|g<rsup|n/p<rsub|i>>\<neq\>1> for all
    <with|mode|math|p<rsub|i>\<mid\>n=<vphi>(n)>, then <with|mode|math|g> is
    a generator of <with|mode|math|(<Z>/p<rsup|r><Z>)<rsup|\<ast\>>>.

    <item><label|ex:dlogadd>Let <with|mode|math|p> be an odd prime and
    <with|mode|math|n\<geq\>2> an integer, and prove that

    <\equation*>
      (1+p<rsup|n-1>(<Z>/p<rsup|n><Z>),<space|0.25spc>\<times\>)<isom>(<Z>/p<Z>,<space|0.25spc>+).
    </equation*>

    Use this to show that solving the discrete log problem in
    <with|mode|math|(<Z>/p<rsup|n><Z>)<rsup|\<ast\>>> is ``not much harder''
    than solving the discrete log problem in
    <with|mode|math|(<Z>/p<Z>)<rsup|\<ast\>>>.

    <item><label|ex:cond2>Suppose <with|mode|math|<eps>> is a nontrivial
    Dirichlet character modulo <with|mode|math|2<rsup|n>> of order
    <with|mode|math|r> over the complex numbers <with|mode|math|<C>>. Prove
    that the conductor of <with|mode|math|<eps>> is

    <\equation*>
      c=<cases|<tformat|<table|<row|<cell|2<rsup|<ord><rsub|2>(r)+1>>|<cell|<with|mode|text|if
      <with|mode|math|<eps>(5)=1>>>>|<row|<cell|2<rsup|<ord><rsub|2>(r)+2>>|<cell|<with|mode|text|if
      <with|mode|math|<eps>(5)\<neq\>1>.>>>>>>
    </equation*>

    <item>

    <\enumerate>
      <item>Find an irreducible quadratic polynomial <with|mode|math|f> over
      <with|mode|math|<F><rsub|5>>.

      <item>Then <with|mode|math|<F><rsub|25>=<F><rsub|5>[x]/(f)>. Find an
      element with multiplicative order <with|mode|math|5> in
      <with|mode|math|<F><rsub|25>>.

      <item>Make a list of all Dirichlet characters in
      <with|mode|math|D(25,<F><rsub|25>,\<zeta\>)>.

      <item>Divide these characters up into orbits for the action of
      <with|mode|math|<Gal>(<Fbar><rsub|5>/<F><rsub|5>)>.
    </enumerate>
  </exercises>

  <chapter|Modular Forms and Eisenstein Series of<next-line>Higher
  Level><label|ch:eisen>In this chapter, we define the space
  <with|mode|math|M<rsub|k>(N,<eps>)> modular forms of arbitrary level and
  character and discuss generalized Bernoulli numbers attached to Dirichlet
  characters. Then we give an algorithm to enumerate the Eisenstein series in
  <with|mode|math|M<rsub|k>(N,<eps>)>. We will have to wait until Chapter
  <reference|ch:modsym> for an algorithm to compute all cusp forms in
  <with|mode|math|M<rsub|k>(N,<eps>)>.

  <section|Modular Forms of Higher Level> In this section, we define the
  space <with|mode|math|M<rsub|k>(N,<eps>)> of modular forms for
  <with|mode|math|\<Gamma\><rsub|1>(N)> with character
  <with|mode|math|<eps>>. We begin with the definition of
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))>.

  <\definition>
    [Modular Forms] Let <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))> be
    the complex vector space of holomorphic functions
    <with|mode|math|f:<h><rsup|\<ast\>>\<to\><C>> such that
    <with|mode|math|f\|[\<gamma\>]<rsub|k>=f> for all
    <with|mode|math|\<gamma\>\<in\>\<Gamma\><rsub|1>(N)>.
  </definition>

  What it means for <with|mode|math|f> to be holomorphic at the elements of
  <with|mode|math|<Q><union>{i\<infty\>}> is somewhat subtle. We say
  <with|mode|math|f> is <defn|holomorphic> at <with|mode|math|i\<infty\>> if
  its <with|mode|math|q>-expansion <with|mode|math|<big|sum>a<rsub|n>q<rsup|n>>
  has no nonzero coefficient <with|mode|math|a<rsub|n>> for
  <with|mode|math|n\<less\>0>. To make sense of holomorphicity of
  <with|mode|math|f> at <with|mode|math|\<alpha\>\<in\><Q>>, let
  <with|mode|math|\<gamma\>\<in\><SL><rsub|2>(<Z>)> be such that
  <with|mode|math|\<gamma\>(\<infty\>)=\<alpha\>>. Then we say
  <with|mode|math|f> is holomorphic at <with|mode|math|\<alpha\>> if
  <with|mode|math|f\|[\<gamma\>]<rsub|k>> is holomorphic at infinity. Note
  that formally

  <\equation*>
    f\|[\<gamma\>]<rsub|k>(\<infty\>)=(c*z+d)<rsup|-k>f(\<alpha\>),
  </equation*>

  where <with|mode|math|(c,d)> is the bottom row of
  <with|mode|math|\<gamma\>> and the factor <with|mode|math|(c*z+d)<rsup|-k>>
  does not affect holomorphicity at <with|mode|math|\<alpha\>>. Another
  subtlety hidden in this definition is that
  <with|mode|math|f\|[\<gamma\>]<rsub|k>> is a modular form for the conjugate
  group <with|mode|math|G=\<gamma\><rsup|-1>\<Gamma\><rsub|1>(N)\<gamma\>>,
  which need not equal <with|mode|math|\<Gamma\><rsub|1>(N)>. In particular,
  the matrix <with|mode|math|<abcd|1|1|0|1>> need not be in
  <with|mode|math|G>, so <with|mode|math|f\|[\<gamma\>]<rsub|k>> need not
  even have a power series expansion <with|mode|math|<big|sum><rsub|n\<in\><Z>>b<rsub|n>q<rsup|n>>
  at infinity! Fortunately (see <exref|ch:eisen|ex:has<rsub|w>idth>) there is
  some positive integer <with|mode|math|h> such that
  <with|mode|math|<abcd|1|h|0|1>\<in\>G>, so
  <with|mode|math|f\|[\<gamma\>]<rsub|k>> has a power series expansion
  <with|mode|math|<big|sum><rsub|n\<in\><Z>>b<rsub|n/h>q<rsup|n/h>> in powers
  of <with|mode|math|q<rsup|1/h>>, and we again say
  <with|mode|math|f\|[\<gamma\>]<rsub|k>> is holomorphic at infinity if
  <with|mode|math|b<rsub|n/h>=0> for all <with|mode|math|n\<less\>0>. (The
  reason we obtain a power series in <with|mode|math|q<rsup|1/h>> is that
  <with|mode|math|f\|[\<gamma\>]<rsub|k>(h*z)> is invariant under
  <with|mode|math|z\<mapsto\>z+1>, so <with|mode|math|f\|[\<gamma\>]<rsub|k>(h*z)>
  has an expansion in powers of <with|mode|math|q>.)

  A <defn|congruence subgroup> is a subgroup <with|mode|math|\<Gamma\>> of
  <with|mode|math|<SL><rsub|2>(<Z>)> that contains the kernel
  <with|mode|math|\<Gamma\>(N)=ker(<SL><rsub|2>(<Z>)\<to\><SL><rsub|2>(<Z>/N<Z>))>
  for some <with|mode|math|N>. The smallest such <with|mode|math|N> is the
  <defn|level> of <with|mode|math|\<Gamma\>>.

  <\definition>
    [Width of Cusp] The minimal <with|mode|math|h> such that
    <with|mode|math|<abcd|1|h|0|1>\<in\>\<gamma\><rsup|-1>\<Gamma\>\<gamma\>>
    is called the <defn|width of the cusp>
    <with|mode|math|\<gamma\>(\<infty\>)> for the group
    <with|mode|math|\<Gamma\>>.
  </definition>

  <\algorithm|Width of Cusp>
    \ Given a congruence subgroup <with|mode|math|\<Gamma\>> of level
    <with|mode|math|N> and a cusp <with|mode|math|\<alpha\>> for
    <with|mode|math|\<Gamma\>>, this algorithm computes the width
    <with|mode|math|h> of <with|mode|math|\<alpha\>>. We assume that
    <with|mode|math|\<Gamma\>> is given by congruence conditions, e.g.,
    <with|mode|math|\<Gamma\>=\<Gamma\><rsub|0>(N)> or
    <with|mode|math|\<Gamma\><rsub|1>(N)>. <\steps>
      <item>[Find <with|mode|math|\<gamma\>>] Using the extended Euclidean
      algorithm, find <with|mode|math|\<gamma\>\<in\><SL><rsub|2>(<Z>)> such
      that <with|mode|math|\<gamma\>(\<infty\>)=\<alpha\>>. If
      <with|mode|math|\<alpha\>=\<infty\>> set
      <with|mode|math|\<gamma\><set>1>; otherwise, write
      <with|mode|math|\<alpha\>=a/b>, find <with|mode|math|c,d> such that
      <with|mode|math|a*d-b*c=1>, and set
      <with|mode|math|\<gamma\><set><abcd|a|b|c|d>>.

      <item>[Generic Conjugate Matrix] Compute the following matrix in
      <with|mode|math|M<rsub|2>(<Z>[x])>:

      <\equation*>
        \<delta\>(x)<set>\<gamma\><mtwo|1|x|0|1>\<gamma\><rsup|-1>.
      </equation*>

      Note that <with|mode|math|\<delta\>(x)> matrix whose entries are
      constant or linear in <with|mode|math|x>.

      <item>[Solve] The congruence conditions that define
      <with|mode|math|\<Gamma\>> give rise to four linear congruence
      conditions on <with|mode|math|x>. Use techniques from elementary number
      theory to find the smallest simultaneous positive solution
      <with|mode|math|h> to these four equations.\ 
    </steps>\ 
  </algorithm>

  <\example>
    <with|mode|text|><next-line>

    <\enumerate>
      <item>Suppose <with|mode|math|\<alpha\>=0> and
      <with|mode|math|\<Gamma\>=\<Gamma\><rsub|0>(N)> or
      <with|mode|math|\<Gamma\><rsub|1>(N)>. Then
      <with|mode|math|\<gamma\>=<abcd|0|1|1|0>> has the property that
      <with|mode|math|\<gamma\>(\<infty\>)=\<alpha\>>. Next, the congruence
      condition is

      <\equation*>
        \<delta\>(x)=\<gamma\><mtwo|1|x|0|1>\<gamma\><rsup|-1>=<mtwo|1|0|x|1><con><mtwo|1|\<ast\>|0|1><pmod|N>.
      </equation*>

      Thus the smallest positive solution is <with|mode|math|h=N>, so the
      width of <with|mode|math|0> is <with|mode|math|N>.

      <item>Suppose <with|mode|math|N=p*q> where <with|mode|math|p,q> are
      distinct primes, and let <with|mode|math|\<alpha\>=1/p>. Then
      <with|mode|math|\<gamma\>=<abcd|1|0|p|1>> sends
      <with|mode|math|\<infty\>> to <with|mode|math|\<alpha\>>. The
      congruence condition for <with|mode|math|\<Gamma\><rsub|0>(p*q)> is

      <\equation*>
        \<delta\>(x)=\<gamma\><mtwo|1|x|0|1>\<gamma\><rsup|-1>=<mtwo|1-p*x|x|-p<rsup|2>x|p*x+1><con><mtwo|\<ast\>|\<ast\>|0|\<ast\>><pmod|p*q>.
      </equation*>

      Since <with|mode|math|p<rsup|2>x<con>0<pmod|p*q>>, we see that
      <with|mode|math|x=q> is the smallest solution. Thus
      <with|mode|math|1/p> has width <with|mode|math|q>, and likewise
      <with|mode|math|1/q> has width <with|mode|math|p>.
    </enumerate>
  </example>

  <\remark>
    For <with|mode|math|\<Gamma\><rsub|0>(N)>, once we enforce that the
    bottom left entry is <with|mode|math|0<pmod|N>>, and use that the
    determinant is 1, the coprimeness that one gets from the other two
    congruences is automatic. So there is one congruence to solve for
    <with|mode|math|\<Gamma\><rsub|0>(N)>. There are 2 congruences in the
    <with|mode|math|\<Gamma\><rsub|1>(N)> case (the bottom left entry and top
    left entry).
  </remark>

  The group <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>> acts on
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))> through the
  <defn|diamond-bracket operators> <with|mode|math|\<langle\>d\<rangle\>>.
  For <with|mode|math|d\<in\>(<Z>/N<Z>)<rsup|\<ast\>>>, define

  <\equation*>
    f\|<dbd|d>=f\|[<abcd|a|b|c|d<rprime|'>>]<rsub|k>,
  </equation*>

  where <with|mode|math|<abcd|a|b|c|d<rprime|'>>\<in\><SL><rsub|2>(<Z>)> is
  congruent to <with|mode|math|<abcd|d<rsup|-1>|0|0|d><pmod|N>>. Note that
  the map <with|mode|math|<SL><rsub|2>(<Z>)\<to\><SL><rsub|2>(<Z>/N<Z>)> is
  surjective (see <exref|ch:eisen|ex:surjred>), so it makes sense to consider
  the matrix <with|mode|math|<abcd|a|b|c|d<rprime|'>>>. To prove that
  <with|mode|math|<dbd|d>> preserves <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))>,
  we prove the more general fact that <with|mode|math|\<Gamma\><rsub|1>(N)>
  is normal in

  <\equation*>
    \<Gamma\><rsub|0>(N)=<left|{><mtwo|a|b|c|d>\<in\><SL><rsub|2>(<Z>):<mtwo|a|b|c|d><con><mtwo|\<ast\>|\<ast\>|0|\<ast\>><pmod|N><right|}>.
  </equation*>

  This will imply that <with|mode|math|<dbd|d>> preserves
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))> since
  <with|mode|math|<abcd|a|b|c|d<rprime|'>>\<in\>\<Gamma\><rsub|0>(N)>.

  <\lemma>
    The group <with|mode|math|\<Gamma\><rsub|1>(N)> is a normal subgroup of
    <with|mode|math|\<Gamma\><rsub|0>(N)>, and the quotient
    <with|mode|math|\<Gamma\><rsub|0>(N)/\<Gamma\><rsub|1>(N)> is isomorphic
    to <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>.
  </lemma>

  <\proof>
    Consider the surjective homomorphism <with|mode|math|r:<SL><rsub|2>(<Z>)\<to\><SL><rsub|2>(<Z>/N<Z>)>.
    Then <with|mode|math|\<Gamma\><rsub|1>(N)> is the exact inverse image of
    the subgroup <with|mode|math|H> of matrices of the form
    <with|mode|math|<abcd|1|\<ast\>|0|1>> and
    <with|mode|math|\<Gamma\><rsub|0>(N)> is the inverse image of the subroup
    <with|mode|math|T> of upper triangular matrices. It thus suffices to
    observe that <with|mode|math|H> is normal in <with|mode|math|T>, which is
    clear. Finally, the quotient <with|mode|math|T/H> is isomorphic to the
    group of diagonal matrices in <with|mode|math|<SL><rsub|2>(<Z>/N<Z>)<rsup|\<ast\>>>,
    which is isomorphic to <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>.
  </proof>

  The diamond bracket action is simply the action of
  <with|mode|math|\<Gamma\><rsub|0>(N)/\<Gamma\><rsub|1>(N)<isom>(<Z>/N<Z>)<rsup|\<ast\>>>
  on <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))>. Since
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))> is a vector space over
  <with|mode|math|<C>>, the <with|mode|math|<dbd|d>> action breaks
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))> up as a direct sum of
  factors corresponding to the Dirichlet characters <with|mode|math|D(N,C)>
  of modulus <with|mode|math|N>.

  <\proposition>
    We have

    <\equation*>
      M<rsub|k>(\<Gamma\><rsub|1>(N))=<big|oplus><rsub|<eps>\<in\>D(N,<C>)>M<rsub|k>(N,<eps>),
    </equation*>

    where

    <\equation*>
      M<rsub|k>(N,<eps>)=<left|{>f\<in\><M><rsub|k>(\<Gamma\><rsub|1>(N)):f\|<dbd|d>=<eps>(d)f<with|mode|text|all
      >d\<in\>(<Z>/N<Z>)<rsup|\<ast\>><right|}>.
    </equation*>
  </proposition>

  <\proof>
    The linear transformations <with|mode|math|<dbd|d>>, for the
    <with|mode|math|d\<in\>(<Z>/N<Z>)<rsup|\<ast\>>>, all commute, since
    <with|mode|math|<dbd|d>> acts through the abelian group
    <with|mode|math|\<Gamma\><rsub|0>(N)/\<Gamma\><rsub|1>(N)>. Also, if
    <with|mode|math|e> is the exponent of
    <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>, then
    <with|mode|math|<dbd|d><rsup|e>=<dbd|d<rsup|e>>=<dbd|1>=1>, so the matrix
    of <with|mode|math|<dbd|d>> is diagonalizable. It is a standard fact from
    linear algebra that any commuting family of diagonalizable linear
    transformations is simultaneously diagonalizable (see
    <exref|ch:eisen|ex:diag>), so there is a basis
    <with|mode|math|f<rsub|1>,\<ldots\>,f<rsub|n>> for
    <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))> so that all
    <with|mode|math|<dbd|d>> act by diagonal matrices. The eigenvalues of the
    action of <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>> on a fixed
    <with|mode|math|f<rsub|i>> defines a Dirichlet character, i.e., each
    <with|mode|math|f<rsub|i>> has the property that
    <with|mode|math|f<rsub|i>\|<dbd|d>=<eps><rsub|i>(d)>, for all
    <with|mode|math|d\<in\>(<Z>/N<Z>)<rsup|\<ast\>>> and some Dirichlet
    character <with|mode|math|<eps><rsub|i>>. The <with|mode|math|f<rsub|i>>
    for a given <with|mode|math|<eps>> then span
    <with|mode|math|M<rsub|k>(N,<eps>)>, and taken together the
    <with|mode|math|M<rsub|k>(N,<eps>)> must span
    <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))>.
  </proof>

  <\definition>
    [Character of Modular Form] If <with|mode|math|f\<in\>M<rsub|k>(N,<eps>)>,
    we say that <with|mode|math|f> <defn|has character>
    <with|mode|math|<eps>>.
  </definition>

  <\remark>
    People also often write that <with|mode|math|f> has ``nebentypus
    character'' <with|mode|math|<eps>>. I rarely hear anyone actually
    <with|font-shape|italic|say> nebentypus, and it's somewhat redundant, so
    I will simply omit it in this book.
  </remark>

  The spaces <with|mode|math|M<rsub|k>(N,<eps>)> are a direct sum of
  subspaces <with|mode|math|S<rsub|k>(N,<eps>)> and
  <with|mode|math|E<rsub|k>(N,<eps>)>, where
  <with|mode|math|S<rsub|k>(N,<eps>)> is the subspace of cusp forms, i.e.,
  forms that vanish at <with|font-shape|italic|all> cusps (elements of
  <with|mode|math|<Q><union>{\<infty\>}>), and
  <with|mode|math|E<rsub|k>(N,<eps>)> is the subspace of Eisenstein series,
  which is the unique subspace of <with|mode|math|M<rsub|k>(N,<eps>)> that is
  invariant under all Hecke operators and is such that
  <with|mode|math|M<rsub|k>(N,<eps>)=S<rsub|k>(N,<eps>)\<oplus\>E<rsub|k>(N,<eps>)>.
  The space <with|mode|math|E<rsub|k>(N,<eps>)> can also be defined as the
  space spanned by all Eisenstein series of weight <with|mode|math|k> and
  level <with|mode|math|N>, as defined below. It can also be defined using
  the Petersson inner product.

  <\remark>
    The notation <with|mode|math|M<rsub|k>(N)> will not be used anywhere in
    this book (except in this sentence).
  </remark>

  <section|Generalized Bernoulli Numbers> Suppose <with|mode|math|<eps>> is a
  Dirichlet character modulo <with|mode|math|N> over <with|mode|math|<C>>.

  <\definition>
    [Generalized Bernoulli Number] Define the <defn|generalized Bernoulli
    numbers> <with|mode|math|B<rsub|k,<eps>>> attached to
    <with|mode|math|<eps>> by the following identity of infinite series:

    <\equation*>
      <big|sum><rsub|a=1><rsup|N-1><frac|<eps>(a)\<cdot\>x\<cdot\>e<rsup|a*x>|e<rsup|N*x>-1><space|0.25spc><space|0.25spc>=<space|0.25spc><space|0.25spc><big|sum><rsub|k=0><rsup|\<infty\>>B<rsub|k,<eps>>\<cdot\><frac|x<rsup|k>|k!>.
    </equation*>
  </definition>

  If <with|mode|math|<eps>> is the trivial character of modulus
  <with|mode|math|1> and <with|mode|math|B<rsub|k>> are as in Section
  <reference|sec:level>, then <with|mode|math|B<rsub|k,<eps>>=B<rsub|k>>,
  except when <with|mode|math|k=1>, in which case
  <with|mode|math|B<rsub|1,<eps>>=-B<rsub|1>=1/2> (see
  <exref|ch:eisen|ex:bern<rsub|t>riv>).

  Let <with|mode|math|<Q>(<eps>)> denote the field generated by the values of
  the character <with|mode|math|<eps>>, so <with|mode|math|<Q>(<eps>)> is the
  cyclotomic extension <with|mode|math|<Q>(\<zeta\><rsub|n>)>, where
  <with|mode|math|n> is the order of <with|mode|math|<eps>>.
  <algorithm|Bernoulli Numbers|<label|alg:gen>Given an integer
  <with|mode|math|k\<geq\>0> and any Dirichlet character
  <with|mode|math|<eps>> with modulus <with|mode|math|N>, this algorithm
  computes the generalized Bernoulli numbers
  <with|mode|math|B<rsub|j,<eps>>>, for <with|mode|math|j\<leq\>k>. <\steps>
    <item><label|step:ber1>Compute <with|mode|math|g<set>x/(e<rsup|N*x>-1)\<in\><Q>[[x]]>
    to precision <with|mode|math|O(x<rsup|k+1>)> by computing
    <with|mode|math|e<rsup|N*x>-1=<big|sum><rsub|n\<geq\>1>N<rsup|n>x<rsup|n>/n!>
    to precision <with|mode|math|O(x<rsup|k+2>)>, and computing the inverse
    <with|mode|math|x/(e<rsup|N*x>-1)>. For completeness, note that if
    <with|mode|math|f=a<rsub|0>+a<rsub|1>x+a<rsub|2>x<rsup|2>+\<cdots\>>,
    then we have the following recursive formula for the coefficients
    <with|mode|math|b<rsub|n>> of the expansion of <with|mode|math|1/f>:

    <\equation*>
      b<rsub|n><set>-<frac|b<rsub|0>|a<rsub|0>>\<cdot\>(b<rsub|n-1>a<rsub|1>+b<rsub|n-2>a<rsub|2>+\<cdots\>+b<rsub|0>a<rsub|n>).
    </equation*>

    <item><label|step:ber2>For each <with|mode|math|a=1,\<ldots\>,N>, compute
    <with|mode|math|f<rsub|a><set>g\<cdot\>e<rsup|a*x>\<in\><Q>[[x]]>, to
    precision <with|mode|math|O(x<rsup|k+1>)>. This requires computing
    <with|mode|math|e<rsup|a*x>=<big|sum><rsub|n\<geq\>0>a<rsup|n>x<rsup|n>/n!>
    to precision <with|mode|math|O(x<rsup|k+1>)>. (One can omit computation
    of <with|mode|math|e<rsup|N*x>> if <with|mode|math|N\<gtr\>1>.)

    <item><label|step:ber4>Then for <with|mode|math|j\<leq\>k>, we have

    <\equation*>
      B<rsub|j,<eps>><set>j!\<cdot\><big|sum><rsub|a=1><rsup|N><eps>(a)\<cdot\>c<rsub|j>(f<rsub|a>),
    </equation*>

    where <with|mode|math|c<rsub|j>(f<rsub|a>)> is the coefficient of
    <with|mode|math|x<rsup|j>> in <with|mode|math|f<rsub|a>>.\ 
  </steps> > Note that in Steps <reference|step:ber1> and
  <reference|step:ber2> we compute the power series doing arithmetic only in
  <with|mode|math|<Q>[[x]]>, not in <with|mode|math|<Q>(<eps>)[[x]]>, which
  could be much less efficient if <with|mode|math|<eps>> has large order. One
  could also write down a recurrence formula for
  <with|mode|math|B<rsub|j,<eps>>>, but this would simply encode arithmetic
  in power series rings and the definitions in a formula.

  <\example>
    Let <with|mode|math|<eps>> be the nontrivial character with modulus
    <with|mode|math|4>. Thus <with|mode|math|<eps>> has order
    <with|mode|math|2> and takes values in <with|mode|math|<Q>>. Then the
    Bernoulli numbers <with|mode|math|B<rsub|k,<eps>>> for <with|mode|math|k>
    even are all <with|mode|math|0> and for <with|mode|math|k> odd they are

    <\align*>
      <tformat|<table|<row|<cell|B<rsub|1,<eps>>>|<cell|=-1/2>>|<row|<cell|B<rsub|3,<eps>>>|<cell|=3/2>>|<row|<cell|B<rsub|5,<eps>>>|<cell|=-25/2>>|<row|<cell|B<rsub|7,<eps>>>|<cell|=427/2>>|<row|<cell|B<rsub|9,<eps>>>|<cell|=-12465/2>>|<row|<cell|B<rsub|11,<eps>>>|<cell|=555731/2>>|<row|<cell|B<rsub|13,<eps>>>|<cell|=-35135945/2>>|<row|<cell|B<rsub|15,<eps>>>|<cell|=2990414715/2>>|<row|<cell|B<rsub|17,<eps>>>|<cell|=-329655706465/2>>|<row|<cell|B<rsub|19,<eps>>>|<cell|=45692713833379/2.>>>>
    </align*>

    These Bernoulli numbers can be divisible by large primes. For example,
    <with|mode|math|B<rsub|17,<eps>>=5\<cdot\>17<rsup|2>\<cdot\>228135437/2>.
  </example>

  <\example>
    This examples illustrates that the generalized Bernoulli numbers need not
    be rational numbers. Suppose <with|mode|math|<eps>> is the mod
    <with|mode|math|5> character such that
    <with|mode|math|<eps>(2)=i=<sqrt|-1>>. Then
    <with|mode|math|B<rsub|k,<eps>>=0> for <with|mode|math|k> even and

    <\align*>
      <tformat|<table|<row|<cell|B<rsub|1,<eps>>>|<cell|=<frac|-i-3|5>>>|<row|<cell|B<rsub|3,<eps>>>|<cell|=<frac|6i+12|5>>>|<row|<cell|B<rsub|5,<eps>>>|<cell|=<frac|-86i-148|5>>>|<row|<cell|B<rsub|7,<eps>>>|<cell|=<frac|2366i+3892|5>>>|<row|<cell|B<rsub|9,<eps>>>|<cell|=<frac|-108846i-176868|5>>>|<row|<cell|B<rsub|11,<eps>>>|<cell|=<frac|7599526i+12309572|5>>>|<row|<cell|B<rsub|13,<eps>>>|<cell|=<frac|-751182406i-1215768788|5>>>|<row|<cell|B<rsub|15,<eps>>>|<cell|=<frac|99909993486i+161668772052|5>>>|<row|<cell|B<rsub|17,<eps>>>|<cell|=<frac|-17209733596766i-27846408467908|5>>>|<row|<cell|>|<cell|>>>>
    </align*>
  </example>

  <\proposition>
    If <with|mode|math|<eps>(-1)\<neq\>(-1)<rsup|k>>, then
    <with|mode|math|B<rsub|k,<eps>>=0>.
  </proposition>

  <section|Explicit Basis for the Eisenstein Subspace> Suppose
  <with|mode|math|\<chi\>> and <with|mode|math|\<psi\>> are primitive
  Dirichlet characters with conductors <with|mode|math|L> and
  <with|mode|math|M>, respectively. Let

  <\equation>
    <label|eqn:eisen>E<rsub|k,\<chi\>,\<psi\>>(q)=c<rsub|0>+<big|sum><rsub|m\<geq\>1><left|(><big|sum><rsub|n\|m>\<psi\>(n)\<cdot\>\<chi\>(m/n)\<cdot\>n<rsup|k-1><right|)>q<rsup|m>\<in\><Q>(\<chi\>,\<psi\>)[[q]],
  </equation>

  where

  <\equation*>
    c<rsub|0>=<cases|<tformat|<table|<row|<cell|0>|<cell|<with|mode|text|if
    >L\<gtr\>1,>>|<row|<cell|<ds>-<frac|B<rsub|k,\<psi\>>|2k>>|<cell|<with|mode|text|if
    >L=1.>>>>>
  </equation*>

  Note that when <with|mode|math|\<chi\>=\<psi\>=1> and
  <with|mode|math|k\<geq\>4>, then <with|mode|math|E<rsub|k,\<chi\>,\<psi\>>=E<rsub|k>>,
  where <with|mode|math|E<rsub|k>> is from Chapter <reference|ch:levelone>.

  Miyake proves statements that imply the following theorems in <cite|miyake>
  (Ch. 7). We will not prove them in this book since developing the theory
  needed to prove them would take us far afield from our goal, which is to
  compute <with|mode|math|M<rsub|k>(N,<eps>)>.

  <\theorem>
    <label|thm:eisser>Suppose <with|mode|math|t> is a positive integer and
    <with|mode|math|\<chi\>>, <with|mode|math|\<psi\>> are as above, and that
    <with|mode|math|k> is a positive integer such that
    <with|mode|math|\<chi\>(-1)\<psi\>(-1)=(-1)<rsup|k>>. Except when
    <with|mode|math|k=2> and <with|mode|math|\<chi\>=\<psi\>=1>, the power
    series <with|mode|math|E<rsub|k,\<chi\>,\<psi\>>(q<rsup|t>)> defines an
    element of <with|mode|math|M<rsub|k>(M*L*t,\<chi\>/\<psi\>)>. If
    <with|mode|math|\<chi\>=\<psi\>=1>, <with|mode|math|k=2>,
    <with|mode|math|t\<gtr\>1>, and <with|mode|math|E<rsub|2>=E<rsub|k,\<chi\>,\<psi\>>>,
    then <with|mode|math|E<rsub|2>(q)-t*E<rsub|2>(q<rsup|t>)> is a modular
    form in <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(t))>.
  </theorem>

  <\theorem>
    <label|thm:eisgen>The Eisenstein series in
    <with|mode|math|M<rsub|k>(N,<eps>)> coming from Theorem
    <reference|thm:eisser> form a basis for the Eisenstein subspace
    <with|mode|math|E<rsub|k>(N,<eps>)>.
  </theorem>

  <\theorem>
    <label|thm:eiseigen>The Eisenstein series
    <with|mode|math|E<rsub|k,\<chi\>,\<psi\>>(q)\<in\>M<rsub|k>(M*L)> defined
    above is an eigenvector for all Hecke operators
    <with|mode|math|T<rsub|n>>. Also <with|mode|math|E<rsub|2>(q)-t*E<rsub|2>(q<rsup|t>)>,
    for <with|mode|math|t\<gtr\>1>, is an eigenform.
  </theorem>

  Since <with|mode|math|E<rsub|k,\<chi\>,\<psi\>>(q)> is normalizes so the
  coefficient of <with|mode|math|q> is <with|mode|math|1>, the eigenvalue of
  <with|mode|math|T<rsub|m>> is

  <\equation*>
    <big|sum><rsub|n\|m>\<psi\>(n)\<cdot\>\<chi\>(m/n)\<cdot\>n<rsup|k-1>.
  </equation*>

  Also for <with|mode|math|f=E<rsub|2>(q)-t*E<rsub|2>(q<rsup|t>)> with
  <with|mode|math|t\<gtr\>1> prime, the coefficient of <with|mode|math|q> is
  <with|mode|math|1>, and <with|mode|math|T<rsub|m>(f)=\<sigma\><rsub|1>(m)\<cdot\>f>
  for <with|mode|math|(m,t)=1>, and <with|mode|math|T<rsub|t>(f)=((t+1)-t)f=f>.

  <\algorithm|Enumerating Eisenstein Series>
    <label|alg:enum>Given a weight <with|mode|math|k> and a Dirichlet
    character <with|mode|math|<eps>> of modulus <with|mode|math|N>, this
    algorithm computes a basis for the Eisenstein subspace
    <with|mode|math|E<rsub|k>(N,<eps>)> of
    <with|mode|math|M<rsub|k>(N,<eps>)> to precision
    <with|mode|math|O(q<rsup|r>)>. <\steps>
      <item>[Weight 2 Trivial Character?] If <with|mode|math|k=2> and
      <with|mode|math|<eps>=1>, output the Eisenstein series
      <with|mode|math|E<rsub|2>(q)-t*E<rsub|2>(q<rsup|t>)>, for each divisor
      <with|mode|math|t\<mid\>N> with <with|mode|math|t\<neq\>1>, then
      terminate.

      <item>[Compute Dirichlet Group] Let
      <with|mode|math|G<set>D(N,<Q>(\<zeta\><rsub|n>))> be the group of
      Dirichlet characters with values in
      <with|mode|math|<Q>(\<zeta\><rsub|n>)>, where <with|mode|math|n> is the
      exponent fo <with|mode|math|(<Z>/N<Z>)<rsup|\<ast\>>>.

      <item>[Compute Conductors]<label|step:enum>Compute the conductor of
      every element of <with|mode|math|G> (which just involves computing the
      orders of the local components of each character).

      <item>[List Characters <with|mode|math|\<chi\>>]<label|step:enum>Form a
      list <with|mode|math|V> all Dirichlet characters
      <with|mode|math|\<chi\>\<in\>G> such that
      <with|mode|math|<cond>(\<chi\>)\<cdot\><cond>(\<chi\>/<eps>)> divides
      <with|mode|math|N>.

      <item>[Compute Eisenstein Series] For each character
      <with|mode|math|\<chi\>> in <with|mode|math|V>, let
      <with|mode|math|\<psi\>=\<chi\>/<eps>>, and compute
      <with|mode|math|E<rsub|k,\<chi\>,\<psi\>>(q<rsup|t>)<pmod|q<rsup|r>>>
      for each divisor <with|mode|math|t> of
      <with|mode|math|N/(<cond>(\<chi\>)\<cdot\><cond>(\<psi\>))>. We compute
      <with|mode|math|E<rsub|k,\<chi\>,\<psi\>>(q<rsup|t>)<pmod|q<rsup|r>>>
      using (<reference|eqn:eisen>) and Algorithm <reference|alg:gen>.
    </steps>\ 
  </algorithm>

  <\remark>
    Algorithm <reference|alg:enum> is what I currently use in my programs. It
    might be better to first reduce to the prime power case by writing all
    characters as product of local characters and combine Steps
    <reference|step:enum> and <reference|step:enum> into a single step that
    involves orders. However, this might make things more complicated and
    obscure.
  </remark>

  <\example>
    The following is a basis of Eisenstein series
    <with|mode|math|E<rsub|2,\<chi\>,\<psi\>>> for
    <with|mode|math|E<rsub|2>(\<Gamma\><rsub|1>(13))>.\ 

    <\verbatim>
      f1 = 1/2 + q + 3*q^2 + 4*q^3 + O(q^4)

      \;

      f2 = (-7/13*zeta_12^2 - 11/13) + q + (2*zeta_12^2 + 1)*q^2\ 

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ +
      (-3*zeta_12^2 + 1)*q^3 + O(q^4)

      \;

      f3 = q + (zeta_12^2 + 2)*q^2 + (-1*zeta_12^2 + 3)*q^3 + O(q^4)

      \;

      f4 = (-1*zeta_12^2) + q + (2*zeta_12^2 - 1)*q^2\ 

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ + (3*zeta_12^2 - 2)*q^3
      + O(q^4)

      \;

      f5 = q + (zeta_12^2 + 1)*q^2 + (zeta_12^2 + 2)*q^3 + O(q^4)

      \;

      f6 = (-1) + q + (-1)*q^2 + 4*q^3 + O(q^4)

      \;

      f7 = q + q^2 + 4*q^3 + O(q^4)

      \;

      f8 = (zeta_12^2 - 1) + q + (-2*zeta_12^2 + 1)*q^2\ 

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ + (-3*zeta_12^2 +
      1)*q^3 + O(q^4)

      \;

      f9 = q + (-1*zeta_12^2 + 2)*q^2 + (-1*zeta_12^2 + 3)*q^3 + O(q^4)

      \;

      f10 = (7/13*zeta_12^2 - 18/13) + q + (-2*zeta_12^2 + 3)*q^2\ 

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ +
      (3*zeta_12^2 - 2)*q^3 + O(q^4)

      \;

      f11 = q + (-1*zeta_12^2 + 3)*q^2 + (zeta_12^2 + 2)*q^3 + O(q^4)
    </verbatim>
  </example>

  <\exercises>
    <item><label|ex:has>Suppose <with|mode|math|\<gamma\>\<in\><SL><rsub|2>(<Z>)>
    and <with|mode|math|N> is a positive integer. Prove that there is a
    positive integer <with|mode|math|h> such that
    <with|mode|math|<abcd|1|h|0|1>\<in\>\<gamma\><rsup|-1>\<Gamma\><rsub|1>(N)\<gamma\>>.

    <item><label|ex:surjred>Prove that the map
    <with|mode|math|<SL><rsub|2>(<Z>)\<to\><SL><rsub|2>(<Z>/N<Z>)> is
    surjective. (Hint: There is a proof of a more general result near the
    beginning of Shimura's book <cite|shimura:intro>.)

    <item><label|ex:gamma0>Prove that <with|mode|math|M<rsub|k>(N,1)=M<rsub|k>(\<Gamma\><rsub|0>(N))>.

    <item><label|ex:diag>Suppose <with|mode|math|A> and <with|mode|math|B>
    are diagonalizable linear transformations of a finite-dimensional vector
    space <with|mode|math|V> and that both <with|mode|math|A> and
    <with|mode|math|B> are diagonalizable. Prove there is a basis for
    <with|mode|math|V> so that the matrices of <with|mode|math|A> and
    <with|mode|math|B> with respect to that both are simultaneously diagonal.

    <item><label|ex:bern>If <with|mode|math|<eps>> is the trivial character
    of modulus <with|mode|math|1> and <with|mode|math|B<rsub|k>> are as in
    Section <reference|sec:level>, then <with|mode|math|B<rsub|k,<eps>>=B<rsub|k>>,
    except when <with|mode|math|k=1>, in which case
    <with|mode|math|B<rsub|1,<eps>>=-B<rsub|1>=1/2>.

    <item><label|ex:odd>Prove that if <with|mode|math|n\<gtr\>1> is odd, then
    the Bernoulli number <with|mode|math|B<rsub|n>> is <with|mode|math|0>.
  </exercises>

  <chapter|Computing Dimensions of Spaces of Modular Forms><label|ch:dim>

  When computing with spaces of modular forms, it is helpful to have
  easy-to-compute formulas for dimensions of these spaces, and certain of
  their subspaces. For example, they provide a double-check on the output of
  the algorithms from Chapter <reference|ch:modsym> that compute explicit
  bases for spaces of modular forms. Alternatively, dimension formulas can be
  used to improve the efficiency of some of the algorithms in Chapter
  <reference|ch:modsym>, since we can use them to determine the ranks of
  certain matrices without having to explicitly compute them. If we know the
  dimension of <with|mode|math|M<rsub|k>(N,<eps>)>, and we have a process for
  computing <with|mode|math|q>-expansions of elements of
  <with|mode|math|M<rsub|k>(N,<eps>)>, e.g., multiplying together
  <with|mode|math|q>-expansions of certain forms of smaller weight or
  searching for <with|mode|math|\<theta\>>-series attached to quadratic
  forms, then we can tell when we are done generating
  <with|mode|math|M<rsub|k>(N,<eps>)>.

  This chapter contains formulas the author knows for computing dimensions of
  spaces of modular forms, along with some hints about how to compute them,
  when this isn't obvious. In several cases we give dimension formulas for
  spaces that haven't yet been defined in this book, so we define them in
  this chapter (e.g., we will discuss newforms and oldforms further). We also
  give many examples, which were computed using the modular symbols
  algorithms from Chapter <reference|ch:modsym>.

  Many of the dimension formulas and algorithms we give below grew out of a
  program that Bruce Caskel wrote (around 1996) in PARI, which Kevin Buzzard
  extended. Their program codified dimension formulas that Buzzard and Caskel
  found or extracted from the literature (mainly <cite|shimura:intro> (S)).
  The algorithm for dimensions of spaces with nontrivial character are from
  <cite|cohen-oesterle:dimensions>, with some slight refinements from Kevin
  Buzzard.

  For the rest of this chapter, <with|mode|math|N> denotes a positive integer
  and <with|mode|math|k\<geq\>2> is an integer. We give
  <with|font-series|bold|no formulas> for dimensions of spaces of weight
  <with|mode|math|1> modular forms, because it is an
  <with|font-shape|italic|open problem> to give such formulas; the geometric
  methods used to derive the formulas below do not apply in the case
  <with|mode|math|k=1>. If <with|mode|math|k=0>, the only modular forms are
  the constants, and for <with|mode|math|k\<less\>0> the dimension of
  <with|mode|math|M<rsub|k>(N,<eps>)> is <with|mode|math|0>.

  For a nonzero integer <with|mode|math|N> and a prime <with|mode|math|p>,
  let <with|mode|math|v<rsub|p>(N)> be the largest <with|mode|math|e> such
  that <with|mode|math|p<rsup|e>\<mid\>N>. In the formulas below,
  <with|mode|math|p> always denotes a prime number. Let
  <with|mode|math|M<rsub|k>(N,<eps>)> be the space of modular forms of level
  <with|mode|math|N> weight <with|mode|math|k> and character
  <with|mode|math|<eps>>, and <with|mode|math|S<rsub|k>(N,<eps>)> and
  <with|mode|math|E<rsub|k>(N,<eps>)> the cuspidal and Eisenstein subspaces.

  The dimension formulas below for <with|mode|math|S<rsub|k>(\<Gamma\><rsub|0>(N))>,
  <with|mode|math|S<rsub|k>(\<Gamma\><rsub|1>(N))>,
  <with|mode|math|E<rsub|k>(\<Gamma\><rsub|0>(N))> and
  <with|mode|math|E<rsub|k>(\<Gamma\><rsub|1>(N))> below are almost straight
  from <cite|shimura:intro> (S) (see also <cite|miyake> (S)), and they are
  derived using the Riemann-Roch Theorem applied to the covering
  <with|mode|math|X<rsub|0>(N)\<to\>X<rsub|0>(1)> or
  <with|mode|math|X<rsub|1>(N)\<to\>X<rsub|1>(1)> and appropriately chosen
  divisors. It would be natural to give a sample argument along these lines
  at this point, but I will not since it easy to find such arguments in other
  books and survey papers (see, e.g., <cite|diamond-im>). So you will not
  learn much about how to derive dimension formulas from this chapter. What
  you will learn is what is known about dimension formulas and what some of
  the obscure references are.

  <section|Modular Forms for <with|mode|math|\<Gamma\><rsub|0>(N)>><label|sec:dimg0>Define
  functions of a positive integer <with|mode|math|N> by the following
  formulas:

  <\align*>
    <tformat|<table|<row|<cell|\<mu\><rsub|0>(N)>|<cell|=<big|prod><rsub|p\<mid\>N><left|(>p<rsup|v<rsub|p>(N)>+p<rsup|v<rsub|p>(N)-1><right|)>>>|<row|<cell|\<mu\><rsub|0,2>(N)>|<cell|=<cases|<tformat|<table|<row|<cell|0>|<cell|<with|mode|text|if
    <with|mode|math|4\<mid\>N>,>>>|<row|<cell|<big|prod><rsub|p\<mid\>N><left|(>1+<kr|-4|p><right|)>>|<cell|<with|mode|text|otherwise.>>>>>>>>|<row|<cell|\<mu\><rsub|0,3>(N)>|<cell|=<cases|<tformat|<table|<row|<cell|0>|<cell|<with|mode|text|if
    <with|mode|math|2\<mid\>N> or <with|mode|math|9\<mid\>N>,>>>|<row|<cell|<big|prod><rsub|p\<mid\>N><left|(>1+<kr|-3|p><right|)>>|<cell|<with|mode|text|otherwise.>>>>>>>>|<row|<cell|c<rsub|0>(N)>|<cell|=<big|sum><rsub|d\<mid\>N><vphi>(gcd(d,N/d))>>|<row|<cell|g<rsub|0>(N)>|<cell|=1+<frac|\<mu\><rsub|0>(N)|12>-<frac|\<mu\><rsub|0,2>(N)|4>-<\n><frac|\<mu\><rsub|0,3>(N)|3>-<frac|c<rsub|0>(N)|2>>>|<row|<cell|>|<cell|>>>>
  </align*>

  Note that <with|mode|math|\<mu\><rsub|0>(N)> is the index of
  <with|mode|math|\<Gamma\><rsub|0>(N)> in
  <with|mode|math|<SL><rsub|2>(<Z>)>. Also <with|mode|math|g<rsub|0>(N)> is
  the genus of the modular curve <with|mode|math|X<rsub|0>(N)>, and
  <with|mode|math|c<rsub|0>(N)> is the number of cusps of
  <with|mode|math|X<rsub|0>(N)>.

  <\proposition>
    We have <with|mode|math|dim S<rsub|2>(\<Gamma\><rsub|0>(N))=g<rsub|0>(N)>,
    and for <with|mode|math|k\<geq\>4> even,

    <\align*>
      <tformat|<table|<row|<cell|dim S<rsub|k>(\<Gamma\><rsub|0>(N))>|<cell|=(k-1)\<cdot\>(g<rsub|0>(N)-1)<space|0.25spc><space|0.25spc>+<space|0.25spc><space|0.25spc><left|(><frac|k|2>-1<right|)>\<cdot\>c<rsub|0>(N)<space|0.25spc><space|0.25spc>+>>|<row|<cell|>|<cell|<space|2fn><space|2fn>\<mu\><rsub|0,2>(N)\<cdot\><left|lfloor><frac|k|4><right|rfloor><space|0.25spc><space|0.25spc>+<space|0.25spc><space|0.25spc>\<mu\><rsub|0,3>(N)\<cdot\><left|lfloor><frac|k|3><right|rfloor>.>>>>
    </align*>

    The dimension of the Eisenstein subspace is as follows:

    <\equation*>
      dim E<rsub|k>(\<Gamma\><rsub|0>(N))=<cases|<tformat|<table|<row|<cell|c<rsub|0>(N)>|<cell|<with|mode|text|if
      <with|mode|math|k\<neq\>2>,>>>|<row|<cell|c<rsub|0>(N)-1>|<cell|<with|mode|text|if
      <with|mode|math|k=2>.>>>>>>
    </equation*>
  </proposition>

  The following table contains the dimension of
  <with|mode|math|S<rsub|k>(\<Gamma\><rsub|0>(N))> for some sample values of
  <with|mode|math|N> and <with|mode|math|k>:

  <\center>
    <tabular*|<tformat|<cwith|1|-1|1|1|cell-lborder|1ln>|<cwith|1|-1|1|1|cell-halign|l>|<cwith|1|-1|1|1|cell-rborder|1ln>|<cwith|1|-1|2|2|cell-halign|l>|<cwith|1|-1|3|3|cell-halign|l>|<cwith|1|-1|4|4|cell-halign|l>|<cwith|1|-1|5|5|cell-halign|l>|<cwith|1|-1|5|5|cell-rborder|1ln>|<cwith|1|1|1|-1|cell-tborder|1ln>|<cwith|1|1|1|-1|cell-bborder|1ln>|<cwith|9|9|1|-1|cell-bborder|1ln>|<table|<row|<cell|<with|mode|math|N>
    >|<cell| <with|mode|math|dim S<rsub|2>(\<Gamma\><rsub|0>(N))> >|<cell|
    <with|mode|math|dim S<rsub|4>(\<Gamma\><rsub|0>(N))> >|<cell|
    <with|mode|math|dim S<rsub|6>(\<Gamma\><rsub|0>(N))> >|<cell|
    <with|mode|math|dim S<rsub|24>(\<Gamma\><rsub|0>(N))>>>|<row|<cell|1
    >|<cell| 0 >|<cell| 0 >|<cell| 0 >|<cell| 2>>|<row|<cell|10 >|<cell| 0
    >|<cell| 3 >|<cell| 5 >|<cell| 33>>|<row|<cell|11 >|<cell| 1 >|<cell| 2
    >|<cell| 4 >|<cell| 22>>|<row|<cell|100 >|<cell| 7 >|<cell| 36 >|<cell|
    66 >|<cell| 336>>|<row|<cell|389 >|<cell| 32 >|<cell| 97 >|<cell| 161
    >|<cell| 747>>|<row|<cell|1000 >|<cell| 131 >|<cell| 430 >|<cell| 730
    >|<cell| 3430>>|<row|<cell|2004 >|<cell| 331 >|<cell| 1002 >|<cell| 1674
    >|<cell| 7722>>|<row|<cell|100000 >|<cell| 14801 >|<cell| 44800 >|<cell|
    74800 >|<cell| 344800>>>>>
  </center>

  <subsection|New and Old Subspaces> For each divisor
  <with|mode|math|N<rprime|'>> of <with|mode|math|N>, there are natural maps

  <\equation*>
    \<alpha\><rsub|d>:M<rsub|k>(\<Gamma\><rsub|0>(N<rprime|'>))\<to\>M<rsub|k>(\<Gamma\><rsub|0>(N)),
  </equation*>

  corresponding to the divisors <with|mode|math|d> of
  <with|mode|math|N/N<rprime|'>>, and maps

  <\equation*>
    \<beta\><rsub|d>:M<rsub|k>(\<Gamma\><rsub|0>(N))\<to\>M<rsub|k>(\<Gamma\><rsub|0>(N<rprime|'>)).
  </equation*>

  such that <with|mode|math|\<beta\><rsub|d>\<circ\>\<alpha\><rsub|d>> is
  multiplication by a nonzero scalar. On <with|mode|math|q>-expansions,
  <with|mode|math|\<alpha\><rsub|d>(f(q))=f(q<rsup|d>)>, and the definition
  of <with|mode|math|\<beta\><rsub|d>> is a more complicated ``trace map''
  (see, e.g., <cite|lang:modular>).

  The space <with|mode|math|M<rsub|k>(\<Gamma\><rsub|0>(N))> decomposes as a
  direct sum

  <\equation*>
    M<rsub|k>(\<Gamma\><rsub|0>(N))=M<rsub|k>(\<Gamma\><rsub|0>(N))<rsup|<old>>\<oplus\>M<rsub|k>(\<Gamma\><rsub|0>(N))<rsup|<new>>,
  </equation*>

  where <with|mode|math|M<rsub|k>(\<Gamma\><rsub|0>(N))<rsup|<old>>> is the
  subspace generated by all images <with|mode|math|\<alpha\><rsub|d>(M<rsub|k>(\<Gamma\><rsub|0>(N<rprime|'>))>
  where <with|mode|math|N<rprime|'>> runs through proper divisors of
  <with|mode|math|N> and <with|mode|math|d> runs through all divisors of
  <with|mode|math|N/N<rprime|'>>. The new subspace
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|0>(N))<rsup|<new>>> can be defined
  as either the intersection of the kernels of all maps
  <with|mode|math|\<beta\><rsub|d>> to lower level, or the largest
  Hecke-stable complement of <with|mode|math|M<rsub|k>(\<Gamma\><rsub|0>(N))<rsup|<old>>>.

  Atkin and Lehner <cite|atkin-lehner> proved that the space
  <with|mode|math|S<rsub|k>(\<Gamma\><rsub|0>(N))> is built out of new
  subspaces, in the following sense.

  <\theorem>
    [Atkin-Lehner]<label|thm:atkin-lehner>We have an isomorphism

    <\equation*>
      S<rsub|k>(\<Gamma\><rsub|0>(N))=<big|sum><rsub|M\<mid\>N><big|sum><rsub|d\<mid\>N/M>\<alpha\><rsub|d>(S<rsub|k>(\<Gamma\><rsub|0>(M))<rsup|<new>>).
    </equation*>

    This is an isomorphism of <with|mode|math|<T><rprime|'>> modules, where
    <with|mode|math|<T><rprime|'>> is the anemic Hecke algebra, i.e., the
    subring generated by Hecke operators <with|mode|math|T<rsub|n>> with
    <with|mode|math|gcd(n,N)=1>.
  </theorem>

  This theorem reduces the problem of computing
  <with|mode|math|S<rsub|k>(\<Gamma\><rsub|0>(N))> to that of computing
  <with|mode|math|S<rsub|k>(\<Gamma\><rsub|0>(M))<rsup|<new>>> for divisors
  <with|mode|math|M> of <with|mode|math|N>, a fact that will be central later
  in this book. Atkin and Lehner also prove that one can completely determine
  <with|mode|math|S<rsub|k>(\<Gamma\><rsub|0>(M))<rsup|<new>>> just from the
  information of how the Hecke operators act on it (their ``multiplicity
  one'' theory). Atkin and Lehner's work was generalized to fairly arbitrary
  congruence subgroups of <with|mode|math|<SL><rsub|2>(<Z>)> by Winnie Li in
  her Berkeley Ph.D. thesis under A. Ogg (see <cite|winnie:newforms>).

  If <with|mode|math|N<rprime|''>\<mid\>N<rprime|'>\<mid\>N>, then the maps
  <with|mode|math|\<alpha\><rsub|d>> from
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|0>(N<rprime|''>))> to
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|0>(N))> factor through
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|0>(N<rprime|'>))>. Thus in the
  definition of <with|mode|math|M<rsub|k>(\<Gamma\><rsub|0>(N))<rsup|<old>>>
  and <with|mode|math|M<rsub|k>(\<Gamma\><rsub|0>(N))<rsup|<new>>>, it would
  suffice to consider only proper divisors <with|mode|math|N<rprime|'>> of
  <with|mode|math|N> such that <with|mode|math|N/N<rprime|'>> is prime.

  <vspace|1ex><no-indent><with|font-series|bold|Warning:> For a fixed
  <with|mode|math|N<rprime|'>=N/p>, the images of
  <with|mode|math|\<alpha\><rsub|1>> and <with|mode|math|\<alpha\><rsub|p>>
  need <with|font-shape|italic|not> always be linearly independent (see
  Example <reference|ex:new> below). However, the images of the new subspace
  <with|mode|math|S<rsub|k>(\<Gamma\><rsub|0>(N<rprime|'>))<rsup|<new>>> are
  linearly independent, as asserted by Theorem <reference|thm:atkin-lehner>.

  <\proposition>
    <label|prop:newg0>The dimension of the new subspace is

    <\equation*>
      dim S<rsub|k>(\<Gamma\><rsub|0>(N))<rsup|<new>>=<big|sum><rsub|M\<mid\>N><overline|\<mu\>>(N/M)\<cdot\>dim
      S<rsub|k>(\<Gamma\><rsub|0>(M)),
    </equation*>

    where the sum is over the positive divisors of <with|mode|math|N>, and
    for an integer <with|mode|math|R>,

    <\equation*>
      <overline|\<mu\>>(R)=<cases|<tformat|<table|<row|<cell|0>|<cell|<with|mode|text|if
      <with|mode|math|p<rsup|3>\<mid\>R> for some
      <with|mode|math|p>>>>|<row|<cell|<ds><big|prod><rsub|p\<mid\>\<mid\>R>-2>|<cell|<with|mode|text|otherwise>,>>>>>
    </equation*>

    where the product is over primes that exactly divide <with|mode|math|n>.
    (Note that <with|mode|math|<overline|\<mu\>>> is
    <with|font-shape|italic|not> the Moebius function, but is similar to it.)
  </proposition>

  <label|prop:dimg0>Let <with|mode|math|f(n)=dim
  S<rsub|k>(\<Gamma\><rsub|0>(n))> and <with|mode|math|g(n)=dim
  S<rsub|k>(\<Gamma\><rsub|0>(n))<rsup|<new>>>. Theorem
  <reference|thm:atkin-lehner> implies that

  <\equation>
    <label|eqn:mumu>f(N)=<big|sum><rsub|M\<mid\>N>\<sigma\><rsub|0>(N/M)g(M),
  </equation>

  where <with|mode|math|\<sigma\><rsub|0>(N/M)> is the number of divisors of
  <with|mode|math|N/M>. Presumably there is an analogue of Moebius inversion,
  but for functions with the property in (<reference|eqn:mumu>), which
  involves the function <with|mode|math|<overline|\<mu\>>>.

  <\example>
    <label|ex:new>The space <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(45))>
    has dimension <with|mode|math|10> and basis\ 

    <\verbatim>
      1 + 12*q^15 + O(q^20),

      q + q^7 + 3*q^16 + 6*q^19 + O(q^20),

      q^2 + 4*q^11 + 3*q^14 + q^17 + O(q^20),

      q^3 + q^12 + q^15 + 3*q^18 + O(q^20),

      q^4 + q^7 + 2*q^13 + 4*q^16 + 2*q^19 + O(q^20),

      q^5 + O(q^20),

      q^6 + 2*q^12 + 2*q^15 - q^18 + O(q^20),

      q^8 + q^14 + q^17 + O(q^20),

      q^9 - 2*q^15 + 3*q^18 + O(q^20),

      q^10 + O(q^20)
    </verbatim>

    The new subspace is spanned by the single cusp form\ 

    <\verbatim>
      q + q^2 - q^4 - q^5 - 3*q^8 - q^10 + 4*q^11 - 2*q^13 + O(q^14)
    </verbatim>

    First consider <with|mode|math|N<rprime|'>=45/3=15>. The space
    <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(15))> has basis\ 

    <\verbatim>
      1 + 12*q^5 + O(q^8),

      q + q^4 + q^5 + 3*q^6 + 2*q^7 + O(q^8),

      q^2 + 2*q^4 + 2*q^5 - q^6 + 2*q^7 + O(q^8),

      q^3 - 2*q^5 + 3*q^6 + O(q^8)
    </verbatim>

    There are two maps <with|mode|math|\<alpha\><rsub|1>> and
    <with|mode|math|\<alpha\><rsub|3>> from
    <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(15))> to
    <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(45))>. The one dimension
    space <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(5))> embeds in
    <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(15))> via
    <with|mode|math|f(q)\<mapsto\>f(q)> and
    <with|mode|math|f(q)\<mapsto\>f(q<rsup|3>)>. We have a commutative
    diagram

    <\equation*>
      <xymatrix|<tformat|<table|<row|<cell|>|<cell|M<rsub|2>(\<Gamma\><rsub|0>(15))<ar>[r*d]<rsup|\<alpha\><rsub|3>>>|<cell|>>|<row|<cell|M<rsub|2>(\<Gamma\><rsub|0>(5))<ar>[u*r]<rsup|\<alpha\><rsub|1>><ar>[d*r]<rsup|\<alpha\><rsub|3>>>|<cell|>|<cell|M<rsub|2>(\<Gamma\><rsub|0>(45)).>>|<row|<cell|>|<cell|M<rsub|2>(\<Gamma\><rsub|0>(15))<ar>[u*r]<rsup|\<alpha\><rsub|1>>>|<cell|>>>>>
    </equation*>

    This diagram illustrates that the intersection of the two images of
    <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(15))> has dimension at least
    <with|mode|math|1>. In fact, the sum of the images of the two maps from
    <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(15))> is a
    <with|mode|math|7>-dimensional subspace of
    <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(45))>.

    Next consider <with|mode|math|N<rprime|'>=45/5=9>, where the space
    <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(9))=E<rsub|2>(\<Gamma\><rsub|0>(9))>
    has as basis the three forms\ 

    <\verbatim>
      1 + 12*q^3 + 36*q^6 + O(q^8),

      q + 7*q^4 + 8*q^7 + O(q^8),

      q^2 + 2*q^5 + O(q^8)
    </verbatim>

    There are two maps <with|mode|math|\<alpha\><rsub|1>> and
    <with|mode|math|\<alpha\><rsub|5>> from
    <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(9))> to
    <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(45))>. The images of these
    two maps span a space of dimension <with|mode|math|6>, and this space
    intersects the span of the images of <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(15))>
    in a space of dimension <with|mode|math|4>. Thus the old subspace
    <with|mode|math|M<rsub|2>(\<Gamma\><rsub|0>(45))<rsup|<old>>> has
    dimension <with|mode|math|9>, and the new subspace has dimension
    <with|mode|math|1>. The new subspace is spanned by the single cusp form\ 

    <\verbatim>
      q + q^2 - q^4 - q^5 - 3*q^8 - q^10 + 4*q^11 + O(q^12)
    </verbatim>
  </example>

  <\remark>
    Csirik, Wetherell, and Zieve prove in <cite|csirik-wetherell-zieve:g0>
    that a random positive integer has probability <with|mode|math|0> of
    being a value of <with|mode|math|g<rsub|0>(N)=dim
    S<rsub|2>(\<Gamma\><rsub|0>(N))>, and give bounds on the size of the set
    of values of <with|mode|math|g<rsub|0>(N)> below some given
    <with|mode|math|x>. For example, they show that
    <with|mode|math|150,180,210,286,304,312,\<ldots\>> are the first few
    integers that are not of the form <with|mode|math|g<rsub|0>(N)> for some
    <with|mode|math|N>.
  </remark>

  <section|Modular Forms for <with|mode|math|\<Gamma\><rsub|1>(N)>> This
  section follows Section <reference|sec:dimg0> closely, but with suitable
  modifications with <with|mode|math|\<Gamma\><rsub|0>(N)> replaced by
  <with|mode|math|\<Gamma\><rsub|1>(N)>. The notion of new and old subspaces
  for <with|mode|math|\<Gamma\><rsub|1>(N)> is exactly the same as for
  <with|mode|math|\<Gamma\><rsub|0>(N)>; simply replace
  <with|mode|math|\<Gamma\><rsub|0>(N)> by
  <with|mode|math|\<Gamma\><rsub|1>(N)> in the discussion of new and old
  forms in Section <reference|sec:dimg0>.

  Define functions of a positive integer <with|mode|math|N> by the following
  formulas:

  <\align*>
    <tformat|<table|<row|<cell|\<mu\><rsub|1>(N)>|<cell|=<cases|<tformat|<table|<row|<cell|\<mu\><rsub|0>(N)>|<cell|<with|mode|text|if
    <with|mode|math|N=1,2>,>>>|<row|<cell|<ds><frac|\<phi\>(N)\<cdot\>\<mu\><rsub|0>(N)|2>>|<cell|<with|mode|text|otherwise.>>>>>>>>|<row|<cell|\<mu\><rsub|1,2>(N)>|<cell|=<cases|<tformat|<table|<row|<cell|0>|<cell|<with|mode|text|if
    <with|mode|math|N\<geq\>4>,>>>|<row|<cell|\<mu\><rsub|0,2>(N)>|<cell|<with|mode|text|otherwise.>>>>>>>>|<row|<cell|\<mu\><rsub|1,3>(N)>|<cell|=<cases|<tformat|<table|<row|<cell|0>|<cell|<with|mode|text|if
    <with|mode|math|N\<geq\>4>,>>>|<row|<cell|\<mu\><rsub|0,3>(N)>|<cell|<with|mode|text|otherwise.>>>>>>>>|<row|<cell|c<rsub|1>(N)>|<cell|=<cases|<tformat|<table|<row|<cell|c<rsub|0>(N)>|<cell|<with|mode|text|if
    <with|mode|math|N=1,2>,>>>|<row|<cell|3>|<cell|<with|mode|text|if
    <with|mode|math|N=4>,>>>|<row|<cell|<ds><big|sum><rsub|d\<mid\>N><frac|\<phi\>(d)\<phi\>(N/d)|2>>|<cell|<with|mode|text|otherwise>.>>>>>>>|<row|<cell|g<rsub|1>(N)>|<cell|=1+<frac|\<mu\><rsub|1>(N)|12>-<frac|\<mu\><rsub|1,2>(N)|4>-<frac|\<mu\><rsub|1,3>(N)|3>-<frac|c<rsub|1>(N)|2>>>>>
  </align*>

  Note that <with|mode|math|g<rsub|1>(N)> is the genus of the modular curve
  <with|mode|math|X<rsub|1>(N)>, and <with|mode|math|c<rsub|1>(N)> is the
  number of cusps of <with|mode|math|X<rsub|1>(N)>. <todo|Make sure this is
  right for <with|mode|math|N\<leq\>5>.>

  <\proposition>
    We have <with|mode|math|dim S<rsub|2>(\<Gamma\><rsub|1>(N))=g<rsub|1>(N)>.
    If <with|mode|math|N\<leq\>2>, then

    <\equation*>
      dim S<rsub|k>(\<Gamma\><rsub|1>(N))=dim
      S<rsub|k>(\<Gamma\><rsub|0>(N)),
    </equation*>

    where <with|mode|math|dim S<rsub|k>(\<Gamma\><rsub|0>(N))> is given by
    the formula of Proposition <reference|prop:dimg0>. If
    <with|mode|math|k\<geq\>3>, let

    <\equation*>
      a=(k-1)(g<rsub|1>(N)-1)+<left|(><frac|k|2>-1<right|)>\<cdot\>c<rsub|1>(N).
    </equation*>

    Then for <with|mode|math|N\<geq\>3>,

    <\equation*>
      dim S<rsub|k>(\<Gamma\><rsub|1>(N))=<cases|<tformat|<table|<row|<cell|a+1/2>|<cell|<with|mode|text|if
      <with|mode|math|N=4> and <with|mode|math|2\<nmid\>k>,>>>|<row|<cell|a+\<lfloor\>k/3\<rfloor\>>|<cell|<with|mode|text|if
      <with|mode|math|N=3>,>>>|<row|<cell|a>|<cell|<with|mode|text|otherwise.>>>>>>
    </equation*>

    The dimension of the Eisenstein subspace is as follows:

    <\equation*>
      dim E<rsub|k>(\<Gamma\><rsub|1>(N))=<cases|<tformat|<table|<row|<cell|c<rsub|1>(N)>|<cell|<with|mode|text|if
      <with|mode|math|k\<neq\>2>,>>>|<row|<cell|c<rsub|1>(N)-1>|<cell|<with|mode|text|if
      <with|mode|math|k=2>.>>>>>>
    </equation*>

    The dimension of the new subspace of <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))>
    is

    <\equation*>
      dim S<rsub|k>(\<Gamma\><rsub|1>(N))<rsup|<new>>=<big|sum><rsub|M\<mid\>N><overline|\<mu\>>(N/M)\<cdot\>dim
      S<rsub|k>(\<Gamma\><rsub|1>(M)),
    </equation*>

    where <with|mode|math|<overline|\<mu\>>> is as in the statement of
    Proposition <reference|prop:newg0>.
  </proposition>

  <\remark>
    Since <with|mode|math|M<rsub|k>=S<rsub|k>\<oplus\>E<rsub|k>>, the
    formulas above also give a formula for the dimension of
    <with|mode|math|M<rsub|k>>.
  </remark>

  The following table contains the dimension of
  <with|mode|math|S<rsub|k>(\<Gamma\><rsub|1>(N))> for some sample values of
  <with|mode|math|N> and <with|mode|math|k>:

  <\center>
    <tabular*|<tformat|<cwith|1|-1|1|1|cell-lborder|1ln>|<cwith|1|-1|1|1|cell-halign|l>|<cwith|1|-1|1|1|cell-rborder|1ln>|<cwith|1|-1|2|2|cell-halign|l>|<cwith|1|-1|3|3|cell-halign|l>|<cwith|1|-1|4|4|cell-halign|l>|<cwith|1|-1|5|5|cell-halign|l>|<cwith|1|-1|5|5|cell-rborder|1ln>|<cwith|1|1|1|-1|cell-tborder|1ln>|<cwith|1|1|1|-1|cell-bborder|1ln>|<cwith|9|9|1|-1|cell-bborder|1ln>|<table|<row|<cell|<with|mode|math|N>
    >|<cell| <with|mode|math|dim S<rsub|2>(\<Gamma\><rsub|1>(N))> >|<cell|
    <with|mode|math|dim S<rsub|3>(\<Gamma\><rsub|1>(N))> >|<cell|
    <with|mode|math|dim S<rsub|4>(\<Gamma\><rsub|1>(N))> >|<cell|
    <with|mode|math|dim S<rsub|24>(\<Gamma\><rsub|1>(N))>>>|<row|<cell|1
    >|<cell| 0 >|<cell| 0 >|<cell| 0 >|<cell| 2>>|<row|<cell|10 >|<cell| 0
    >|<cell| 2 >|<cell| 5 >|<cell| 65>>|<row|<cell|11 >|<cell| 1 >|<cell| 5
    >|<cell| 10 >|<cell| 110>>|<row|<cell|100 >|<cell| 231 >|<cell| 530
    >|<cell| 830 >|<cell| 6830>>|<row|<cell|389 >|<cell| 6112 >|<cell| 12416
    >|<cell| 18721 >|<cell| 144821>>|<row|<cell|1000 >|<cell| 28921 >|<cell|
    58920 >|<cell| 88920 >|<cell| 688920>>|<row|<cell|2004 >|<cell| 109893
    >|<cell| 221444 >|<cell| 332996 >|<cell| 2564036>>|<row|<cell|100000
    >|<cell| 299792001 >|<cell| 599792000 >|<cell| 899792000 >|<cell|
    6899792000>>>>>
  </center>

  <section|Modular Forms with Character> Fix a Dirichlet character
  <with|mode|math|<eps>> modulo <with|mode|math|N>, and let
  <with|mode|math|c> be the conductor of <with|mode|math|<eps>> (we do
  <with|font-shape|italic|not> assume that <with|mode|math|<eps>> is
  primitive). Assume that <with|mode|math|<eps>\<neq\>1>, since otherwise
  <with|mode|math|M<rsub|k>(N,<eps>)=M<rsub|k>(\<Gamma\><rsub|0>(N))> and the
  formulas of Section <reference|sec:dimg0> apply. Also, assume that
  <with|mode|math|<eps>(-1)=(-1)<rsup|k>>, since otherwise
  <with|mode|math|dim M<rsub|k>(\<Gamma\><rsub|0>(N))=0>. In this section we
  discuss formulas for certain subspaces of
  <with|mode|math|M<rsub|k>(N,<eps>)>.

  In <cite|cohen-oesterle:dimensions>, Cohen and Oesterle assert (without
  proof, see Remark <reference|rem:co> below) that for any
  <with|mode|math|k\<in\><Z>> and <with|mode|math|N>, <with|mode|math|<eps>>
  as above, that

  <\align*>
    <tformat|<table|<row|<cell|dim S<rsub|k>(N,<eps>)>|<cell|-dim
    M<rsub|2-k>(N,<eps>)>>|<row|<cell|>|<cell|=<frac|k-1|12>\<cdot\>\<mu\><rsub|0>(N)<space|0.25spc><space|0.25spc>-<space|0.25spc><space|0.25spc><frac|1|2>\<cdot\><big|prod><rsub|p\<mid\>N>\<lambda\>(p,N,v<rsub|p>(c))>>|<row|<cell|>|<cell|<space|2fn>+\<gamma\><rsub|4>(k)\<cdot\><space|-0.25spc><space|-0.25spc><big|sum><rsub|x\<in\>A<rsub|4>(N)><eps>(x)<space|0.25spc><space|0.25spc><space|0.25spc>+<space|0.25spc><space|0.25spc><space|0.25spc>\<gamma\><rsub|3>(k)\<cdot\><space|-0.25spc><space|-0.25spc><big|sum><rsub|x\<in\>A<rsub|3>(N)><eps>(x)>>>>
  </align*>

  where <with|mode|math|\<mu\><rsub|0>(N)> is as in Section
  <reference|sec:dimg0>, <with|mode|math|A<rsub|4>(N)={x\<in\><Z>/N<Z>:x<rsup|2>+1=0}>
  and <with|mode|math|A<rsub|3>(N)={x\<in\><Z>/N<Z>:x<rsup|2>+x+1=0}>, and
  <with|mode|math|\<gamma\><rsub|3>,\<gamma\><rsub|4>> are:

  <\align*>
    <tformat|<table|<row|<cell|\<gamma\><rsub|4>(k)>|<cell|=<cases|<tformat|<table|<row|<cell|-1/4>|<cell|<with|mode|text|if
    <with|mode|math|k<con>2<pmod|4>>>>>|<row|<cell|1/4>|<cell|<with|mode|text|if
    <with|mode|math|k<con>0<pmod|4>>>>>|<row|<cell|0>|<cell|<with|mode|text|if
    <with|mode|math|k> is odd>>>>>>>>|<row|<cell|\<gamma\><rsub|3>(k)>|<cell|=<cases|<tformat|<table|<row|<cell|-1/3>|<cell|<with|mode|text|if
    <with|mode|math|k<con>2<pmod|3>>>>>|<row|<cell|1/3>|<cell|<with|mode|text|if
    <with|mode|math|k<con>0<pmod|3>>>>>|<row|<cell|0>|<cell|<with|mode|text|if
    <with|mode|math|k<con>1<pmod|3>>>>>>>>>>>>
  </align*>

  It remains to define <with|mode|math|\<lambda\>>. Fix a prime divisor
  <with|mode|math|p\<mid\>N> and let <with|mode|math|r=v<rsub|p>(N)>. Then

  <\equation*>
    \<lambda\>(p,N,v<rsub|p>(c))=<cases|<tformat|<table|<row|<cell|p<rsup|<frac|r|2>>+p<rsup|<frac|r|2>-1>>|<cell|<with|mode|text|if
    <with|mode|math|2\<cdot\>v<rsub|p>(c)\<leq\>r> and
    <with|mode|math|2\<mid\>r>,>>>|<row|<cell|2\<cdot\>p<rsup|<frac|r-1|2>>>|<cell|<with|mode|text|if
    <with|mode|math|2\<cdot\>v<rsub|p>(c)\<leq\>r> and
    <with|mode|math|2\<nmid\>r>,>>>|<row|<cell|2\<cdot\>p<rsup|r-v<rsub|p>(c)>>|<cell|<with|mode|text|if
    <with|mode|math|2\<cdot\>v<rsub|p>(c)\<gtr\>r>>>>>>>
  </equation*>

  The formula can be used to compute <with|mode|math|dim M<rsub|k>(N,<eps>)>,
  <with|mode|math|dim S<rsub|k>(N,<eps>)>, and <with|mode|math|dim
  E<rsub|k>(N,<eps>)> for any <with|mode|math|N>, <with|mode|math|<eps>>,
  <with|mode|math|k\<neq\>1>, by using that

  <\align*>
    <tformat|<table|<row|<cell|dim S<rsub|k>(N,<eps>)>|<cell|=0<space|2fn><with|mode|text|if
    <with|mode|math|k\<leq\>0>>>>|<row|<cell|dim
    M<rsub|k>(N,<eps>)>|<cell|=0<space|2fn><with|mode|text|if
    <with|mode|math|k\<less\>0>>>>|<row|<cell|dim
    M<rsub|0>(N,<eps>)>|<cell|=1<space|2fn><with|mode|text|if
    <with|mode|math|k=0>>>>>>
  </align*>

  One thing that is not straightforward when implementing an algorithm to
  compute the above dimension formulas is how to efficiently compute the sets
  <with|mode|math|A<rsub|4>(N)> and <with|mode|math|A<rsub|6>(N)>. Kevin
  Buzzard suggested the following two algorithms to the author. Note that if
  <with|mode|math|k> is odd, then <with|mode|math|\<gamma\><rsub|4>(k)=0>, so
  the sum over <with|mode|math|A<rsub|4>(N)> is only needed when
  <with|mode|math|k> is even. <algorithm|Compute Sum over
  <with|mode|math|A<rsub|4>(N)>|<label|alg:suma4>INPUT: A positive integer
  <with|mode|math|N> and an even Dirichlet character <with|mode|math|<eps>>
  modulo <with|mode|math|N>.<next-line>OUTPUT: The sum
  <with|mode|math|<big|sum><rsub|x\<in\>A<rsub|4>(N)><eps>(x)>. <\steps>
    <item>[Factor <with|mode|math|N>] Compute the prime factorization
    <with|mode|math|p<rsub|1><rsup|e<rsub|1>>\<cdots\>p<rsub|n><rsup|e<rsub|n>>>
    of <with|mode|math|N>.

    <item>[Initialize] Set <with|mode|math|t<set>1> and
    <with|mode|math|i<set>0>.

    <item>[Loop over prime divisors]<label|alg:sum1go>Set
    <with|mode|math|i<set>i+1>. If <with|mode|math|i\<gtr\>n>, return
    <with|mode|math|t>. Otherwise set <with|mode|math|p<set>p<rsub|i>> and
    <with|mode|math|e<set>e<rsub|i>>. <\steps>
      <item><label|alg:a4>If <with|mode|math|p<con>3<pmod|4>>, return
      <with|mode|math|0>.

      <item><label|alg:a4>If <with|mode|math|p=2> and
      <with|mode|math|e\<gtr\>1>, return <with|mode|math|0>.

      <item>If <with|mode|math|p=2> and <with|mode|math|e=1>, go to Step
      <reference|alg:sum1go>.

      <item><label|alg:a4>Compute a generator
      <with|mode|math|a\<in\>(<Z>/p<Z>)<rsup|\<ast\>>> using Algorithm
      <reference|alg:mingens>.

      <item>Compute <with|mode|math|\<omega\>=a<rsup|(p-1)/4>>.

      <item>Using the Chinese Remainder Theorem to find
      <with|mode|math|x\<in\><Z>/N<Z>> such that
      <with|mode|math|x<con>a<pmod|p>> and
      <with|mode|math|x<con>1<pmod|N/p<rsup|e>>>.

      <item><label|alg:a4>Set <with|mode|math|x<set>x<rsup|p<rsup|r-1>>>.

      <item><label|alg:a4>Set <with|mode|math|s<set><eps>(x)>.

      <item><label|alg:a4>If <with|mode|math|s=1>, set
      <with|mode|math|t<set>2t> and go to Step <reference|alg:sum1go>.

      <item><label|alg:a4>If <with|mode|math|s=-1>, set
      <with|mode|math|t<set>-2t> and go to Step <reference|alg:sum1go>.\ 
    </steps>\ 
  </steps> >

  <\proof>
    Note that <with|mode|math|<eps>(-x)=<eps>(x)>, since
    <with|mode|math|<eps>> is even. By the chinese remainder theorem, the set
    <with|mode|math|A<rsub|4>(N)> is empty if and only if there is no square
    root of <with|mode|math|-1> modulo some prime power divisor of
    <with|mode|math|p>. If <with|mode|math|A<rsub|4>(N)> is empty, the
    algorithm correctly detects this fact in steps
    <reference|alg:a4>--<reference|alg:a4>. Thus assume
    <with|mode|math|A<rsub|4>(N)> is non-empty. For each prime power
    <with|mode|math|p<rsub|i><rsup|e<rsub|i>>> that exactly divides
    <with|mode|math|N>, let <with|mode|math|x<rsub|i>\<in\>Z/N<Z>> be such
    that <with|mode|math|x<rsub|i><rsup|2>=-1> and
    <with|mode|math|x<rsub|i><con>1<pmod|p<rsub|j><rsup|e<rsub|j>>>> for
    <with|mode|math|i\<neq\>j>. This is the value of <with|mode|math|x>
    computed in steps <reference|alg:a4>--<reference|alg:a4> (as one can see
    using elementary number theory).

    The next key observation is that

    <\equation>
      <label|eqn:a4prodsum><big|prod><rsub|i>(<eps>(x<rsub|i>)+<eps>(-x<rsub|i>))=<big|sum><rsub|x\<in\>A<rsub|4>(N)><eps>(x),
    </equation>

    since by the chinese remainder theorem the elements of
    <with|mode|math|A<rsub|4>(N)> are in bijection with the choices for a
    square root of <with|mode|math|-1> modulo each prime power divisors of
    <with|mode|math|N>. The observation (<reference|eqn:a4prodsum>) is a huge
    gain from an efficiency point of view---if <with|mode|math|N> had
    <with|mode|math|r> prime factors, then <with|mode|math|A<rsub|4>(N)>
    would have size <with|mode|math|2<rsup|r>>, which could be prohibitive,
    where the product involves only <with|mode|math|r> factors. To finish the
    proof, just note that Steps <reference|alg:a4>--<reference|alg:a4>
    compute the local factors <with|mode|math|<eps>(x<rsub|i>)+<eps>(-x<rsub|i>)=2<eps>(x<rsub|i>)>,
    where again we use that <with|mode|math|<eps>> is even. (Note, e.g., that
    a solution of <with|mode|math|x<rsup|2>+1<con>0<pmod|p>> lifts uniquely
    to a solution mod <with|mode|math|p<rsup|n>> for any <with|mode|math|n>,
    because the kernel of the natural homomorphism
    <with|mode|math|(<Z>/p<rsup|n><Z>)<rsup|\<ast\>>\<to\>(<Z>/p<Z>)<rsup|\<ast\>>>
    is a group of <with|mode|math|p>-power order.
  </proof>

  The algorithm for computing the sum over <with|mode|math|A<rsub|3>(N)> is
  similar, but we omit it.

  The following table contains the dimension of
  <with|mode|math|S<rsub|k>(N,<eps>)> for some sample values of
  <with|mode|math|N> and <with|mode|math|k>. In each case,
  <with|mode|math|<eps>> is the product of characters
  <with|mode|math|<eps><rsub|p>> of maximal order corresponding to the prime
  power factors of <with|mode|math|N> (i.e., the product of the generators of
  <with|mode|math|D(N,<C><rsup|\<ast\>>)>).

  <\center>
    <tabular*|<tformat|<cwith|1|-1|1|1|cell-lborder|1ln>|<cwith|1|-1|1|1|cell-halign|l>|<cwith|1|-1|1|1|cell-rborder|1ln>|<cwith|1|-1|2|2|cell-halign|l>|<cwith|1|-1|3|3|cell-halign|l>|<cwith|1|-1|4|4|cell-halign|l>|<cwith|1|-1|5|5|cell-halign|l>|<cwith|1|-1|5|5|cell-rborder|1ln>|<cwith|1|1|1|-1|cell-tborder|1ln>|<cwith|1|1|1|-1|cell-bborder|1ln>|<cwith|8|8|1|-1|cell-bborder|1ln>|<table|<row|<cell|<with|mode|math|N>
    >|<cell| <with|mode|math|dim S<rsub|2>(N,<eps>)> >|<cell|
    <with|mode|math|dim S<rsub|3>(N,<eps>)> >|<cell| <with|mode|math|dim
    S<rsub|4>(N,<eps>)> >|<cell| <with|mode|math|dim
    S<rsub|24>(N,<eps>)>>>|<row|<cell|1 >|<cell| 0 >|<cell| 0 >|<cell| 0
    >|<cell| 2>>|<row|<cell|10 >|<cell| 0 >|<cell| 1 >|<cell| 0 >|<cell|
    0>>|<row|<cell|11 >|<cell| 0 >|<cell| 1 >|<cell| 0 >|<cell|
    0>>|<row|<cell|100 >|<cell| 13 >|<cell| 0 >|<cell| 43 >|<cell|
    343>>|<row|<cell|389 >|<cell| 0 >|<cell| 64 >|<cell| 0 >|<cell|
    0>>|<row|<cell|1000 >|<cell| 148 >|<cell| 0 >|<cell| 448 >|<cell|
    3448>>|<row|<cell|2004 >|<cell| 0 >|<cell| 668 >|<cell| 0 >|<cell| 0>>>>>
  </center>

  <\remark>
    <label|rem:co>Cohen and Oesterle also give dimension formulas for spaces
    of half-integral weight modular forms, which we do not give in this
    chapter. Also <cite|cohen-oesterle:dimensions> does not contain any
    <with|font-shape|italic|proofs> that their claimed formulas are correct,
    but instead say only that ``Les formules qui les donnent sont connues de
    beaucoup de gens et il existe plusieurs méthodes permettant de les
    obtenir (théorčme de Riemann-Roch, application des formules de trace
    données par Shimura).'' (The formulas that we give here are well known
    and there exist many methods to prove them, e.g., the Riemann-Roch
    theorem and applications of the trace formula of Shimura.)
  </remark>

  <\exercises>
    <item>Fill in the elementary number theory details of the proof of
    Algorithm <reference|alg:suma4>.

    <item>Track this down the analogue of Moebius inversion for
    <with|mode|math|<overline|\<mu\>>> and give a quick presentation on it.

    <item>Implement in your favorite computer language an algorithm to
    compute <with|mode|math|dim S<rsub|k>(\<Gamma\><rsub|0>(N))>.
  </exercises>

  <chapter|Linear Algebra><label|ch:linalg>This chapter is about exact matrix
  algebra with over the rational numbers and cyclotomic fields. Algorithms
  for linear algebra over exact fields are necessary in order to implement
  the modular symbols algorithms that we will describe in Chapter
  <reference|ch:linalg>.

  This chapter partly overlaps with <cite|cohen:course> (S).

  <section|Echelon Form><label|sec:echelon>

  <\definition>
    [Reduced Row Echelon Form] A matrix is in <defn|row echelon form> if each
    row in the matrix starts with more zeros than the row above it. A matrix
    is in <defn|reduced row echelon form> if it is in row echelon form, the
    first nonzero entry of any row is <with|mode|math|1>, and the first
    nonzero entry of any row is the only nonzero value in its column.
  </definition>

  Given a matrix <with|mode|math|A>, there is another matrix
  <with|mode|math|B> such that <with|mode|math|B> is obtained from
  <with|mode|math|A> by left multiplication by an invertible matrix and
  <with|mode|math|B> is in reduced row echelon form. This matrix
  <with|mode|math|B> is called the reduced row echelon form of
  <with|mode|math|A>. It is unique.

  A <defn|pivot column> of <with|mode|math|A> is one such that the reduced
  row echelon form of <with|mode|math|A> contains a leading
  <with|mode|math|1>.

  <\example>
    The following matrix is in row echelon form, but not reduced row echelon
    form:\ 

    <\verbatim>
      \ [ 14, \ 2, \ 7, \ 228, -224;

      \ \ \ \ 0, \ 0, \ 3, \ \ 78, \ -70;

      \ \ \ \ 0, \ 0, \ 0, -405, \ 381]
    </verbatim>

    The reduced row echelon form of the above matrix is\ 

    <\verbatim>
      \ \ [1, 1/7, 0, 0, -1174/945;

      \ \ \ 0, \ \ 0, 1, 0, \ \ 152/135;

      \ \ \ 0, \ \ 0, 0, 1, \ -127/135]
    </verbatim>

    Notice that the entries of the reduced row echelon form can easily be
    messy. Another example is the simple looking matrix\ 

    <\verbatim>
      \ \ [ -9, \ 6, \ 7, 3, 1, 0, 0, 0;

      \ \ \ -10, \ 3, \ 8, 2, 0, 1, 0, 0;

      \ \ \ \ \ 3, -6, \ 2, 8, 0, 0, 1, 0;

      \ \ \ \ -8, -6, -8, 6, 0, 0, 0, 1]
    </verbatim>

    whose echelon form is\ 

    <\verbatim>
      \ \ [1, 0, 0, 0, \ 42/1025, \ -92/1025, \ 1/25, \ -9/205;

      \ \ \ 0, 1, 0, 0, 716/3075, -641/3075, -2/75, \ -7/615;

      \ \ \ 0, 0, 1, 0, -83/1025, \ 133/1025, \ 1/25, -23/410;

      \ \ \ 0, 0, 0, 1, 184/1025, -159/1025, \ 2/25, \ \ 9/410]
    </verbatim>
  </example>

  One learns in a basic linear algebra course that two matrices
  <with|mode|math|A> and <with|mode|math|B> have the same reduced row echelon
  form if and only if there is an invertible matrix <with|mode|math|E> such
  that <with|mode|math|E*A=B>. Also, many standard operations in linear
  algebra, e.g., computation of the kernel of a linear map, intersection of
  subspaces, membership checking, etc., can be encoded as a question about
  computing the echelon form of a matrix.

  The following is a naive algorithm for computing the echelon form of a
  matrix. <\algorithm|Gauss Elimination>
    <label|alg:gauss>INPUT: An <with|mode|math|m\<times\>n> matrix
    <with|mode|math|A> over a field.<next-line>OUTPUT: The reduced row
    echelon form of <with|mode|math|A>.<next-line>We write
    <with|font-family|tt|A[i,j]> for the <with|mode|math|i,j> entry of
    <with|mode|math|A>, where <with|mode|math|0\<leq\>i\<leq\>m-1> and
    <with|mode|math|0\<leq\>j\<leq\>n-1>.\ 

    <\verbatim>
      def echelon(A):

      \ \ \ \ start_row = 0

      \ \ \ \ nr = A.nrows \ \ \ \ \ \ \ # The number of rows of A

      \ \ \ \ nc = A.ncols \ \ \ \ \ \ \ # The number of columns of A

      \ \ \ \ for c in range(nc): # for c = 0, 1, 2, ..., nc-1

      \ \ \ \ \ \ \ \ for r in range(nr):

      \ \ \ \ \ \ \ \ \ \ \ \ a = A[r,c]

      \ \ \ \ \ \ \ \ \ \ \ \ # if a is nonzero

      \ \ \ \ \ \ \ \ \ \ \ \ if a != 0: \ 

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ # Rescale row r of A by 1/a.

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ A.scale_row(r, 1/a)

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ # Swap row r with the start_row row.

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ A.swap_rows(r, start_row)

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ # Clear the c-th column

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ for i in range(nr):

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if i != start_row:

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if A[i,c] != 0:

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ # Add -A[i,c]
      times start_row to the i-th row

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ # in order to
      clear the leading entry of\ 

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ # the i-th row.

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ A.add_multiple_of_row(start_row,
      -A[i,c], i)

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ # Increment the start_row

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ start_row = start_row + 1

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ # The following break means that we
      skip the rest

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ # of the for loop over r in range(nr),
      and

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ # increase c and start a new for loop
      over r.

      \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ break
    </verbatim>
  </algorithm> This algorithm takes <with|mode|math|O(m*n<rsup|2>)>
  arithmetic operation in the base field, where <with|mode|math|A> is an
  <with|mode|math|m\<times\>n> matrix. If the base field is
  <with|mode|math|<Q>>, the entries can become huge and arithmetic operations
  can be increasingly expensive. See Section <reference|sec:modularmethod>
  for ways to mitigate this problem.

  To conclude this section we mention how to convert a few standard problems
  into questions about reduced row echelon forms of matrices. Note that one
  can also phrase some of these answers in terms of the echelon form, which
  might be easier to compute, or an LUP decomposition (lower triangular times
  upper triangular times permutation matrix), which the numerical analysts
  use.

  <\enumerate>
    <item><with|font-series|bold|Kernel of <with|mode|math|A>:> Since passing
    to the reduced row echelon form of <with|mode|math|A> is the same as
    multiplying on the left by an invertible matrix, the kernel of the reduce
    row echelon form is the same as the kernel of <with|mode|math|A>. Thus we
    may assume <with|mode|math|A> is in reduced row echelon form. There is a
    basis vector of <with|mode|math|ker(A)> that corresponds to each
    non-pivot column of <with|mode|math|A>. That vector has a
    <with|mode|math|1> at the non-pivot column, <with|mode|math|0>'s at all
    other non-pivot columns, and for each pivot column, the negative of the
    entry of <with|mode|math|A> at the non-pivot column in the row with that
    pivot element.

    <item><with|font-series|bold|Intersection of Subspaces:> Suppose
    <with|mode|math|W<rsub|1>> and <with|mode|math|W<rsub|2>> are subspace of
    a finite-dimensional vector space <with|mode|math|V>. Let
    <with|mode|math|A<rsub|1>> and <with|mode|math|A<rsub|2>> be matrices
    whose columns form a basis for <with|mode|math|W<rsub|1>> and
    <with|mode|math|W<rsub|2>>, respectively. Let
    <with|mode|math|A=[A<rsub|1>\|A<rsub|2>]> be the augmented matrix formed
    from <with|mode|math|A<rsub|1>> and <with|mode|math|A<rsub|2>>. Let
    <with|mode|math|K> be the kernel of the linear transformation defined by
    <with|mode|math|A>. Then K is isomorphic to the desired intersection. To
    write down the intersection explicitly, suppose that
    <with|mode|math|dim(V)\<leq\>dim(W)> and do the following: For each
    <with|mode|math|b> in a basis for <with|mode|math|K>, write down the
    linear combination of a basis for <with|mode|math|V> got by taking the
    first <with|mode|math|dim(V)> entries of the vector <with|mode|math|b>.
    The fact that <with|mode|math|b> is in <with|mode|math|<Ker>(A)> implies
    that the vector we just wrote down is also in <with|mode|math|W>. We took
    <with|mode|math|V> to have smaller dimension just so that the linear
    combinations in the intersection could be written down slightly more
    quickly.
  </enumerate>

  <section|Echelon Forms over <with|mode|math|<Q>>><label|sec:modularmethod>A
  major difficulty with computation of the echelon form of a dense matrix
  over the rational numbers is that arithmetic with large rational numbers is
  very time consuming, since each addition potentially requires a
  <with|mode|math|gcd> and numerous additions and multiplications of
  integers. Moreover, the entries of <with|mode|math|A> during intermediate
  steps of Algorithm <reference|alg:gauss> can be huge even though the
  entries of <with|mode|math|A> and the answer are small. For example,
  suppose <with|mode|math|A> is an invertible square matrix. Then the echelon
  form of <with|mode|math|A> is the identity matrix, but during intermediate
  steps the entries of <with|mode|math|A> could be quite large. One technique
  for mitigating this problem is to compute the echelon form using a
  multi-modular method. The following is a sketch of such a multi-modular
  method (we will give a more precise version later):

  <\enumerate>
    <item>By clearing denominators, we may assume that the entries of
    <with|mode|math|A> are integers.

    <item>Compute the echelon forms <with|mode|math|B<rsub|p>> of the
    reduction <with|mode|math|A<pmod|p>> of <with|mode|math|A> modulo several
    primes <with|mode|math|P={p,\<ldots\>}>, using some variant of Algorithm
    <reference|alg:gauss>. (Note that arithmetic modulo <with|mode|math|p>
    for a ``machine size'' prime <with|mode|math|p> is
    <with|font-shape|italic|very> fast.)

    <item>Use the Chinese Remainder Theorem to find a matrix
    <with|mode|math|B> with integer entries such that
    <with|mode|math|B<con>B<rsub|p><pmod|p>> for all
    <with|mode|math|p\<in\>P>.

    <item>Use rational reconstruction (see below) to find a matrix
    <with|mode|math|C> whose coefficients are rational numbers
    <with|mode|math|n/r> such that <with|mode|math|\|n\|,r\<leq\><sqrt|m/2>>,
    where <with|mode|math|m> is the product of the primes in
    <with|mode|math|P>, and <with|mode|math|C<con>B<rsub|p><pmod|p>> for each
    prime <with|mode|math|p>.

    <item>Use height bounds to verify that <with|mode|math|C> is the reduced
    row echelon form of <with|mode|math|A>.
  </enumerate>

  Rational reconstruction is a process that allows one to sometimes lift an
  integer modulo <with|mode|math|m> uniquely to a bounded rational number.

  <\algorithm|Rational Reconstruction>
    <label|alg:ratrecon>INPUT: An integer <with|mode|math|a\<geq\>0> and an
    integer <with|mode|math|m\<geq\>1>.<next-line>OUTPUT: The numerator and
    denominator <with|mode|math|n>, <with|mode|math|d> of the unique rational
    number <with|mode|math|n/d>, if it exists, with

    <\equation*>
      \|n\|,d\<leq\><sqrt|<frac|m|2>><space|2fn><with|mode|text|and><space|2fn>n<con>a*d<pmod|m>,
    </equation*>

    or returns <with|mode|math|n=d=0>, if no such rational number exists.\ 

    <\verbatim>
      def rational_reconstruction(a, m):

      \ \ \ \ # Reduce a modulo m

      \ \ \ \ a = a % m \ \ \ \ \ \ \ \ \ \ 

      \ \ \ \ # Trivial special cases

      \ \ \ \ if a == 0: return (0,1)

      \ \ \ \ if a == 1: return (1,1)

      \ \ \ \ # Let bnd be the integer part of the square root of m/2.

      \ \ \ \ bnd = sqrt(m/2.0) \ \ \ 

      \ \ \ \ # Initialize Euclidean algorithm.

      \ \ \ \ u = m

      \ \ \ \ v = a

      \ \ \ \ # Perform the extended Euclidean algorithm, but terminate

      \ \ \ \ # when V[2] is \<less\>= bnd.

      \ \ \ \ U = (1,0,u)

      \ \ \ \ V = (0,1,v)

      \ \ \ \ while abs(V[2]) \<gtr\> bnd:

      \ \ \ \ \ \ \ \ q = U[2]//V[2] \ \ \ \ \ # // means divide and take the
      integer part

      \ \ \ \ \ \ \ \ tmp = (U[0]-q*V[0], U[1]-q*V[1], U[2]-q*V[2])

      \ \ \ \ \ \ \ \ U = V

      \ \ \ \ \ \ \ \ V = tmp

      \ \ \ \ d = abs(V[1])

      \ \ \ \ n = V[2]

      \ \ \ \ if V[1] \<less\> 0: \ n = n * (-1)

      \ \ \ \ if d \<less\>= bnd and gcd(n,d) == 1:

      \ \ \ \ \ \ \ \ return (n,d)

      \ \ \ \ return (0,0)
    </verbatim>
  </algorithm>

  <\remark>
    [Technical Python Remarks] In Python, use the <with|font-family|tt|sqrt>
    function from the <with|font-family|tt|gmpy> GMP library, not the one
    from <with|font-family|tt|math>. With Python integers,
    <with|font-family|tt|a/b> also means divide and take the floor, i.e.,
    what we denote by <with|font-family|tt|a//b> above. Finally,
    <with|font-family|tt|gcd> is not included with Python. Use, e.g., the
    <with|font-family|tt|gmpy.gcd> function.
  </remark>

  Algorithm <reference|alg:ratrecon> for rational reconstruction is described
  (with a complete nontrivial proof) in <cite|knuth2> (pg.656--657) as the
  solution to exercise 51 on page 379. See in particular the paragraph right
  in the middle of page 657, which describes the algorithm. Knuth says this
  rational reconstruction algorithm is due to Wang, Kornerup, and Gregory
  from around 1983.

  We now give an indication of why Algorithm <reference|alg:ratrecon>
  computes the rational reconstruction of <with|mode|math|a<pmod|m>>, leaving
  the precise details and uniqueness to <cite|knuth2> (pg.656--657). At each
  step in Algorithm <reference|alg:ratrecon>, the <with|mode|math|3>-tuple
  <with|mode|math|V=(v<rsub|0>,v<rsub|1>,v<rsub|2>)> satisfies

  <\equation>
    <label|eqn:xgcdeqn>m\<cdot\>v<rsub|0>+a\<cdot\>v<rsub|1>=v<rsub|2>,
  </equation>

  and similarly for <with|mode|math|U>. When computing the usual extended
  <with|mode|math|gcd>, at the end <with|mode|math|v<rsub|2>=gcd(a,m)> and
  <with|mode|math|v<rsub|0>>, <with|mode|math|v<rsub|1>> give a
  representation of the <with|mode|math|v<rsub|2>> as a
  <with|mode|math|<Z>>-linear combination of <with|mode|math|m> and
  <with|mode|math|a>. In Algorithm <reference|alg:ratrecon>, we are instead
  interested in finding a rational number <with|mode|math|n/d> such that
  <with|mode|math|n<con>a\<cdot\>d<pmod|m>>. If we set
  <with|mode|math|n=v<rsub|2>> and <with|mode|math|d=v<rsub|1>> in
  (<reference|eqn:xgcdeqn>) and rearrange, we obtain

  <\equation*>
    n=a\<cdot\>d+m\<cdot\>v<rsub|0>.
  </equation*>

  Thus at <with|font-shape|italic|every> step of the algorithm we find a
  rational number <with|mode|math|n/d> such that
  <with|mode|math|n<con>a*d<pmod|m>>. The problem at intermediate steps is
  that, e.g., <with|mode|math|v<rsub|0>> could be <with|mode|math|0>, or
  <with|mode|math|n> or <with|mode|math|d> could be too large.

  If <with|mode|math|A> is a matrix with rational entries, let
  <with|mode|math|H(A)> be the <defn|height> of <with|mode|math|A>, which is
  the maximum of the absolute values of the numerators and denominators of
  all entries of <with|mode|math|A>.

  <algorithm|Modular Algorithm for Computing Echelon
  Form|<label|alg:modech>INPUT: An <with|mode|math|m\<times\>n> matrix
  <with|mode|math|A> with entries in <with|mode|math|<Q>>.<next-line>OUTPUT:
  The reduced row echelon form of <with|mode|math|A>. <\steps>
    <item>Rescale the input matrix <with|mode|math|A> to have integer
    entries. This does not change the echelon form and makes reduction modulo
    many primes easier. Henceforth we assume <with|mode|math|A> has integer
    entries.

    <item>Let <with|mode|math|c> be a guess for the height of the echelon
    form.

    <item>List successive primes <with|mode|math|p<rsub|1>,p<rsub|2>,\<ldots\>>
    such that the product of the <with|mode|math|p<rsub|i>> is bigger than
    <with|mode|math|n\<cdot\>c\<cdot\>H(A)+1>, where <with|mode|math|n> is
    the number of columns of <with|mode|math|A>.

    <item>Compute the echelon forms <with|mode|math|B<rsub|i>> of the
    reduction <with|mode|math|A<pmod|p<rsub|i>>> using, e.g., Algorithm
    <reference|alg:gauss> or something similar.

    <item><label|step:discard>Discard any <with|mode|math|B<rsub|i>> whose
    pivot column list is not maximal among pivot lists of all
    <with|mode|math|B<rsub|j>> found so far. (The pivot list associated to
    <with|mode|math|B<rsub|i>> is the ordered list of integers
    <with|mode|math|k> such that the <with|mode|math|k>th column of
    <with|mode|math|B<rsub|j>> is a pivot column. We mean maximal with
    respect to the following ordering on integer sequences: shorter integer
    sequences are smaller, and if two sequences have the same length, then
    order in reverse lexicographic order. Thus <with|mode|math|[1,2]> is
    smaller than <with|mode|math|[1,2,3]>, and <with|mode|math|[1,2,7]> is
    smaller than <with|mode|math|[1,2,5]>. Think of maximal as ``optimal'',
    i.e., best possible pivot columns.)

    <item>Use the Chinese Remainder Theorem to find a matrix
    <with|mode|math|B> with integer entries such that
    <with|mode|math|B<con>B<rsub|i><pmod|p<rsub|i>>> for all
    <with|mode|math|p<rsub|i>>.

    <item>Use rational reconstruction (Algorithm <reference|alg:ratrecon>) to
    try to find a matrix <with|mode|math|C> whose coefficients are rational
    numbers <with|mode|math|n/r> such that
    <with|mode|math|\|n\|,r\<leq\><sqrt|M/2>>, where
    <with|mode|math|M=<big|prod>p<rsub|i>>, and
    <with|mode|math|C<con>B<rsub|i><pmod|p<rsub|i>>> for each prime
    <with|mode|math|p>. If rational reconstruction fails, compute a few more
    echelon forms mod the next few primes (using the above steps), and
    attempt rational reconstruction again. Let <with|mode|math|E> be the
    matrix over <with|mode|math|<Q>> so obtained.

    <item>Compute the denominator <with|mode|math|d> of <with|mode|math|E>,
    i.e., the smallest positive integer such that <with|mode|math|d*E> has
    integer entries. If

    <\equation>
      <label|eqn:modalgbound>H(d*E)\<cdot\>H(A)\<cdot\>n\<leq\><big|prod>p<rsub|i>,
    </equation>

    then <with|mode|math|E> is the reduced row echelon form of
    <with|mode|math|A>. If not, repeat the above steps with a few more
    primes.\ 
  </steps> >

  <\proof>
    We prove that if the bound (<reference|eqn:modalgbound>) is satisfied,
    then the matrix <with|mode|math|E> computed by the algorithm really is
    the reduced row echelon form <with|mode|math|R> of <with|mode|math|A>.
    The set of pivot columns of all matrices <with|mode|math|B<rsub|i>> used
    to construct <with|mode|math|E> are the same, so the pivot columns of
    <with|mode|math|E> are the same as those of any
    <with|mode|math|B<rsub|i>>. Thus <with|mode|math|E> is in reduced row
    echelon form.

    Recall from the end of Section <reference|sec:echelon> that a matrix
    whose columns are a basis for the kernel of <with|mode|math|A> can be
    obtained from the reduced row echelon form of <with|mode|math|R>. Let
    <with|mode|math|K> be the matrix whose columns are the vectors in the
    kernel algorithm applied to <with|mode|math|E>, so
    <with|mode|math|E*K=0>. Since the reduced row echelon form is got by left
    multiplying by an invertible matrix, for each <with|mode|math|i>, there
    is an invertible matrices <with|mode|math|C<rsub|i>> mod
    <with|mode|math|p<rsub|i>> such that <with|mode|math|A=C<rsub|i>B<rsub|i>>
    so

    <\equation*>
      A\<cdot\>d*K<con>d*C<rsub|i>B<rsub|i>K<con>C<rsub|i>\<cdot\>d*E\<cdot\>K<con>0<pmod|p<rsub|i>>.
    </equation*>

    Since <with|mode|math|d*K> and <with|mode|math|A> are integer matrices,

    <\equation*>
      A\<cdot\>d*K<con>0<pmod|<big|prod>p<rsub|i>>.
    </equation*>

    The integer entries of <with|mode|math|A\<cdot\>d*K> are all at most
    <with|mode|math|H(A)\<cdot\>H(d*K)\<cdot\>n>, where <with|mode|math|n> is
    the number of columns of <with|mode|math|A>. Since
    <with|mode|math|H(K)\<leq\>H(E)>, the bound (<reference|eqn:modalgbound>)
    implies that <with|mode|math|A\<cdot\>d*K=0>. Thus
    <with|mode|math|A*K=0>, so <with|mode|math|<Ker>(E)\<subset\><Ker>(A)>.
    On the other hand, the rank of <with|mode|math|E> equals the rank of each
    <with|mode|math|B<rsub|i>> (since the pivot columns are the same), so

    <\equation*>
      <rank>(E)=<rank>(B<rsub|i>)=<rank>(A<space|-0.25spc><space|-0.25spc><space|-0.25spc><pmod|p<rsub|i>>)\<leq\><rank>(A).
    </equation*>

    Thus <with|mode|math|dim(<Ker>(A))\<leq\>dim(<Ker>(E))>, and combining
    this with the bound obtained above we see that
    <with|mode|math|<Ker>(E)=<Ker>(A)>. This implies that <with|mode|math|E>
    is the reduced row echelon form of <with|mode|math|A>, since two matrices
    have the same kernel if and only if they have the same reduced row
    echelon form (the echelon form is an invariant of the row space, and the
    kernel is the orthogonal complement of the row space).

    The reason for Step <reference|step:discard> is that the matrices
    <with|mode|math|B<rsub|i>> need <with|font-shape|italic|not> be the
    reduction of <with|mode|math|R> modulo <with|mode|math|p<rsub|i>>, and
    indeed this reduction might not even be defined, e.g., if
    <with|mode|math|p<rsub|i>> divides the denominator of some element of
    <with|mode|math|R>, then this reduction makes no sense. For example, set
    <with|mode|math|p=p<rsub|i>> and suppose
    <with|mode|math|A=<abcd|p|1|0|0>>. Then
    <with|mode|math|R=<abcd|1|1/p|0|0>>, which has no reduction modulo
    <with|mode|math|p>; also, the reduction of <with|mode|math|A> modulo
    <with|mode|math|B<rsub|i>> is <with|mode|math|B<rsub|i>=<abcd|0|1|0|0><pmod|p>>,
    which is already in reduced row echelon form. However if we were to
    combine <with|mode|math|B<rsub|i>> with the echelon form of
    <with|mode|math|A> modulo another prime, the result could never be lifted
    using rational reconstruction. Thus the reason we exclude all
    <with|mode|math|B<rsub|i>> with non-maximal pivot column sequence is so
    that a rational reconstruction will exist. There are only finitely many
    primes that divide denominators of entries of <with|mode|math|R>, so
    eventually all <with|mode|math|B<rsub|i>> will have maximal pivot column
    sequences, i.e., are the reduction of the true reduced row echelon form
    <with|mode|math|R>, so the algorithm terminates.
  </proof>

  <\remark>
    <with|mode|text|>

    <\enumerate>
      <item>I learned about rational reconstruction in the context of
      computing echelon forms from Allan Steel, who is one of the developers
      of <magma>. I learned from Allan that <magma> does not use the above
      algorithm; instead it uses a Strassen ``divide and conquer'' echelon
      procedure that involves random permuting of rows, etc., and takes
      advantage of asymptotically fast matrix multiplication algorithms. The
      matrix multiplies are done using a modular CRT technique. This is
      probably better in many cases, especially for dense matrices.

      <item>I have tested an implementation of Algorithm
      <reference|alg:modech> against MAGMA V2.11-8. For large square matrices
      over <with|mode|math|<Q>>, e.g., over a hundred rows, (a case of
      importance when cutting out eigenspaces for Hecke operators), Algorithm
      <reference|alg:modech> is much more efficient (both in time and memory
      usage) than MAGMA. In contrast, for matrices with more columns than
      rows (an important case, e.g., when intersecting subspaces), MAGMA is
      often an order of magnitude faster. Thus an optimal package should
      probably implement both Algorithm <reference|alg:modech> for square
      matrices and a divide and conquer echelon strategy for non-square
      matrices.

      <item>I have never seen Algorithm <reference|alg:modech> anywhere else,
      and found the details and proof myself. I have seen the idea of using a
      multi-modular method for linear algebra problems hinted out or
      explicitly suggested <with|font-shape|italic|many times>; I've just
      never seen a discussion of computing reduced row echelon forms this
      way.

      <item>There is also an iterative <with|mode|math|p>-adic method for
      lifting solutions modulo <with|mode|math|p> to an equation
      <with|mode|math|A*x=v> to characteristic <with|mode|math|0>. This is
      supposed to be faster for a single solution, but slower for lifting
      many solutions. See\ 

      <\verbatim>
        http://magma.maths.usyd.edu.au/users/allan/gb/faugere_f4.ps.gz
      </verbatim>

      for a discussion.

      <item>Algorithm <reference|alg:modech>, with all matrices
      <with|font-series|bold|sparse>, seems to work very well in practice. A
      simple but helpful modification to Algorithm <reference|alg:gauss> in
      the sparse case is to clear each column using a row with a minimal
      number of nonzero entries, so as to reduce the amount of ``fill in''
      (denseness) of the matrix. There are more sophisticated methods along
      these lines called ``intelligent Gauss elimination''. (Cryptographers
      are interested in linear algebra with huge sparse linear, since they
      come up in factor basis attacks on the discrete log problem or integer
      factorization.)
    </enumerate>
  </remark>

  One can likely adapt Algorithm <reference|alg:modech> to computation of
  reduced row echelon forms of matrices <with|mode|math|A> over cyclotomic
  fields <with|mode|math|<Q>(\<zeta\><rsub|n>)>. Assume <with|mode|math|A>
  has denominator <with|mode|math|1>. Let <with|mode|math|p> be a prime that
  splits completely in <with|mode|math|<Q>(\<zeta\><rsub|n>)>. Compute the
  homomorphisms <with|mode|math|f<rsub|i>:<Z><rsub|p>[\<zeta\><rsub|n>]\<to\><F><rsub|p>>
  by finding the elements of order <with|mode|math|n> in
  <with|mode|math|<F><rsub|p><rsup|\<ast\>>>. Then compute the mod
  <with|mode|math|p> matrix <with|mode|math|f<rsub|i>(A)> for each
  <with|mode|math|i>, and find its reduced row echelon form. Taken together,
  the maps <with|mode|math|f<rsub|i>> together induce an isomorphism
  <with|mode|math|\<Psi\>:<F><rsub|p>[X]/\<Phi\><rsub|n>(X)<isom><F><rsub|p><rsup|d>>,
  where <with|mode|math|\<Phi\><rsub|n>(X)> is the <with|mode|math|n>th
  cyclotomic polynomial and <with|mode|math|d> is its degree. It's easy to
  compute <with|mode|math|\<Psi\>(f(x))> by evaluating <with|mode|math|f(x)>
  at each element of order <with|mode|math|n> in
  <with|mode|math|<F><rsub|p>>. To compute <with|mode|math|\<Psi\><rsup|-1>>
  simply use linear algebra over <with|mode|math|<F><rsub|p>> to invert a
  matrix that represents <with|mode|math|\<Psi\>>. Use
  <with|mode|math|\<Psi\><rsup|-1>> to compute the the reduced row echelon
  form of <with|mode|math|A<pmod|p>>, where <with|mode|math|(p)> is the
  non-prime ideal in <with|mode|math|<Z>[\<zeta\><rsub|n>]> generated by
  <with|mode|math|p>. Do this for several primes <with|mode|math|p>, and use
  rational reconstruction on each coefficient of each power of
  <with|mode|math|\<zeta\><rsub|n>>, to recover the echelon form of
  <with|mode|math|A>. Problems: What is the analogue of
  (<reference|eqn:modalgbound>)?

  <section|Polynomials>

  There are several linear algebra algorithms that involve polynomials and
  are important to modular forms algorithms.

  Computation of characteristic polynomials of matrices is crucial to modular
  forms computations. There are many approaches to this problems: compute
  <with|mode|math|det(x*I-A)> symbolically (bad), compute the traces of the
  powers of <with|mode|math|A> (bad), or compute the Hessenberg form modulo
  many primes and use CRT (not so bad, see <cite|cohen:course> (S)). Another
  more sophisticated method is to compute the rational canonical form of
  <with|mode|math|A> using Giesbrecht's algorithms, which involve computing
  Krylov subspaces (i.e., cyclic spaces spanned by a single vector), and
  building up the whole space on which <with|mode|math|A> acts. This latter
  method may be viewed as a generalization of Weiedemann's algorithm for
  computing characteristic polynomials, but with more structure. The
  algorithm used in <magma> is similar to Giesbrecht's (probably
  independently discovered). PARI uses only Lagrange interpolation (?) and
  Hessenberg form.

  Factorization of polynomials in <with|mode|math|<Z>[X]> is an important
  step in computing an explicit basis of newforms for a space of modular
  forms. The best algorithm is the van Hoeij method, which uses LLL in a
  novel way to solve the sort of optimization problems that come up in trying
  to lift factorizations mod <with|mode|math|p> to <with|mode|math|<Z>>. It
  has aparently been generalized to number fields and is included in new
  versions of PARI, <magma>, and NTL. For more details, see van Hoeij's web
  page: <url|http://www.math.fsu.edu/ hoeij/papers.html>.

  <chapter|Modular Symbols><label|ch:modsym>Modular symbols are a formalism
  that make it fairly easy and elementary to compute with homology or
  cohomology related to certain Kuga-Sato varieties (these are
  <with|mode|math|<cE>\<times\><rsub|X>\<cdots\>\<times\><rsub|X><cE>>, where
  <with|mode|math|X> is a modular curve and <with|mode|math|<cE>> is the
  univeral elliptic curve over it). It is not necessary to know anything
  about these Kuga-Sato varieties in order to compute with modular symbols.

  This chapter is about spaces of modular symbols and how to compute with
  them. It is by far the most important chapter in this book. The algorithms
  that build on the theory in this chapter are central to all the
  computations we will do later in the book. We will start with the basics,
  in that the intended reader of this chapter is not assumed to have ever
  seen a modular symbol before.

  Much of this chapter follows Loic Merel's paper <cite|merel:1585> very
  closely. First we define modular symbols of weight
  <with|mode|math|k\<geq\>2>. Then we define the corresponding Manin symbols,
  and state a theorem of Merel-Shokurov, which gives all relations between
  Manin symbols. (The proof of the Merel-Shokurov theorem is beyond the scope
  of this book.) Next we describe how the Hecke operators act on both modular
  and Manin symbols, and how to compute trace and inclusion maps between
  spaces of modular symbols of different levels. We close the chapter with a
  discussion of computations with modular symbols over finite fields.

  In this book we will view modular symbols primarily as a formalism that
  generates algorithms for computing with modular forms. I.e.,
  <with|font-shape|italic|we view modular symbols as modular forms for
  computers>. However, modular symbols have also been used to prove
  theoretical results about modular forms. For example, certain technical
  calculations with modular symbols are used in Loic Merel's proof of the
  uniform boundedness conjecture for torsion points on elliptic curves over
  number fields; modular symbols arise, e.g., in order to understand linear
  independence of Hecke operators. Another example is Grigor Grigorov's
  in-progress Ph.D. thesis, which distills hypotheses about Kato's Euler
  system in <with|mode|math|K<rsub|2>> of modular curves to a simple formula
  involving modular symbols (when the hypotheses are satisfied, one obtains a
  lower bound on the Shafarevich-Tate group of an elliptic curve).

  <section|Modular Symbols> We begin by defining a free abelian group
  <with|mode|math|<sM>> of modular symbols, which you should think of as the
  homology of the extended upper half plane
  <with|mode|math|<h><rsup|\<ast\>>=<h><union><P><rsup|1>(<Q>)> relative to
  the cusps. This is the free abelian group on symbols
  <with|mode|math|{\<alpha\>,\<beta\>}> with

  <\equation*>
    \<alpha\>,\<beta\>\<in\><P><rsup|1>(<Q>)=<Q><union>{\<infty\>}
  </equation*>

  subject to the relations

  <\equation*>
    {\<alpha\>,\<beta\>}+{\<beta\>,\<gamma\>}+{\<gamma\>,\<alpha\>}=0,
  </equation*>

  for all <with|mode|math|\<alpha\>,\<beta\>,\<gamma\>\<in\><P><rsup|1>(<Q>)>.
  More precisely, <with|mode|math|<sM>=(F/R)/(F/R)<rsub|<tor>>>, where
  <with|mode|math|F> is the free abelian group on all pairs
  <with|mode|math|(\<alpha\>,\<beta\>)> and <with|mode|math|R> is the
  subgroup generated by all elements of the form
  <with|mode|math|(\<alpha\>,\<beta\>)+(\<beta\>,\<gamma\>)+(\<gamma\>,\<alpha\>)>.
  Note that <with|mode|math|<sM>> is a huge free abelian group of countable
  rank.

  <\remark>
    [Warning!] The <with|mode|math|{\<alpha\>,\<beta\>}> satisfy the
    relations <with|mode|math|{\<alpha\>,\<beta\>}=-{\<beta\>,\<alpha\>}>,
    since <with|mode|math|{\<alpha\>,\<beta\>}+{\<beta\>,\<alpha\>}+{\<alpha\>,\<alpha\>}=0.>
    Thus the order matters. The notation <with|mode|math|{\<alpha\>,\<beta\>}>
    looks like the set containing two elements, which strongly (and
    incorrectly) suggests that the order does not matter. This is annoying,
    but it is the standard notation, and we will stick with it.
  </remark>

  Now fix an integer <with|mode|math|k\<geq\>2>. Let
  <with|mode|math|<Z><rsub|k-2>[X,Y]> be the abelian group of homogeneous
  polynomials of degree <with|mode|math|k-2> in two variables
  <with|mode|math|X,Y> (so <with|mode|math|<Z><rsub|k-2>[X,Y]> is isomorphic
  to <with|mode|math|<Sym><rsup|k-2>(<Z>)> as a group, but certain natural
  actions are different). Set

  <\equation*>
    <sM><rsub|k>=<Z><rsub|k-2>[X,Y]<tensor><rsub|<Z>><sM>,
  </equation*>

  which is a torsion-free abelian group whose elements are sums of
  expressions of the form <with|mode|math|X<rsup|i>Y<rsup|k-2-i><tensor>{\<alpha\>,\<beta\>}>.
  For example,

  <\equation*>
    X<rsup|3><tensor>{0,1/2}-17X*Y<rsup|2><tensor>{\<infty\>,1/7}\<in\><sM><rsub|5>.
  </equation*>

  Fix a finite index subgroup <with|mode|math|G> of
  <with|mode|math|<SL><rsub|2>(<Z>)>. Define a <defn|left action of
  <with|mode|math|G>> on <with|mode|math|<Z><rsub|k-2>[X,Y]> as follows. If
  <with|mode|math|g=<abcd|a|b|c|d>\<in\>G> and
  <with|mode|math|P(X,Y)\<in\><Z><rsub|k-2>[X,Y]>, let

  <\equation*>
    (g.P)(X,Y)=P(d*X-b*Y,-c*X+a*Y).
  </equation*>

  Note that if we think of <with|mode|math|z=(X,Y)> as a column vector, then

  <\equation*>
    (g.P)(z)=P(g<rsup|-1>z),
  </equation*>

  since <with|mode|math|g<rsup|-1>=<abcd|<htab|1fn>d|-b|-c|<htab|1fn>a>>,
  since <with|mode|math|det(g)=1>. The reason for the inverse is so that this
  is a left action instead of a right action, which is what function
  pre-composition always is. As further explanation, observe that if
  <with|mode|math|g,h\<in\>G>, then

  <\equation*>
    ((g*h).P)(z)=P((g*h)<rsup|-1>z)=P(h<rsup|-1>g<rsup|-1>z)=(h.P)(g<rsup|-1>z)=(g.(h.P))(z).
  </equation*>

  Let <with|mode|math|G> act on the left on <with|mode|math|<sM>> by

  <\equation*>
    g.{\<alpha\>,\<beta\>}={g(\<alpha\>),g(\<beta\>)}.
  </equation*>

  Here <with|mode|math|G> is acting via linear fractional transformations, so
  if <with|mode|math|g=<abcd|a|b|c|d>>, then

  <\equation*>
    g(\<alpha\>)=<frac|a\<alpha\>+b|c\<alpha\>+d>.
  </equation*>

  For example, useful special cases to remember are that if
  <with|mode|math|g=<abcd|a|b|c|d>> then

  <\equation*>
    g(0)=<frac|b|d><space|2fn><with|mode|text|and><space|2fn>g(\<infty\>)=<frac|a|c>.
  </equation*>

  We now combine these two actions to obtain a left action of
  <with|mode|math|G> on <with|mode|math|<sM><rsub|k-2>>, which is given by

  <\equation*>
    g.(P<tensor>{\<alpha\>,\<beta\>})=(g.P)<tensor>{g(\<alpha\>),g(\<beta\>)}.
  </equation*>

  For example,

  <\align*>
    <tformat|<table|<row|<cell|<mtwo|<htab|1fn>1|<htab|1fn>2|-2|-3>.(X<rsup|3><tensor>{0,1/2})>|<cell|=(-3X-2Y)<rsup|3><tensor><left|{>-<frac|2|3>,-<frac|5|8><right|}>>>|<row|<cell|>|<cell|<space|-2em>=(-27X<rsup|3>-54X<rsup|2>Y-36X*Y<rsup|2>-8Y<rsup|3>)<tensor><left|{>-<frac|2|3>,-<frac|5|8><right|}>.>>>>
  </align*>

  We will often write <with|mode|math|P(X,Y){\<alpha\>,\<beta\>}> for
  <with|mode|math|P(X,Y)<tensor>{\<alpha\>,\<beta\>}>.

  <\definition>
    [Modular Symbols] Let <with|mode|math|k\<geq\>2> be an integer and let
    <with|mode|math|G> be a finite index subgroup of
    <with|mode|math|<SL><rsub|2>(<Z>)>. The space
    <with|mode|math|<sM><rsub|k>(G)> of weight <with|mode|math|k> modular
    symbols for <with|mode|math|G> is the quotient of
    <with|mode|math|<sM><rsub|k>> by all relations <with|mode|math|g.x-x> for
    <with|mode|math|x\<in\><sM><rsub|k>> and by any torsion.
  </definition>

  Note that <with|mode|math|<sM><rsub|k>> is a torsion free abelian group,
  and it is a nontrivial fact that <with|mode|math|<sM><rsub|k>> has finite
  rank. We denote modular symbols for <with|mode|math|G> in exactly the same
  way we denote elements of <with|mode|math|<sM><rsub|k>>, but with
  surrounding text that hopefully makes the group <with|mode|math|G> clear.
  Thus <with|mode|math|X<rsup|3>{0,1/2}> is an example element of
  <with|mode|math|<sM><rsub|5>(\<Gamma\><rsub|0>(8))>, because I say so. In
  practice this does not cause confusion.

  The space of <defn|modular symbols over a ring <with|mode|math|R>> is

  <\equation*>
    <sM><rsub|k>(G,R)=<sM><rsub|k>(G)<tensor><rsub|<Z>>R.
  </equation*>

  In Section <reference|sec:msff> we will discuss computing
  <with|mode|math|<sM><rsub|k>(G,R)> when <with|mode|math|R> is a finite
  field.

  <section|Manin Symbols><label|sec:manin>At this point you are probably
  wondering how one could possibly ever program a computer to
  <with|font-shape|italic|compute> <with|mode|math|<sM><rsub|k>(G)> for any
  specific <with|mode|math|k> and <with|mode|math|G>. As defined above,
  <with|mode|math|<sM><rsub|k>(G)> is the quotient of one infinitely
  generated abelian group by another one. This section is about Manin
  symbols, which are simply a distinguished subset of the elements of
  <with|mode|math|<sM><rsub|k>(G)> that lead to a finite presentation for
  <with|mode|math|<sM><rsub|k>(G)>. Also, it has emerged that formulas
  written in terms of Manin symbols are frequently much easier to compute
  using a computer than formulas in terms of modular symbols.

  The <defn|Manin symbol> associated to <with|mode|math|g\<in\><SL><rsub|2>(<Z>)>
  and <with|mode|math|P\<in\><Z><rsub|k-2>[X,Y]> is

  <\equation*>
    [P,g]=g.(P{0,\<infty\>})\<in\><sM><rsub|k>(G).
  </equation*>

  Notice that if <with|mode|math|G*g=G*h>, then <with|mode|math|[P,g]=[P,h]>,
  since the symbol <with|mode|math|g.(P{0,\<infty\>})> is invariant by the
  action of <with|mode|math|G> on the left (by definition, since it is a
  modular symbols for <with|mode|math|G>). Thus we can also write
  <with|mode|math|[P,G*g]>, and since <with|mode|math|G> has finite index in
  <with|mode|math|<SL><rsub|2>(<Z>)>, the abelian group generated by Manin
  symbols is of finite rank, generated by

  <\equation*>
    <left|{>[X<rsup|k-2-i>Y<rsup|i>,<space|0.25spc>G*g<rsub|j>]<space|0.25spc>:<space|0.25spc>i=0,\<ldots\>,k-2,<space|1fn><with|mode|text|and><space|1fn>j=0,\<ldots\>,r<right|}>,
  </equation*>

  where <with|mode|math|g<rsub|0>,\<ldots\>,g<rsub|r>> run through
  representatives for the right cosets <with|mode|math|G\<backslash\><SL><rsub|2>(<Z>)>.

  The great thing about Manin symbols is that every modular symbols can be
  written as a <with|mode|math|<Z>>-linear combination of them, so they
  generate all <with|mode|math|<sM><rsub|k>(G)>. The proof of this fact is
  known as ``Manin's trick''.

  <\proposition>
    <label|prop:mangen>The Manin symbols generate
    <with|mode|math|<sM><rsub|k>(G)>.
  </proposition>

  <\proof>
    Suppose that we are given a modular symbol
    <with|mode|math|P{\<alpha\>,\<beta\>}> and wish to represent it as a sum
    of Manin symbols. Because

    <\equation*>
      P{a/b,c/d}=P{a/b,0}+P{0,c/d},
    </equation*>

    it suffices to write <with|mode|math|P{0,a/b}> in terms of Manin symbols.
    Let

    <\equation*>
      0=<frac|p<rsub|-2>|q<rsub|-2>>=<frac|0|1>,<space|0.25spc><space|0.25spc><frac|p<rsub|-1>|q<rsub|-1>>=<frac|1|0>,<space|0.25spc><space|0.25spc><frac|p<rsub|0>|1>=<frac|p<rsub|0>|q<rsub|0>>,<space|0.25spc><space|0.25spc><frac|p<rsub|1>|q<rsub|1>>,<space|0.25spc><space|0.25spc><frac|p<rsub|2>|q<rsub|2>>,<space|0.25spc>\<ldots\>,<space|0.25spc><frac|p<rsub|r>|q<rsub|r>>=<frac|a|b>
    </equation*>

    denote the continued fraction convergents of the rational number
    <with|mode|math|a/b>. Then

    <\equation*>
      p<rsub|j>q<rsub|j-1>-p<rsub|j-1>q<rsub|j>=(-1)<rsup|j-1><space|2fn><with|mode|text|for
      >-1\<leq\>j\<leq\>r.
    </equation*>

    If we let <with|mode|math|g<rsub|j>=<mtwo|(-1)<rsup|j-1>p<rsub|j>|p<rsub|j-1>|(-1)<rsup|j-1>q<rsub|j>|q<rsub|j-1>>>,
    then <with|mode|math|g<rsub|j>\<in\><sltwoz>> and

    <\align*>
      <tformat|<table|<row|<cell|P{0,a/b}>|<cell|=P<big|sum><rsub|j=-1><rsup|r><left|{><frac|p<rsub|j-1>|q<rsub|j-1>>,<frac|p<rsub|j>|q<rsub|j>><right|}>>>|<row|<cell|>|<cell|=<big|sum><rsub|j=-1><rsup|r>g<rsub|j>((g<rsub|j><rsup|-1>P){0,\<infty\>})>>|<row|<cell|>|<cell|=<big|sum><rsub|j=-1><rsup|r>[g<rsub|j><rsup|-1>P,<space|0.25spc><space|0.25spc>g<rsub|j>].>>>>
    </align*>

    Since <with|mode|math|g<rsub|j>\<in\><sltwoz>> and <with|mode|math|P> has
    integer coefficients, the polynomial <with|mode|math|g<rsub|j><rsup|-1>P>
    also has integer coefficients, so we introduce no denominators.
  </proof>

  As is well known, the continued fraction expansion
  <with|mode|math|[c<rsub|1>,c<rsub|2>,\<ldots\>,c<rsub|n>]> of the rational
  number <with|mode|math|a/b> can be computed using the Euclidean algorithm.
  The first term <with|mode|math|c<rsub|1>> is the ``quotient'':
  <with|mode|math|a=b*c<rsub|1>+r>, with <with|mode|math|0\<leq\>r\<less\>b>.
  Let <with|mode|math|a<rprime|'>=b>, <with|mode|math|b<rprime|'>=r> and
  compute <with|mode|math|c<rsub|2>> as <with|mode|math|a<rprime|'>=b<rprime|'>c<rsub|2>+r<rprime|'>>,
  etc., terminating when the remainder is <with|mode|math|0>. For example,
  the expansion of <with|mode|math|5/13> is <with|mode|math|[0,2,1,1,2]>. The
  numbers

  <\equation*>
    d<rsub|i>=c<rsub|1>+<frac|1|<ds>c<rsub|2>+<frac|1|<ds>c<rsub|3>+\<cdots\>>>
  </equation*>

  will then be the (finite) convergents. For example if
  <with|mode|math|a/b=5/13>, then the convergents are

  <\equation*>
    0/1,<space|0.25spc><space|0.25spc>1/0,<space|0.25spc><space|0.25spc>d<rsub|1>=0,<space|0.25spc><space|0.25spc>d<rsub|2>=<frac|1|2>,<space|0.25spc><space|0.25spc>d<rsub|3>=<frac|1|3>,<space|0.25spc><space|0.25spc>d<rsub|4>=<frac|2|5>,<space|0.25spc><space|0.25spc>d<rsub|5>=<frac|5|13>.
  </equation*>

  <\remark>
    One can prove Proposition <reference|prop:mangen> inductively without
    introducing continued fractions, but that proof is essentially the same
    one used to prove the existence of continued fractions of integers. (I
    think I saw this in <cite|mtt>, but I can't seem to find the exact
    location in that paper right now.)
  </remark>

  Now that we know the Manin symbols generate
  <with|mode|math|<sM><rsub|k>(G)>, the next question is what are the
  relations between Manin symbols. Fortunately the answer is fairly simple
  (though the proof is not). Let

  <\equation*>
    \<sigma\>=<mtwo|0|-1|1|<htab|1fn>0>,<space|2fn>\<tau\>=<mtwo|0|-1|1|-1>,<space|2fn>J=<mtwo|-1|<htab|1fn>0|0|-1>.
  </equation*>

  Define a <with|font-shape|italic|right action> of
  <with|mode|math|<SL><rsub|2>(<Z>)> on Manin symbols as follows. If
  <with|mode|math|h\<in\><SL><rsub|2>(<Z>)>, let

  <\equation*>
    [P,g].h=[h<rsup|-1>.P,g*h].
  </equation*>

  This is a right action because <with|mode|math|P.h=h<rsup|-1>P> is a right
  action, and right multiplication <with|mode|math|g\<mapsto\>g*h> is also a
  right action.

  <\theorem>
    <label|thm:mansym>If <with|mode|math|x> is a Manin symbol, then

    <\align>
      <tformat|<table|<row|<cell|x+x.\<sigma\>>|<cell|=0>>|<row|<cell|x+x.\<tau\>+x.\<tau\><rsup|2>>|<cell|=0>>|<row|<cell|x-x.J>|<cell|=0.>>>>
    </align>

    Moreover, these are all the relations between Manin symbols, in the sense
    that the space <with|mode|math|<sM><rsub|k>(G)> of modular symbols is
    isomorphic to the quotient of the free abelian group on the finitely many
    symbols <with|mode|math|[X<rsup|i>Y<rsup|k-2-i>,G*g]> (for
    <with|mode|math|i=0,\<ldots\>,k-2>, and
    <with|mode|math|G*g\<in\>G\<backslash\><SL><rsub|2>(<Z>)>) by the above
    relations and any torsion.
  </theorem>

  <\proof>
    We will only prove the easy ``half'' of the theorem here. The proof of
    the difficult half, i.e., that the above relations are all the relations
    is more complicated. Merel remarks in <cite|merel:1585> (S) that the
    quotient of Manin symbols by the above relations and torsion is
    isomorphic to a space of ’okurov symbols, which is in turn isomorphic to
    <with|mode|math|<sM><rsub|k>(G)>. He cites <cite|sokurov:shimura> for
    most of the proof. See also <cite|math252> for an exposition of Manin's
    proof from <cite|manin:parabolic> when <with|mode|math|k=2>, which
    involves triangulating the Riemann surface
    <with|mode|math|G\<backslash\><h>>.

    For the proof of the easy half, i.e., that the expressions above are in
    fact relations, we follow Merel's proof from <cite|merel:1585> (S). Note
    that

    <\equation*>
      \<sigma\>(0)=\<sigma\><rsup|2>(\<infty\>)=\<infty\><space|2fn><with|mode|text|and><space|2fn>\<tau\>(1)=\<tau\><rsup|2>(0)=\<infty\>.
    </equation*>

    Write <with|mode|math|x=[P,g]>, we have

    <\align*>
      <tformat|<table|<row|<cell|[P,g]+[P,g].\<sigma\>>|<cell|=[P,g]+[\<sigma\><rsup|-1>.P,g\<sigma\>]>>|<row|<cell|>|<cell|=g.(P{0,\<infty\>})+g\<sigma\>.(\<sigma\><rsup|-1>.P{0,\<infty\>})>>|<row|<cell|>|<cell|=(g.P){g(0),g(\<infty\>)}+(g\<sigma\>).(\<sigma\><rsup|-1>.P){g\<sigma\>(0),g\<sigma\>(\<infty\>)}>>|<row|<cell|>|<cell|=(g.P){g(0),g(\<infty\>)}+(g.P){g(\<infty\>),g(0)}>>|<row|<cell|>|<cell|=(g.P)({g(0),g(\<infty\>)}+{g(\<infty\>),g(0)})>>|<row|<cell|>|<cell|=0.>>>>
    </align*>

    Also,

    <\align*>
      <tformat|<table|<row|<cell|[P,g]>|<cell|+[P,g].\<tau\>+[P,g].\<tau\><rsup|2>=[P,g]+[\<tau\><rsup|-1>.P,g\<tau\>]+[\<tau\><rsup|-2>.P,g\<tau\><rsup|2>]>>|<row|<cell|>|<cell|=g.(P{0,\<infty\>})+g\<tau\>.(\<tau\><rsup|-1>.P{0,\<infty\>})+g\<tau\><rsup|2>.(\<tau\><rsup|-2>.P{0,\<infty\>})>>|<row|<cell|>|<cell|=(g.P){g(0),g(\<infty\>)}+(g.P){g\<tau\>(0),g\<tau\>(\<infty\>)})+(g.P){g\<tau\><rsup|2>(0),\<tau\><rsup|2>(\<infty\>)})>>|<row|<cell|>|<cell|=(g.P){g(0),g(\<infty\>)}+(g.P){g(1),g(0)})+(g.P){g(\<infty\>),g(1)})>>|<row|<cell|>|<cell|=(g.P)({g(0),g(\<infty\>)}+{g(\<infty\>),g(1)}+{g(1),g(0)})>>|<row|<cell|>|<cell|=0>>>>
    </align*>

    Finally,

    <\align*>
      <tformat|<table|<row|<cell|[P,g]+[P,g].J>|<cell|=g.(P{0,\<infty\>})-g*J.(J<rsup|-1>P{g*J(0),g*J(\<infty\>)}>>|<row|<cell|>|<cell|=(g.P){g(0),g(\<infty\>)}-(g.P){g(0),g(\<infty\>)}>>|<row|<cell|>|<cell|=0,>>>>
    </align*>

    where we use that <with|mode|math|J> acts trivially via linear fractional
    transformations.
  </proof>

  If <with|mode|math|G> is a finite-index subgroup and we have an algorithm
  to enumerate the right cosets <with|mode|math|G\<backslash\><SL><rsub|2>(<Z>)>,
  and to decide which coset an arbitrary element of
  <with|mode|math|<SL><rsub|2>(<Z>)> belongs to, then Theorem
  <reference|thm:mansym> and the algorithms of Chapter <reference|ch:linalg>
  yield an algorithm to compute <with|mode|math|<sM><rsub|k>(G,<Q>)>. We will
  defer further discussion about precise details of algorithms to compute
  modular symbols until Chapter <reference|ch:modsymcomp>). Note that if
  <with|mode|math|J\<in\>G>, then the relation <with|mode|math|x-x.J=0> is
  automatic. Also note the matrices <with|mode|math|\<sigma\>> and
  <with|mode|math|\<tau\>> <with|font-shape|italic|do not commute>, so one
  can <with|font-shape|italic|not> first quotient out by the two-term
  <with|mode|math|\<sigma\>> relations, then quotient out only the remaining
  free generators by the <with|mode|math|\<tau\>> relations, and get the
  right answer in general.

  <subsection|Coset Representatives and Manin Symbols>

  <\proposition>
    <label|prop:gamma1cosets>The right cosets
    <with|mode|math|\<Gamma\><rsub|1>(N)\<backslash\><SL><rsub|2>(<Z>)> are
    in bijection with pairs <with|mode|math|(c,d)> where
    <with|mode|math|c,d\<in\><Z>/N<Z>> and <with|mode|math|gcd(c,d,N)=1>. The
    coset containing a matrix <with|mode|math|<abcd|a|b|c|d>> corresponds
    <with|mode|math|(c,d)>.
  </proposition>

  <\proof>
    This proof is copied from <cite|cremona:gammaone> (pg. 203), except in
    that paper Cremona works with the analogue of
    <with|mode|math|\<Gamma\><rsub|1>(N)> in
    <with|mode|math|<PSL><rsub|2>(<Z>)>, so his result is slightly different.
    Suppose <with|mode|math|\<gamma\><rsub|i>=<abcd|a<rsub|i>|b<rsub|i>|c<rsub|i>|d<rsub|i>>\<in\><SL><rsub|2>(<Z>)>,
    for <with|mode|math|i=1,2>. We have

    <\equation*>
      \<gamma\><rsub|1>\<gamma\><rsub|2><rsup|-1>=<mtwo|a<rsub|1>|b<rsub|1>|c<rsub|1>|d<rsub|1>><mtwo|<htab|1fn>d<rsub|2>|-b<rsub|2>|-c<rsub|2>|<htab|1fn>a<rsub|2>>=<mtwo|a<rsub|1>d<rsub|2>-b<rsub|1>c<rsub|2>|\<ast\>|c<rsub|1>d<rsub|2>-d<rsub|1>c<rsub|2>|a<rsub|2>d<rsub|1>-b<rsub|2>c<rsub|1>>,
    </equation*>

    which is in <with|mode|math|\<Gamma\><rsub|1>(N)> if and only if

    <\equation>
      <label|eqn:cos1a>c<rsub|1>d<rsub|2>-d<rsub|1>c<rsub|2><con>0<pmod|N>
    </equation>

    and

    <\equation>
      <label|eqn:cos1b>a<rsub|2>d<rsub|1>-b<rsub|2>c<rsub|1><con>a<rsub|1>d<rsub|2>-b<rsub|1>c<rsub|2><con>1<pmod|N>.
    </equation>

    Since the <with|mode|math|\<gamma\><rsub|i>> have determinant
    <with|mode|math|1>, if <with|mode|math|(c<rsub|1>,d<rsub|1>)=(c<rsub|2>,d<rsub|2>)<pmod|N>>,
    then the congruences (<reference|eqn:cos1a>--<reference|eqn:cos1b>) hold.
    Conversely, if (<reference|eqn:cos1a>--<reference|eqn:cos1b>) hold, then

    <\align*>
      <tformat|<table|<row|<cell|c<rsub|2>>|<cell|<con>a<rsub|2>d<rsub|1>c<rsub|2>-b<rsub|2>c<rsub|1>c<rsub|2>>>|<row|<cell|>|<cell|<con>a<rsub|2>d<rsub|2>c<rsub|1>-b<rsub|2>c<rsub|2>c<rsub|1><space|1fn><with|mode|text|since
      >d<rsub|1>c<rsub|2><con>d<rsub|2>c<rsub|1><pmod|N>>>|<row|<cell|>|<cell|<con>c<rsub|1><space|2fn><space|2fn><space|2fn><space|1fn><space|0.25spc><with|mode|text|since
      >a<rsub|2>d<rsub|2>-b<rsub|2>c<rsub|2>=1,>>>>
    </align*>

    and likewise

    <\equation*>
      d<rsub|2><con>a<rsub|2>d<rsub|1>d<rsub|2>-b<rsub|2>c<rsub|1>d<rsub|2><con>a<rsub|2>d<rsub|1>d<rsub|2>-b<rsub|2>d<rsub|1>c<rsub|2><con>d<rsub|1><pmod|N>.
    </equation*>
  </proof>

  Thus we may view weight <with|mode|math|k> Manin symbols for
  <with|mode|math|\<Gamma\><rsub|1>(N)> as triples of integers
  <with|mode|math|(i,c,d)>, where <with|mode|math|0\<leq\>i\<leq\>k-2> and
  <with|mode|math|c,d\<in\><Z>/N<Z>> with <with|mode|math|gcd(c,d,N)=1>. Here
  <with|mode|math|(i,c,d)> corresponds to the Manin symbol
  <with|mode|math|[X<rsup|i>Y<rsup|k-2-i>,<abcd|a|b|c<rprime|'>|d<rprime|'>>]>,
  where <with|mode|math|c<rprime|'>> and <with|mode|math|d<rprime|'>> lift
  <with|mode|math|c,d>. The relations of Theorem <reference|thm:mansym>
  become

  <\align*>
    <tformat|<table|<row|<cell|(i,<space|0.25spc>c,d)+(-1)<rsup|i>(k-2-i,<space|0.25spc>d,-c)>|<cell|=0,>>|<row|<cell|(i,<space|0.25spc>c,d)<space|1fn>+<space|1fn><space|0.25spc>(-1)<rsup|k-2><big|sum><rsub|j=0><rsup|k-2-i>(-1)<rsup|j><binom|k-2-i|j>(j,<space|0.25spc>d,-c-d)>|<cell|>>|<row|<cell|<space|2fn><space|2fn>+<space|1fn>(-1)<rsup|k-2-i><big|sum><rsub|j=0><rsup|i>(-1)<rsup|j><binom|i|j>(k-2-i+j,<space|0.25spc>-c-d,c)>|<cell|=0,>>|<row|<cell|(i,<space|0.25spc>c,d)-(-1)<rsup|k-2>(i,<space|0.25spc>-c,-d)>|<cell|=0.>>>>
  </align*>

  There is a similar description of cosets for
  <with|mode|math|\<Gamma\><rsub|0>(N)>:

  <\proposition>
    The right cosets <with|mode|math|\<Gamma\><rsub|0>(N)\<backslash\><SL><rsub|2>(<Z>)>
    are in bijection with the elements of
    <with|mode|math|<P><rsup|1>(<Z>/N<Z>)>. The coset containing a matrix
    <with|mode|math|<abcd|a|b|c|d>> corresponds to the point
    <with|mode|math|(c:d)\<in\><P><rsup|1>(<Z>/N<Z>)>.
  </proposition>

  For a proof, see <cite|cremona:algs> (S).

  <subsection|Modular Symbols With Character> Suppose now that
  <with|mode|math|G=\<Gamma\><rsub|1>(N)\<subset\><SL><rsub|2>(<Z>)>. Merel
  defines an action of diamond bracket operators <with|mode|math|<dbd|d>>,
  with <with|mode|math|gcd(d,N)=1>, on modular and Manin symbols. On Manin
  symbols the action is given by

  <\equation*>
    \<langle\>n\<rangle\>([P,(c,d)])=<left|[>P,(n*c,n*d)<right|]>.
  </equation*>

  Let

  <\equation*>
    <eps>:(<Z>/N<Z>)<rsup|\<ast\>>\<to\><Q>(\<zeta\>)<rsup|\<ast\>>
  </equation*>

  be a Dirichlet character, where <with|mode|math|\<zeta\>> is an
  <with|mode|math|n>th root of unity and <with|mode|math|n> is the order of
  <with|mode|math|<eps>>. Let <with|mode|math|<sM><rsub|k>(\<Gamma\><rsub|1>(N),<eps>)>
  be the quotient of <with|mode|math|<sM><rsub|k>(\<Gamma\><rsub|1>(N),<Z>[\<zeta\>])>
  by the relations (given in terms of Manin symbols)

  <\equation*>
    <dbd|d>x-<eps>(d)x=0,
  </equation*>

  for all <with|mode|math|x\<in\><sM><rsub|k>(\<Gamma\><rsub|1>(N),<Z>[\<zeta\>])>,
  and by any torsion. Thus <with|mode|math|<sM><rsub|k>(\<Gamma\><rsub|1>(N),<eps>)>
  is a torsion free <with|mode|math|<Z>[<eps>]>-module.

  <\remark>
    I do not know whether or not <with|mode|math|<sM><rsub|k>(\<Gamma\><rsub|1>(N),<eps>)>
    is necessarily free as a <with|mode|math|<Z>[<eps>]>-module.
  </remark>

  <section|Hecke Operators>

  Just as for modular forms, there is a <defn|Hecke algebra>
  <with|mode|math|<T>=<Z>[T<rsub|1>,T<rsub|2>,\<ldots\>]> of Hecke operators
  that act on <with|mode|math|<sM><rsub|k>(\<Gamma\><rsub|0>(N))>. Let

  <\equation*>
    R<rsub|p>=<left|{><mtwo|1|r|0|p>:r=0,1,\<ldots\>,p-1<right|}><union><left|{><mtwo|p|0|0|1><right|}>,
  </equation*>

  where we omit <with|mode|math|<abcd|p|0|0|1>> if
  <with|mode|math|p\<mid\>N>. Then the <defn|Hecke operator>
  <with|mode|math|T<rsub|p>> on <with|mode|math|<sM><rsub|k>(\<Gamma\><rsub|0>(N))>
  is given by

  <\equation*>
    T<rsub|p>(x)=<big|sum><rsub|g\<in\>R>g.x.
  </equation*>

  Notice when <with|mode|math|p\<nmid\>N>, that <with|mode|math|T<rsub|p>> is
  defined by summing over <with|mode|math|p+1> matrices that correspond to
  the <with|mode|math|p+1> sublattices of <with|mode|math|<Z>\<times\><Z>> if
  index <with|mode|math|p>. This is exactly how we defined
  <with|mode|math|T<rsub|p>> on modular forms.

  You might think at this point that we've just formally defined a computable
  abelian group, and defined operators formally on it that look something
  like the usual Hecke operators, but perhaps there's no real connection. As
  it turns out, the ring generated by all the Hecke operators on modular
  symbols is commutative, and <with|mode|math|<sM><rsub|k>(\<Gamma\><rsub|1>(N),<R>)>
  is non-canonically isomorphic as a <with|mode|math|<T>>-module to
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))>. Note that
  <with|mode|math|<sM><rsub|k>(\<Gamma\><rsub|1>(N),<R>)> is a real vector
  space and <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))> is a complex
  vector space, so this should be viewed also as an isomorphism of
  <with|mode|math|<R>>-vector spaces. In fact there is an extra conjugation
  structure on <with|mode|math|<sM><rsub|k>(\<Gamma\><rsub|1>(N),<R>)>, which
  we will discuss later.

  <subsection|General Definition of Hecke Operators> Let
  <with|mode|math|\<Gamma\>> be a finite index subgroup of
  <with|mode|math|<SL><rsub|2>(<Z>)> and suppose

  <\equation*>
    \<Delta\>\<subset\><GL><rsub|2>(<Q>)
  </equation*>

  is a set such that <with|mode|math|\<Gamma\>\<Delta\>=\<Delta\>\<Gamma\>=\<Delta\>>
  and <with|mode|math|\<Gamma\>\<backslash\>\<Delta\>> is finite. For
  example, <with|mode|math|\<Delta\>=\<Gamma\>> trivially satisfies this
  condition. Also, if <with|mode|math|\<Gamma\>=\<Gamma\><rsub|1>(N)>, then
  for any positive integer <with|mode|math|n>, the set

  <\equation*>
    \<Delta\><rsub|n>=<left|{><mtwo|a|b|c|d>\<in\>M<rsub|2>(<Z>)<space|0.25spc><space|0.25spc>:<space|0.25spc><space|0.25spc>a*d-b*c=n,<space|0.25spc><space|0.25spc><with|mode|text|and><space|0.25spc><space|0.25spc><mtwo|a|b|c|d><con><mtwo|1|\<ast\>|0|n><pmod|N><right|}>
  </equation*>

  also satisfies this condition, as we will now prove.

  <\lemma>
    <label|lem:deltan>We have

    <\equation*>
      \<Gamma\><rsub|1>(N)\<cdot\>\<Delta\><rsub|n>=\<Delta\><rsub|n>\<cdot\>\<Gamma\><rsub|1>(N)=\<Delta\><rsub|n>
    </equation*>

    and

    <\equation*>
      \<Delta\><rsub|n>=<big|cup><rsub|a,b>\<Gamma\><rsub|1>(N)\<cdot\>\<sigma\><rsub|a><mtwo|a|b|0|n/a>,
    </equation*>

    where <with|mode|math|\<sigma\><rsub|a><con><abcd|<htab|1fn>1/a|<space|0.25spc><space|0.25spc>0|0|<htab|1fn>a><pmod|N>>,
    the union is disjoint and <with|mode|math|1\<leq\>a\<leq\>n> with
    <with|mode|math|a\<mid\>n>, <with|mode|math|gcd(a,N)=1>, and
    <with|mode|math|0\<leq\>b\<less\>n/a>. In particular, the set of cosets
    <with|mode|math|\<Gamma\><rsub|1>(N)\<backslash\>\<Delta\><rsub|n>> is
    finite.
  </lemma>

  <\proof>
    If <with|mode|math|\<gamma\>\<in\>\<Gamma\><rsub|1>(N)> and
    <with|mode|math|\<delta\>\<in\>\<Delta\><rsub|n>>, then

    <\equation*>
      <mtwo|1|\<ast\>|0|1>\<cdot\><mtwo|1|\<ast\>|0|n><con><mtwo|1|\<ast\>|0|n>\<cdot\><mtwo|1|\<ast\>|0|1><con><mtwo|1|\<ast\>|0|n><pmod|N>.
    </equation*>

    Thus <with|mode|math|\<Gamma\><rsub|1>(N)\<Delta\><rsub|n>\<subset\>\<Delta\><rsub|n>>,
    and since <with|mode|math|\<Gamma\><rsub|1>(N)> is a group
    <with|mode|math|\<Gamma\><rsub|1>(N)\<Delta\><rsub|n>=\<Delta\><rsub|n>>;
    likewise <with|mode|math|\<Delta\><rsub|n>\<Gamma\><rsub|1>(N)=\<Delta\><rsub|n>>.

    For the coset decomposition, we first prove the statement for
    <with|mode|math|N=1>, i.e., for <with|mode|math|\<Gamma\><rsub|1>(N)=<SL><rsub|2>(<Z>)>.
    If <with|mode|math|A> is an arbitrary element of
    <with|mode|math|M<rsub|2>(<Z>)> with determinant <with|mode|math|n>, then
    using row operators on the left with determinant <with|mode|math|1>,
    i.e., left multiplication by elements of
    <with|mode|math|<SL><rsub|2>(<Z>)>, we can transform <with|mode|math|A>
    into the form <with|mode|math|<abcd|a|b|0|n/a>>, with
    <with|mode|math|1\<leq\>a\<leq\>n> and
    <with|mode|math|0\<leq\>b\<less\>n>. (Just imagine applying the Euclidean
    algorithm to the two entries in the first column of <with|mode|math|A>.
    Then <with|mode|math|a> is the <with|mode|math|gcd> of the two entries in
    the first column, and the lower left entry is <with|mode|math|0>. Next
    subtract <with|mode|math|n/a> from <with|mode|math|b> until
    <with|mode|math|0\<leq\>b\<less\>n/a>.)

    Next suppose <with|mode|math|N> is arbitrary. Let
    <with|mode|math|g<rsub|1>,\<ldots\>,g<rsub|r>> be such that

    <\equation*>
      g<rsub|1>\<Gamma\><rsub|1>(N)<union>\<cdots\><union>g<rsub|r>\<Gamma\><rsub|1>(N)=<SL><rsub|2>(<Z>)
    </equation*>

    is a disjoint union. If <with|mode|math|A\<in\>\<Delta\><rsub|n>> is
    arbitrary, then as we showed above, there is some
    <with|mode|math|\<gamma\>\<in\><SL><rsub|2>(<Z>)>, so that
    <with|mode|math|\<gamma\>\<cdot\>A=<abcd|a|b|0|n/a>>, with
    <with|mode|math|1\<leq\>a\<leq\>n> and
    <with|mode|math|0\<leq\>b\<less\>n/a>, and <with|mode|math|a\<mid\>n>.
    Write <with|mode|math|\<gamma\>=g<rsub|i>\<cdot\>\<alpha\>>, with
    <with|mode|math|\<alpha\>\<in\>\<Gamma\><rsub|1>(N)>. Then

    <\equation*>
      \<alpha\>\<cdot\>A=g<rsub|i><rsup|-1>\<cdot\><mtwo|a|b|0|n/a><con><mtwo|1|\<ast\>|0|n><pmod|N>.
    </equation*>

    It follows that

    <\equation*>
      g<rsub|i><rsup|-1><con><mtwo|1|\<ast\>|0|n>\<cdot\><mtwo|a|b|0|n/a><rsup|-1><con><mtwo|1/a|\<ast\>|0|a><pmod|N>.
    </equation*>

    Since <with|mode|math|<abcd|1|1|0|1>\<in\>\<Gamma\><rsub|1>(N)> and
    <with|mode|math|gcd(a,N)=1>, there is
    <with|mode|math|\<gamma\><rprime|'>\<in\>\<Gamma\><rsub|1>(N)> such that

    <\equation*>
      \<gamma\><rprime|'>g<rsub|i><rsup|-1><con><mtwo|1/a|0|0|a><pmod|N>.
    </equation*>

    We may then choose <with|mode|math|\<sigma\><rsub|a>=\<gamma\><rprime|'>g<rsub|i><rsup|-1>>.
    Thus every <with|mode|math|A\<in\>\<Delta\><rsub|n>> is of the form
    <with|mode|math|\<gamma\>\<sigma\><rsub|a><abcd|a|b|0|n/a>>, with
    <with|mode|math|\<gamma\>\<in\>\<Gamma\><rsub|1>(N)> and
    <with|mode|math|a,b> suitably bounded. This proves the second claim.
  </proof>

  Let any element <with|mode|math|\<delta\>=<abcd|a|b|c|d>\<in\><GL><rsub|2>(<Q>)>
  act on the left on modular symbols <with|mode|math|<M><rsub|k>> by

  <\equation*>
    \<delta\>(P{\<alpha\>,\<beta\>})=P(d*X-b*Y,-c*X+a*Y){\<delta\>(\<alpha\>),\<delta\>(\<beta\>)}.
  </equation*>

  (Until now we had only defined an action of
  <with|mode|math|<SL><rsub|2>(<Z>)> on modular symbols.) For
  <with|mode|math|g=<abcd|a|b|c|d>\<in\><GL><rsub|2>(<Q>)>, let

  <\equation>
    <label|eqn:gtilde><wide|g|~>=<mtwo|<htab|1fn>d|-b|-c|<htab|1fn>a>=det(g)\<cdot\>g<rsup|-1>.
  </equation>

  Note that <with|mode|math|<wide|<wide|g|~>|~>=g>. Also,
  <with|mode|math|\<delta\>.P(X,Y)=(P\<circ\><wide|g|~>)(X,Y)>, where we set

  <\equation*>
    <wide|g|~>(X,Y)=(d*X-b*Y,-c*X+a*Y).
  </equation*>

  Suppose <with|mode|math|\<Gamma\>> and <with|mode|math|\<Delta\>> are as
  above. Fix a finite set <with|mode|math|R> of representatives for
  <with|mode|math|\<Gamma\>\<backslash\>\<Delta\>>. Let

  <\equation*>
    T<rsub|\<Delta\>>:<M><rsub|k>(\<Gamma\>)\<to\><M><rsub|k>(\<Gamma\>)
  </equation*>

  be the linear map

  <\equation*>
    T<rsub|\<Delta\>>(x)=<big|sum><rsub|\<delta\>\<in\>R>\<delta\>\<cdot\>x,
  </equation*>

  This map is well defined because if <with|mode|math|\<gamma\>\<in\>\<Gamma\>>
  and <with|mode|math|x\<in\><M><rsub|k>(\<Gamma\>)>, then

  <\equation*>
    <big|sum><rsub|\<delta\>\<in\>R>\<delta\>\<gamma\>\<cdot\>x=<big|sum><rsub|<with|mode|text|certain
    <with|mode|math|\<delta\><rprime|'>>>>\<gamma\>\<delta\><rprime|'>\<cdot\>x=<big|sum><rsub|<with|mode|text|certain
    <with|mode|math|\<delta\><rprime|'>>>>\<delta\><rprime|'>\<cdot\>x=<big|sum><rsub|\<delta\>\<in\>R>\<delta\>\<cdot\>x,
  </equation*>

  where we have used that <with|mode|math|\<Delta\>\<Gamma\>=\<Gamma\>\<Delta\>>,
  and <with|mode|math|\<Gamma\>> acts trivially on
  <with|mode|math|<M><rsub|k>(\<Gamma\>)>.

  Let <with|mode|math|\<Gamma\>=\<Gamma\><rsub|1>(N)> and
  <with|mode|math|\<Delta\>=\<Delta\><rsub|n>>. Then the <with|mode|math|n>th
  Hecke operator <with|mode|math|T<rsub|n>> is
  <with|mode|math|T<rsub|\<Delta\><rsub|n>>>, and by Lemma
  <reference|lem:deltan>,

  <\equation*>
    T<rsub|n>(x)=<big|sum><rsub|a,b>\<sigma\><rsub|a><mtwo|a|b|0|n/a>\<cdot\>x,
  </equation*>

  where <with|mode|math|a,b> are as in Lemma <reference|lem:deltan>.

  Given this definition, we can compute the Hecke operators on
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))> as follows. Write
  <with|mode|math|x> as a modular symbol <with|mode|math|P{\<alpha\>,\<beta\>}>,
  compute <with|mode|math|T<rsub|n>(x)> as a modular symbol, then convert
  back to Manin symbols using (many!) continued fractions expansions. This is
  extremely inefficient, and fortunately Lo<"|i>c Merel found a much better
  way, which we now describe (see also <cite|merel:1585> and also
  <cite|mazur:symboles>).

  <subsection|Hecke Operators on Manin Symbols> If <with|mode|math|S> is a
  subset of <with|mode|math|<GL><rsub|2>(<Q>)>, let

  <\equation*>
    <wide|S|~>={<wide|g|~>:g\<in\>S}.
  </equation*>

  Also, for any ring <with|mode|math|R> and any subset
  <with|mode|math|S\<subset\>M<rsub|2>(<Z>)>, let <with|mode|math|R[S]>
  denote the free <with|mode|math|R>-module with basis the elements of
  <with|mode|math|S>, so the elements of <with|mode|math|R[S]> are the finite
  <with|mode|math|R>-linear combinations of the elements of
  <with|mode|math|S>.

  One of the main theorems of <cite|merel:1585> is that for any
  <with|mode|math|\<Gamma\>,\<Delta\>> as above, if one can find
  <with|mode|math|<big|sum>u<rsub|M>M\<in\><C>[M<rsub|2>(<Z>)]> and a map

  <\equation*>
    \<phi\>:<wide|\<Delta\>|~><SL><rsub|2>(<Z>)\<to\><SL><rsub|2>(<Z>)
  </equation*>

  that satisfies a complicated list of conditions, then for any Manin symbol
  <with|mode|math|[P,g]\<in\><M><rsub|k>(\<Gamma\>)>, we have

  <\equation*>
    T<rsub|\<Delta\>>([P,g])=<big|sum><rsub|g*M\<in\><wide|\<Delta\>|~><SL><rsub|2>(<Z>)<with|mode|text|with
    >M\<in\><SL><rsub|2>(<Z>)>u<rsub|M>[<wide|M|~>\<cdot\>P,<space|0.25spc><space|0.25spc>\<phi\>(g*M)].
  </equation*>

  Merel devotes substantial work to giving examples of
  <with|mode|math|\<phi\>> and <with|mode|math|<big|sum>u<rsub|M>M\<in\><C>[M<rsub|2>(<Z>)]>
  that satisfy all his conditions.

  When <with|mode|math|\<Gamma\>=\<Gamma\><rsub|1>(N)>, the complicated list
  of conditions becomes simpler. Let <with|mode|math|M<rsub|2>(<Z>)<rsub|n>>
  be the set of <with|mode|math|2\<times\>2> matrices with determinant
  <with|mode|math|n>. An element

  <\equation*>
    h=<big|sum>u<rsub|M>[M]\<in\><C>[M<rsub|2>(<Z>)<rsub|n>]
  </equation*>

  <defn|satisfies condition <with|mode|math|C<rsub|n>>> if for every
  <with|mode|math|K\<in\>M<rsub|2>(<Z>)<rsub|n>/<SL><rsub|2>(<Z>)>, we have
  that

  <\equation>
    <label|eqn:cn><big|sum><rsub|M\<in\>K>u<rsub|M>([M\<infty\>]-[M0])=[\<infty\>]-[0]\<in\><C>[P<rsup|1>(<Q>)].
  </equation>

  If <with|mode|math|h> satisfies condition <with|mode|math|C<rsub|n>>, then
  for any Manin symbol <with|mode|math|[P,g]\<in\>M<rsub|k>(\<Gamma\><rsub|1>(N))>,
  Merel proves that

  <\equation>
    <label|eqn:tnmanin>T<rsub|n>([P,(u,v)])=<big|sum><rsub|M>u<rsub|M>[P(a*X+b*Y,<space|0.25spc>c*X+d*Y),(u,v)M].
  </equation>

  Here <with|mode|math|(u,v)\<in\>(<Z>/N<Z>)<rsup|2>> corresponds to a coset
  of <with|mode|math|\<Gamma\><rsub|1>(N)> in
  <with|mode|math|<SL><rsub|2>(<Z>)>, as in Proposition
  <reference|prop:gamma1cosets>, and if <with|mode|math|(u<rprime|'>,v<rprime|'>)=(u,v)M\<in\>(<Z>/N<Z>)<rsup|2>>,
  and <with|mode|math|gcd(u<rprime|'>,v<rprime|'>,N)\<neq\>1>, then we omit
  the corresponding summand.

  For example, we will now check directly that the element

  <\equation*>
    h<rsub|2>=<left|[><mtwo|2|0|0|1><right|]>+<left|[><mtwo|1|0|0|2><right|]>+<left|[><mtwo|2|1|0|1><right|]>+<left|[><mtwo|1|0|1|2><right|]>
  </equation*>

  satisfies condition <with|mode|math|C<rsub|2>>. We have, as in the proof of
  Lemma <reference|lem:deltan>, but using elementary column operations, that

  <\align*>
    <tformat|<table|<row|<cell|M<rsub|2>(<Z>)<rsub|2>/<SL><rsub|2>(<Z>)>|<cell|=<left|{><mtwo|a|0|b|2/a><SL><rsub|2>(<Z>):a=1,2<with|mode|text|and
    >0\<leq\>b\<less\>2/a<right|}>>>|<row|<cell|>|<cell|=<left|{><mtwo|1|0|0|2><SL><rsub|2>(<Z>),<space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc><mtwo|1|0|1|2><SL><rsub|2>(<Z>),<space|0.25spc><space|0.25spc><space|0.25spc><space|0.25spc><mtwo|2|0|0|1><SL><rsub|2>(<Z>)<right|}>.>>>>
  </align*>

  To verify condition <with|mode|math|C<rsub|2>>, we consider each of the
  three elements of <with|mode|math|M<rsub|2>(<Z>)<rsub|2>/<SL><rsub|2>(<Z>)>
  and check that (<reference|eqn:cn>) holds. We have that

  <\equation*>
    <mtwo|1|0|0|2>\<in\><mtwo|1|0|0|2><SL><rsub|2>(<Z>),
  </equation*>

  <\equation*>
    <mtwo|2|1|0|1>,<mtwo|1|0|1|2>\<in\><mtwo|1|0|1|2><SL><rsub|2>(<Z>),
  </equation*>

  and

  <\equation*>
    <mtwo|2|0|0|1>\<in\><mtwo|2|0|0|1><SL><rsub|2>(<Z>).
  </equation*>

  Thus if <with|mode|math|K=<abcd|1|0|0|2><SL><rsub|2>(<Z>)>, the left sum of
  (<reference|eqn:cn>) is <with|mode|math|[<abcd|1|0|0|2>(\<infty\>)]-[<abcd|1|0|0|2>(0)]=[\<infty\>]-[0]>,
  as required. If <with|mode|math|K=<abcd|1|0|1|2><SL><rsub|2>(<Z>)>, then
  the left side of (<reference|eqn:cn>) is

  <\equation*>
    [<abcd|2|1|0|1>(\<infty\>)]-[<abcd|2|1|0|1>(0)]+[<abcd|1|0|1|2>(\<infty\>)]-[<abcd|1|0|1|2>(0)]=[\<infty\>]-[1]+[1]-[0]=[\<infty\>]-[0].
  </equation*>

  Finally, for <with|mode|math|K=<abcd|2|0|0|1><SL><rsub|2>(<Z>)> we also
  have <with|mode|math|[<abcd|2|0|0|1>(\<infty\>)]-[<abcd|2|0|0|1>(0)]=[\<infty\>]-[0]>,
  as required. Thus by (<reference|eqn:tnmanin>) we can compute
  <with|mode|math|T<rsub|2>> on <with|font-shape|italic|any> Manin symbol, by
  summing over the action of the four matrices
  <with|mode|math|<abcd|2|0|0|1>,<abcd|1|0|0|2>,<abcd|2|1|0|1>,<abcd|1|0|1|2>>.

  <\proposition>
    [Merel]<label|prop:heilbronn>The element

    <\equation*>
      <big|sum><rsub|<substack|a\<gtr\>b\<geq\>0<next-line>d\<gtr\>c\<geq\>0<next-line>a*d-b*c=n>><left|[><mtwo|a|b|c|d><right|]>\<in\><Z>[M<rsub|2>(<Z>)<rsub|n>]
    </equation*>

    satisfies condition <with|mode|math|C<rsub|n>>.
  </proposition>

  Merel's proof isn't too difficult, but takes two pages.

  <\remark>
    In <cite|cremona:algs> (S), Cremona discusses the work of Merel and Mazur
    on Heilbronn matrices in the special cases
    <with|mode|math|\<Gamma\>=\<Gamma\><rsub|0>(N)> and weight
    <with|mode|math|2>. He gives a fairly simple proof that the action of
    <with|mode|math|T<rsub|p>> on Manin symbols can be computed by summing
    the action of some set <with|mode|math|R<rsub|p>> of matrices of
    determinant <with|mode|math|p>. He then describes the set
    <with|mode|math|R<rsub|p>>, and gives an efficient continued fractions
    algorithm for computing it (but he does not seem to prove that his
    description of <with|mode|math|R<rsub|p>> is correct). (Note: My
    experience is that Cremona's set <with|mode|math|R<rsub|p>> is
    significantly smaller than the sets appearing in Merel's paper, but when
    I've tried to use <with|mode|math|R<rsub|p>> to do certain more general
    higher-weight computations that are correct using Merel's sets, they do
    not work.)
  </remark>

  <subsection|Remarks on Complexity> Merel also gives another family
  <with|mode|math|<with|math-font|cal|S><rsub|n>> of matrices that satisfy
  condition <with|mode|math|C<rsub|n>>, and he proves that as
  <with|mode|math|n\<to\>\<infty\>>,

  <\equation*>
    #<with|math-font|cal|S><rsub|n>\<sim\><frac|12log(2)|\<pi\><rsup|2>>\<cdot\>\<sigma\><rsub|1>(n)log(n),
  </equation*>

  where <with|mode|math|\<sigma\><rsub|1>(n)> is the sum of the divisors of
  <with|mode|math|n>. Thus for a fixed space
  <with|mode|math|M<rsub|k>(\<Gamma\>)> of modular symbols, one can compute
  the Hecke operator <with|mode|math|T<rsub|n>> using
  <with|mode|math|O(\<sigma\><rsub|1>(n)log(n))> arithmetic operations in the
  base field. Note that we've fixed <with|mode|math|M<rsub|k>(\<Gamma\>)>, so
  we ignore the linear algebra involved in computation of a presentation;
  also, adding elements takes a bounded number of field operations when the
  space is fixed. Thus using Manin symbols the complexity of computing
  <with|mode|math|T<rsub|p>>, for <with|mode|math|p> prime, is
  <with|mode|math|O((p+1)log(p))> field operations, which is
  <with|font-shape|italic|exponential> in the number of digits of
  <with|mode|math|p>.

  There is a trick of Basmaji (see <cite|basmaji:thesis>) for computing a
  matrix of <with|mode|math|T<rsub|n>> on
  <with|mode|math|<sM><rsub|k>(\<Gamma\>)>, when <with|mode|math|n> is very
  large, and it is more efficient than one might naively expect. Basmaji's
  trick doesn't improve the big-oh complexity for a fixed space, but does
  improve the complexity by a constant factor of the dimension of
  <with|mode|math|<sM><rsub|k>(\<Gamma\>,<Q>)>. Suppose we are interested in
  computing the matrix for <with|mode|math|T<rsub|n>> for some massive
  integer <with|mode|math|n>, and that <with|mode|math|<sM><rsub|k>(\<Gamma\>,<Q>)>
  as has fairly large dimension. The trick is as follows. Choose, a list

  <\equation*>
    x<rsub|1>=[P<rsub|1>,g<rsub|1>],\<ldots\>,x<rsub|r>=[P<rsub|r>,g<rsub|r>]\<in\>V=<sM><rsub|k>(\<Gamma\>,<Q>)
  </equation*>

  of Manin symbols such that the map <with|mode|math|\<Psi\>:<T>\<to\>V<rsup|r>>
  given by

  <\equation*>
    t\<mapsto\>(t*x<rsub|1>,\<ldots\>,t*x<rsub|r>)
  </equation*>

  is injective. In practice, it is often possible to do this with
  <with|mode|math|r> ``very small''. Also, we emphasize that
  <with|mode|math|V<rsup|r>> is a <with|mode|math|<Q>>-vector space of
  dimension <with|mode|math|r\<cdot\>dim(V)>.

  Next find Hecke operators <with|mode|math|T<rsub|i>>, with
  <with|mode|math|i> small, whose images form a basis for the image of
  <with|mode|math|\<Psi\>>. Now with the above data precomputed, which only
  required working with Hecke operators <with|mode|math|T<rsub|i>> for small
  <with|mode|math|i>, we are ready to compute <with|mode|math|T<rsub|n>> with
  <with|mode|math|n> huge. Compute <with|mode|math|y<rsub|i>=T<rsub|n>(x<rsub|i>)>,
  for each <with|mode|math|i=1,\<ldots\>,r>, which we can compute using
  Heilbronn matrices since each <with|mode|math|x<rsub|i>=[P<rsub|i>,g<rsub|i>]>
  is a Manin symbol. We thus obtain <with|mode|math|\<Psi\>(T<rsub|n>)\<in\>V<rsup|r>.>
  Since we have precomputed Hecke operators <with|mode|math|T<rsub|j>> such
  that <with|mode|math|\<Psi\>(T<rsub|j>)> generate
  <with|mode|math|V<rsup|r>>, we can find <with|mode|math|a<rsub|j>> such
  that <with|mode|math|<big|sum>a<rsub|j>\<Psi\>(T<rsub|j>)=\<Psi\>(T<rsub|n>)>.
  Then since <with|mode|math|\<Psi\>> is injective, we have
  <with|mode|math|T<rsub|n>=<big|sum>a<rsub|j>T<rsub|j>>, which gives the
  full matrix of <with|mode|math|T<rsub|n>> on
  <with|mode|math|M<rsub|k>(\<Gamma\>,<Q>)>.

  <section|Cuspidal Modular Symbols> Let <with|mode|math|<sB>> be the free
  abelian group on symbols <with|mode|math|{\<alpha\>}>, for
  <with|mode|math|\<alpha\>\<in\><P><rsup|1>(<Q>)>, and set

  <\equation*>
    <sB><rsub|k>=<Z><rsub|k-2>[X,Y]<tensor><sB>.
  </equation*>

  Define a left action of <with|mode|math|<SL><rsub|2>(<Z>)> on
  <with|mode|math|<sB><rsub|k>> by

  <\equation*>
    g.(P{\<alpha\>})=(g.P){g(\<alpha\>)},
  </equation*>

  for <with|mode|math|g\<in\><SL><rsub|2>(<Z>)>. For any finite index
  subgroup <with|mode|math|\<Gamma\>\<subset\><SL><rsub|2>(<Z>)>, let
  <with|mode|math|<sB><rsub|k>(\<Gamma\>)> be the quotient of
  <with|mode|math|<sB><rsub|k>> by the relations <with|mode|math|x-g.x> for
  all <with|mode|math|g\<in\>\<Gamma\>> and by any torsion. Thus
  <with|mode|math|<sB><rsub|k>(\<Gamma\>)> is a torsion free abelian group.

  The <defn|boundary map> is the map

  <\equation*>
    b:<sM><rsub|k>(\<Gamma\>)\<to\><sB><rsub|k>(\<Gamma\>)
  </equation*>

  given by extending the map

  <\equation*>
    b(P{\<alpha\>,\<beta\>})=P{\<beta\>}-P{\<alpha\>}
  </equation*>

  linearly. The space <with|mode|math|<sS><rsub|k>(\<Gamma\>)> of
  <defn|cuspidal modular symbols> is the kernel

  <\equation*>
    <sS><rsub|k>(\<Gamma\>)=ker(<sM><rsub|k>(\<Gamma\>)\<to\><sB><rsub|k>(\<Gamma\>)),
  </equation*>

  so we have an exact sequence

  <\equation*>
    0\<to\><sS><rsub|k>(\<Gamma\>)\<to\><sM><rsub|k>(\<Gamma\>)\<to\><sB><rsub|k>(\<Gamma\>).
  </equation*>

  One can prove that when <with|mode|math|k\<gtr\>2> then this sequence is
  exact on the right. Also, there is a presentation of
  <with|mode|math|<sB><rsub|k>(\<Gamma\>)> in terms of ``boundary Manin
  symbols''. [[TODO: Add this later to the book, but discussing this is not
  necessary for Math 257.]]

  <section|The Pairing Between Modular Symbols and Modular Forms> In this
  section we define a pairing between modular symbols and modular forms, and
  prove that the Hecke operators respect this pairing. We also define an
  involution on modular symbols, and study its relationship with the pairing.
  This pairing is crucial in much that follows, because it gives rise to
  period maps from modular symbols to certain complex vector spaces.

  Fix an integer weight <with|mode|math|k\<geq\>2> and a finite-index
  subgroup <with|mode|math|\<Gamma\>> of <with|mode|math|<SL><rsub|2>(<Z>)>.
  Let <with|mode|math|M<rsub|k>(\<Gamma\>)> denote the space of holomorphic
  modular forms of weight <with|mode|math|k> for <with|mode|math|\<Gamma\>>,
  and <with|mode|math|S<rsub|k>(\<Gamma\>)> its cuspidal subspace. Following
  <cite|merel:1585> (S), let

  <\equation*>
    <Sbar><rsub|k>(\<Gamma\>)={<overline|f>:f\<in\>S<rsub|k>(\<Gamma\>)}
  </equation*>

  denote the space of <defn|antiholomorphic> cuspforms. Here
  <with|mode|math|<overline|f>> is the function on
  <with|mode|math|<h><rsup|\<ast\>>> given by
  <with|mode|math|<overline|f>(z)=<overline|f(z)>>.

  Define a pairing

  <\equation>
    <label|eqn:intpairing>(S<rsub|k>(\<Gamma\>)\<oplus\><Sbar><rsub|k>(\<Gamma\>))\<times\><sM><rsub|k>(\<Gamma\>)\<to\><C>
  </equation>

  by

  <\equation*>
    \<langle\>(f<rsub|1>,f<rsub|2>),P{\<alpha\>,\<beta\>}\<rangle\>=<big|int><rsub|\<alpha\>><rsup|\<beta\>>f<rsub|1>(z)P(z,1)<dz>+<big|int><rsub|\<alpha\>><rsup|\<beta\>>f<rsub|2>(z)P(<zbar>,1)<dzbar>,
  </equation*>

  and extending linearly. Here the integral is a complex path integral along
  a great circle (or vertical line) from <with|mode|math|\<alpha\>> to
  <with|mode|math|\<beta\>> (so, e.g., write
  <with|mode|math|z(t)=x(t)+i*y(t)>, where <with|mode|math|(x(t),y(t))>
  traces out the path, and consider two real integrals; see any introductory
  book on complex analysis for more details).

  The integration pairing is well defined, which means that if we replace
  <with|mode|math|P{\<alpha\>,\<beta\>}> by an equivalent modular symbols
  (equivalent modulo the left action of <with|mode|math|\<Gamma\>>), then the
  integral is the same. This follows from the change of variables formulas
  for integration and the fact that <with|mode|math|f<rsub|1>\<in\>S<rsub|k>(\<Gamma\>)>
  and <with|mode|math|f<rsub|2>\<in\><Sbar><rsub|k>(\<Gamma\>)>. For example,
  if <with|mode|math|k=2>, <with|mode|math|g\<in\>\<Gamma\>> and
  <with|mode|math|f\<in\>S<rsub|k>(\<Gamma\>)>, then

  <\align*>
    <tformat|<table|<row|<cell|\<langle\>f,g{\<alpha\>,\<beta\>}\<rangle\>>|<cell|=\<langle\>f,{g(\<alpha\>),g(\<beta\>)}\<rangle\>>>|<row|<cell|>|<cell|=<big|int><rsub|g(\<alpha\>)><rsup|g(\<beta\>)>f(z)<dz>>>|<row|<cell|>|<cell|=<big|int><rsub|\<alpha\>><rsup|\<beta\>>f(g(z))d*g(z)>>|<row|<cell|>|<cell|=<big|int><rsub|\<alpha\>><rsup|\<beta\>>f(z)<dz>=\<langle\>f,{\<alpha\>,\<beta\>}\<rangle\>,>>>>
  </align*>

  where in the last step we use that <with|mode|math|f> is a weight
  <with|mode|math|2> modular form.

  <\remark>
    The integration pairing is related to special values of
    <with|mode|math|L>-functions. The <with|mode|math|L>-function attached to
    a cusp form <with|mode|math|f=<big|sum>a<rsub|n>q<rsup|n>\<in\>S<rsub|k>(\<Gamma\><rsub|1>(N))>
    is

    <\equation>
      <label|eqn:lfs>L(f,s)=(2\<pi\>)<rsup|s>\<Gamma\>(s)<rsup|-1><big|int><rsub|0><rsup|\<infty\>>f(i*t)t<rsup|s><frac|d*t|t>
    </equation>

    Note that one can show that <with|mode|math|L(f,s)=<big|sum><rsub|n=1><rsup|\<infty\>><frac|a<rsub|n>|n<rsup|s>>>
    by switching the order of summation and integration, which is justified
    using standard estimates on <with|mode|math|\|a<rsub|n>\|> (see, e.g.,
    <cite|knapp:elliptic> (S)).

    For each integer <with|mode|math|j> with
    <with|mode|math|1\<leq\>j\<leq\>k-1>, we have setting
    <with|mode|math|s=j> and making the change of variables
    <with|mode|math|t\<mapsto\>-i*t> in (<reference|eqn:lfs>), that

    <\equation*>
      L(f,j)=<frac|(-2\<pi\>i)<rsup|j>|(j-1)!>\<cdot\><left|langle>f,<space|0.25spc><space|0.25spc>X<rsup|j-1>Y<rsup|k-2-(j-1)>{0,\<infty\>}<right|rangle>.
    </equation*>

    The integers <with|mode|math|j> as above are called <defn|critical
    integers>, and when <with|mode|math|f> is an eigenform, they have deep
    conjectural significance. We will discuss tricks to efficiently compute
    <with|mode|math|L(f,j)> later in this book.
  </remark>

  <\theorem>
    [Shokoruv] The pairing <with|mode|math|\<langle\>\<cdot\><space|0.25spc>,<space|0.25spc>\<cdot\>\<rangle\>>
    is nondegenerate when restricted to cuspidal modular symbols:

    <\equation*>
      \<langle\>\<cdot\><space|0.25spc>,<space|0.25spc>\<cdot\>\<rangle\>:(S<rsub|k>(\<Gamma\>)\<oplus\><Sbar><rsub|k>(\<Gamma\>))\<times\><sS><rsub|k>(\<Gamma\>)\<to\><C>.
    </equation*>
  </theorem>

  The pairing is also compatible with Hecke operators. Before proving this,
  we define an action of <defn|Hecke operators> on
  <with|mode|math|M<rsub|k>(\<Gamma\><rsub|1>(N))> and on
  <with|mode|math|<Sbar><rsub|k>(\<Gamma\><rsub|1>(N))>. The definition is
  very similar to the one we gave in Section <reference|sec:hecke> for
  modular forms of level <with|mode|math|1>. For a positive integer
  <with|mode|math|n>, let <with|mode|math|R<rsub|n>> be a set of coset
  representatives for <with|mode|math|\<Gamma\><rsub|1>(N)\<backslash\>\<Delta\><rsub|n>>
  from Lemma <reference|lem:deltan>. For any
  <with|mode|math|\<gamma\>=<abcd|a|b|c|d>\<in\><GL><rsub|2>(<Q>)> and
  <with|mode|math|f\<in\>M<rsub|k>(\<Gamma\><rsub|1>(N))> set

  <\equation*>
    f\|[\<gamma\>]<rsub|k>=det(\<gamma\>)<rsup|k-1>(c*z+d)<rsup|-k>f(\<gamma\>(z)).
  </equation*>

  Also, for <with|mode|math|f\<in\><Sbar><rsub|k>(\<Gamma\><rsub|1>(N))>, set

  <\equation*>
    f\|[\<gamma\>]<rsub|k><rprime|'>=det(\<gamma\>)<rsup|k-1>(c<zbar>+d)<rsup|-k>f(\<gamma\>(z)).
  </equation*>

  Then for <with|mode|math|f\<in\>M<rsub|k>(\<Gamma\><rsub|1>(N))>,

  <\equation*>
    T<rsub|n>(f)=<big|sum><rsub|\<gamma\>\<in\>R<rsub|n>>f\|[\<gamma\>]<rsub|k>
  </equation*>

  and for <with|mode|math|f\<in\><Sbar><rsub|k>(\<Gamma\><rsub|1>(N))>,

  <\equation*>
    T<rsub|n>(f)=<big|sum><rsub|\<gamma\>\<in\>R<rsub|n>>f\|[\<gamma\>]<rsub|k><rprime|'>.
  </equation*>

  This agrees with the definition from <reference|sec:hecke> when
  <with|mode|math|N=1>.

  <\remark>
    If <with|mode|math|\<Gamma\>> is an arbitrary finite index subgroup of
    <with|mode|math|<SL><rsub|2>(<Z>)>, then we can define operators
    <with|mode|math|T<rsub|\<Delta\>>> on
    <with|mode|math|M<rsub|k>(\<Gamma\>)> for any <with|mode|math|\<Delta\>>
    with <with|mode|math|\<Delta\>\<Gamma\>=\<Gamma\>\<Delta\>=\<Delta\>> and
    <with|mode|math|\<Gamma\>\<backslash\>\<Delta\>> finite. For concreteness
    we do not do the general case here or in the theorem below, but the proof
    is exactly the same (see <cite|merel:1585> (S)).
  </remark>

  Finally we prove the promised Hecke compatibility of the pairing. This
  proof should convince you that the definition of modular symbols is
  sensible, in that they are ``natural'' expressions to integrate against
  modular forms.

  <\theorem>
    If <with|mode|math|f=(f<rsub|1>,f<rsub|2>)\<in\>S<rsub|k>(\<Gamma\><rsub|1>(N))\<oplus\><Sbar><rsub|k>(\<Gamma\><rsub|1>(N))>
    and <with|mode|math|x\<in\><sM><rsub|k>(\<Gamma\><rsub|1>(N))>, then for
    any <with|mode|math|n>,

    <\equation*>
      \<langle\>T<rsub|n>(f),x\<rangle\>=\<langle\>f,T<rsub|n>(x)\<rangle\>.
    </equation*>
  </theorem>

  <\proof>
    We exactly follow <cite|merel:1585> (S), and will only prove the theorem
    when <with|mode|math|f=f<rsub|1>\<in\>S<rsub|k>(\<Gamma\><rsub|1>(N))>,
    the proof in the general case being the same.

    Let <with|mode|math|\<alpha\>,\<beta\>\<in\><P><rsup|1>(<Q>)>,
    <with|mode|math|P\<in\><Z><rsub|k-2>[X,Y]>, and for
    <with|mode|math|g=<abcd|a|b|c|d>\<in\><GL><rsub|2>(<Q>)>, set
    <with|mode|math|j(g,z)=(c*z+d)>. Let <with|mode|math|n> be any positive
    integer, and let <with|mode|math|R<rsub|n>> be a set of coset
    representatives for <with|mode|math|\<Gamma\><rsub|1>(N)\<backslash\>\<Delta\><rsub|n>>
    from Lemma <reference|lem:deltan>.

    We have

    <\align*>
      <tformat|<table|<row|<cell|\<langle\>T<rsub|n>(f),P{\<alpha\>,\<beta\>}\<rangle\>>|<cell|=<big|int><rsub|\<alpha\>><rsup|\<beta\>>T<rsub|n>(f)P(z,1)<dz>>>|<row|<cell|>|<cell|=<big|sum><rsub|\<delta\>\<in\>R><big|int><rsub|\<alpha\>><rsup|\<beta\>>det(\<delta\>)<rsup|k-1>f(\<delta\>(z))j(\<delta\>,z)<rsup|-k>P(z,1)<dz>.>>>>
    </align*>

    Now for each summand corresponding to the
    <with|mode|math|\<delta\>\<in\>R>, make the change of variables
    <with|mode|math|u=\<delta\>z>. Thus we make <with|mode|math|#R> change of
    variables. Also, recall the notation from (<reference|eqn:gtilde>), which
    we will use below.

    <\align*>
      <tformat|<table|<row|<cell|\<langle\>T<rsub|n>(f),P{\<alpha\>,\<beta\>}\<rangle\>>|<cell|=<big|sum><rsub|\<delta\>\<in\>R><big|int><rsub|\<delta\>(\<alpha\>)><rsup|\<delta\>(\<beta\>)>det(\<delta\>)<rsup|k-1>f(u)j(\<delta\>,\<delta\><rsup|-1>(u))<rsup|-k>P(\<delta\><rsup|-1>(u),1)d(\<delta\><rsup|-1>(u))>>|<row|<cell|>|<cell|=<big|sum><rsub|\<delta\>\<in\>R><big|int><rsub|\<delta\>(\<alpha\>)><rsup|\<delta\>(\<beta\>)>det(\<delta\>)<rsup|k-1>f(u)j(<wide|\<delta\>|~>,u)<rsup|k>det(\<delta\>)<rsup|-k>P(<wide|\<delta\>|~>(u),1)<frac|det(\<delta\>)d*u|j(<wide|\<delta\>|~>,u)<rsup|2>>>>|<row|<cell|>|<cell|=<big|sum><rsub|\<delta\>\<in\>R><big|int><rsub|\<delta\>(\<alpha\>)><rsup|\<delta\>(\<beta\>)>f(u)j(<wide|\<delta\>|~>,u)<rsup|k-2>P(<wide|\<delta\>|~>(u),1)d*u>>|<row|<cell|>|<cell|=<big|sum><rsub|\<delta\>\<in\>R><big|int><rsub|\<delta\>(\<alpha\>)><rsup|\<delta\>(\<beta\>)>f(u)\<cdot\>((\<delta\>.P)(u,1))d*u>>|<row|<cell|>|<cell|=\<langle\>f,<space|0.25spc>T<rsub|n>(P{\<alpha\>,\<beta\>})\<rangle\>.>>>>
    </align*>

    The second equality is the trickiest. First, note that
    <with|mode|math|\<delta\><rsup|-1>(u)=<wide|\<delta\>|~>(u)>, since a
    linear fractional transformation is unchanged by a nonzero rescaling of a
    matrix that induces it. Thus by the quotient rule, using that
    <with|mode|math|<wide|\<delta\>|~>> has determinant
    <with|mode|math|det(\<delta\>)>, we see that

    <\equation*>
      d(\<delta\><rsup|-1>(u))=<frac|det(\<delta\>)d*u|j(<wide|\<delta\>|~>,u)<rsup|2>>.
    </equation*>

    The other part of the second equality asserts that

    <\equation>
      <label|eqn:bigstuff>j(\<delta\>,\<delta\><rsup|-1>(u))<rsup|-k>P(\<delta\><rsup|-1>(u),1)=j(<wide|\<delta\>|~>,u)<rsup|k>det(\<delta\>)<rsup|-k>P(<wide|\<delta\>|~>(u),1).
    </equation>

    From the definitions, and again using that
    <with|mode|math|\<delta\><rsup|-1>(u)=<wide|\<delta\>|~>(u)>, we see that

    <\equation*>
      j(\<delta\>,\<delta\><rsup|-1>(u))=<frac|det(\<delta\>)|j(<wide|\<delta\>|~>,u)>,
    </equation*>

    which proves that (<reference|eqn:bigstuff>) holds. In the third
    equality, we use that

    <\equation*>
      (\<delta\>.P)(u,1)=j(<wide|\<delta\>|~>,u)<rsup|k-2>P(<wide|\<delta\>|~>(u),1).
    </equation*>

    To see this, note that <with|mode|math|P(X,Y)=P(X/Y,1)\<cdot\>Y<rsup|k-2>>.
    Using this we see that

    <\align*>
      <tformat|<table|<row|<cell|(\<delta\>.P)(X,Y)>|<cell|=(P\<circ\><wide|\<delta\>|~>)(X,Y)>>|<row|<cell|>|<cell|=P<left|(><wide|\<delta\>|~><left|(><frac|X|Y><right|)>,1<right|)>\<cdot\><left|(>-c\<cdot\><frac|X|Y>+a<right|)><rsup|k-2>\<cdot\>Y<rsup|k-2>.>>>>
    </align*>

    Now substituting <with|mode|math|(u,1)> for <with|mode|math|(X,1)>, we
    see that

    <\equation*>
      (\<delta\>.P)(u,1)=P(<wide|\<delta\>|~>(u),1)\<cdot\>(-c*u+a)<rsup|k-2>,
    </equation*>

    as required.
  </proof>

  <\remark>
    The theorem is true more generally for any <with|mode|math|\<Gamma\>> and
    any operator <with|mode|math|T<rsub|\<Delta\>>>, via the same proof.
  </remark>

  Suppose that <with|mode|math|\<Gamma\>> is finite index subgroup of
  <with|mode|math|<SL><rsub|2>(<Z>)> such that if
  <with|mode|math|\<eta\>=<abcd|-1|0|<htab|1fn>0|1>>, then

  <\equation*>
    \<eta\>\<Gamma\>\<eta\>=\<Gamma\>.
  </equation*>

  For example, <with|mode|math|\<Gamma\>=\<Gamma\><rsub|1>(N)> satisfies this
  condition. There is an involution <with|mode|math|\<iota\><rsup|\<ast\>>>
  on <with|mode|math|<sM><rsub|k>(\<Gamma\>)> given by

  <\equation>
    <label|eqn:star>\<iota\><rsup|\<ast\>>(P(X,Y){\<alpha\>,\<beta\>})=-P(X,-Y){-\<alpha\>,-\<beta\>},
  </equation>

  which we call the <defn|star involution>. On Manin symbols,
  <with|mode|math|\<iota\><rsup|\<ast\>>> it is

  <\equation*>
    \<iota\><rsup|\<ast\>>[P,(u,v)]=-[P(-X,Y),(-u,v)].
  </equation*>

  Let <with|mode|math|<sS><rsub|k>(\<Gamma\>)<rsup|+>> be the
  <with|mode|math|+1> eigenspace for <with|mode|math|\<iota\><rsup|\<ast\>>>
  and <with|mode|math|<sS><rsub|k>(\<Gamma\>)<rsup|->> the
  <with|mode|math|-1> eigenspace. There is also a map
  <with|mode|math|\<iota\>> on modular forms, which is adjoint to
  <with|mode|math|\<iota\><rsup|\<ast\>>>.

  <\remark>
    [WARNING] Notice the <with|mode|math|-> sign in front of
    <with|mode|math|-P(X,-Y){-\<alpha\>,-\<beta\>}> in
    (<reference|eqn:star>). This sign is missing in <cite|cremona:algs>,
    which confused me. Thus the <with|mode|math|+1> quotient in MAGMA is the
    quotient where <with|mode|math|\<eta\>> acts as <with|mode|math|-1>.
    (This is a mistake.)
  </remark>

  We now state the final result about the pairing, which explains how modular
  symbols and modular forms are related.

  <\theorem>
    The pairing <with|mode|math|\<langle\>\<cdot\><space|0.25spc>,<space|0.25spc>\<cdot\>\<rangle\>>
    restricts to give nondegenerate Hecke compatible bilinear pairings

    <\equation*>
      <sS><rsub|k>(\<Gamma\>)<rsup|+>\<times\>S<rsub|k>(\<Gamma\>)\<to\><C><space|2fn><with|mode|text|and><space|2fn><sS><rsub|k>(\<Gamma\>)<rsup|->\<times\><Sbar><rsub|k>(\<Gamma\>)\<to\><C>.
    </equation*>
  </theorem>

  In light of the Peterson inner product, the above theorem implies that
  there is a canonical isomorphism of <with|mode|math|<T><rprime|'>>-modules

  <\equation*>
    <sS><rsub|k>(\<Gamma\>,<C>)<rsup|+><isom>S<rsub|k>(\<Gamma\>),
  </equation*>

  where <with|mode|math|<T><rprime|'>> is the anemic Hecke algebra, i.e., the
  subring of <with|mode|math|<T>> generated by Hecke operators
  <with|mode|math|T<rsub|n>> with <with|mode|math|gcd(n,N)=1>. In fact, one
  can prove, e.g., using Eichler-Shimura cohomology, that there is a
  non-canonical isomorphism over the full Hecke algebra

  <\equation*>
    <sM><rsub|k>(\<Gamma\>,<C>)<isom>M<rsub|k>(\<Gamma\>)\<oplus\><overline|S><rsub|k>(\<Gamma\>).
  </equation*>

  <section|Examples> In this section we explicitly compute
  <with|mode|math|<M><rsub|k>(\<Gamma\><rsub|0>(N))> for various
  <with|mode|math|k> and <with|mode|math|N>. We represent Manin symbols for
  <with|mode|math|\<Gamma\><rsub|0>(N)> as triples <with|mode|math|(i,u,v)>,
  where <with|mode|math|(u,v)\<in\><P><rsup|1>(<Z>/N<Z>)>, and
  <with|mode|math|(i,u,v)> corresponds to
  <with|mode|math|[X<rsup|i>Y<rsup|k-2-i>,(u,v)]> in the usual notation.

  <\example>
    We compute <with|mode|math|V=<sM><rsub|4>(\<Gamma\><rsub|0>(1))>. Because
    the <with|mode|math|S<rsub|k>(\<Gamma\><rsub|0>(1))=0>, and
    <with|mode|math|M<rsub|k>(\<Gamma\><rsub|0>(1))=<C>E<rsub|4>>, we expect
    <with|mode|math|V> to have dimension <with|mode|math|1>, and for the
    Hecke operator <with|mode|math|T<rsub|n>> to have eigenvalues
    <with|mode|math|\<sigma\><rsub|3>(n)>.

    The Manin symbols are

    <\equation*>
      x<rsub|0>=(0,0,0),<space|1fn>x<rsub|1>=(1,0,0),<space|1fn>x<rsub|2>=(2,0,0).
    </equation*>

    The relation matrix is\ 

    <\verbatim>
      [

      1, 0, 1, \ \ \ \ \ \ \ \ \ \ \<less\>-- S relation

      0, 0, 0, \ \ \ \ \ \ \ \ \ \ \<less\>-- S relation

      2, -2, 2, \ \ \ \ \ \ \ \ \ \<less\>-- T relation

      1, -1, 1, \ \ \ \ \ \ \ \ \ \<less\>-- T relation

      2, -2, 2] \ \ \ \ \ \ \ \ \ \<less\>-- T relation
    </verbatim>

    Note that we don't include all <with|mode|math|S> relations, since it is
    obvious that some are redundant, e.g., <with|mode|math|x+x*S=0> and
    <with|mode|math|(x*S)+(x*S)S=x*S+x=0> are the same since
    <with|mode|math|S> has order <with|mode|math|2>. It's not so clear to me
    what is going on with <with|mode|math|T> relations when
    <with|mode|math|k\<gtr\>2>, though in this example two of the three
    <with|mode|math|T> relations are redundant.

    The echelon form of the relation matrix is\ 

    <\verbatim>
      [1, 0, 1,

      0, 1, 0,

      three zero rows...]
    </verbatim>

    This means that we can replace the above complicated list of relations
    with this simpler list of relations, from which we immediately read off
    that the second generator <with|mode|math|x<rsub|1>> is
    <with|mode|math|0> and <with|mode|math|x<rsub|0>=-x<rsub|2>>. Thus
    <with|mode|math|<sM><rsub|4>(\<Gamma\><rsub|0>(1))> has dimension
    <with|mode|math|1>, with basis the equivalence class of
    <with|mode|math|x<rsub|2>>.

    Next we compute the Hecke operator <with|mode|math|T<rsub|2>> on
    <with|mode|math|<sM><rsub|4>(\<Gamma\><rsub|0>(1))>. The Heilbronn
    matrices of determinant <with|mode|math|2> from Proposition
    <reference|prop:heilbronn> are\ 

    <\verbatim>
      [h0=[1, 0, 0, 2], h1=[1, 0, 1, 2], h2=[2, 0, 0, 1], h3=[2, 1, 0, 1]]
    </verbatim>

    To compute <with|mode|math|T<rsub|2>>, we apply each of these matrices to
    <with|mode|math|x<rsub|0>>, then reduce modulo the relations. We have

    <\align*>
      <tformat|<table|<row|<cell|x<rsub|2>.<mtwo|1|0|0|2>>|<cell|=[X<rsup|2>,(0,0)].<mtwo|1|0|0|2>x<rsub|2>>>|<row|<cell|x<rsub|2>.<mtwo|1|0|1|2>>|<cell|=[X<rsup|2>,(0,0)]=x<rsub|2>>>|<row|<cell|x<rsub|2>.<mtwo|2|0|0|1>>|<cell|=[(2X)<rsup|2>,(0,0)]=4x<rsub|2>>>|<row|<cell|x<rsub|2>.<mtwo|2|1|0|1>>|<cell|=[(2X+1)<rsup|2>,(0,0)]=x<rsub|0>+4x<rsub|1>+4x<rsub|2>\<sim\>3x<rsub|2>>>>>
    </align*>

    Summing we see that <with|mode|math|T<rsub|2>(x<rsub|2>)\<sim\>9x<rsub|2>>
    in <with|mode|math|<sM><rsub|4>(\<Gamma\><rsub|0>(1))>. Notice that
    <with|mode|math|9=1<rsup|3>+2<rsup|3>=\<sigma\><rsub|3>(2)>.
  </example>

  Next we compute <with|mode|math|<sM><rsub|2>(\<Gamma\><rsub|0>(11))>
  explicitly. The Manin symbol generators are

  <\equation*>
    x<rsub|0>=(0,1),x<rsub|1>=(1,0),x<rsub|2>=(1,1),x<rsub|3>=(1,2),x<rsub|4>=(1,3),x<rsub|5>=(1,4),x<rsub|6>=(1,5),
  </equation*>

  <\equation*>
    x<rsub|7>=(1,6),x<rsub|8>=(1,7),x<rsub|9>=(1,8),x<rsub|10>=(1,9),x<rsub|11>=(1,10)
  </equation*>

  <newpage> The relation matrix is\ 

  <\verbatim>
    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ \ \ \ \ \<less\>-- S relation\ 

    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ \ \ \ \ \<less\>-- S relation

    0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, \ \ \ \ \ \<less\>-- S relation

    0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, \ \ \ \ \ \<less\>-- S relation

    0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, \ \ \ \ \ \<less\>-- S relation

    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, \ \ \ \ \ \<less\>-- S relation

    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ \ \ \ \ \<less\>-- T relation

    0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, \ \ \ \ \ \<less\>-- T relation

    0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, \ \ \ \ \ \<less\>-- T relation

    0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0 \ \ \ \ \ \ \<less\>-- T relation
  </verbatim>

  Many of the <with|mode|math|T>-relations are obviously redundant, so we do
  not include them. The reduced row echelon form of the relation matrix is\ 

  <\verbatim>
    1, 1, 0, 0, 0, 0, 0, 0, 0, \ 0, \ 0, 0,

    0, 0, 1, 0, 0, 0, 0, 0, 0, \ 0, \ 0, 0,

    0, 0, 0, 1, 0, 0, 0, 0, 0, \ 0, -1, 0,

    0, 0, 0, 0, 1, 0, 0, 0, 0, \ 1, -1, 0,

    0, 0, 0, 0, 0, 1, 0, 0, 0, \ 1, \ 0, 0,

    0, 0, 0, 0, 0, 0, 1, 0, 0, \ 0, \ 1, 0,

    0, 0, 0, 0, 0, 0, 0, 1, 0, \ 0, \ 1, 0,

    0, 0, 0, 0, 0, 0, 0, 0, 1, -1, \ 1, 0,

    0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, \ 0, 1,

    0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, \ 0, 0
  </verbatim>

  From this we see that every symbol is equivalent to a combination of
  <with|mode|math|x<rsub|1>=(1,0)>, <with|mode|math|x<rsub|9>=(1,8)>, and
  <with|mode|math|x<rsub|10>=(1,9)>. For example,
  <with|mode|math|x<rsub|7>T*o*c*o*m*p*u*t*e>T<rsub|2><with|mode|math|,w*e*a*p*p*l*y*e*a*c*h*o*f*t*h*e*H*e*i*l*b*r*o*n*n*m*a*t*r*i*c*e*s*o*f*d*e*t*e*r*m*i*n*a*n*t*t*o>2<with|mode|math|f*r*o*m*P*r*o*p*o*s*i*t*i*o*n<reference|prop:heilbronn>t*o>x<rsub|1><with|mode|math|,t*h*e*n*t*o>x<rsub|9><with|mode|math|,a*n*d*f*i*n*a*l*l*y*t*o>x<rsub|10><with|mode|math|.T*h*e*m*a*t*r*i*c*e*s*a*r*e:>

  [h0=[1, 0, 0, 2], h1=[1, 0, 1, 2], h2=[2, 0, 0, 1], h3=[2, 1, 0, 1]]

  A*p*p*l*y*i*n*gT<rsub|2><with|mode|math|t*o>x<rsub|1>=(1,0)<with|mode|math|,w*e*g*e*t><with|mode|math|x<rsub|1>\<mapsto\>(1,0)+(1,0)+(2,0)+(2,1)=3x<rsub|1>+x<rsub|7>\<sim\>=3x<rsub|1>-x<rsub|10>.><with|mode|math|A*p*p*l*y*i*n*g>T<rsub|2><with|mode|math|t*o>x<rsub|9>=(1,8)<with|mode|math|,w*e*g*e*t><with|mode|math|x<rsub|9>\<mapsto\>x<rsub|6>+x<rsub|4>+x<rsub|5>+x<rsub|11>\<sim\>-2x<rsub|9>><with|mode|math|A*p*p*l*y*i*n*g>T<rsub|2><with|mode|math|t*o>x<rsub|10>=(1,9)<with|mode|math|,w*e*g*e*t><with|mode|math|x<rsub|10>\<mapsto\>x<rsub|8>+x<rsub|5>+x<rsub|11>+x<rsub|6>\<sim\>-2x<rsub|10>.><with|mode|math|T*h*u*s*t*h*e*m*a*t*r*i*x*o*f>T<rsub|2><with|mode|math|w*i*t*h*r*e*s*p*e*c*t*t*o*t*h*i*s*b*a*s*i*s*i*s>

  \ \ [ 3, \ 0, \ 0;

  \ \ \ \ 0, -2, \ 0;

  \ \ \ -1, \ 0, -2]

  T*h*i*s*h*a*s*c*h*a*r*a*c*t*e*r*i*s*t*i*c*p*o*l*y*n*o*m*i*a*l<with|mode|math|(x-3)(x+2)<rsup|2>.><with|mode|math|T*h*e>(x-3)<with|mode|math|f*a*c*t*o*r*c*o*r*r*e*s*p*o*n*d*s*t*o*t*h*e*w*e*i*g*h*t>2<with|mode|math|E*i*s*e*n*s*t*e*i*n*s*e*r*i*e*s,a*n*d*t*h*e>x+2<with|mode|math|f*a*c*t*o*r*c*o*r*r*e*s*p*o*n*d*s*t*o*t*h*e*e*l*l*i*p*t*i*c*c*u*r*v*e>E=X<rsub|0>(11)<with|mode|math|,w*h*i*c*h*h*a*s>a<rsub|2>
  = -2 = 2+1 - #E(<F><rsub|2>)<with|mode|math|.>

  <section|A*p*p*l*i*c*a*t*i*o*n*s><subsection|L*a*t*e*r*i*n*t*h*i*s*B*o*o*k>W*e*n*o*w*s*k*e*t*c*h*s*o*m*e*o*f*t*h*e*w*a*y*s*i*n*w*h*i*c*h*w*e*w*i*l*l*a*p*p*l*y*t*h*e*m*o*d*u*l*a*r*s*y*m*b*o*l*s*a*l*g*o*r*i*t*h*m*s*o*f*t*h*i*s*c*h*a*p*t*e*r*l*a*t*e*r*i*n*t*h*i*s*b*o*o*k.

  C*u*s*p*i*d*a*l*m*o*d*u*l*a*r*s*y*m*b*o*l*s*a*r*e*i*n*H*e*c*k*e-e*q*u*i*v*a*r*i*a*n*t*d*u*a*l*i*t*y*w*i*t*h*c*u*s*p*i*d*a*l*m*o*d*u*l*a*r*f*o*r*m*s,a*n*d*a*s*s*u*c*h*w*e*c*a*n*c*o*m*p*u*t*e*m*o*d*u*l*a*r*f*o*r*m*s*b*y*c*o*m*p*u*t*i*n*g*s*y*s*t*e*m*s*o*f*e*i*g*e*n*v*a*l*u*e*s*f*o*r*t*h*e*H*e*c*k*e*o*p*e*r*a*t*o*r*s*a*c*t*i*n*g*o*n*m*o*d*u*l*a*r*s*y*m*b*o*l*s.B*y*t*h*e*A*t*k*i*n-L*e*h*n*e*r-L*i*t*h*e*o*r*y*o*f*n*e*w*f*o*r*m*s(s*e*e,e.g.,<reference|thm:atkin-lehner>),w*e*c*a*n*c*o*n*s*t*r*u*c*tS<rsub|k>(N,<eps>)<with|mode|math|f*o*r*a*n*y>N<with|mode|math|,a*n*y><eps><with|mode|math|,a*n*d>k\<geq\>
  2<with|mode|math|u*s*i*n*g*t*h*i*s*m*e*t*h*o*d.S*e*e*C*h*a*p*t*e*r<reference|ch:modform>f*o*r*m*o*r*e*d*e*t*a*i*l*s.>

  O*n*c*e*w*e*c*a*n*c*o*m*p*u*t*e*s*p*a*c*e*s*o*f*m*o*d*u*l*a*r*s*y*m*b*o*l*s,w*e*m*o*v*e*t*o*c*o*m*p*u*t*i*n*g*t*h*e*c*o*r*r*e*s*p*o*n*d*i*n*g*m*o*d*u*l*a*r*f*o*r*m*s.I*n*S*e*c*t*i*o*n<reference|sec:degen>,w*e*d*e*f*i*n*e*i*n*c*l*u*s*i*o*n*a*n*d*t*r*a*c*e*m*a*p*s*f*r*o*m*m*o*d*u*l*a*r*s*y*m*b*o*l*s*o*f*o*n*e*l*e*v*e*lN<with|mode|math|t*o*m*o*d*u*l*a*r*s*y*m*b*o*l*s*o*f*l*e*v*e*l*a*m*u*l*t*i*p*l*e*o*r*d*i*v*i*s*o*r*o*f>N<with|mode|math|.U*s*i*n*g*t*h*e*s*e*w*e*c*o*m*p*u*t*e*t*h*e*q*u*o*t*i*e*n*t>V<with|mode|math|o*f*t*h*e*n*e*w*s*u*b*s*p*a*c*e*o*f*c*u*s*p*i*d*a*l*m*o*d*u*l*a*r*s*y*m*b*o*l*s*o*n*w*h*i*c*h*a``s*t*a*r*i*n*v*o*l*u*t*i*o*n<rprime|''>a*c*t*s*a*s>+1<with|mode|math|.T*h*e*H*e*c*k*e*o*p*e*r*a*t*o*r*s*a*c*t*b*y*d*i*a*g*o*n*a*l*i*z*a*b*l*e*c*o*m*m*u*t*i*n*g*m*a*t*r*i*c*e*s*o*n*t*h*i*s*s*p*a*c*e,a*n*d*c*o*m*p*u*t*i*n*g*t*h*e*s*i*m*u*l*t*a*n*e*o*u*s*s*y*s*t*e*m*s*o*f*H*e*c*k*e*e*i*g*e*n*v*a*l*u*e*s*i*s*e*q*u*i*v*a*l*e*n*t*t*o*c*o*m*p*u*t*i*n*g*c*o*r*r*e*s*p*o*n*d*i*n*g*n*e*w*f*o*r*m*s><big|sum>
  a<rsub|n> q<rsup|n><with|mode|math|.I*n*t*h*i*s*w*a*y,w*e*o*b*t*a*i*n*a*l*i*s*t*o*f<with|font-shape|italic|a*l*l>*n*e*w*f*o*r*m*s(n*o*r*m*a*l*i*z*e*d*e*i*g*e*n*f*o*r*m*s)i*n>S<rsub|k>(N,<eps>)<with|mode|math|f*o*r*a*n*y>N<with|mode|math|,><eps><with|mode|math|,a*n*d>k\<geq\>
  2<with|mode|math|.>

  I*n*C*h*a*p*t*e*r<reference|sec:periods>,w*e*c*o*m*p*u*t*e*w*i*t*h*t*h*e*p*e*r*i*o*d*m*a*p*p*i*n*g*f*r*o*m*m*o*d*u*l*a*r*s*y*m*b*o*l*s*t*o<C><with|mode|math|a*t*t*a*c*h*e*d*t*o*a*n*e*w*f*o*r*m>f
  \<in\> S<rsub|k>(N,<eps>)<with|mode|math|.W*h*e*n>k=2,<eps>=1<with|mode|math|a*n*d>f<with|mode|math|h*a*s*r*a*t*i*o*n*a*l*F*o*u*r*i*e*r*c*o*e*f*f*i*c*i*e*n*t*s,t*h*i*s*g*i*v*e*s*a*m*e*t*h*o*d*t*o*c*o*m*p*u*t*e*t*h*e*p*e*r*i*o*d*l*a*t*t*i*c*e*a*s*s*o*c*i*a*t*e*d*t*o*a*m*o*d*u*l*a*r*e*l*l*i*p*t*i*c*c*u*r*v*e*a*t*t*a*c*h*e*d*t*o*a*n*e*w*f*o*r*m(s*e*e*S*e*c*t*i*o*n<reference|sec:cremona>).I*n*g*e*n*e*r*a*l,c*o*m*p*u*t*a*t*i*o*n*o*f*t*h*i*s*m*a*p*i*s*i*m*p*o*r*t*a*n*t*w*h*e*n*f*i*n*d*i*n*g*e*q*u*a*t*i*o*n*s*f*o*r*m*o*d*u*l*a*r><Q><with|mode|math|-c*u*r*v*e*s,C*M*c*u*r*v*e*s,a*n*d*c*u*r*v*e*s*w*i*t*h*a*g*i*v*e*n*m*o*d*u*l*a*r*J*a*c*o*b*i*a*n.I*t*i*s*a*l*s*o*i*m*p*o*r*t*a*n*t*f*o*r*c*o*m*p*u*t*i*n*g*s*p*e*c*i*a*l*v*a*l*u*e*s*o*f*t*h*e>L<with|mode|math|-f*u*n*c*t*i*o*n>L(f,s)<with|mode|math|a*t*i*n*t*e*g*e*r*p*o*i*n*t*s*i*n*t*h*e*c*r*i*t*i*c*a*l*s*t*r*i*p.>

  <subsection|D*i*s*c*u*s*s*i*o*n*o*f*t*h*e*L*i*t*e*r*a*t*u*r*e*a*n*d*R*e*s*e*a*r*c*h>M*o*d*u*l*a*r*s*y*m*b*o*l*s*w*e*r*e*i*n*t*r*o*d*u*c*e*d*b*y*B*i*r*c*h<cite|birch:bsd>i*n*c*o*n*n*e*c*t*i*o*n*w*i*t*h*c*o*m*p*u*t*a*t*i*o*n*s*i*n*s*u*p*p*o*r*t*o*f*t*h*e*B*i*r*c*h*a*n*d*S*w*i*n*n*e*r*t*o*n-D*y*e*r*c*o*n*j*e*c*t*u*r*e.M*a*n*i*n<cite|manin:parabolic>t*h*e*n*m*a*d*e*a*s*y*s*t*e*m*a*t*i*c*s*t*u*d*y*o*f*w*e*i*g*h*t2<with|mode|math|m*o*d*u*l*a*r*s*y*m*b*o*l*s*a*n*d*u*s*e*d*t*h*e*m*t*o*p*r*o*v*e*r*a*t*i*o*n*a*l*i*t*y*r*e*s*u*l*t*s*a*b*o*u*t*s*p*e*c*i*a*l*v*a*l*u*e*s*o*f>L<with|mode|math|-f*u*n*c*t*i*o*n*s(n*o*t*e*t*h*a*t``p*a*r*a*b*o*l*i*c*p*o*i*n*t*s<rprime|''>i*n*t*h*e*t*i*t*l*e*o*f*M*a*n*i*n<rprime|'>s*p*a*p*e*r*m*e*a*n*s``c*u*s*p*s<rprime|''>).M*e*r*e*l<rprime|'>s*p*a*p*e*r<cite|merel:1585>b*u*i*l*d*s*o*n*w*o*r*k*o*f’o*k*u*r*o*v(m*a*i*n*l*y<cite|sokurov:shimura>),w*h*i*c*h*d*e*v*e*l*o*p*e*d*a*h*i*g*h*e*r-w*e*i*g*h*t*g*e*n*e*r*a*l*i*z*a*t*i*o*n*o*f*M*a*n*i*n<rprime|'>s*w*o*r*k*p*a*r*t*l*y*t*o*u*n*d*e*r*s*t*a*n*d*r*a*t*i*o*n*a*l*i*t*y*p*r*o*p*e*r*t*i*e*s*o*f*s*p*e*c*i*a*l*v*a*l*u*e*s*o*f*m*o*d*u*l*a*r>L<with|mode|math|-f*u*n*c*t*i*o*n*s(S*h*i*m*u*r*a*s*i*m*u*l*t*a*n*e*o*u*s*l*y*p*r*o*v*e*d*s*i*m*i*l*a*r*r*e*s*u*l*t*s*v*i*a*r*e*l*a*t*e*d*c*o*h*o*m*o*l*o*g*i*c*a*l*m*e*t*h*o*d*s).C*r*e*m*o*n*a<rprime|'>s*b*o*o*k<cite|cremona:algs>d*i*s*c*u*s*s*e*s*i*n*d*e*t*a*i*l*h*o*w*t*o*c*o*m*p*u*t*e*t*h*e*s*p*a*c*e*o*f*w*e*i*g*h*t>2<with|mode|math|m*o*d*u*l*a*r*s*y*m*b*o*l*s*f*o*r>\<Gamma\><rsub|0>(N)<with|mode|math|,i*n*c*o*n*n*e*c*t*i*o*n*w*i*t*h*t*h*e*p*r*o*b*l*e*m*o*f*e*n*u*m*e*r*a*t*i*n*g*a*l*l*e*l*l*i*p*t*i*c*c*u*r*v*e*s*o*f*g*i*v*e*n*c*o*n*d*u*c*t*o*r,a*n*d*h*i*s*a*r*t*i*c*l*e<cite|cremona:gammaone>d*i*s*c*u*s*s*e*s*t*h*e>\<Gamma\><rsub|1>(N)<with|mode|math|c*a*s*e*a*n*d*c*o*m*p*u*t*a*t*i*o*n*o*f*m*o*d*u*l*a*r*s*y*m*b*o*l*s*w*i*t*h*c*h*a*r*a*c*t*e*r.>

  T*h*e*r*e*h*a*v*e*b*e*e*n*s*e*v*e*r*a*l*r*e*c*e*n*t*P*h.D.t*h*e*s*i*s*a*b*o*u*t*m*o*d*u*l*a*r*s*y*m*b*o*l*s.B*a*s*m*a*j*i<rprime|'>s*t*h*e*s*i*s<cite|basmaji:thesis>,w*h*i*c*h*i*s*i*n*G*e*r*m*a*n,c*o*n*t*a*i*n*s*a*t*r*i*c*k*s*t*o*e*f*f*i*c*i*e*n*t*l*y*c*o*m*p*u*t*e*H*e*c*k*e*o*p*e*r*a*t*o*r*sT<rsub|p><with|mode|math|,w*i*t*h>p<with|mode|math|v*e*r*y*l*a*r*g*e,a*n*d*a*l*s*o*d*i*s*c*u*s*s*e*s*h*o*w*t*o*c*o*m*p*u*t*e*s*p*a*c*e*s*o*f*h*a*l*f*i*n*t*e*g*r*a*l*w*e*i*g*h*t*m*o*d*u*l*a*r*f*o*r*m*s*b*u*i*l*d*i*n*g*o*n*w*h*a*t*o*n*e*c*a*n*g*e*t*f*r*o*m*m*o*d*u*l*a*r*s*y*m*b*o*l*s*o*f*i*n*t*e*g*r*a*l*w*e*i*g*h*t.T*h*e*a*u*t*h*o*r<rprime|'>s*P*h.D.t*h*e*s*i*s<cite|stein:phd>c*o*n*t*a*i*n*s*t*w*o*c*h*a*p*t*e*r*s*a*b*o*u*t*h*i*g*h*e*r-w*e*i*g*h*t*m*o*d*u*l*a*r*s*y*m*b*o*l*s,a*n*d*a*n*a*p*p*l*i*c*a*t*i*o*n*t*o*v*i*s*i*b*i*l*i*t*y*o*f*S*h*a*f*a*r*e*v*i*c*h-T*a*t*e*g*r*o*u*p*s(s*e*e*a*l*s*o<cite|agashe:phd>).D*i*d*e*r*o*t<rprime|'>s*t*h*e*s*i*s<cite|diderot:thesis>i*s*a*b*o*u*t*a*n*a*t*t*e*m*p*t*t*o*s*t*u*d*y*a*n*a*n*a*l*o*g*u*e*o*f*m*o*d*u*l*a*r*s*y*m*b*o*l*s*f*o*r*w*e*i*g*h*t>1<with|mode|math|.L*e*m*e*l*i*n<rprime|'>s*t*h*e*s*i*s<cite|lemelin:dominic>d*i*s*c*u*s*s*e*s*m*o*d*u*l*a*r*s*y*m*b*o*l*s*f*o*r*q*u*a*d*r*a*t*i*c*i*m*a*g*i*n*a*r*y*f*i*e*l*d*s*i*n*t*h*e*c*o*n*t*e*x*t*o*f>p<with|mode|math|-a*d*i*c*a*n*a*l*o*g*u*e*s*o*f*t*h*e*B*i*r*c*h*a*n*d*S*w*i*n*n*e*r*t*o*n-D*y*e*r*c*o*n*j*e*c*t*u*r*e.S*e*e*a*l*s*o*t*h*e*s*u*r*v*e*y*p*a*p*e*r<cite|frey-muller>,w*h*i*c*h*d*i*s*c*u*s*s*e*s*c*o*m*p*u*t*a*t*i*o*n*w*i*t*h*o*f*w*e*i*g*h*t>2<with|mode|math|m*o*d*u*l*a*r*s*y*m*b*o*l*s*i*n*t*h*e*c*o*n*t*e*x*t*o*f*c*o*m*p*u*t*i*n*g*w*i*t*h*m*o*d*u*l*a*r*a*b*e*l*i*a*n*v*a*r*i*e*t*i*e*s.>

  T*h*e*r*e*a*r*e*a*n*a*l*o*g*u*e*s*f*o*r*m*o*d*u*l*a*r*s*y*m*b*o*l*s*f*o*r*g*r*o*u*p*s*b*e*s*i*d*e*s*f*i*n*i*t*e-i*n*d*e*x*s*u*b*g*r*o*u*p*s*o*f<SL><rsub|2>(<Z>)<with|mode|math|,e.g.,f*o*r*g*r*o*u*p*s*o*f*h*i*g*h*e*r*d*e*g*r*e*e,e.g.,><GL><rsub|3><with|mode|math|.T*h*e*r*e*h*a*s*a*l*s*o*b*e*e*n*w*o*r*k*o*n*c*o*m*p*u*t*i*n*g*H*i*l*b*e*r*t*m*o*d*u*l*a*r*f*o*r*m*s,e.g.,b*y*L*a*s*s*i*n*a*D*e*m*b*e*l*e<cite|dembele>(H*i*l*b*e*r*t*m*o*d*u*l*a*r*f*o*r*m*s*a*r*e*l*i*k*e*c*l*a*s*s*i*c*a*l*m*o*d*u*l*a*r*f*o*r*m*s,b*u*t*a*r*e*f*u*n*c*t*i*o*n*s*o*n*a*p*r*o*d*u*c*t*o*f*c*o*p*i*e*s*o*f><h><with|mode|math|,a*n*d><SL><rsub|2>(<Z>)<with|mode|math|i*s*r*e*p*l*a*c*e*d*b*y*a*g*r*o*u*p*o*f*m*a*t*r*i*c*e*s*w*i*t*h*e*n*t*r*i*e*s*i*n*a*t*o*t*a*l*l*y*r*e*a*l*f*i*e*l*d).I*a*m<with|font-shape|italic|n*o*t>*a*w*a*r*e*o*f*a*n*y*a*n*a*l*o*g*u*e*o*f*m*o*d*u*l*a*r*s*y*m*b*o*l*s*f*o*r*S*i*e*g*e*l*m*o*d*u*l*a*r*f*o*r*m*s(t*h*e*s*e*a*r*e*l*i*k*e*c*l*a*s*s*i*c*a*l*m*o*d*u*l*a*r*f*o*r*m*s,e*x*c*e*p*t*t*h*e*u*p*p*e*r*h*a*l*f*p*l*a*n*e*i*s*r*e*p*l*a*c*e*d*b*y*a*s*p*a*c*e*o*f*m*a*t*r*i*c*e*s).>

  G*l*e*n*n*S*t*e*v*e*n*s(a*n*d*r*e*c*e*n*t*l*y*R*o*b*e*r*t*P*o*l*l*a*c*k*a*n*d*H*e*n*r*i*D*a*r*m*o*n,s*e*e<cite|darmon-pollack>)h*a*s*b*e*e*n*w*o*r*k*i*n*g*f*o*r*m*a*n*y*y*e*a*r*s*t*o*d*e*v*e*l*o*p*a*n*a*n*a*l*o*g*u*e*o*f*m*o*d*u*l*a*r*s*y*m*b*o*l*s*i*n*a*r*i*g*i*d*a*n*a*l*y*t*i*c*c*o*n*t*e*x*t,w*h*i*c*h*s*h*o*u*l*d*b*e*v*e*r*y*h*e*l*p*f*u*l*f*o*r*q*u*e*s*t*i*o*n*s*a*b*o*u*t*c*o*m*p*u*t*i*n*g*w*i*t*h*o*v*e*r*c*o*n*v*e*r*g*e*n*tp<with|mode|math|-a*d*i*c*m*o*d*u*l*a*r*f*o*r*m*s,o*r*p*r*o*v*i*n*g*r*e*s*u*l*t*s*a*b*o*u*t>p<with|mode|math|-a*d*i*c>L<with|mode|math|-f*u*n*c*t*i*o*n*s.>

  G*a*b*o*r*W*e*i*s*e*a*n*d*B*a*s*E*d*i*x*h*o*v*e*n*h*a*v*e*b*e*e*n*w*o*r*k*i*n*g*o*n*t*h*e*o*r*y*a*b*o*u*t*m*o*dp<with|mode|math|m*o*d*u*l*a*r*s*y*m*b*o*l*s,a*n*d*c*o*m*p*u*t*a*t*i*o*n*o*f*w*e*i*g*h*t>1<with|mode|math|m*o*d*u*l*a*r*s*y*m*b*o*l*s*m*o*d>2<with|mode|math|.>

  F*i*n*a*l*l*y*w*e*m*e*n*t*i*o*n*t*h*a*t*M*a*z*u*r*u*s*e*s*t*h*e*t*e*r*m``m*o*d*u*l*a*r*s*y*m*b*o*l<rprime|''>s*l*i*g*h*t*l*y*d*i*f*f*e*r*e*n*t*l*y*i*n*m*a*n*y*o*f*h*i*s*p*a*p*e*r*s*t*o*m*e*a*n*e*s*s*e*n*t*i*a*l*l*y*w*h*a*t*w*e*c*a*l*l*t*h*e*i*n*t*e*g*r*a*l*p*e*r*i*o*d*m*a*p*p*i*n*g(s*e*e*S*e*c*t*i*o*n<reference|sec:ratpm>).T*h*i*s*i*s*a*d*u*a*l*n*o*t*i*o*n,w*h*i*c*h*a*t*t*a*c*h*e*s*a``m*o*d*u*l*a*r*s*y*m*b*o*l<rprime|''>t*o*a*m*o*d*u*l*a*r*f*o*r*m*o*r*e*l*l*i*p*t*i*c*c*u*r*v*e,a*n*d*i*s*r*e*a*l*l*y*j*u*s*t*a*n*o*v*e*r*l*o*a*d*i*n*g*o*f*t*h*e*t*e*r*m*i*n*o*l*o*g*y.S*e*e<cite|mtt>f*o*r*a*n*e*x*t*e*n*s*i*v*e*d*i*s*c*u*s*s*i*o*n*o*f*m*o*d*u*l*a*r*s*y*m*b*o*l*s*f*r*o*m*t*h*i*s*p*o*i*n*t*o*f*v*i*e*w,w*h*e*r*e*t*h*e*y*a*r*e*u*s*e*d*t*o*c*o*n*s*t*r*u*c*tp<with|mode|math|-a*d*i*c>L<with|mode|math|-f*u*n*c*t*i*o*n*s.>

  <\exercises>
    <item>C*o*m*p*u*t*e<sM><rsub|3>(\<Gamma\><rsub|1>(3))<with|mode|math|e*x*p*l*i*c*i*t*l*y.L*i*s*t*e*a*c*h*M*a*n*i*n*s*y*m*b*o*l,t*h*e*r*e*l*a*t*i*o*n*s*t*h*e*y*s*a*t*i*s*f*y,c*o*m*p*u*t*e*t*h*e*q*u*o*t*i*e*n*t,e*t*c.F*i*n*d*t*h*e*m*a*t*r*i*x*o*f>T<rsub|2><with|mode|math|.(C*h*e*c*k:T*h*e*d*i*m*e*n*s*i*o*n*o*f><sM><rsub|3>(\<Gamma\><rsub|1>(3))<with|mode|math|i*s>2<with|mode|math|,a*n*d*t*h*e*c*h*a*r*a*c*t*e*r*i*s*t*i*c*p*o*l*y*n*o*m*i*a*l*o*f>T<rsub|2><with|mode|math|i*s>(x-3)(x+3)<with|mode|math|.)>

    <item>P*r*o*v*e*t*h*a*t*t*h*e*p*a*i*r*i*n*g<reference|eqn:intpairing>i*s*w*e*l*l*d*e*f*i*n*e*d.

    <item>

    <\enumerate>
      <item>S*h*o*w*t*h*a*t*i*f\<eta\> = <abcd|-1|0|0|1><with|mode|math|,t*h*e*n>\<eta\>
      \<Gamma\> \<eta\> = \<Gamma\><with|mode|math|f*o*r>\<Gamma\>=\<Gamma\><rsub|0>(N)<with|mode|math|a*n*d>\<Gamma\>=\<Gamma\><rsub|1>(N)<with|mode|math|.>

      <item>(\<ast\>)G*i*v*e*a*n*e*x*a*m*p*l*e*o*f*a*f*i*n*i*t*e*i*n*d*e*x*s*u*b*g*r*o*u*p\<Gamma\><with|mode|math|s*u*c*h*t*h*a*t>\<eta\>
      \<Gamma\> \<eta\> \<neq\> \<Gamma\>.
    </enumerate>
  </exercises>

  <chapter|C*o*m*p*u*t*i*n*g*W*i*t*h*M*o*d*u*l*a*r*S*y*m*b*o*l*s><label|ch:modsymcomp>

  <chapter|U*s*i*n*g*M*o*d*u*l*a*r*S*y*m*b*o*l*s*t*o*C*o*m*p*u*t*e*S*p*a*c*e*s*o*f*M*o*d*u*l*a*r*F*o*r*m*s><label|ch:modform><section|<with|mode|math|q>-expansions
  of Newforms><label|sec:qexps><edit|A*t*k*i*n-L*e*h*n*e*r*T*h*e*o*r*y>

  <definition|[N*e*w*f*o*r*m]A<defn|n*e*w*f*o*r*m>i*s*a*c*u*s*p*f*o*r*mf<with|mode|math|i*n*t*h*e*n*e*w*s*u*b*s*p*a*c*e*o*f>S<rsub|k>(N,<eps>)<with|mode|math|t*h*a*t*i*s*a*c*o*m*m*o*n*e*i*g*e*n*v*e*c*t*o*r*f*o*r*a*l*l*H*e*c*k*e*o*p*e*r*a*t*o*r*s>T<rsub|n><with|mode|math|a*n*d*i*s*n*o*r*m*a*l*i*z*e*d*s*o*t*h*a*t>f
  = q + \<cdots\>.>

  <algorithm|S*y*s*t*e*m*s*o*f*C*u*s*p*i*d*a*l*E*i*g*e*n*v*a*l*u*e*s|G*i*v*e*n*a*w*e*i*g*h*tk<with|mode|math|a*n*d*a*D*i*r*i*c*h*l*e*t*c*h*a*r*a*c*t*e*r><eps><with|mode|math|o*f*m*o*d*u*l*u*s>N<with|mode|math|,t*h*i*s*a*l*g*o*r*i*t*h*m*c*o*m*p*u*t*e*s*t*h*e*s*y*s*t*e*m>a<rsub|p><with|mode|math|o*f*e*i*g*e*n*v*a*l*u*e*s*o*f*e*a*c*h*n*e*w*f*o*r*m*i*n>S<rsub|k>(N,<eps>).>

  <edit|M*e*n*t*i*o*n*t*h*e*S*c*h*o*o*f-E*l*k*i*e*s-A*t*k*i*n*a*l*g*o*r*i*t*h*m*f*o*r*c*o*m*p*u*t*i*n*g<with|mode|math|a<rsub|p>(f)>
  in polynomial time when <with|mode|math|f> corresponds to an elliptic
  curve.>

  <section|C*o*n*g*r*u*e*n*c*e*s>

  <theorem|[S*t*u*r*m]L*e*t\<lambda\><with|mode|math|b*e*a*p*r*i*m*e*i*d*e*a*l*i*n*t*h*e*r*i*n*g*o*f*i*n*t*e*g*e*r*s><O><rsub|K><with|mode|math|o*f*a*n*u*m*b*e*r*f*i*e*l*d>K<with|mode|math|.S*u*p*p*o*s*e>f\<in\>
  M<rsub|k>(\<Gamma\>,<O><rsub|K>)<with|mode|math|i*s*a*m*o*d*u*l*a*r*f*o*r*m*s*f*o*r*a*c*o*n*g*r*u*e*n*c*e*s*u*b*g*r*o*u*p>\<Gamma\><with|mode|math|a*n*d*t*h*a*t>a<rsub|n>(f)<con>
  0<pmod|\<lambda\>><with|mode|math|f*o*r>n\<leq\>
  <frac*|k|12|<SL><rsub|2>(<Z>):\<Gamma\>><with|mode|math|.T*h*e*n>f<con>
  0<pmod|\<lambda\>>.>

  <theorem|S*u*p*p*o*s*e\<Gamma\><with|mode|math|i*s*a*c*o*n*g*r*u*e*n*c*e*s*u*b*g*r*o*u*p*a*n*d*l*e*t><with|mode|math|r=<left|lceil><frac|k|12>\<cdot\>[<SL><rsub|2>(<Z>):\<Gamma\>]<right|rceil>.><with|mode|math|T*h*e*n*t*h*e*H*e*c*k*e*a*l*g*e*b*r*a><T><rsub|k>(\<Gamma\>)
  \<subset\> <End>(M<rsub|k>(\<Gamma\>))<with|mode|math|i*s*g*e*n*e*r*a*t*e*d*a*s*a><Z><with|mode|math|-m*o*d*u*l*e*b*y*t*h*e*H*e*c*k*e*o*p*e*r*a*t*o*r*s>T<rsub|n><with|mode|math|f*o*r>n\<leq\>
  r.>

  <chapter|P*e*r*i*o*d*M*a*p*p*i*n*g*s*A*s*s*o*c*i*a*t*e*d*t*o*N*e*w*f*o*r*m*s><label|sec:periods><section|C*o*m*p*l*e*x*P*e*r*i*o*d*M*a*p*p*i*n*g><algorithm|C*o*m*p*l*e*x*P*e*r*i*o*d*M*a*p*p*i*n*g|G*i*v*e*n*a*n*e*w*f*o*r*mf<with|mode|math|i*n>S<rsub|k>(N,<eps>)<with|mode|math|,t*h*i*s*a*l*g*o*r*i*t*h*m*a*p*p*r*o*x*i*m*a*t*e*s*t*h*e*p*e*r*i*o*d*m*a*p>M<rsub|k>(N,<eps>)\<to\>
  <C>.>

  <edit|S*a*y*s*o*m*e*t*h*i*n*g*a*b*o*u*t*b*o*u*n*d*o*n*e*r*r*o*r,f*o*l*l*o*w*i*n*g*t*h*e*a*r*g*u*m*e*n*t*t*h*a*t*A*n*d*r*e*i*J*o*r*z*a*s*h*o*w*e*d*m*e.>

  <section|R*a*t*i*o*n*a*l*a*n*d*I*n*t*e*g*r*a*l*P*e*r*i*o*d*M*a*p*p*i*n*g><label|sec:ratpm>

  <section|S*p*e*c*i*a*l*V*a*l*u*e*s*o*f<with|mode|math|L>-Functions><algorithm||G*i*v*e*n*a*n*e*w*f*o*r*mf<with|mode|math|i*n>S<rsub|k>(N,<eps>)<with|mode|math|a*n*d*a*n*i*n*t*e*g*e*r>j<with|mode|math|w*i*t*h>1\<leq\>
  j \<leq\> k-1<with|mode|math|,t*h*i*s*a*l*g*o*r*i*t*h*m*a*p*p*r*o*x*i*m*a*t*e*s>L(f,j).>

  <chapter|M*o*d*u*l*a*r*C*u*r*v*e*s*a*n*d*A*b*e*l*i*a*n*V*a*r*i*e*t*i*e*s><label|ch:modabvar><section|M*o*d*u*l*a*r*C*u*r*v*e*s>--m*o*d*e*l*s*f*o*r*m*o*d*u*l*a*r*c*u*r*v*e*s

  --B*a*k*e*r-P*o*o*n*e*n-G*o*n*z*a*l*e*z

  <section|M*o*d*u*l*a*r*A*b*e*l*i*a*n*V*a*r*i*e*t*i*e*s>

  <edit|S*a*y*s*o*m*e*t*h*i*n*g*a*b*o*u*t*c*o*m*p*u*t*i*n*g<with|mode|math|L(f,s)>
  for arbitrary <with|mode|math|s>.><section|T*h*e*B*i*r*c*h*a*n*d*S*w*i*n*n*e*r*t*o*n-D*y*e*r*C*o*n*j*e*c*t*u*r*e><algorithm|T*h*e*B*S*D*R*a*t*i*o|G*i*v*e*n*a*n*e*w*f*o*r*mf<with|mode|math|i*n>S<rsub|2>(\<Gamma\>)<with|mode|math|,w*i*t*h>\<Gamma\>=\<Gamma\><rsub|0>(N)<with|mode|math|o*r>\<Gamma\><rsub|1>(N)<with|mode|math|,v*t*h*i*s*a*l*g*o*r*i*t*h*m*c*o*m*p*u*t*e*s*t*h*e*r*a*t*i*o*n*a*l*n*u*m*b*e*r>L(A<rsub|f>,1)/\<Omega\><rsub|A<rsub|f>>.>

  <section|H*o*w*C*r*e*m*o*n*a*C*o*m*p*u*t*e*s*a*l*l*E*l*l*i*p*t*i*c*C*u*r*v*e*s*o*f*C*o*n*d*u*c*t*o*r<with|mode|math|N>><label|sec:cremona>

  <chapter|A*p*p*l*i*c*a*t*i*o*n:S*e*r*r*e<rprime|'>s*C*o*n*j*e*c*t*u*r*e><label|ch:serre>

  <section|S*t*a*t*e*m*e*n*t*o*f*t*h*e*C*o*n*j*e*c*t*u*r*e>

  <section|D*e*t*e*r*m*i*n*i*n*g*I*r*r*e*d*u*c*i*b*i*l*i*t*y><algorithm|I*r*r*e*d*u*c*i*b*l*e|G*i*v*e*n*a*n*e*w*f*o*r*mf\<in\>
  S<rsub|k>(N,<eps>)<with|mode|math|a*n*d*a*m*a*x*i*m*a*l*i*d*e*a*l>\<lambda\><with|mode|math|o*f><O><rsub|f><with|mode|math|,t*h*i*s*a*l*g*o*r*i*t*h*m*d*e*t*e*r*m*i*n*e*s*w*h*e*t*h*e*r*o*r*n*o*t*t*h*e*m*o*d>\<lambda\><with|mode|math|r*e*p*r*e*s*e*n*t*a*t*i*o*n><rhobar><rsub|f,\<lambda\>>i*s*i*r*r*e*d*u*c*i*b*l*e.>

  <section|C*o*m*p*u*t*i*n*g*t*h*e*S*e*r*r*e*I*n*v*a*r*i*a*n*t*s><algorithm|S*e*r*r*e*W*e*i*g*h*t|G*i*v*e*n*a*n*e*w*f*o*r*mf<with|mode|math|a*n*d*a*m*a*x*i*m*a*l*i*d*e*a*l>\<lambda\><with|mode|math|o*f><O><rsub|f><with|mode|math|,t*h*i*s*a*l*g*o*r*i*t*h*m*c*o*m*p*u*t*e*s*t*h*e*S*e*r*r*e*w*e*i*g*h*t*o*f>\<rho\><rsub|f,\<lambda\>>.>

  <algorithm|S*e*r*r*e*L*e*v*e*l|G*i*v*e*n*a*n*e*w*f*o*r*mf<with|mode|math|a*n*d*a*m*a*x*i*m*a*l*i*d*e*a*l>\<lambda\><with|mode|math|o*f><O><rsub|f><with|mode|math|,t*h*i*s*a*l*g*o*r*i*t*h*m*c*o*m*p*u*t*e*s*t*h*e*S*e*r*r*e*l*e*v*e*l*o*f>\<rho\><rsub|f,\<lambda\>>.>

  <section|F*i*n*d*i*n*g*t*h*e*N*e*w*f*o*r*m*s*t*h*a*t*G*i*v*e*R*i*s*e*t*o*a*R*e*p*r*e*s*e*n*t*a*t*i*o*n>

  <algorithm|N*e*w*f*o*r*m*s*A*t*t*a*c*h*e*d*t*o*a*R*e*p*r*e*s*e*n*t*a*t*i*o*n|G*i*v*e*n*a*r*e*p*r*e*s*e*n*t*a*t*i*o*n<rhobar><rsub|f,\<lambda\>><with|mode|math|a*n*d*a*s*p*a*c*e>S<rsub|k>(N,<eps>)<with|mode|math|,t*h*i*s*a*l*g*o*r*i*t*h*m*f*i*n*d*s*a*l*l*r*e*p*r*e*s*e*n*t*a*t*i*o*n*s><rhobar><rsub|g,\<mu\>><with|mode|math|t*h*a*t*a*r*e*i*s*o*m*o*r*p*h*i*c*t*o>f<with|mode|math|,w*i*t*h>g\<in\>
  S<rsub|k>(N,<eps>).>

  <chapter|S*o*f*t*w*a*r*e*f*o*r*C*o*m*p*u*t*i*n*g*W*i*t*h*M*o*d*u*l*a*r*F*o*r*m*s><label|ch:manin>

  <section|M*A*G*M*A>

  <section|P*y*t*h*o*n/M*A*N*I*N>

  M*A*N*I*N*i*s*a*p*a*c*k*a*g*e*f*o*r*c*o*m*p*u*t*i*n*g*w*i*t*h*m*o*d*u*l*a*r*f*o*r*m*s*t*h*a*t*t*h*e*a*u*t*h*o*r*i*s*d*e*v*e*l*o*p*i*n*g*u*s*i*n*g*t*h*e*c*o*m*p*u*t*e*r*l*a*n*g*u*a*g*e*s*P*y*t*h*o*n*a*n*d*C++.T*h*i*s*c*h*a*p*t*e*r*i*s*a*b*o*u*t*t*h*e*s*t*r*u*c*t*u*r*e*a*n*d*i*m*p*l*e*m*e*n*t*a*t*i*o*n*o*f*M*A*N*I*N,a*n*d*i*t*s*r*e*l*a*t*i*o*n*w*i*t*h*t*h*e*a*l*g*o*r*i*t*h*m*s*d*e*s*c*r*i*b*e*d*e*l*s*e*w*h*e*r*e*i*n*t*h*i*s*b*o*o*k.

  M*A*N*I*N*i*s*a*n*d*w*i*l*l*r*e*m*a*i*n*f*r*e*e*l*y*a*v*a*i*l*a*b*l*e,a*n*d*a*l*l*i*t*s*c*o*m*p*o*n*e*n*t*s*a*r*e*o*p*e*n*s*o*u*r*c*e.I*t<rprime|'>s*i*n*i*t*i*a*l*p*u*r*p*o*s*e*i*s*t*o*p*r*o*v*i*d*e*a*p*a*c*k*a*g*e*f*o*r*d*o*i*n*g*c*o*m*p*u*t*a*t*i*o*n*s*w*i*t*h*m*o*d*u*l*a*r*f*o*r*m*s*w*h*o*s*e*s*o*u*r*c*e*c*o*d*e*i*s*e*a*s*y*t*o*r*e*a*d,m*o*d*i*f*y,a*n*d*u*n*d*e*r*s*t*a*n*d.I*t*i*s*u*s*a*b*l*e*f*r*o*m*P*y*t*h*o*n,w*h*i*c*h*i*s*a*n*e*x*t*r*e*m*e*l*y*m*a*t*u*r*e*a*n*d*w*e*l*l-d*e*s*i*g*n*e*d*m*o*d*e*r*n*l*a*n*g*u*a*g*e.B*e*i*n*g*c*o*m*p*l*e*t*e*l*y*f*r*e*e*a*n*d*o*p*e*n*s*o*u*r*c*e*m*a*k*e*s*i*t*m*o*r*e*s*u*i*t*a*b*l*e*f*o*r*c*i*t*a*t*i*o*n*i*n*r*e*s*e*a*r*c*h*p*a*p*e*r*s.S*p*e*e*d*i*s*i*m*p*o*r*t*a*n*t*b*u*t*i*s<with|font-shape|italic|c*u*r*r*e*n*t*l*y>*o*f*s*e*c*o*n*d*a*r*y*i*m*p*o*r*t*a*n*c*e(t*h*e*a*u*t*h*o*r<rprime|'>s*M*A*G*M*A*p*a*c*k*a*g*e*s*a*r*e*m*u*c*h*f*a*s*t*e*r*i*n*m*a*n*y*c*a*s*e*s).

  W*e*b*e*g*i*n*w*i*t*h*a*s*a*m*p*l*e*M*A*N*I*N*s*e*s*s*i*o*n.

  <\verbatim>
    \<gtr\>\<gtr\>\<gtr\> M = ModularSymbols(11)

    \<gtr\>\<gtr\>\<gtr\> M.basis()

    [(1,0), (1,8), (1,9)]

    \<gtr\>\<gtr\>\<gtr\> t2 = M.hecke_operator(2);\ 

    \<gtr\>\<gtr\>\<gtr\> t2

    \ \ [ 3, \ 0, \ 0;

    \ \ \ \ 0, -2, \ 0;

    \ \ \ -1, \ 0, -2]

    \<gtr\>\<gtr\>\<gtr\> charpoly(t2)

    x^3 + x^2 - 8*x - 12

    \<gtr\>\<gtr\>\<gtr\> t2.charpoly() \ \ \ \ \ \ \ \ \ \ \ \ # call in
    more ``object-oriented'' way.

    x^3 + x^2 - 8*x - 12
  </verbatim>

  <section|C*r*e*m*o*n*a<rprime|'>s*m*w*r*a*n*k>

  <section|H*E*C*K*E*C++L*i*b*r*a*r*y>

  <section|P*A*R*I/G*P*P*a*c*k*a*g*e>

  <\with|font-size|0.84>
    <chapter*|A*p*p*e*n*d*i*x:G*N*U*F*r*e*e*D*o*c*u*m*e*n*t*a*t*i*o*n*L*i*c*e*n*s*e><addcontentsline|t*o*c|c*h*a*p*t*e*r|<numberline|>A*p*p*e*n*d*i*x:G*N*U*F*r*e*e*D*o*c*u*m*e*n*t*a*t*i*o*n*L*i*c*e*n*s*e>
  </with>

  <\center>
    V*e*r*s*i*o*n1.2,N*o*v*e*m*b*e*r2002

    C*o*p*y*r*i*g*h*t<copyright>2000,2001,2002F*r*e*e*S*o*f*t*w*a*r*e*F*o*u*n*d*a*t*i*o*n,I*n*c.

    59T*e*m*p*l*e*P*l*a*c*e,S*u*i*t*e330,B*o*s*t*o*n,M*A02111-1307U*S*A

    E*v*e*r*y*o*n*e*i*s*p*e*r*m*i*t*t*e*d*t*o*c*o*p*y*a*n*d*d*i*s*t*r*i*b*u*t*e*v*e*r*b*a*t*i*m*c*o*p*i*e*s*o*f*t*h*i*s*l*i*c*e*n*s*e*d*o*c*u*m*e*n*t,b*u*t*c*h*a*n*g*i*n*g*i*t*i*s*n*o*t*a*l*l*o*w*e*d.
  </center>

  <\center>
    <\with|font-series|bold>
      <with|font-size|1.19|P*r*e*a*m*b*l*e>
    </with>
  </center>

  T*h*e*p*u*r*p*o*s*e*o*f*t*h*i*s*L*i*c*e*n*s*e*i*s*t*o*m*a*k*e*a*m*a*n*u*a*l,t*e*x*t*b*o*o*k,o*r*o*t*h*e*r*f*u*n*c*t*i*o*n*a*l*a*n*d*u*s*e*f*u*l*d*o*c*u*m*e*n*t``f*r*e*e<rprime|''>i*n*t*h*e*s*e*n*s*e*o*f*f*r*e*e*d*o*m:t*o*a*s*s*u*r*e*e*v*e*r*y*o*n*e*t*h*e*e*f*f*e*c*t*i*v*e*f*r*e*e*d*o*m*t*o*c*o*p*y*a*n*d*r*e*d*i*s*t*r*i*b*u*t*e*i*t,w*i*t*h*o*r*w*i*t*h*o*u*t*m*o*d*i*f*y*i*n*g*i*t,e*i*t*h*e*r*c*o*m*m*e*r*c*i*a*l*l*y*o*r*n*o*n*c*o*m*m*e*r*c*i*a*l*l*y.S*e*c*o*n*d*a*r*i*l*y,t*h*i*s*L*i*c*e*n*s*e*p*r*e*s*e*r*v*e*s*f*o*r*t*h*e*a*u*t*h*o*r*a*n*d*p*u*b*l*i*s*h*e*r*a*w*a*y*t*o*g*e*t*c*r*e*d*i*t*f*o*r*t*h*e*i*r*w*o*r*k,w*h*i*l*e*n*o*t*b*e*i*n*g*c*o*n*s*i*d*e*r*e*d*r*e*s*p*o*n*s*i*b*l*e*f*o*r*m*o*d*i*f*i*c*a*t*i*o*n*s*m*a*d*e*b*y*o*t*h*e*r*s.

  T*h*i*s*L*i*c*e*n*s*e*i*s*a*k*i*n*d*o*f``c*o*p*y*l*e*f*t",w*h*i*c*h*m*e*a*n*s*t*h*a*t*d*e*r*i*v*a*t*i*v*e*w*o*r*k*s*o*f*t*h*e*d*o*c*u*m*e*n*t*m*u*s*t*t*h*e*m*s*e*l*v*e*s*b*e*f*r*e*e*i*n*t*h*e*s*a*m*e*s*e*n*s*e.I*t*c*o*m*p*l*e*m*e*n*t*s*t*h*e*G*N*U*G*e*n*e*r*a*l*P*u*b*l*i*c*L*i*c*e*n*s*e,w*h*i*c*h*i*s*a*c*o*p*y*l*e*f*t*l*i*c*e*n*s*e*d*e*s*i*g*n*e*d*f*o*r*f*r*e*e*s*o*f*t*w*a*r*e.

  W*e*h*a*v*e*d*e*s*i*g*n*e*d*t*h*i*s*L*i*c*e*n*s*e*i*n*o*r*d*e*r*t*o*u*s*e*i*t*f*o*r*m*a*n*u*a*l*s*f*o*r*f*r*e*e*s*o*f*t*w*a*r*e,b*e*c*a*u*s*e*f*r*e*e*s*o*f*t*w*a*r*e*n*e*e*d*s*f*r*e*e*d*o*c*u*m*e*n*t*a*t*i*o*n:a*f*r*e*e*p*r*o*g*r*a*m*s*h*o*u*l*d*c*o*m*e*w*i*t*h*m*a*n*u*a*l*s*p*r*o*v*i*d*i*n*g*t*h*e*s*a*m*e*f*r*e*e*d*o*m*s*t*h*a*t*t*h*e*s*o*f*t*w*a*r*e*d*o*e*s.B*u*t*t*h*i*s*L*i*c*e*n*s*e*i*s*n*o*t*l*i*m*i*t*e*d*t*o*s*o*f*t*w*a*r*e*m*a*n*u*a*l*s;i*t*c*a*n*b*e*u*s*e*d*f*o*r*a*n*y*t*e*x*t*u*a*l*w*o*r*k,r*e*g*a*r*d*l*e*s*s*o*f*s*u*b*j*e*c*t*m*a*t*t*e*r*o*r*w*h*e*t*h*e*r*i*t*i*s*p*u*b*l*i*s*h*e*d*a*s*a*p*r*i*n*t*e*d*b*o*o*k.W*e*r*e*c*o*m*m*e*n*d*t*h*i*s*L*i*c*e*n*s*e*p*r*i*n*c*i*p*a*l*l*y*f*o*r*w*o*r*k*s*w*h*o*s*e*p*u*r*p*o*s*e*i*s*i*n*s*t*r*u*c*t*i*o*n*o*r*r*e*f*e*r*e*n*c*e.

  <\center>
    <\with|font-size|1.41>
      <with|font-series|bold|1.A*P*P*L*I*C*A*B*I*L*I*T*Y*A*N*D*D*E*F*I*N*I*T*I*O*N*S>
    </with>
  </center>

  T*h*i*s*L*i*c*e*n*s*e*a*p*p*l*i*e*s*t*o*a*n*y*m*a*n*u*a*l*o*r*o*t*h*e*r*w*o*r*k,i*n*a*n*y*m*e*d*i*u*m,t*h*a*t*c*o*n*t*a*i*n*s*a*n*o*t*i*c*e*p*l*a*c*e*d*b*y*t*h*e*c*o*p*y*r*i*g*h*t*h*o*l*d*e*r*s*a*y*i*n*g*i*t*c*a*n*b*e*d*i*s*t*r*i*b*u*t*e*d*u*n*d*e*r*t*h*e*t*e*r*m*s*o*f*t*h*i*s*L*i*c*e*n*s*e.S*u*c*h*a*n*o*t*i*c*e*g*r*a*n*t*s*a*w*o*r*l*d-w*i*d*e,r*o*y*a*l*t*y-f*r*e*e*l*i*c*e*n*s*e,u*n*l*i*m*i*t*e*d*i*n*d*u*r*a*t*i*o*n,t*o*u*s*e*t*h*a*t*w*o*r*k*u*n*d*e*r*t*h*e*c*o*n*d*i*t*i*o*n*s*s*t*a*t*e*d*h*e*r*e*i*n.T*h*e<with|font-series|bold|``D*o*c*u*m*e*n*t<rprime|''>>,b*e*l*o*w,r*e*f*e*r*s*t*o*a*n*y*s*u*c*h*m*a*n*u*a*l*o*r*w*o*r*k.A*n*y*m*e*m*b*e*r*o*f*t*h*e*p*u*b*l*i*c*i*s*a*l*i*c*e*n*s*e*e,a*n*d*i*s*a*d*d*r*e*s*s*e*d*a*s<with|font-series|bold|``y*o*u<rprime|''>>.Y*o*u*a*c*c*e*p*t*t*h*e*l*i*c*e*n*s*e*i*f*y*o*u*c*o*p*y,m*o*d*i*f*y*o*r*d*i*s*t*r*i*b*u*t*e*t*h*e*w*o*r*k*i*n*a*w*a*y*r*e*q*u*i*r*i*n*g*p*e*r*m*i*s*s*i*o*n*u*n*d*e*r*c*o*p*y*r*i*g*h*t*l*a*w.

  A<with|font-series|bold|``M*o*d*i*f*i*e*d*V*e*r*s*i*o*n<rprime|''>>o*f*t*h*e*D*o*c*u*m*e*n*t*m*e*a*n*s*a*n*y*w*o*r*k*c*o*n*t*a*i*n*i*n*g*t*h*e*D*o*c*u*m*e*n*t*o*r*a*p*o*r*t*i*o*n*o*f*i*t,e*i*t*h*e*r*c*o*p*i*e*d*v*e*r*b*a*t*i*m,o*r*w*i*t*h*m*o*d*i*f*i*c*a*t*i*o*n*s*a*n*d/o*r*t*r*a*n*s*l*a*t*e*d*i*n*t*o*a*n*o*t*h*e*r*l*a*n*g*u*a*g*e.

  A<with|font-series|bold|``S*e*c*o*n*d*a*r*y*S*e*c*t*i*o*n<rprime|''>>i*s*a*n*a*m*e*d*a*p*p*e*n*d*i*x*o*r*a*f*r*o*n*t-m*a*t*t*e*r*s*e*c*t*i*o*n*o*f*t*h*e*D*o*c*u*m*e*n*t*t*h*a*t*d*e*a*l*s*e*x*c*l*u*s*i*v*e*l*y*w*i*t*h*t*h*e*r*e*l*a*t*i*o*n*s*h*i*p*o*f*t*h*e*p*u*b*l*i*s*h*e*r*s*o*r*a*u*t*h*o*r*s*o*f*t*h*e*D*o*c*u*m*e*n*t*t*o*t*h*e*D*o*c*u*m*e*n*t<rprime|'>s*o*v*e*r*a*l*l*s*u*b*j*e*c*t(o*r*t*o*r*e*l*a*t*e*d*m*a*t*t*e*r*s)a*n*d*c*o*n*t*a*i*n*s*n*o*t*h*i*n*g*t*h*a*t*c*o*u*l*d*f*a*l*l*d*i*r*e*c*t*l*y*w*i*t*h*i*n*t*h*a*t*o*v*e*r*a*l*l*s*u*b*j*e*c*t.(T*h*u*s,i*f*t*h*e*D*o*c*u*m*e*n*t*i*s*i*n*p*a*r*t*a*t*e*x*t*b*o*o*k*o*f*m*a*t*h*e*m*a*t*i*c*s,a*S*e*c*o*n*d*a*r*y*S*e*c*t*i*o*n*m*a*y*n*o*t*e*x*p*l*a*i*n*a*n*y*m*a*t*h*e*m*a*t*i*c*s.)T*h*e*r*e*l*a*t*i*o*n*s*h*i*p*c*o*u*l*d*b*e*a*m*a*t*t*e*r*o*f*h*i*s*t*o*r*i*c*a*l*c*o*n*n*e*c*t*i*o*n*w*i*t*h*t*h*e*s*u*b*j*e*c*t*o*r*w*i*t*h*r*e*l*a*t*e*d*m*a*t*t*e*r*s,o*r*o*f*l*e*g*a*l,c*o*m*m*e*r*c*i*a*l,p*h*i*l*o*s*o*p*h*i*c*a*l,e*t*h*i*c*a*l*o*r*p*o*l*i*t*i*c*a*l*p*o*s*i*t*i*o*n*r*e*g*a*r*d*i*n*g*t*h*e*m.

  T*h*e<with|font-series|bold|``I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s<rprime|''>>a*r*e*c*e*r*t*a*i*n*S*e*c*o*n*d*a*r*y*S*e*c*t*i*o*n*s*w*h*o*s*e*t*i*t*l*e*s*a*r*e*d*e*s*i*g*n*a*t*e*d,a*s*b*e*i*n*g*t*h*o*s*e*o*f*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s,i*n*t*h*e*n*o*t*i*c*e*t*h*a*t*s*a*y*s*t*h*a*t*t*h*e*D*o*c*u*m*e*n*t*i*s*r*e*l*e*a*s*e*d*u*n*d*e*r*t*h*i*s*L*i*c*e*n*s*e.I*f*a*s*e*c*t*i*o*n*d*o*e*s*n*o*t*f*i*t*t*h*e*a*b*o*v*e*d*e*f*i*n*i*t*i*o*n*o*f*S*e*c*o*n*d*a*r*y*t*h*e*n*i*t*i*s*n*o*t*a*l*l*o*w*e*d*t*o*b*e*d*e*s*i*g*n*a*t*e*d*a*s*I*n*v*a*r*i*a*n*t.T*h*e*D*o*c*u*m*e*n*t*m*a*y*c*o*n*t*a*i*n*z*e*r*o*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s.I*f*t*h*e*D*o*c*u*m*e*n*t*d*o*e*s*n*o*t*i*d*e*n*t*i*f*y*a*n*y*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s*t*h*e*n*t*h*e*r*e*a*r*e*n*o*n*e.

  T*h*e<with|font-series|bold|``C*o*v*e*r*T*e*x*t*s<rprime|''>>a*r*e*c*e*r*t*a*i*n*s*h*o*r*t*p*a*s*s*a*g*e*s*o*f*t*e*x*t*t*h*a*t*a*r*e*l*i*s*t*e*d,a*s*F*r*o*n*t-C*o*v*e*r*T*e*x*t*s*o*r*B*a*c*k-C*o*v*e*r*T*e*x*t*s,i*n*t*h*e*n*o*t*i*c*e*t*h*a*t*s*a*y*s*t*h*a*t*t*h*e*D*o*c*u*m*e*n*t*i*s*r*e*l*e*a*s*e*d*u*n*d*e*r*t*h*i*s*L*i*c*e*n*s*e.A*F*r*o*n*t-C*o*v*e*r*T*e*x*t*m*a*y*b*e*a*t*m*o*s*t5w*o*r*d*s,a*n*d*a*B*a*c*k-C*o*v*e*r*T*e*x*t*m*a*y*b*e*a*t*m*o*s*t25w*o*r*d*s.

  A<with|font-series|bold|``T*r*a*n*s*p*a*r*e*n*t<rprime|''>>c*o*p*y*o*f*t*h*e*D*o*c*u*m*e*n*t*m*e*a*n*s*a*m*a*c*h*i*n*e-r*e*a*d*a*b*l*e*c*o*p*y,r*e*p*r*e*s*e*n*t*e*d*i*n*a*f*o*r*m*a*t*w*h*o*s*e*s*p*e*c*i*f*i*c*a*t*i*o*n*i*s*a*v*a*i*l*a*b*l*e*t*o*t*h*e*g*e*n*e*r*a*l*p*u*b*l*i*c,t*h*a*t*i*s*s*u*i*t*a*b*l*e*f*o*r*r*e*v*i*s*i*n*g*t*h*e*d*o*c*u*m*e*n*t*s*t*r*a*i*g*h*t*f*o*r*w*a*r*d*l*y*w*i*t*h*g*e*n*e*r*i*c*t*e*x*t*e*d*i*t*o*r*s*o*r(f*o*r*i*m*a*g*e*s*c*o*m*p*o*s*e*d*o*f*p*i*x*e*l*s)g*e*n*e*r*i*c*p*a*i*n*t*p*r*o*g*r*a*m*s*o*r(f*o*r*d*r*a*w*i*n*g*s)s*o*m*e*w*i*d*e*l*y*a*v*a*i*l*a*b*l*e*v*d*r*a*w*i*n*g*e*d*i*t*o*r,a*n*d*t*h*a*t*i*s*s*u*i*t*a*b*l*e*f*o*r*i*n*p*u*t*t*o*t*e*x*t*f*o*r*m*a*t*t*e*r*s*o*r*f*o*r*a*u*t*o*m*a*t*i*c*t*r*a*n*s*l*a*t*i*o*n*t*o*a*v*a*r*i*e*t*y*o*f*f*o*r*m*a*t*s*s*u*i*t*a*b*l*e*f*o*r*i*n*p*u*t*t*o*t*e*x*t*f*o*r*m*a*t*t*e*r*s.A*c*o*p*y*m*a*d*e*i*n*a*n*o*t*h*e*r*w*i*s*e*T*r*a*n*s*p*a*r*e*n*t*f*i*l*e*f*o*r*m*a*t*w*h*o*s*e*m*a*r*k*u*p,o*r*a*b*s*e*n*c*e*o*f*m*a*r*k*u*p,h*a*s*b*e*e*n*a*r*r*a*n*g*e*d*t*o*t*h*w*a*r*t*o*r*d*i*s*c*o*u*r*a*g*e*s*u*b*s*e*q*u*e*n*t*m*o*d*i*f*i*c*a*t*i*o*n*b*y*r*e*a*d*e*r*s*i*s*n*o*t*T*r*a*n*s*p*a*r*e*n*t.A*n*i*m*a*g*e*f*o*r*m*a*t*i*s*n*o*t*T*r*a*n*s*p*a*r*e*n*t*i*f*u*s*e*d*f*o*r*a*n*y*s*u*b*s*t*a*n*t*i*a*l*a*m*o*u*n*t*o*f*t*e*x*t.A*c*o*p*y*t*h*a*t*i*s*n*o*t``T*r*a*n*s*p*a*r*e*n*t<rprime|''>i*s*c*a*l*l*e*d<with|font-series|bold|``O*p*a*q*u*e<rprime|''>>.

  E*x*a*m*p*l*e*s*o*f*s*u*i*t*a*b*l*e*f*o*r*m*a*t*s*f*o*r*T*r*a*n*s*p*a*r*e*n*t*c*o*p*i*e*s*i*n*c*l*u*d*e*p*l*a*i*n*A*S*C*I*I*w*i*t*h*o*u*t*m*a*r*k*u*p,T*e*x*i*n*f*o*i*n*p*u*t*f*o*r*m*a*t,L*a*T*e*X*i*n*p*u*t*f*o*r*m*a*t,S*G*M*L*o*r*X*M*L*u*s*i*n*g*a*p*u*b*l*i*c*l*y*a*v*a*i*l*a*b*l*e*D*T*D,a*n*d*s*t*a*n*d*a*r*d-c*o*n*f*o*r*m*i*n*g*s*i*m*p*l*e*H*T*M*L,P*o*s*t*S*c*r*i*p*t*o*r*P*D*F*d*e*s*i*g*n*e*d*f*o*r*h*u*m*a*n*m*o*d*i*f*i*c*a*t*i*o*n.E*x*a*m*p*l*e*s*o*f*t*r*a*n*s*p*a*r*e*n*t*i*m*a*g*e*f*o*r*m*a*t*s*i*n*c*l*u*d*e*P*N*G,X*C*F*a*n*d*J*P*G.O*p*a*q*u*e*f*o*r*m*a*t*s*i*n*c*l*u*d*e*p*r*o*p*r*i*e*t*a*r*y*f*o*r*m*a*t*s*t*h*a*t*c*a*n*b*e*r*e*a*d*a*n*d*e*d*i*t*e*d*o*n*l*y*b*y*p*r*o*p*r*i*e*t*a*r*y*w*o*r*d*p*r*o*c*e*s*s*o*r*s,S*G*M*L*o*r*X*M*L*f*o*r*w*h*i*c*h*t*h*e*D*T*D*a*n*d/o*r*p*r*o*c*e*s*s*i*n*g*t*o*o*l*s*a*r*e*n*o*t*g*e*n*e*r*a*l*l*y*a*v*a*i*l*a*b*l*e,a*n*d*t*h*e*m*a*c*h*i*n*e-g*e*n*e*r*a*t*e*d*H*T*M*L,P*o*s*t*S*c*r*i*p*t*o*r*P*D*F*p*r*o*d*u*c*e*d*b*y*s*o*m*e*w*o*r*d*p*r*o*c*e*s*s*o*r*s*f*o*r*o*u*t*p*u*t*p*u*r*p*o*s*e*s*o*n*l*y.

  T*h*e<with|font-series|bold|``T*i*t*l*e*P*a*g*e<rprime|''>>m*e*a*n*s,f*o*r*a*p*r*i*n*t*e*d*b*o*o*k,t*h*e*t*i*t*l*e*p*a*g*e*i*t*s*e*l*f,p*l*u*s*s*u*c*h*f*o*l*l*o*w*i*n*g*p*a*g*e*s*a*s*a*r*e*n*e*e*d*e*d*t*o*h*o*l*d,l*e*g*i*b*l*y,t*h*e*m*a*t*e*r*i*a*l*t*h*i*s*L*i*c*e*n*s*e*r*e*q*u*i*r*e*s*t*o*a*p*p*e*a*r*i*n*t*h*e*t*i*t*l*e*p*a*g*e.F*o*r*w*o*r*k*s*i*n*f*o*r*m*a*t*s*w*h*i*c*h*d*o*n*o*t*h*a*v*e*a*n*y*t*i*t*l*e*p*a*g*e*a*s*s*u*c*h,``T*i*t*l*e*P*a*g*e<rprime|''>m*e*a*n*s*t*h*e*t*e*x*t*n*e*a*r*t*h*e*m*o*s*t*p*r*o*m*i*n*e*n*t*a*p*p*e*a*r*a*n*c*e*o*f*t*h*e*w*o*r*k<rprime|'>s*t*i*t*l*e,p*r*e*c*e*d*i*n*g*t*h*e*b*e*g*i*n*n*i*n*g*o*f*t*h*e*b*o*d*y*o*f*t*h*e*t*e*x*t.

  A*s*e*c*t*i*o*n<with|font-series|bold|``E*n*t*i*t*l*e*d*X*Y*Z<rprime|''>>m*e*a*n*s*a*n*a*m*e*d*s*u*b*u*n*i*t*o*f*t*h*e*D*o*c*u*m*e*n*t*w*h*o*s*e*t*i*t*l*e*e*i*t*h*e*r*i*s*p*r*e*c*i*s*e*l*y*X*Y*Z*o*r*c*o*n*t*a*i*n*s*X*Y*Z*i*n*p*a*r*e*n*t*h*e*s*e*s*f*o*l*l*o*w*i*n*g*t*e*x*t*t*h*a*t*t*r*a*n*s*l*a*t*e*s*X*Y*Z*i*n*a*n*o*t*h*e*r*l*a*n*g*u*a*g*e.(H*e*r*e*X*Y*Z*s*t*a*n*d*s*f*o*r*a*s*p*e*c*i*f*i*c*s*e*c*t*i*o*n*n*a*m*e*m*e*n*t*i*o*n*e*d*b*e*l*o*w,s*u*c*h*a*s<with|font-series|bold|``A*c*k*n*o*w*l*e*d*g*e*m*e*n*t*s<rprime|''>>,<with|font-series|bold|``D*e*d*i*c*a*t*i*o*n*s<rprime|''>>,<with|font-series|bold|``E*n*d*o*r*s*e*m*e*n*t*s<rprime|''>>,o*r<with|font-series|bold|``H*i*s*t*o*r*y<rprime|''>>.)T*o<with|font-series|bold|``P*r*e*s*e*r*v*e*t*h*e*T*i*t*l*e<rprime|''>>o*f*s*u*c*h*a*s*e*c*t*i*o*n*w*h*e*n*y*o*u*m*o*d*i*f*y*t*h*e*D*o*c*u*m*e*n*t*m*e*a*n*s*t*h*a*t*i*t*r*e*m*a*i*n*s*a*s*e*c*t*i*o*n``E*n*t*i*t*l*e*d*X*Y*Z<rprime|''>a*c*c*o*r*d*i*n*g*t*o*t*h*i*s*d*e*f*i*n*i*t*i*o*n.

  T*h*e*D*o*c*u*m*e*n*t*m*a*y*i*n*c*l*u*d*e*W*a*r*r*a*n*t*y*D*i*s*c*l*a*i*m*e*r*s*n*e*x*t*t*o*t*h*e*n*o*t*i*c*e*w*h*i*c*h*s*t*a*t*e*s*t*h*a*t*t*h*i*s*L*i*c*e*n*s*e*a*p*p*l*i*e*s*t*o*t*h*e*D*o*c*u*m*e*n*t.T*h*e*s*e*W*a*r*r*a*n*t*y*D*i*s*c*l*a*i*m*e*r*s*a*r*e*c*o*n*s*i*d*e*r*e*d*t*o*b*e*i*n*c*l*u*d*e*d*b*y*r*e*f*e*r*e*n*c*e*i*n*t*h*i*s*L*i*c*e*n*s*e,b*u*t*o*n*l*y*a*s*r*e*g*a*r*d*s*d*i*s*c*l*a*i*m*i*n*g*w*a*r*r*a*n*t*i*e*s:a*n*y*o*t*h*e*r*i*m*p*l*i*c*a*t*i*o*n*t*h*a*t*t*h*e*s*e*W*a*r*r*a*n*t*y*D*i*s*c*l*a*i*m*e*r*s*m*a*y*h*a*v*e*i*s*v*o*i*d*a*n*d*h*a*s*n*o*e*f*f*e*c*t*o*n*t*h*e*m*e*a*n*i*n*g*o*f*t*h*i*s*L*i*c*e*n*s*e.

  <\center>
    <\with|font-size|1.41>
      <with|font-series|bold|2.V*E*R*B*A*T*I*M*C*O*P*Y*I*N*G>
    </with>
  </center>

  Y*o*u*m*a*y*c*o*p*y*a*n*d*d*i*s*t*r*i*b*u*t*e*t*h*e*D*o*c*u*m*e*n*t*i*n*a*n*y*m*e*d*i*u*m,e*i*t*h*e*r*c*o*m*m*e*r*c*i*a*l*l*y*o*r*n*o*n*c*o*m*m*e*r*c*i*a*l*l*y,p*r*o*v*i*d*e*d*t*h*a*t*t*h*i*s*L*i*c*e*n*s*e,t*h*e*c*o*p*y*r*i*g*h*t*n*o*t*i*c*e*s,a*n*d*t*h*e*l*i*c*e*n*s*e*n*o*t*i*c*e*s*a*y*i*n*g*t*h*i*s*L*i*c*e*n*s*e*a*p*p*l*i*e*s*t*o*t*h*e*D*o*c*u*m*e*n*t*a*r*e*r*e*p*r*o*d*u*c*e*d*i*n*a*l*l*c*o*p*i*e*s,a*n*d*t*h*a*t*y*o*u*a*d*d*n*o*o*t*h*e*r*c*o*n*d*i*t*i*o*n*s*w*h*a*t*s*o*e*v*e*r*t*o*t*h*o*s*e*o*f*t*h*i*s*L*i*c*e*n*s*e.Y*o*u*m*a*y*n*o*t*u*s*e*t*e*c*h*n*i*c*a*l*m*e*a*s*u*r*e*s*t*o*o*b*s*t*r*u*c*t*o*r*c*o*n*t*r*o*l*t*h*e*r*e*a*d*i*n*g*o*r*f*u*r*t*h*e*r*c*o*p*y*i*n*g*o*f*t*h*e*c*o*p*i*e*s*y*o*u*m*a*k*e*o*r*d*i*s*t*r*i*b*u*t*e.H*o*w*e*v*e*r,y*o*u*m*a*y*a*c*c*e*p*t*c*o*m*p*e*n*s*a*t*i*o*n*i*n*e*x*c*h*a*n*g*e*f*o*r*c*o*p*i*e*s.I*f*y*o*u*d*i*s*t*r*i*b*u*t*e*a*l*a*r*g*e*e*n*o*u*g*h*n*u*m*b*e*r*o*f*c*o*p*i*e*s*y*o*u*m*u*s*t*a*l*s*o*f*o*l*l*o*w*t*h*e*c*o*n*d*i*t*i*o*n*s*i*n*s*e*c*t*i*o*n3.

  Y*o*u*m*a*y*a*l*s*o*l*e*n*d*c*o*p*i*e*s,u*n*d*e*r*t*h*e*s*a*m*e*c*o*n*d*i*t*i*o*n*s*s*t*a*t*e*d*a*b*o*v*e,a*n*d*y*o*u*m*a*y*p*u*b*l*i*c*l*y*d*i*s*p*l*a*y*c*o*p*i*e*s.

  <\center>
    <\with|font-size|1.41>
      <with|font-series|bold|3.C*O*P*Y*I*N*G*I*N*Q*U*A*N*T*I*T*Y>
    </with>
  </center>

  I*f*y*o*u*p*u*b*l*i*s*h*p*r*i*n*t*e*d*c*o*p*i*e*s(o*r*c*o*p*i*e*s*i*n*m*e*d*i*a*t*h*a*t*c*o*m*m*o*n*l*y*h*a*v*e*p*r*i*n*t*e*d*c*o*v*e*r*s)o*f*t*h*e*D*o*c*u*m*e*n*t,n*u*m*b*e*r*i*n*g*m*o*r*e*t*h*a*n100,a*n*d*t*h*e*D*o*c*u*m*e*n*t<rprime|'>s*l*i*c*e*n*s*e*n*o*t*i*c*e*r*e*q*u*i*r*e*s*C*o*v*e*r*T*e*x*t*s,y*o*u*m*u*s*t*e*n*c*l*o*s*e*t*h*e*c*o*p*i*e*s*i*n*c*o*v*e*r*s*t*h*a*t*c*a*r*r*y,c*l*e*a*r*l*y*a*n*d*l*e*g*i*b*l*y,a*l*l*t*h*e*s*e*C*o*v*e*r*T*e*x*t*s:F*r*o*n*t-C*o*v*e*r*T*e*x*t*s*o*n*t*h*e*f*r*o*n*t*c*o*v*e*r,a*n*d*B*a*c*k-C*o*v*e*r*T*e*x*t*s*o*n*t*h*e*b*a*c*k*c*o*v*e*r.B*o*t*h*c*o*v*e*r*s*m*u*s*t*a*l*s*o*c*l*e*a*r*l*y*a*n*d*l*e*g*i*b*l*y*i*d*e*n*t*i*f*y*y*o*u*a*s*t*h*e*p*u*b*l*i*s*h*e*r*o*f*t*h*e*s*e*c*o*p*i*e*s.T*h*e*f*r*o*n*t*c*o*v*e*r*m*u*s*t*p*r*e*s*e*n*t*t*h*e*f*u*l*l*t*i*t*l*e*w*i*t*h*a*l*l*w*o*r*d*s*o*f*t*h*e*t*i*t*l*e*e*q*u*a*l*l*y*p*r*o*m*i*n*e*n*t*a*n*d*v*i*s*i*b*l*e.Y*o*u*m*a*y*a*d*d*o*t*h*e*r*m*a*t*e*r*i*a*l*o*n*t*h*e*c*o*v*e*r*s*i*n*a*d*d*i*t*i*o*n.C*o*p*y*i*n*g*w*i*t*h*c*h*a*n*g*e*s*l*i*m*i*t*e*d*t*o*t*h*e*c*o*v*e*r*s,a*s*l*o*n*g*a*s*t*h*e*y*p*r*e*s*e*r*v*e*v*t*h*e*t*i*t*l*e*o*f*t*h*e*D*o*c*u*m*e*n*t*a*n*d*s*a*t*i*s*f*y*t*h*e*s*e*c*o*n*d*i*t*i*o*n*s,c*a*n*b*e*t*r*e*a*t*e*d*a*s*v*e*r*b*a*t*i*m*c*o*p*y*i*n*g*i*n*o*t*h*e*r*r*e*s*p*e*c*t*s.

  I*f*t*h*e*r*e*q*u*i*r*e*d*t*e*x*t*s*f*o*r*e*i*t*h*e*r*c*o*v*e*r*a*r*e*t*o*o*v*o*l*u*m*i*n*o*u*s*t*o*f*i*t*l*e*g*i*b*l*y,y*o*u*s*h*o*u*l*d*p*u*t*t*h*e*f*i*r*s*t*o*n*e*s*l*i*s*t*e*d(a*s*m*a*n*y*a*s*f*i*t*r*e*a*s*o*n*a*b*l*y)o*n*t*h*e*a*c*t*u*a*l*c*o*v*e*r,a*n*d*c*o*n*t*i*n*u*e*t*h*e*r*e*s*t*o*n*t*o*a*d*j*a*c*e*n*t*p*a*g*e*s.

  I*f*y*o*u*p*u*b*l*i*s*h*o*r*d*i*s*t*r*i*b*u*t*e*O*p*a*q*u*e*c*o*p*i*e*s*o*f*t*h*e*D*o*c*u*m*e*n*t*n*u*m*b*e*r*i*n*g*m*o*r*e*t*h*a*n100,y*o*u*m*u*s*t*e*i*t*h*e*r*i*n*c*l*u*d*e*a*m*a*c*h*i*n*e-r*e*a*d*a*b*l*e*T*r*a*n*s*p*a*r*e*n*t*c*o*p*y*a*l*o*n*g*w*i*t*h*e*a*c*h*O*p*a*q*u*e*c*o*p*y,o*r*s*t*a*t*e*i*n*o*r*w*i*t*h*e*a*c*h*O*p*a*q*u*e*c*o*p*y*a*c*o*m*p*u*t*e*r-n*e*t*w*o*r*k*l*o*c*a*t*i*o*n*f*r*o*m*w*h*i*c*h*t*h*e*g*e*n*e*r*a*l*n*e*t*w*o*r*k-u*s*i*n*g*p*u*b*l*i*c*h*a*s*a*c*c*e*s*s*t*o*d*o*w*n*l*o*a*d*u*s*i*n*g*p*u*b*l*i*c-s*t*a*n*d*a*r*d*n*e*t*w*o*r*k*p*r*o*t*o*c*o*l*s*a*c*o*m*p*l*e*t*e*T*r*a*n*s*p*a*r*e*n*t*c*o*p*y*o*f*t*h*e*D*o*c*u*m*e*n*t,f*r*e*e*o*f*a*d*d*e*d*m*a*t*e*r*i*a*l.I*f*y*o*u*u*s*e*t*h*e*l*a*t*t*e*r*o*p*t*i*o*n,y*o*u*m*u*s*t*t*a*k*e*r*e*a*s*o*n*a*b*l*y*p*r*u*d*e*n*t*s*t*e*p*s,w*h*e*n*y*o*u*b*e*g*i*n*d*i*s*t*r*i*b*u*t*i*o*n*o*f*O*p*a*q*u*e*c*o*p*i*e*s*i*n*q*u*a*n*t*i*t*y,t*o*e*n*s*u*r*e*t*h*a*t*t*h*i*s*T*r*a*n*s*p*a*r*e*n*t*c*o*p*y*w*i*l*l*r*e*m*a*i*n*t*h*u*s*a*c*c*e*s*s*i*b*l*e*a*t*t*h*e*s*t*a*t*e*d*l*o*c*a*t*i*o*n*u*n*t*i*l*a*t*l*e*a*s*t*o*n*e*y*e*a*r*a*f*t*e*r*t*h*e*l*a*s*t*t*i*m*e*y*o*u*d*i*s*t*r*i*b*u*t*e*a*n*O*p*a*q*u*e*c*o*p*y(d*i*r*e*c*t*l*y*o*r*t*h*r*o*u*g*h*y*o*u*r*a*g*e*n*t*s*o*r*r*e*t*a*i*l*e*r*s)o*f*t*h*a*t*e*d*i*t*i*o*n*t*o*t*h*e*p*u*b*l*i*c.

  I*t*i*s*r*e*q*u*e*s*t*e*d,b*u*t*n*o*t*r*e*q*u*i*r*e*d,t*h*a*t*y*o*u*c*o*n*t*a*c*t*t*h*e*a*u*t*h*o*r*s*o*f*t*h*e*D*o*c*u*m*e*n*t*w*e*l*l*b*e*f*o*r*e*r*e*d*i*s*t*r*i*b*u*t*i*n*g*a*n*y*l*a*r*g*e*n*u*m*b*e*r*o*f*c*o*p*i*e*s,t*o*g*i*v*e*t*h*e*m*a*c*h*a*n*c*e*t*o*p*r*o*v*i*d*e*y*o*u*w*i*t*h*a*n*u*p*d*a*t*e*d*v*e*r*s*i*o*n*o*f*t*h*e*D*o*c*u*m*e*n*t.

  <\center>
    <\with|font-size|1.41>
      <with|font-series|bold|4.M*O*D*I*F*I*C*A*T*I*O*N*S>
    </with>
  </center>

  Y*o*u*m*a*y*c*o*p*y*a*n*d*d*i*s*t*r*i*b*u*t*e*a*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n*o*f*t*h*e*D*o*c*u*m*e*n*t*u*n*d*e*r*t*h*e*c*o*n*d*i*t*i*o*n*s*o*f*s*e*c*t*i*o*n*s2a*n*d3a*b*o*v*e,p*r*o*v*i*d*e*d*t*h*a*t*y*o*u*r*e*l*e*a*s*e*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n*u*n*d*e*r*p*r*e*c*i*s*e*l*y*t*h*i*s*L*i*c*e*n*s*e,w*i*t*h*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n*f*i*l*l*i*n*g*t*h*e*r*o*l*e*o*f*t*h*e*D*o*c*u*m*e*n*t,t*h*u*s*l*i*c*e*n*s*i*n*g*d*i*s*t*r*i*b*u*t*i*o*n*a*n*d*m*o*d*i*f*i*c*a*t*i*o*n*o*f*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n*t*o*w*h*o*e*v*e*r*p*o*s*s*e*s*s*e*s*a*c*o*p*y*o*f*i*t.I*n*a*d*d*i*t*i*o*n,y*o*u*m*u*s*t*d*o*t*h*e*s*e*t*h*i*n*g*s*i*n*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n:

  <\itemize>
    <item*|A>U*s*e*i*n*t*h*e*T*i*t*l*e*P*a*g*e(a*n*d*o*n*t*h*e*c*o*v*e*r*s,i*f*a*n*y)a*t*i*t*l*e*d*i*s*t*i*n*c*t*f*r*o*m*t*h*a*t*o*f*t*h*e*D*o*c*u*m*e*n*t,a*n*d*f*r*o*m*t*h*o*s*e*o*f*p*r*e*v*i*o*u*s*v*e*r*s*i*o*n*s(w*h*i*c*h*s*h*o*u*l*d,i*f*t*h*e*r*e*w*e*r*e*a*n*y,b*e*l*i*s*t*e*d*i*n*t*h*e*H*i*s*t*o*r*y*s*e*c*t*i*o*n*o*f*t*h*e*D*o*c*u*m*e*n*t).Y*o*u*m*a*y*u*s*e*t*h*e*s*a*m*e*t*i*t*l*e*a*s*a*p*r*e*v*i*o*u*s*v*e*r*s*i*o*n*i*f*t*h*e*o*r*i*g*i*n*a*l*p*u*b*l*i*s*h*e*r*o*f*t*h*a*t*v*e*r*s*i*o*n*g*i*v*e*s*p*e*r*m*i*s*s*i*o*n.

    <item*|B>L*i*s*t*o*n*t*h*e*T*i*t*l*e*P*a*g*e,a*s*a*u*t*h*o*r*s,o*n*e*o*r*m*o*r*e*p*e*r*s*o*n*s*o*r*e*n*t*i*t*i*e*s*r*e*s*p*o*n*s*i*b*l*e*f*o*r*a*u*t*h*o*r*s*h*i*p*o*f*t*h*e*m*o*d*i*f*i*c*a*t*i*o*n*s*i*n*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n,t*o*g*e*t*h*e*r*w*i*t*h*a*t*l*e*a*s*t*f*i*v*e*o*f*t*h*e*p*r*i*n*c*i*p*a*l*a*u*t*h*o*r*s*o*f*t*h*e*D*o*c*u*m*e*n*t(a*l*l*o*f*i*t*s*p*r*i*n*c*i*p*a*l*a*u*t*h*o*r*s,i*f*i*t*h*a*s*f*e*w*e*r*t*h*a*n*f*i*v*e),u*n*l*e*s*s*t*h*e*y*r*e*l*e*a*s*e*y*o*u*f*r*o*m*t*h*i*s*r*e*q*u*i*r*e*m*e*n*t.

    <item*|C>S*t*a*t*e*o*n*t*h*e*T*i*t*l*e*p*a*g*e*t*h*e*n*a*m*e*o*f*t*h*e*p*u*b*l*i*s*h*e*r*o*f*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n,a*s*t*h*e*p*u*b*l*i*s*h*e*r.

    <item*|D>P*r*e*s*e*r*v*e*a*l*l*t*h*e*c*o*p*y*r*i*g*h*t*n*o*t*i*c*e*s*o*f*t*h*e*D*o*c*u*m*e*n*t.

    <item*|E>A*d*d*a*n*a*p*p*r*o*p*r*i*a*t*e*c*o*p*y*r*i*g*h*t*n*o*t*i*c*e*f*o*r*y*o*u*r*m*o*d*i*f*i*c*a*t*i*o*n*s*a*d*j*a*c*e*n*t*t*o*t*h*e*o*t*h*e*r*c*o*p*y*r*i*g*h*t*n*o*t*i*c*e*s.

    <item*|F>I*n*c*l*u*d*e,i*m*m*e*d*i*a*t*e*l*y*a*f*t*e*r*t*h*e*c*o*p*y*r*i*g*h*t*n*o*t*i*c*e*s,a*l*i*c*e*n*s*e*n*o*t*i*c*e*g*i*v*i*n*g*t*h*e*p*u*b*l*i*c*p*e*r*m*i*s*s*i*o*n*t*o*u*s*e*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n*u*n*d*e*r*t*h*e*t*e*r*m*s*o*f*t*h*i*s*L*i*c*e*n*s*e,i*n*t*h*e*f*o*r*m*s*h*o*w*n*i*n*t*h*e*A*d*d*e*n*d*u*m*b*e*l*o*w.

    <item*|G>P*r*e*s*e*r*v*e*i*n*t*h*a*t*l*i*c*e*n*s*e*n*o*t*i*c*e*t*h*e*f*u*l*l*l*i*s*t*s*o*f*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s*a*n*d*r*e*q*u*i*r*e*d*C*o*v*e*r*T*e*x*t*s*g*i*v*e*n*i*n*t*h*e*D*o*c*u*m*e*n*t<rprime|'>s*l*i*c*e*n*s*e*n*o*t*i*c*e.

    <item*|H>I*n*c*l*u*d*e*a*n*u*n*a*l*t*e*r*e*d*c*o*p*y*o*f*t*h*i*s*L*i*c*e*n*s*e.

    <item*|I>P*r*e*s*e*r*v*e*t*h*e*s*e*c*t*i*o*n*E*n*t*i*t*l*e*d``H*i*s*t*o*r*y",P*r*e*s*e*r*v*e*i*t*s*T*i*t*l*e,a*n*d*a*d*d*t*o*i*t*a*n*i*t*e*m*s*t*a*t*i*n*g*a*t*l*e*a*s*t*t*h*e*t*i*t*l*e,y*e*a*r,n*e*w*a*u*t*h*o*r*s,a*n*d*p*u*b*l*i*s*h*e*r*o*f*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n*a*s*g*i*v*e*n*o*n*t*h*e*T*i*t*l*e*P*a*g*e.I*f*v*t*h*e*r*e*i*s*n*o*s*e*c*t*i*o*n*E*n*t*i*t*l*e*d``H*i*s*t*o*r*y<rprime|''>i*n*t*h*e*D*o*c*u*m*e*n*t,c*r*e*a*t*e*o*n*e*s*t*a*t*i*n*g*t*h*e*t*i*t*l*e,y*e*a*r,a*u*t*h*o*r*s,a*n*d*p*u*b*l*i*s*h*e*r*o*f*t*h*e*D*o*c*u*m*e*n*t*a*s*g*i*v*e*n*o*n*i*t*s*T*i*t*l*e*P*a*g*e,t*h*e*n*a*d*d*a*n*i*t*e*m*d*e*s*c*r*i*b*i*n*g*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n*a*s*s*t*a*t*e*d*i*n*t*h*e*p*r*e*v*i*o*u*s*s*e*n*t*e*n*c*e.

    <item*|J>P*r*e*s*e*r*v*e*t*h*e*n*e*t*w*o*r*k*l*o*c*a*t*i*o*n,i*f*a*n*y,g*i*v*e*n*i*n*t*h*e*D*o*c*u*m*e*n*t*f*o*r*p*u*b*l*i*c*a*c*c*e*s*s*t*o*a*T*r*a*n*s*p*a*r*e*n*t*c*o*p*y*o*f*t*h*e*D*o*c*u*m*e*n*t,a*n*d*l*i*k*e*w*i*s*e*t*h*e*n*e*t*w*o*r*k*l*o*c*a*t*i*o*n*s*g*i*v*e*n*i*n*t*h*e*D*o*c*u*m*e*n*t*f*o*r*p*r*e*v*i*o*u*s*v*e*r*s*i*o*n*s*i*t*w*a*s*b*a*s*e*d*o*n.T*h*e*s*e*m*a*y*b*e*p*l*a*c*e*d*i*n*t*h*e``H*i*s*t*o*r*y<rprime|''>s*e*c*t*i*o*n.Y*o*u*m*a*y*o*m*i*t*a*n*e*t*w*o*r*k*l*o*c*a*t*i*o*n*f*o*r*a*w*o*r*k*t*h*a*t*w*a*s*p*u*b*l*i*s*h*e*d*a*t*l*e*a*s*t*f*o*u*r*y*e*a*r*s*b*e*f*o*r*e*t*h*e*D*o*c*u*m*e*n*t*i*t*s*e*l*f,o*r*i*f*t*h*e*o*r*i*g*i*n*a*l*p*u*b*l*i*s*h*e*r*o*f*t*h*e*v*e*r*s*i*o*n*i*t*r*e*f*e*r*s*t*o*g*i*v*e*s*p*e*r*m*i*s*s*i*o*n.

    <item*|K>F*o*r*a*n*y*s*e*c*t*i*o*n*E*n*t*i*t*l*e*d``A*c*k*n*o*w*l*e*d*g*e*m*e*n*t*s<rprime|''>o*r``D*e*d*i*c*a*t*i*o*n*s",P*r*e*s*e*r*v*e*t*h*e*T*i*t*l*e*o*f*t*h*e*s*e*c*t*i*o*n,a*n*d*p*r*e*s*e*r*v*e*i*n*t*h*e*s*e*c*t*i*o*n*a*l*l*t*h*e*s*u*b*s*t*a*n*c*e*a*n*d*t*o*n*e*o*f*e*a*c*h*o*f*t*h*e*c*o*n*t*r*i*b*u*t*o*r*a*c*k*n*o*w*l*e*d*g*e*m*e*n*t*s*a*n*d/o*r*d*e*d*i*c*a*t*i*o*n*s*g*i*v*e*n*t*h*e*r*e*i*n.

    <item*|L>P*r*e*s*e*r*v*e*a*l*l*t*h*e*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s*o*f*t*h*e*D*o*c*u*m*e*n*t,u*n*a*l*t*e*r*e*d*i*n*t*h*e*i*r*t*e*x*t*a*n*d*i*n*t*h*e*i*r*t*i*t*l*e*s.S*e*c*t*i*o*n*n*u*m*b*e*r*s*o*r*t*h*e*e*q*u*i*v*a*l*e*n*t*a*r*e*n*o*t*c*o*n*s*i*d*e*r*e*d*p*a*r*t*o*f*t*h*e*s*e*c*t*i*o*n*t*i*t*l*e*s.

    <item*|M>D*e*l*e*t*e*a*n*y*s*e*c*t*i*o*n*E*n*t*i*t*l*e*d``E*n*d*o*r*s*e*m*e*n*t*s".S*u*c*h*a*s*e*c*t*i*o*n*m*a*y*n*o*t*b*e*i*n*c*l*u*d*e*d*i*n*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n.

    <item*|N>D*o*n*o*t*r*e*t*i*t*l*e*a*n*y*e*x*i*s*t*i*n*g*s*e*c*t*i*o*n*t*o*b*e*E*n*t*i*t*l*e*d``E*n*d*o*r*s*e*m*e*n*t*s"o*r*t*o*c*o*n*f*l*i*c*t*i*n*t*i*t*l*e*w*i*t*h*a*n*y*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n.

    <item*|O>P*r*e*s*e*r*v*e*a*n*y*W*a*r*r*a*n*t*y*D*i*s*c*l*a*i*m*e*r*s.
  </itemize>

  I*f*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n*i*n*c*l*u*d*e*s*n*e*w*f*r*o*n*t-m*a*t*t*e*r*s*e*c*t*i*o*n*s*o*r*a*p*p*e*n*d*i*c*e*s*t*h*a*t*q*u*a*l*i*f*y*a*s*S*e*c*o*n*d*a*r*y*S*e*c*t*i*o*n*s*a*n*d*c*o*n*t*a*i*n*n*o*m*a*t*e*r*i*a*l*c*o*p*i*e*d*f*r*o*m*t*h*e*D*o*c*u*m*e*n*t,y*o*u*m*a*y*a*t*y*o*u*r*o*p*t*i*o*n*d*e*s*i*g*n*a*t*e*s*o*m*e*o*r*a*l*l*o*f*t*h*e*s*e*s*e*c*t*i*o*n*s*a*s*i*n*v*a*r*i*a*n*t.T*o*d*o*t*h*i*s,a*d*d*t*h*e*i*r*t*i*t*l*e*s*t*o*t*h*e*l*i*s*t*o*f*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s*i*n*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n<rprime|'>s*l*i*c*e*n*s*e*n*o*t*i*c*e.T*h*e*s*e*t*i*t*l*e*s*m*u*s*t*b*e*d*i*s*t*i*n*c*t*f*r*o*m*a*n*y*o*t*h*e*r*s*e*c*t*i*o*n*t*i*t*l*e*s.

  Y*o*u*m*a*y*a*d*d*a*s*e*c*t*i*o*n*E*n*t*i*t*l*e*d``E*n*d*o*r*s*e*m*e*n*t*s",p*r*o*v*i*d*e*d*i*t*c*o*n*t*a*i*n*s*n*o*t*h*i*n*g*b*u*t*e*n*d*o*r*s*e*m*e*n*t*s*o*f*y*o*u*r*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n*b*y*v*a*r*i*o*u*s*p*a*r*t*i*e*s--f*o*r*e*x*a*m*p*l*e,s*t*a*t*e*m*e*n*t*s*o*f*p*e*e*r*r*e*v*i*e*w*o*r*t*h*a*t*t*h*e*t*e*x*t*h*a*s*b*e*e*n*a*p*p*r*o*v*e*d*b*y*a*n*o*r*g*a*n*i*z*a*t*i*o*n*a*s*t*h*e*a*u*t*h*o*r*i*t*a*t*i*v*e*d*e*f*i*n*i*t*i*o*n*o*f*a*s*t*a*n*d*a*r*d.

  Y*o*u*m*a*y*a*d*d*a*p*a*s*s*a*g*e*o*f*u*p*t*o*f*i*v*e*w*o*r*d*s*a*s*a*F*r*o*n*t-C*o*v*e*r*T*e*x*t,a*n*d*a*p*a*s*s*a*g*e*o*f*u*p*t*o25w*o*r*d*s*a*s*a*B*a*c*k-C*o*v*e*r*T*e*x*t,t*o*t*h*e*e*n*d*o*f*t*h*e*l*i*s*t*o*f*C*o*v*e*r*T*e*x*t*s*i*n*t*h*e*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n.O*n*l*y*o*n*e*p*a*s*s*a*g*e*o*f*F*r*o*n*t-C*o*v*e*r*T*e*x*t*a*n*d*o*n*e*o*f*B*a*c*k-C*o*v*e*r*T*e*x*t*m*a*y*b*e*a*d*d*e*d*b*y(o*r*t*h*r*o*u*g*h*a*r*r*a*n*g*e*m*e*n*t*s*m*a*d*e*b*y)a*n*y*o*n*e*e*n*t*i*t*y.I*f*t*h*e*D*o*c*u*m*e*n*t*a*l*r*e*a*d*y*i*n*c*l*u*d*e*s*a*c*o*v*e*r*t*e*x*t*f*o*r*t*h*e*s*a*m*e*c*o*v*e*r,p*r*e*v*i*o*u*s*l*y*a*d*d*e*d*b*y*y*o*u*o*r*b*y*a*r*r*a*n*g*e*m*e*n*t*m*a*d*e*b*y*t*h*e*s*a*m*e*e*n*t*i*t*y*y*o*u*a*r*e*a*c*t*i*n*g*o*n*b*e*h*a*l*f*o*f,y*o*u*m*a*y*n*o*t*a*d*d*a*n*o*t*h*e*r;b*u*t*y*o*u*m*a*y*r*e*p*l*a*c*e*t*h*e*o*l*d*o*n*e,o*n*e*x*p*l*i*c*i*t*p*e*r*m*i*s*s*i*o*n*f*r*o*m*t*h*e*p*r*e*v*i*o*u*s*p*u*b*l*i*s*h*e*r*t*h*a*t*a*d*d*e*d*t*h*e*o*l*d*o*n*e.

  T*h*e*a*u*t*h*o*r(s)a*n*d*p*u*b*l*i*s*h*e*r(s)o*f*t*h*e*D*o*c*u*m*e*n*t*d*o*n*o*t*b*y*t*h*i*s*L*i*c*e*n*s*e*g*i*v*e*p*e*r*m*i*s*s*i*o*n*t*o*u*s*e*t*h*e*i*r*n*a*m*e*s*f*o*r*p*u*b*l*i*c*i*t*y*f*o*r*o*r*t*o*a*s*s*e*r*t*o*r*i*m*p*l*y*e*n*d*o*r*s*e*m*e*n*t*o*f*a*n*y*M*o*d*i*f*i*e*d*V*e*r*s*i*o*n.

  <\center>
    <\with|font-size|1.41>
      <with|font-series|bold|5.C*O*M*B*I*N*I*N*G*D*O*C*U*M*E*N*T*S>
    </with>
  </center>

  Y*o*u*m*a*y*c*o*m*b*i*n*e*t*h*e*D*o*c*u*m*e*n*t*w*i*t*h*o*t*h*e*r*d*o*c*u*m*e*n*t*s*r*e*l*e*a*s*e*d*u*n*d*e*r*t*h*i*s*L*i*c*e*n*s*e,u*n*d*e*r*t*h*e*t*e*r*m*s*d*e*f*i*n*e*d*i*n*s*e*c*t*i*o*n4a*b*o*v*e*f*o*r*m*o*d*i*f*i*e*d*v*e*r*s*i*o*n*s,p*r*o*v*i*d*e*d*t*h*a*t*y*o*u*i*n*c*l*u*d*e*i*n*t*h*e*c*o*m*b*i*n*a*t*i*o*n*a*l*l*o*f*t*h*e*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s*o*f*a*l*l*o*f*t*h*e*o*r*i*g*i*n*a*l*d*o*c*u*m*e*n*t*s,u*n*m*o*d*i*f*i*e*d,a*n*d*l*i*s*t*t*h*e*m*a*l*l*a*s*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s*o*f*y*o*u*r*c*o*m*b*i*n*e*d*w*o*r*k*i*n*i*t*s*l*i*c*e*n*s*e*n*o*t*i*c*e,a*n*d*t*h*a*t*y*o*u*p*r*e*s*e*r*v*e*a*l*l*t*h*e*i*r*W*a*r*r*a*n*t*y*D*i*s*c*l*a*i*m*e*r*s.

  T*h*e*c*o*m*b*i*n*e*d*w*o*r*k*n*e*e*d*o*n*l*y*c*o*n*t*a*i*n*o*n*e*c*o*p*y*o*f*t*h*i*s*L*i*c*e*n*s*e,a*n*d*m*u*l*t*i*p*l*e*i*d*e*n*t*i*c*a*l*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s*m*a*y*b*e*r*e*p*l*a*c*e*d*w*i*t*h*a*s*i*n*g*l*e*c*o*p*y.I*f*t*h*e*r*e*a*r*e*m*u*l*t*i*p*l*e*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s*w*i*t*h*t*h*e*s*a*m*e*n*a*m*e*b*u*t*d*i*f*f*e*r*e*n*t*c*o*n*t*e*n*t*s,m*a*k*e*t*h*e*t*i*t*l*e*o*f*e*a*c*h*s*u*c*h*s*e*c*t*i*o*n*u*n*i*q*u*e*b*y*a*d*d*i*n*g*a*t*t*h*e*e*n*d*o*f*i*t,i*n*p*a*r*e*n*t*h*e*s*e*s,t*h*e*n*a*m*e*o*f*t*h*e*o*r*i*g*i*n*a*l*a*u*t*h*o*r*o*r*p*u*b*l*i*s*h*e*r*o*f*t*h*a*t*s*e*c*t*i*o*n*i*f*k*n*o*w*n,o*r*e*l*s*e*a*u*n*i*q*u*e*n*u*m*b*e*r.M*a*k*e*t*h*e*s*a*m*e*a*d*j*u*s*t*m*e*n*t*t*o*t*h*e*s*e*c*t*i*o*n*t*i*t*l*e*s*i*n*t*h*e*l*i*s*t*o*f*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s*i*n*t*h*e*l*i*c*e*n*s*e*n*o*t*i*c*e*o*f*t*h*e*c*o*m*b*i*n*e*d*w*o*r*k.

  I*n*t*h*e*c*o*m*b*i*n*a*t*i*o*n,y*o*u*m*u*s*t*c*o*m*b*i*n*e*a*n*y*s*e*c*t*i*o*n*s*E*n*t*i*t*l*e*d``H*i*s*t*o*r*y"i*n*t*h*e*v*a*r*i*o*u*s*o*r*i*g*i*n*a*l*d*o*c*u*m*e*n*t*s,f*o*r*m*i*n*g*o*n*e*s*e*c*t*i*o*n*E*n*t*i*t*l*e*d"H*i*s*t*o*r*y";l*i*k*e*w*i*s*e*c*o*m*b*i*n*e*a*n*y*s*e*c*t*i*o*n*s*E*n*t*i*t*l*e*d``A*c*k*n*o*w*l*e*d*g*e*m*e*n*t*s",a*n*d*a*n*y*s*e*c*t*i*o*n*s*E*n*t*i*t*l*e*d``D*e*d*i*c*a*t*i*o*n*s".Y*o*u*m*u*s*t*d*e*l*e*t*e*a*l*l*s*e*c*t*i*o*n*s*E*n*t*i*t*l*e*d``E*n*d*o*r*s*e*m*e*n*t*s".

  <\center>
    <\with|font-size|1.41>
      <with|font-series|bold|6.C*O*L*L*E*C*T*I*O*N*S*O*F*D*O*C*U*M*E*N*T*S>
    </with>
  </center>

  Y*o*u*m*a*y*m*a*k*e*a*c*o*l*l*e*c*t*i*o*n*c*o*n*s*i*s*t*i*n*g*o*f*t*h*e*D*o*c*u*m*e*n*t*a*n*d*o*t*h*e*r*d*o*c*u*m*e*n*t*s*r*e*l*e*a*s*e*d*u*n*d*e*r*t*h*i*s*L*i*c*e*n*s*e,a*n*d*r*e*p*l*a*c*e*t*h*e*i*n*d*i*v*i*d*u*a*l*c*o*p*i*e*s*o*f*t*h*i*s*L*i*c*e*n*s*e*i*n*t*h*e*v*a*r*i*o*u*s*d*o*c*u*m*e*n*t*s*w*i*t*h*a*s*i*n*g*l*e*c*o*p*y*t*h*a*t*i*s*i*n*c*l*u*d*e*d*i*n*t*h*e*c*o*l*l*e*c*t*i*o*n,p*r*o*v*i*d*e*d*t*h*a*t*y*o*u*f*o*l*l*o*w*t*h*e*r*u*l*e*s*o*f*t*h*i*s*L*i*c*e*n*s*e*f*o*r*v*e*r*b*a*t*i*m*c*o*p*y*i*n*g*o*f*e*a*c*h*o*f*t*h*e*d*o*c*u*m*e*n*t*s*i*n*a*l*l*o*t*h*e*r*r*e*s*p*e*c*t*s.

  Y*o*u*m*a*y*e*x*t*r*a*c*t*a*s*i*n*g*l*e*d*o*c*u*m*e*n*t*f*r*o*m*s*u*c*h*a*c*o*l*l*e*c*t*i*o*n,a*n*d*d*i*s*t*r*i*b*u*t*e*i*t*i*n*d*i*v*i*d*u*a*l*l*y*u*n*d*e*r*t*h*i*s*L*i*c*e*n*s*e,p*r*o*v*i*d*e*d*y*o*u*i*n*s*e*r*t*a*c*o*p*y*o*f*t*h*i*s*L*i*c*e*n*s*e*i*n*t*o*t*h*e*e*x*t*r*a*c*t*e*d*d*o*c*u*m*e*n*t,a*n*d*f*o*l*l*o*w*t*h*i*s*L*i*c*e*n*s*e*i*n*a*l*l*o*t*h*e*r*r*e*s*p*e*c*t*s*r*e*g*a*r*d*i*n*g*v*e*r*b*a*t*i*m*c*o*p*y*i*n*g*o*f*t*h*a*t*d*o*c*u*m*e*n*t.

  <\center>
    <\with|font-size|1.41>
      <with|font-series|bold|7.A*G*G*R*E*G*A*T*I*O*N*W*I*T*H*I*N*D*E*P*E*N*D*E*N*T*W*O*R*K*S>
    </with>
  </center>

  A*c*o*m*p*i*l*a*t*i*o*n*o*f*t*h*e*D*o*c*u*m*e*n*t*o*r*i*t*s*d*e*r*i*v*a*t*i*v*e*s*w*i*t*h*o*t*h*e*r*s*e*p*a*r*a*t*e*a*n*d*i*n*d*e*p*e*n*d*e*n*t*d*o*c*u*m*e*n*t*s*o*r*w*o*r*k*s,i*n*o*r*o*n*a*v*o*l*u*m*e*o*f*a*s*t*o*r*a*g*e*o*r*d*i*s*t*r*i*b*u*t*i*o*n*m*e*d*i*u*m,i*s*c*a*l*l*e*d*a*n``a*g*g*r*e*g*a*t*e<rprime|''>i*f*t*h*e*c*o*p*y*r*i*g*h*t*r*e*s*u*l*t*i*n*g*f*r*o*m*t*h*e*c*o*m*p*i*l*a*t*i*o*n*i*s*n*o*t*u*s*e*d*t*o*l*i*m*i*t*t*h*e*l*e*g*a*l*r*i*g*h*t*s*o*f*t*h*e*c*o*m*p*i*l*a*t*i*o*n<rprime|'>s*u*s*e*r*s*b*e*y*o*n*d*w*h*a*t*t*h*e*i*n*d*i*v*i*d*u*a*l*w*o*r*k*s*p*e*r*m*i*t.W*h*e*n*t*h*e*D*o*c*u*m*e*n*t*i*s*i*n*c*l*u*d*e*d*i*n*a*n*a*g*g*r*e*g*a*t*e,t*h*i*s*L*i*c*e*n*s*e*d*o*e*s*n*o*t*a*p*p*l*y*t*o*t*h*e*o*t*h*e*r*w*o*r*k*s*i*n*t*h*e*a*g*g*r*e*g*a*t*e*w*h*i*c*h*a*r*e*n*o*t*t*h*e*m*s*e*l*v*e*s*d*e*r*i*v*a*t*i*v*e*w*o*r*k*s*o*f*t*h*e*D*o*c*u*m*e*n*t.

  I*f*t*h*e*C*o*v*e*r*T*e*x*t*r*e*q*u*i*r*e*m*e*n*t*o*f*s*e*c*t*i*o*n3i*s*a*p*p*l*i*c*a*b*l*e*t*o*t*h*e*s*e*c*o*p*i*e*s*o*f*t*h*e*D*o*c*u*m*e*n*t,t*h*e*n*i*f*t*h*e*D*o*c*u*m*e*n*t*i*s*l*e*s*s*t*h*a*n*o*n*e*h*a*l*f*o*f*t*h*e*e*n*t*i*r*e*a*g*g*r*e*g*a*t*e,t*h*e*D*o*c*u*m*e*n*t<rprime|'>s*C*o*v*e*r*T*e*x*t*s*m*a*y*b*e*p*l*a*c*e*d*o*n*c*o*v*e*r*s*t*h*a*t*b*r*a*c*k*e*t*t*h*e*D*o*c*u*m*e*n*t*w*i*t*h*i*n*t*h*e*a*g*g*r*e*g*a*t*e,o*r*t*h*e*e*l*e*c*t*r*o*n*i*c*e*q*u*i*v*a*l*e*n*t*o*f*c*o*v*e*r*s*i*f*t*h*e*D*o*c*u*m*e*n*t*i*s*i*n*e*l*e*c*t*r*o*n*i*c*f*o*r*m.O*t*h*e*r*w*i*s*e*t*h*e*y*m*u*s*t*a*p*p*e*a*r*o*n*p*r*i*n*t*e*d*c*o*v*e*r*s*t*h*a*t*b*r*a*c*k*e*t*t*h*e*w*h*o*l*e*a*g*g*r*e*g*a*t*e.

  <\center>
    <\with|font-size|1.41>
      <with|font-series|bold|8.T*R*A*N*S*L*A*T*I*O*N>
    </with>
  </center>

  T*r*a*n*s*l*a*t*i*o*n*i*s*c*o*n*s*i*d*e*r*e*d*a*k*i*n*d*o*f*m*o*d*i*f*i*c*a*t*i*o*n,s*o*y*o*u*m*a*y*d*i*s*t*r*i*b*u*t*e*t*r*a*n*s*l*a*t*i*o*n*s*o*f*t*h*e*D*o*c*u*m*e*n*t*u*n*d*e*r*t*h*e*t*e*r*m*s*o*f*s*e*c*t*i*o*n4.R*e*p*l*a*c*i*n*g*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s*w*i*t*h*t*r*a*n*s*l*a*t*i*o*n*s*r*e*q*u*i*r*e*s*s*p*e*c*i*a*l*p*e*r*m*i*s*s*i*o*n*f*r*o*m*t*h*e*i*r*c*o*p*y*r*i*g*h*t*h*o*l*d*e*r*s,b*u*t*y*o*u*m*a*y*i*n*c*l*u*d*e*t*r*a*n*s*l*a*t*i*o*n*s*o*f*s*o*m*e*o*r*a*l*l*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s*i*n*a*d*d*i*t*i*o*n*t*o*t*h*e*o*r*i*g*i*n*a*l*v*e*r*s*i*o*n*s*o*f*t*h*e*s*e*I*n*v*a*r*i*a*n*t*S*e*c*t*i*o*n*s.Y*o*u*m*a*y*i*n*c*l*u*d*e*a*t*r*a*n*s*l*a*t*i*o*n*o*f*t*h*i*s*L*i*c*e*n*s*e,a*n*d*a*l*l*t*h*e*l*i*c*e*n*s*e*n*o*t*i*c*e*s*i*n*t*h*e*D*o*c*u*m*e*n*t,a*n*d*a*n*y*W*a*r*r*a*n*t*y*D*i*s*c*l*a*i*m*e*r*s,p*r*o*v*i*d*e*d*t*h*a*t*y*o*u*a*l*s*o*i*n*c*l*u*d*e*t*h*e*o*r*i*g*i*n*a*l*E*n*g*l*i*s*h*v*e*r*s*i*o*n*o*f*t*h*i*s*L*i*c*e*n*s*e*a*n*d*t*h*e*o*r*i*g*i*n*a*l*v*e*r*s*i*o*n*s*o*f*t*h*o*s*e*n*o*t*i*c*e*s*a*n*d*d*i*s*c*l*a*i*m*e*r*s.I*n*c*a*s*e*o*f*a*d*i*s*a*g*r*e*e*m*e*n*t*b*e*t*w*e*e*n*t*h*e*t*r*a*n*s*l*a*t*i*o*n*a*n*d*t*h*e*o*r*i*g*i*n*a*l*v*e*r*s*i*o*n*o*f*t*h*i*s*L*i*c*e*n*s*e*o*r*a*n*o*t*i*c*e*o*r*d*i*s*c*l*a*i*m*e*r,t*h*e*o*r*i*g*i*n*a*l*v*e*r*s*i*o*n*w*i*l*l*p*r*e*v*a*i*l.

  I*f*a*s*e*c*t*i*o*n*i*n*t*h*e*D*o*c*u*m*e*n*t*i*s*E*n*t*i*t*l*e*d``A*c*k*n*o*w*l*e*d*g*e*m*e*n*t*s","D*e*d*i*c*a*t*i*o*n*s",o*r``H*i*s*t*o*r*y",t*h*e*r*e*q*u*i*r*e*m*e*n*t(s*e*c*t*i*o*n4)t*o*P*r*e*s*e*r*v*e*i*t*s*T*i*t*l*e(s*e*c*t*i*o*n1)w*i*l*l*t*y*p*i*c*a*l*l*y*r*e*q*u*i*r*e*c*h*a*n*g*i*n*g*t*h*e*a*c*t*u*a*l*t*i*t*l*e.

  <\center>
    <\with|font-size|1.41>
      <with|font-series|bold|9.T*E*R*M*I*N*A*T*I*O*N>
    </with>
  </center>

  Y*o*u*m*a*y*n*o*t*c*o*p*y,m*o*d*i*f*y,s*u*b*l*i*c*e*n*s*e,o*r*d*i*s*t*r*i*b*u*t*e*t*h*e*D*o*c*u*m*e*n*t*e*x*c*e*p*t*a*s*e*x*p*r*e*s*s*l*y*p*r*o*v*i*d*e*d*f*o*r*u*n*d*e*r*t*h*i*s*L*i*c*e*n*s*e.A*n*y*o*t*h*e*r*a*t*t*e*m*p*t*t*o*c*o*p*y,m*o*d*i*f*y,s*u*b*l*i*c*e*n*s*e*o*r*d*i*s*t*r*i*b*u*t*e*t*h*e*D*o*c*u*m*e*n*t*i*s*v*o*i*d,a*n*d*w*i*l*l*a*u*t*o*m*a*t*i*c*a*l*l*y*t*e*r*m*i*n*a*t*e*y*o*u*r*r*i*g*h*t*s*u*n*d*e*r*t*h*i*s*L*i*c*e*n*s*e.H*o*w*e*v*e*r,p*a*r*t*i*e*s*w*h*o*h*a*v*e*r*e*c*e*i*v*e*d*c*o*p*i*e*s,o*r*r*i*g*h*t*s,f*r*o*m*y*o*u*u*n*d*e*r*t*h*i*s*L*i*c*e*n*s*e*w*i*l*l*n*o*t*h*a*v*e*t*h*e*i*r*l*i*c*e*n*s*e*s*t*e*r*m*i*n*a*t*e*d*s*o*l*o*n*g*a*s*s*u*c*h*p*a*r*t*i*e*s*r*e*m*a*i*n*i*n*f*u*l*l*c*o*m*p*l*i*a*n*c*e.

  <\center>
    <\with|font-size|1.41>
      <with|font-series|bold|10.F*U*T*U*R*E*R*E*V*I*S*I*O*N*S*O*F*T*H*I*S*L*I*C*E*N*S*E>
    </with>
  </center>

  T*h*e*F*r*e*e*S*o*f*t*w*a*r*e*F*o*u*n*d*a*t*i*o*n*m*a*y*p*u*b*l*i*s*h*n*e*w,r*e*v*i*s*e*d*v*e*r*s*i*o*n*s*o*f*t*h*e*G*N*U*F*r*e*e*D*o*c*u*m*e*n*t*a*t*i*o*n*L*i*c*e*n*s*e*f*r*o*m*t*i*m*e*t*o*t*i*m*e.S*u*c*h*n*e*w*v*e*r*s*i*o*n*s*w*i*l*l*b*e*s*i*m*i*l*a*r*i*n*s*p*i*r*i*t*t*o*t*h*e*p*r*e*s*e*n*t*v*e*r*s*i*o*n,b*u*t*m*a*y*d*i*f*f*e*r*i*n*d*e*t*a*i*l*t*o*a*d*d*r*e*s*s*n*e*w*p*r*o*b*l*e*m*s*o*r*c*o*n*c*e*r*n*s.S*e*e*h*t*t*p://w*w*w.g*n*u.o*r*g/c*o*p*y*l*e*f*t/.

  E*a*c*h*v*e*r*s*i*o*n*o*f*t*h*e*L*i*c*e*n*s*e*i*s*g*i*v*e*n*a*d*i*s*t*i*n*g*u*i*s*h*i*n*g*v*e*r*s*i*o*n*n*u*m*b*e*r.I*f*t*h*e*D*o*c*u*m*e*n*t*s*p*e*c*i*f*i*e*s*t*h*a*t*a*p*a*r*t*i*c*u*l*a*r*n*u*m*b*e*r*e*d*v*e*r*s*i*o*n*o*f*t*h*i*s*L*i*c*e*n*s*e``o*r*a*n*y*l*a*t*e*r*v*e*r*s*i*o*n<rprime|''>a*p*p*l*i*e*s*t*o*i*t,y*o*u*h*a*v*e*t*h*e*o*p*t*i*o*n*o*f*f*o*l*l*o*w*i*n*g*t*h*e*t*e*r*m*s*a*n*d*c*o*n*d*i*t*i*o*n*s*e*i*t*h*e*r*o*f*t*h*a*t*s*p*e*c*i*f*i*e*d*v*e*r*s*i*o*n*o*r*o*f*a*n*y*l*a*t*e*r*v*e*r*s*i*o*n*t*h*a*t*h*a*s*b*e*e*n*p*u*b*l*i*s*h*e*d(n*o*t*a*s*a*d*r*a*f*t)b*y*t*h*e*F*r*e*e*S*o*f*t*w*a*r*e*F*o*u*n*d*a*t*i*o*n.I*f*t*h*e*D*o*c*u*m*e*n*t*d*o*e*s*n*o*t*s*p*e*c*i*f*y*a*v*e*r*s*i*o*n*n*u*m*b*e*r*o*f*t*h*i*s*L*i*c*e*n*s*e,y*o*u*m*a*y*c*h*o*o*s*e*a*n*y*v*e*r*s*i*o*n*e*v*e*r*p*u*b*l*i*s*h*e*d(n*o*t*a*s*a*d*r*a*f*t)b*y*t*h*e*F*r*e*e*S*o*f*t*w*a*r*e*F*o*u*n*d*a*t*i*o*n.

  <\bibliography|bib|plain|b*i*b*l*i*o>
    \;
  </bibliography>

  <printindex>
</body>

<\references>
  <\collection>
    <associate|alg:a4|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|35>>
    <associate|alg:baby|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|17>>
    <associate|alg:basis|<tuple|1.17|9>>
    <associate|alg:conductor|<tuple|2.16|20>>
    <associate|alg:dir|<tuple|2.2|20>>
    <associate|alg:dirfac|<tuple|2.14|20>>
    <associate|alg:enum|<tuple|3.16|28>>
    <associate|alg:eval|<tuple|2.8|17>>
    <associate|alg:extend|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|21>>
    <associate|alg:gauss|<tuple|5.2|38>>
    <associate|alg:gen|<tuple|3.10|26>>
    <associate|alg:kronecker|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|19>>
    <associate|alg:mingens|<tuple|2.5|16>>
    <associate|alg:modech|<tuple|5.1|40>>
    <associate|alg:ratrecon|<tuple|5|39>>
    <associate|alg:restrict|<tuple|2.17|21>>
    <associate|alg:sum1go|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|35>>
    <associate|alg:suma4|<tuple|4.3|35>>
    <associate|auto-1|<tuple|<uninit>|4>>
    <associate|auto-10|<tuple|2|15>>
    <associate|auto-11|<tuple|2.1|20>>
    <associate|auto-12|<tuple|2.2|22>>
    <associate|auto-13|<tuple|2.3|24>>
    <associate|auto-14|<tuple|3|24>>
    <associate|auto-15|<tuple|3.1|26>>
    <associate|auto-16|<tuple|3.2|27>>
    <associate|auto-17|<tuple|3.3|30>>
    <associate|auto-18|<tuple|4|30>>
    <associate|auto-19|<tuple|4.1|31>>
    <associate|auto-2|<tuple|<uninit>|5>>
    <associate|auto-20|<tuple|4.1.1|33>>
    <associate|auto-21|<tuple|4.2|34>>
    <associate|auto-22|<tuple|4.3|37>>
    <associate|auto-23|<tuple|5|37>>
    <associate|auto-24|<tuple|5.1|39>>
    <associate|auto-25|<tuple|5.2|41>>
    <associate|auto-26|<tuple|1|41>>
    <associate|auto-27|<tuple|1|42>>
    <associate|auto-28|<tuple|5.3|42>>
    <associate|auto-29|<tuple|5.3|42>>
    <associate|auto-3|<tuple|1|5>>
    <associate|auto-30|<tuple|5.3|43>>
    <associate|auto-31|<tuple|6|43>>
    <associate|auto-32|<tuple|6.1|45>>
    <associate|auto-33|<tuple|6.2|47>>
    <associate|auto-34|<tuple|6.2.1|48>>
    <associate|auto-35|<tuple|6.2.2|48>>
    <associate|auto-36|<tuple|6.3|48>>
    <associate|auto-37|<tuple|6.3.1|50>>
    <associate|auto-38|<tuple|6.3.2|52>>
    <associate|auto-39|<tuple|6.3.3|52>>
    <associate|auto-4|<tuple|1.1|6>>
    <associate|auto-40|<tuple|6.4|53>>
    <associate|auto-41|<tuple|6.5|56>>
    <associate|auto-42|<tuple|6.6|58>>
    <associate|auto-43|<tuple|6.7|58>>
    <associate|auto-44|<tuple|6.7.1|58>>
    <associate|auto-45|<tuple|6.7.2|60>>
    <associate|auto-46|<tuple|7|61>>
    <associate|auto-47|<tuple|8|61>>
    <associate|auto-48|<tuple|8.1|61>>
    <associate|auto-49|<tuple|8.2|62>>
    <associate|auto-5|<tuple|1.2|8>>
    <associate|auto-50|<tuple|9|62>>
    <associate|auto-51|<tuple|9.1|62>>
    <associate|auto-52|<tuple|9.2|62>>
    <associate|auto-53|<tuple|9.3|63>>
    <associate|auto-54|<tuple|10|63>>
    <associate|auto-55|<tuple|10.1|63>>
    <associate|auto-56|<tuple|10.2|63>>
    <associate|auto-57|<tuple|10.3|63>>
    <associate|auto-58|<tuple|10.4|64>>
    <associate|auto-59|<tuple|11|64>>
    <associate|auto-6|<tuple|1.3|9>>
    <associate|auto-60|<tuple|11.1|64>>
    <associate|auto-61|<tuple|11.2|64>>
    <associate|auto-62|<tuple|11.3|64>>
    <associate|auto-63|<tuple|11.4|65>>
    <associate|auto-64|<tuple|12|65>>
    <associate|auto-65|<tuple|12.1|65>>
    <associate|auto-66|<tuple|12.2|65>>
    <associate|auto-67|<tuple|12.3|65>>
    <associate|auto-68|<tuple|12.4|65>>
    <associate|auto-69|<tuple|12.5|66>>
    <associate|auto-7|<tuple|1.4|12>>
    <associate|auto-70|<tuple|12.5|68>>
    <associate|auto-71|<tuple|12.5|?>>
    <associate|auto-8|<tuple|1.5|14>>
    <associate|auto-9|<tuple|1.6|15>>
    <associate|ch:dim|<tuple|4|30>>
    <associate|ch:dirichlet|<tuple|2|15>>
    <associate|ch:eisen|<tuple|3|24>>
    <associate|ch:levelone|<tuple|1|5>>
    <associate|ch:linalg|<tuple|5|37>>
    <associate|ch:manin|<tuple|12|65>>
    <associate|ch:modabvar|<tuple|10|63>>
    <associate|ch:modform|<tuple|8|61>>
    <associate|ch:modsym|<tuple|6|43>>
    <associate|ch:modsymcomp|<tuple|7|60>>
    <associate|ch:serre|<tuple|11|64>>
    <associate|cor:dim1|<tuple|1.16|9>>
    <associate|cor:dir|<tuple|2.4|16>>
    <associate|eqn:a4prodsum|<tuple|4.2|35>>
    <associate|eqn:bigstuff|<tuple|6.8|55>>
    <associate|eqn:cn|<tuple|6.4|50>>
    <associate|eqn:cos1a|<tuple|6.1|47>>
    <associate|eqn:cos1b|<tuple|6.2|47>>
    <associate|eqn:def|<tuple|1.3|7>>
    <associate|eqn:eisen|<tuple|3.1|27>>
    <associate|eqn:ekexp|<tuple|1.4|8>>
    <associate|eqn:epslist|<tuple|2.1|16>>
    <associate|eqn:gtilde|<tuple|6.3|50>>
    <associate|eqn:hecke|<tuple|1.6|10>>
    <associate|eqn:intpairing|<tuple|6.6|53>>
    <associate|eqn:lfs|<tuple|6.7|53>>
    <associate|eqn:modalgbound|<tuple|5.2|40>>
    <associate|eqn:modfunc|<tuple|1.1|5>>
    <associate|eqn:modfunc2|<tuple|1.2|5>>
    <associate|eqn:mumu|<tuple|4.1|32>>
    <associate|eqn:star|<tuple|6.9|55>>
    <associate|eqn:tnmanin|<tuple|6.5|51>>
    <associate|eqn:xgcdeqn|<tuple|5.1|40>>
    <associate|ex:bern|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|29>>
    <associate|ex:char|<tuple|2.17|21>>
    <associate|ex:cond2|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|23>>
    <associate|ex:cyclic|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|23>>
    <associate|ex:diag|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|29>>
    <associate|ex:dlogadd|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|23>>
    <associate|ex:gamma0|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|29>>
    <associate|ex:has|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|29>>
    <associate|ex:mingens|<tuple|2.7|16>>
    <associate|ex:new|<tuple|4.4|32>>
    <associate|ex:odd|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|29>>
    <associate|ex:orderalg|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|23>>
    <associate|ex:prodlocal|<tuple|2.15|20>>
    <associate|ex:surjred|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|29>>
    <associate|lem:deltan|<tuple|6.9|49>>
    <associate|lem:dual|<tuple|2.3|15>>
    <associate|lem:vm|<tuple|1.30|12>>
    <associate|prop:dimg0|<tuple|4.3|32>>
    <associate|prop:gamma1cosets|<tuple|6.6|47>>
    <associate|prop:heilbronn|<tuple|6.10|51>>
    <associate|prop:mangen|<tuple|6.3|45>>
    <associate|prop:mk|<tuple|1.13|8>>
    <associate|prop:newg0|<tuple|4.3|32>>
    <associate|prop:qexpGk|<tuple|1.9|7>>
    <associate|prop:qexpTn|<tuple|1.25|11>>
    <associate|prop:tn|<tuple|1.21|10>>
    <associate|prop:zeta|<tuple|1.10|7>>
    <associate|rem:co|<tuple|4.8|36>>
    <associate|sec:alter|<tuple|2.3|22>>
    <associate|sec:cremona|<tuple|10.4|63>>
    <associate|sec:dimg0|<tuple|4.1|30>>
    <associate|sec:echelon|<tuple|5.1|37>>
    <associate|sec:hecke|<tuple|1.4|9>>
    <associate|sec:level|<tuple|1.2|6>>
    <associate|sec:manin|<tuple|6.2|45>>
    <associate|sec:modularmethod|<tuple|5.2|39>>
    <associate|sec:periods|<tuple|9|62>>
    <associate|sec:qexps|<tuple|8.1|61>>
    <associate|sec:ratpm|<tuple|9.2|62>>
    <associate|sec:vmthesis|<tuple|1.5|12>>
    <associate|step:add|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|19>>
    <associate|step:addmod|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|21>>
    <associate|step:ber1|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|26>>
    <associate|step:ber2|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|26>>
    <associate|step:ber4|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|26>>
    <associate|step:cond|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|20>>
    <associate|step:discard|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|40>>
    <associate|step:enum|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|28>>
    <associate|step:eval|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|17>>
    <associate|step:extra2|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|20>>
    <associate|step:factor|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|20>>
    <associate|step:find|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|17>>
    <associate|step:gen|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|16>>
    <associate|step:nontriv|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|22>>
    <associate|step:singletons|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|20>>
    <associate|thm:atkin-lehner|<tuple|4.2|31>>
    <associate|thm:delta|<tuple|1.14|8>>
    <associate|thm:eiseigen|<tuple|3.16|28>>
    <associate|thm:eisgen|<tuple|3.15|28>>
    <associate|thm:eisser|<tuple|3.14|28>>
    <associate|thm:mansym|<tuple|6.5|46>>
    <associate|thm:mk|<tuple|1.17|9>>
    <associate|thm:valence|<tuple|1.6|6>>
    <associate|usevm|<tuple|<with|mode|<quote|math>||<quote|>|\<cdot\>|<quote|>|<with|math-font-series|<quote|bold>|<group|\<ast\>>>>|13>>
  </collection>
</references>

<\auxiliary>
  <\collection>
    <\associate|bib>
      stein:hecke

      magma

      cremona:algs

      cohen:course

      python

      serre:arithmetic

      serre:arithmetic

      serre:arithmetic

      serre:arithmetic

      serre:arithmetic

      serre:arithmetic

      serre:arithmetic

      serre:arithmetic

      iwaniec:topics

      serre:asymptotique

      serre:arithmetic

      lang:modular

      buzzard:t2

      farmer-james:maeda

      cohen:course

      cohen:course

      cohen:course

      shoup:lower

      nechaev:lower

      gordon:dlog

      gordon:dlp

      cohen:course

      cohen:course

      hijikata:trace

      miyake

      shimura:intro

      shimura:intro

      cohen-oesterle:dimensions

      shimura:intro

      miyake

      diamond-im

      lang:modular

      atkin-lehner

      winnie:newforms

      csirik-wetherell-zieve:g0

      cohen-oesterle:dimensions

      cohen-oesterle:dimensions

      cohen:course

      knuth2

      knuth2

      cohen:course

      merel:1585

      mtt

      merel:1585

      sokurov:shimura

      math252

      manin:parabolic

      merel:1585

      cremona:gammaone

      cremona:algs

      merel:1585

      mazur:symboles

      merel:1585

      cremona:algs

      basmaji:thesis

      merel:1585

      knapp:elliptic

      merel:1585

      merel:1585

      cremona:algs

      birch:bsd

      manin:parabolic

      merel:1585

      sokurov:shimura

      cremona:algs

      cremona:gammaone

      basmaji:thesis

      stein:phd

      agashe:phd

      diderot:thesis

      lemelin:dominic

      frey-muller

      dembele

      darmon-pollack

      mtt
    </associate>
    <\associate|idx>
      <tuple|<tuple|Magma>|<pageref|auto-25>>

      <tuple|<tuple|Magma>|<pageref|auto-26>>

      <tuple|<tuple|Magma>|<pageref|auto-28>>

      <tuple|<tuple|Magma>|<pageref|auto-29>>
    </associate>
    <\associate|toc>
      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|Preface>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-1><vspace|0.5fn>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|1<space|2spc>Modular
      Forms of Level One> <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-2><vspace|0.5fn>

      1.1<space|2spc>Basic Definitions <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-3>

      1.2<space|2spc>Eisenstein Series and Delta
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-4>

      1.3<space|2spc>Structure Theorem <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-5>

      1.4<space|2spc>Hecke Operators <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-6>

      1.5<space|2spc>The Victor Miller Basis
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-7>

      1.6<space|2spc>Can One Compute the Coefficients of
      <with|mode|<quote|math>|\<Delta\>> in Polynomial Time?
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-8>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|2<space|2spc>Dirichlet
      Characters> <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-9><vspace|0.5fn>

      2.1<space|2spc>Representation and Arithmetic
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-10>

      2.2<space|2spc>Algorithms <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-11>

      2.3<space|2spc>Alternative Representations of Characters
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-12>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|3<space|2spc>Modular
      Forms and Eisenstein Series of<next-line>Higher Level>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-13><vspace|0.5fn>

      3.1<space|2spc>Modular Forms of Higher Level
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-14>

      3.2<space|2spc>Generalized Bernoulli Numbers
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-15>

      3.3<space|2spc>Explicit Basis for the Eisenstein Subspace
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-16>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|4<space|2spc>Computing
      Dimensions of Spaces of Modular Forms>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-17><vspace|0.5fn>

      4.1<space|2spc>Modular Forms for <with|mode|<quote|math>|\<Gamma\><rsub|0>(N)>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-18>

      <with|par-left|<quote|1.5fn>|4.1.1<space|2spc>New and Old Subspaces
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-19>>

      4.2<space|2spc>Modular Forms for <with|mode|<quote|math>|\<Gamma\><rsub|1>(N)>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-20>

      4.3<space|2spc>Modular Forms with Character
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-21>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|5<space|2spc>Linear
      Algebra> <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-22><vspace|0.5fn>

      5.1<space|2spc>Echelon Form <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-23>

      5.2<space|2spc>Echelon Forms over <with|mode|<quote|math>|<with|math-font|<quote|Bbb>|Q>>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-24>

      5.3<space|2spc>Polynomials <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-27>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|6<space|2spc>Modular
      Symbols> <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-30><vspace|0.5fn>

      6.1<space|2spc>Modular Symbols <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-31>

      6.2<space|2spc>Manin Symbols <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-32>

      <with|par-left|<quote|1.5fn>|6.2.1<space|2spc>Coset Representatives and
      Manin Symbols <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-33>>

      <with|par-left|<quote|1.5fn>|6.2.2<space|2spc>Modular Symbols With
      Character <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-34>>

      6.3<space|2spc>Hecke Operators <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-35>

      <with|par-left|<quote|1.5fn>|6.3.1<space|2spc>General Definition of
      Hecke Operators <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-36>>

      <with|par-left|<quote|1.5fn>|6.3.2<space|2spc>Hecke Operators on Manin
      Symbols <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-37>>

      <with|par-left|<quote|1.5fn>|6.3.3<space|2spc>Remarks on Complexity
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-38>>

      6.4<space|2spc>Cuspidal Modular Symbols
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-39>

      6.5<space|2spc>The Pairing Between Modular Symbols and Modular Forms
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-40>

      6.6<space|2spc>Examples <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-41>

      6.7<space|2spc>A*p*p*l*i*c*a*t*i*o*n*s
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-42>

      <with|par-left|<quote|1.5fn>|6.7.1<space|2spc>L*a*t*e*r*i*n*t*h*i*s*B*o*o*k
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-43>>

      <with|par-left|<quote|1.5fn>|6.7.2<space|2spc>D*i*s*c*u*s*s*i*o*n*o*f*t*h*e*L*i*t*e*r*a*t*u*r*e*a*n*d*R*e*s*e*a*r*c*h
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-44>>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|7<space|2spc>C*o*m*p*u*t*i*n*g*W*i*t*h*M*o*d*u*l*a*r*S*y*m*b*o*l*s>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-45><vspace|0.5fn>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|8<space|2spc>U*s*i*n*g*M*o*d*u*l*a*r*S*y*m*b*o*l*s*t*o*C*o*m*p*u*t*e*S*p*a*c*e*s*o*f*M*o*d*u*l*a*r*F*o*r*m*s>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-46><vspace|0.5fn>

      8.1<space|2spc><with|mode|<quote|math>|q>-expansions of Newforms
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-47>

      8.2<space|2spc>C*o*n*g*r*u*e*n*c*e*s
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-48>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|9<space|2spc>P*e*r*i*o*d*M*a*p*p*i*n*g*s*A*s*s*o*c*i*a*t*e*d*t*o*N*e*w*f*o*r*m*s>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-49><vspace|0.5fn>

      9.1<space|2spc>C*o*m*p*l*e*x*P*e*r*i*o*d*M*a*p*p*i*n*g
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-50>

      9.2<space|2spc>R*a*t*i*o*n*a*l*a*n*d*I*n*t*e*g*r*a*l*P*e*r*i*o*d*M*a*p*p*i*n*g
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-51>

      9.3<space|2spc>S*p*e*c*i*a*l*V*a*l*u*e*s*o*f<with|mode|<quote|math>|L>-Functions
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-52>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|10<space|2spc>M*o*d*u*l*a*r*C*u*r*v*e*s*a*n*d*A*b*e*l*i*a*n*V*a*r*i*e*t*i*e*s>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-53><vspace|0.5fn>

      10.1<space|2spc>M*o*d*u*l*a*r*C*u*r*v*e*s
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-54>

      10.2<space|2spc>M*o*d*u*l*a*r*A*b*e*l*i*a*n*V*a*r*i*e*t*i*e*s
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-55>

      10.3<space|2spc>T*h*e*B*i*r*c*h*a*n*d*S*w*i*n*n*e*r*t*o*n-D*y*e*r*C*o*n*j*e*c*t*u*r*e
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-56>

      10.4<space|2spc>H*o*w*C*r*e*m*o*n*a*C*o*m*p*u*t*e*s*a*l*l*E*l*l*i*p*t*i*c*C*u*r*v*e*s*o*f*C*o*n*d*u*c*t*o*r<with|mode|<quote|math>|N>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-57>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|11<space|2spc>A*p*p*l*i*c*a*t*i*o*n:S*e*r*r*e<rprime|'>s*C*o*n*j*e*c*t*u*r*e>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-58><vspace|0.5fn>

      11.1<space|2spc>S*t*a*t*e*m*e*n*t*o*f*t*h*e*C*o*n*j*e*c*t*u*r*e
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-59>

      11.2<space|2spc>D*e*t*e*r*m*i*n*i*n*g*I*r*r*e*d*u*c*i*b*i*l*i*t*y
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-60>

      11.3<space|2spc>C*o*m*p*u*t*i*n*g*t*h*e*S*e*r*r*e*I*n*v*a*r*i*a*n*t*s
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-61>

      11.4<space|2spc>F*i*n*d*i*n*g*t*h*e*N*e*w*f*o*r*m*s*t*h*a*t*G*i*v*e*R*i*s*e*t*o*a*R*e*p*r*e*s*e*n*t*a*t*i*o*n
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-62>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|12<space|2spc>S*o*f*t*w*a*r*e*f*o*r*C*o*m*p*u*t*i*n*g*W*i*t*h*M*o*d*u*l*a*r*F*o*r*m*s>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-63><vspace|0.5fn>

      12.1<space|2spc>M*A*G*M*A <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-64>

      12.2<space|2spc>P*y*t*h*o*n/M*A*N*I*N
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-65>

      12.3<space|2spc>C*r*e*m*o*n*a<rprime|'>s*m*w*r*a*n*k
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-66>

      12.4<space|2spc>H*E*C*K*E*C++L*i*b*r*a*r*y
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-67>

      12.5<space|2spc>P*A*R*I/G*P*P*a*c*k*a*g*e
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-68>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|A*p*p*e*n*d*i*x:G*N*U*F*r*e*e*D*o*c*u*m*e*n*t*a*t*i*o*n*L*i*c*e*n*s*e>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-69><vspace|0.5fn>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|Bibliography>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <pageref|auto-70><vspace|0.5fn>
    </associate>
  </collection>
</auxiliary>