)abbrev domain FCOMP FourierComponent
++ Author: James Davenport
++ Date Created: 17 April 1992
++ Basic Functions:
++ Related Constructors:
++ Also See:
++ AMS Classifications:
++ Keywords:
++ References:
++ Description:
FourierComponent(E : OrderedSet):
       OrderedSet with
         sin : E -> %
         ++ sin(x) makes a sin kernel for use in Fourier series
         cos : E -> %
         ++ cos(x) makes a cos kernel for use in Fourier series
         sin? : % -> Boolean
         ++ sin?(x) returns true if term is a sin, otherwise false
         argument : % -> E
         ++ argument(x) returns the argument of a given sin/cos expressions
    ==
  add
   --representations
   Rep := Record(SinIfTrue : Boolean, arg : E)
   e : E
   x, y : %
   sin e == [true, e]
   cos e == [false, e]
   sin? x == x.SinIfTrue
   argument x == x.arg
   coerce(x) : OutputForm ==
     hconcat((if x.SinIfTrue then message("sin") else message("cos")),
              bracket((x.arg)::OutputForm))
   x<y ==
     x.arg < y.arg => true
     y.arg < x.arg => false
     x.SinIfTrue => false
     y.SinIfTrue

)abbrev domain FSERIES FourierSeries
++ Author: James Davenport
++ Date Created: 17 April 1992
++ Basic Functions:
++ Related Constructors:
++ Also See:
++ AMS Classifications:
++ Keywords:
++ References:
++ Description:
FourierSeries(R : Join(CommutativeRing, Algebra(Fraction Integer)),
              E : Join(OrderedSet, AbelianGroup)):
       Algebra(R) with
         if E has Canonical and R has Canonical then Canonical
         coerce : R -> %
         ++ coerce(r) converts coefficients into Fourier Series
         coerce : FourierComponent(E) -> %
         ++ coerce(c) converts sin/cos terms into Fourier Series
         makeSin : (E, R) -> %
         ++ makeSin(e, r) makes a sin expression with given argument and coefficient
         makeCos : (E, R) -> %
         ++ makeCos(e, r) makes a sin expression with given argument and coefficient
    == FreeModule(R, FourierComponent(E))
  add
   --representations
   Term := Record(k : FourierComponent(E), c : R)
   Rep  := List Term
   multiply : (Term, Term) -> %
   w, x1, x2 : %
   t1, t2 : Term
   n : NonNegativeInteger
   z : Integer
   e : FourierComponent(E)
   a : E
   r : R
   1 == [[cos 0, 1]]
   coerce e ==
      sin? e and zero? argument e => 0
      if argument e < 0  then
           not sin? e => e := cos(- argument e)
           return [[sin(- argument e), -1]]
      [[e, 1]]
   multiply(t1, t2) ==
     r := (t1.c*t2.c)*(1/2)
     s1 := argument t1.k
     s2 := argument t2.k
     sum := s1+s2
     diff := s1-s2
     sin? t1.k =>
       sin? t2.k =>
         makeCos(diff, r) + makeCos(sum, -r)
       makeSin(sum, r) + makeSin(diff, r)
     sin? t2.k =>
       makeSin(sum, r) + makeSin(diff, r)
     makeCos(diff, r) + makeCos(sum, r)
   x1*x2 ==
     empty?(x1) => 0
     empty?(x2) => 0
     +/[+/[multiply(t1, t2) for t2 in x2] for t1 in x1]
   makeCos(a, r) ==
      a<0 => [[cos(-a), r]]
      [[cos a, r]]
   makeSin(a, r) ==
      zero? a => []
      a<0 => [[sin(-a), -r]]
      [[sin a, r]]

--Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
--All rights reserved.
--
--Redistribution and use in source and binary forms, with or without
--modification, are permitted provided that the following conditions are
--met:
--
--    - Redistributions of source code must retain the above copyright
--      notice, this list of conditions and the following disclaimer.
--
--    - Redistributions in binary form must reproduce the above copyright
--      notice, this list of conditions and the following disclaimer in
--      the documentation and/or other materials provided with the
--      distribution.
--
--    - Neither the name of The Numerical ALgorithms Group Ltd. nor the
--      names of its contributors may be used to endorse or promote products
--      derived from this software without specific prior written permission.
--
--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
--IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
--TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
--PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
--OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
--EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
--PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
--PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
--LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
--NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
