aboutsummaryrefslogtreecommitdiff
path: root/src/algebra/expexpan.spad.pamphlet
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
committerdos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
commitab8cc85adde879fb963c94d15675783f2cf4b183 (patch)
treec202482327f474583b750b2c45dedfc4e4312b1d /src/algebra/expexpan.spad.pamphlet
downloadopen-axiom-ab8cc85adde879fb963c94d15675783f2cf4b183.tar.gz
Initial population.
Diffstat (limited to 'src/algebra/expexpan.spad.pamphlet')
-rw-r--r--src/algebra/expexpan.spad.pamphlet555
1 files changed, 555 insertions, 0 deletions
diff --git a/src/algebra/expexpan.spad.pamphlet b/src/algebra/expexpan.spad.pamphlet
new file mode 100644
index 00000000..30e4877b
--- /dev/null
+++ b/src/algebra/expexpan.spad.pamphlet
@@ -0,0 +1,555 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/algebra expexpan.spad}
+\author{Clifton J. Williamson}
+\maketitle
+\begin{abstract}
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+\section{domain EXPUPXS ExponentialOfUnivariatePuiseuxSeries}
+<<domain EXPUPXS ExponentialOfUnivariatePuiseuxSeries>>=
+)abbrev domain EXPUPXS ExponentialOfUnivariatePuiseuxSeries
+++ Author: Clifton J. Williamson
+++ Date Created: 4 August 1992
+++ Date Last Updated: 27 August 1992
+++ Basic Operations:
+++ Related Domains: UnivariatePuiseuxSeries(FE,var,cen)
+++ Also See:
+++ AMS Classifications:
+++ Keywords: limit, functional expression, power series, essential singularity
+++ Examples:
+++ References:
+++ Description:
+++ ExponentialOfUnivariatePuiseuxSeries is a domain used to represent
+++ essential singularities of functions. An object in this domain is a
+++ function of the form \spad{exp(f(x))}, where \spad{f(x)} is a Puiseux
+++ series with no terms of non-negative degree. Objects are ordered
+++ according to order of singularity, with functions which tend more
+++ rapidly to zero or infinity considered to be larger. Thus, if
+++ \spad{order(f(x)) < order(g(x))}, i.e. the first non-zero term of
+++ \spad{f(x)} has lower degree than the first non-zero term of \spad{g(x)},
+++ then \spad{exp(f(x)) > exp(g(x))}. If \spad{order(f(x)) = order(g(x))},
+++ then the ordering is essentially random. This domain is used
+++ in computing limits involving functions with essential singularities.
+ExponentialOfUnivariatePuiseuxSeries(FE,var,cen):_
+ Exports == Implementation where
+ FE : Join(Field,OrderedSet)
+ var : Symbol
+ cen : FE
+ UPXS ==> UnivariatePuiseuxSeries(FE,var,cen)
+
+ Exports ==> Join(UnivariatePuiseuxSeriesCategory(FE),OrderedAbelianMonoid) _
+ with
+ exponential : UPXS -> %
+ ++ exponential(f(x)) returns \spad{exp(f(x))}.
+ ++ Note: the function does NOT check that \spad{f(x)} has no
+ ++ non-negative terms.
+ exponent : % -> UPXS
+ ++ exponent(exp(f(x))) returns \spad{f(x)}
+ exponentialOrder: % -> Fraction Integer
+ ++ exponentialOrder(exp(c * x **(-n) + ...)) returns \spad{-n}.
+ ++ exponentialOrder(0) returns \spad{0}.
+
+ Implementation ==> UPXS add
+
+ Rep := UPXS
+
+ exponential f == complete f
+ exponent f == f pretend UPXS
+ exponentialOrder f == order(exponent f,0)
+
+ zero? f == empty? entries complete terms f
+
+ f = g ==
+ -- we redefine equality because we know that we are dealing with
+ -- a FINITE series, so there is no danger in computing all terms
+ (entries complete terms f) = (entries complete terms g)
+
+ f < g ==
+ zero? f => not zero? g
+ zero? g => false
+ (ordf := exponentialOrder f) > (ordg := exponentialOrder g) => true
+ ordf < ordg => false
+ (fCoef := coefficient(f,ordf)) = (gCoef := coefficient(g,ordg)) =>
+ reductum(f) < reductum(g)
+ fCoef < gCoef -- this is "random" if FE is EXPR INT
+
+ coerce(f:%):OutputForm ==
+ ("%e" :: OutputForm) ** ((coerce$Rep)(complete f)@OutputForm)
+
+@
+\section{domain UPXSSING UnivariatePuiseuxSeriesWithExponentialSingularity}
+<<domain UPXSSING UnivariatePuiseuxSeriesWithExponentialSingularity>>=
+)abbrev domain UPXSSING UnivariatePuiseuxSeriesWithExponentialSingularity
+++ Author: Clifton J. Williamson
+++ Date Created: 4 August 1992
+++ Date Last Updated: 27 August 1992
+++ Basic Operations:
+++ Related Domains: UnivariatePuiseuxSeries(FE,var,cen),
+++ ExponentialOfUnivariatePuiseuxSeries(FE,var,cen)
+++ ExponentialExpansion(R,FE,var,cen)
+++ Also See:
+++ AMS Classifications:
+++ Keywords: limit, functional expression, power series
+++ Examples:
+++ References:
+++ Description:
+++ UnivariatePuiseuxSeriesWithExponentialSingularity is a domain used to
+++ represent functions with essential singularities. Objects in this
+++ domain are sums, where each term in the sum is a univariate Puiseux
+++ series times the exponential of a univariate Puiseux series. Thus,
+++ the elements of this domain are sums of expressions of the form
+++ \spad{g(x) * exp(f(x))}, where g(x) is a univariate Puiseux series
+++ and f(x) is a univariate Puiseux series with no terms of non-negative
+++ degree.
+UnivariatePuiseuxSeriesWithExponentialSingularity(R,FE,var,cen):_
+ Exports == Implementation where
+ R : Join(OrderedSet,RetractableTo Integer,_
+ LinearlyExplicitRingOver Integer,GcdDomain)
+ FE : Join(AlgebraicallyClosedField,TranscendentalFunctionCategory,_
+ FunctionSpace R)
+ var : Symbol
+ cen : FE
+ B ==> Boolean
+ I ==> Integer
+ L ==> List
+ RN ==> Fraction Integer
+ UPXS ==> UnivariatePuiseuxSeries(FE,var,cen)
+ EXPUPXS ==> ExponentialOfUnivariatePuiseuxSeries(FE,var,cen)
+ OFE ==> OrderedCompletion FE
+ Result ==> Union(OFE,"failed")
+ PxRec ==> Record(k: Fraction Integer,c:FE)
+ Term ==> Record(%coef:UPXS,%expon:EXPUPXS,%expTerms:List PxRec)
+ -- the %expTerms field is used to record the list of the terms (a 'term'
+ -- records an exponent and a coefficient) in the exponent %expon
+ TypedTerm ==> Record(%term:Term,%type:String)
+ -- a term together with a String which tells whether it has an infinite,
+ -- zero, or unknown limit as var -> cen+
+ TRec ==> Record(%zeroTerms: List Term,_
+ %infiniteTerms: List Term,_
+ %failedTerms: List Term,_
+ %puiseuxSeries: UPXS)
+ SIGNEF ==> ElementaryFunctionSign(R,FE)
+
+ Exports ==> Join(FiniteAbelianMonoidRing(UPXS,EXPUPXS),IntegralDomain) with
+ limitPlus : % -> Union(OFE,"failed")
+ ++ limitPlus(f(var)) returns \spad{limit(var -> cen+,f(var))}.
+ dominantTerm : % -> Union(TypedTerm,"failed")
+ ++ dominantTerm(f(var)) returns the term that dominates the limiting
+ ++ behavior of \spad{f(var)} as \spad{var -> cen+} together with a
+ ++ \spadtype{String} which briefly describes that behavior. The
+ ++ value of the \spadtype{String} will be \spad{"zero"} (resp.
+ ++ \spad{"infinity"}) if the term tends to zero (resp. infinity)
+ ++ exponentially and will \spad{"series"} if the term is a
+ ++ Puiseux series.
+
+ Implementation ==> PolynomialRing(UPXS,EXPUPXS) add
+ makeTerm : (UPXS,EXPUPXS) -> Term
+ coeff : Term -> UPXS
+ exponent : Term -> EXPUPXS
+ exponentTerms : Term -> List PxRec
+ setExponentTerms_! : (Term,List PxRec) -> List PxRec
+ computeExponentTerms_! : Term -> List PxRec
+ terms : % -> List Term
+ sortAndDiscardTerms: List Term -> TRec
+ termsWithExtremeLeadingCoef : (L Term,RN,I) -> Union(L Term,"failed")
+ filterByOrder: (L Term,(RN,RN) -> B) -> Record(%list:L Term,%order:RN)
+ dominantTermOnList : (L Term,RN,I) -> Union(Term,"failed")
+ iDominantTerm : L Term -> Union(Record(%term:Term,%type:String),"failed")
+
+ retractIfCan f ==
+ (numberOfMonomials f = 1) and (zero? degree f) => leadingCoefficient f
+ "failed"
+
+ recip f ==
+ numberOfMonomials f = 1 =>
+ monomial(inv leadingCoefficient f,- degree f)
+ "failed"
+
+ makeTerm(coef,expon) == [coef,expon,empty()]
+ coeff term == term.%coef
+ exponent term == term.%expon
+ exponentTerms term == term.%expTerms
+ setExponentTerms_!(term,list) == term.%expTerms := list
+ computeExponentTerms_! term ==
+ setExponentTerms_!(term,entries complete terms exponent term)
+
+ terms f ==
+ -- terms with a higher order singularity will appear closer to the
+ -- beginning of the list because of the ordering in EXPPUPXS;
+ -- no "expnonent terms" are computed by this function
+ zero? f => empty()
+ concat(makeTerm(leadingCoefficient f,degree f),terms reductum f)
+
+ sortAndDiscardTerms termList ==
+ -- 'termList' is the list of terms of some function f(var), ordered
+ -- so that terms with a higher order singularity occur at the
+ -- beginning of the list.
+ -- This function returns lists of candidates for the "dominant
+ -- term" in 'termList', i.e. the term which describes the
+ -- asymptotic behavior of f(var) as var -> cen+.
+ -- 'zeroTerms' will contain terms which tend to zero exponentially
+ -- and contains only those terms with the lowest order singularity.
+ -- 'zeroTerms' will be non-empty only when there are no terms of
+ -- infinite or series type.
+ -- 'infiniteTerms' will contain terms which tend to infinity
+ -- exponentially and contains only those terms with the highest
+ -- order singularity.
+ -- 'failedTerms' will contain terms which have an exponential
+ -- singularity, where we cannot say whether the limiting value
+ -- is zero or infinity. Only terms with a higher order sigularity
+ -- than the terms on 'infiniteList' are included.
+ -- 'pSeries' will be a Puiseux series representing a term without an
+ -- exponential singularity. 'pSeries' will be non-zero only when no
+ -- other terms are known to tend to infinity exponentially
+ zeroTerms : List Term := empty()
+ infiniteTerms : List Term := empty()
+ failedTerms : List Term := empty()
+ -- we keep track of whether or not we've found an infinite term
+ -- if so, 'infTermOrd' will be set to a negative value
+ infTermOrd : RN := 0
+ -- we keep track of whether or not we've found a zero term
+ -- if so, 'zeroTermOrd' will be set to a negative value
+ zeroTermOrd : RN := 0
+ ord : RN := 0; pSeries : UPXS := 0 -- dummy values
+ while not empty? termList repeat
+ -- 'expon' is a Puiseux series
+ expon := exponent(term := first termList)
+ -- quit if there is an infinite term with a higher order singularity
+ (ord := order(expon,0)) > infTermOrd => leave "infinite term dominates"
+ -- if ord = 0, we've hit the end of the list
+ (ord = 0) =>
+ -- since we have a series term, don't bother with zero terms
+ leave(pSeries := coeff(term); zeroTerms := empty())
+ coef := coefficient(expon,ord)
+ -- if we can't tell if the lowest order coefficient is positive or
+ -- negative, we have a "failed term"
+ (signum := sign(coef)$SIGNEF) case "failed" =>
+ failedTerms := concat(term,failedTerms)
+ termList := rest termList
+ -- if the lowest order coefficient is positive, we have an
+ -- "infinite term"
+ (sig := signum :: Integer) = 1 =>
+ infTermOrd := ord
+ infiniteTerms := concat(term,infiniteTerms)
+ -- since we have an infinite term, don't bother with zero terms
+ zeroTerms := empty()
+ termList := rest termList
+ -- if the lowest order coefficient is negative, we have a
+ -- "zero term" if there are no infinite terms and no failed
+ -- terms, add the term to 'zeroTerms'
+ if empty? infiniteTerms then
+ zeroTerms :=
+ ord = zeroTermOrd => concat(term,zeroTerms)
+ zeroTermOrd := ord
+ list term
+ termList := rest termList
+ -- reverse "failed terms" so that higher order singularities
+ -- appear at the beginning of the list
+ [zeroTerms,infiniteTerms,reverse_! failedTerms,pSeries]
+
+ termsWithExtremeLeadingCoef(termList,ord,signum) ==
+ -- 'termList' consists of terms of the form [g(x),exp(f(x)),...];
+ -- when 'signum' is +1 (resp. -1), this function filters 'termList'
+ -- leaving only those terms such that coefficient(f(x),ord) is
+ -- maximal (resp. minimal)
+ while (coefficient(exponent first termList,ord) = 0) repeat
+ termList := rest termList
+ empty? termList => error "UPXSSING: can't happen"
+ coefExtreme := coefficient(exponent first termList,ord)
+ outList := list first termList; termList := rest termList
+ for term in termList repeat
+ (coefDiff := coefficient(exponent term,ord) - coefExtreme) = 0 =>
+ outList := concat(term,outList)
+ (sig := sign(coefDiff)$SIGNEF) case "failed" => return "failed"
+ (sig :: Integer) = signum => outList := list term
+ outList
+
+ filterByOrder(termList,predicate) ==
+ -- 'termList' consists of terms of the form [g(x),exp(f(x)),expTerms],
+ -- where 'expTerms' is a list containing some of the terms in the
+ -- series f(x).
+ -- The function filters 'termList' and, when 'predicate' is < (resp. >),
+ -- leaves only those terms with the lowest (resp. highest) order term
+ -- in 'expTerms'
+ while empty? exponentTerms first termList repeat
+ termList := rest termList
+ empty? termList => error "UPXSING: can't happen"
+ ordExtreme := (first exponentTerms first termList).k
+ outList := list first termList
+ for term in rest termList repeat
+ not empty? exponentTerms term =>
+ (ord := (first exponentTerms term).k) = ordExtreme =>
+ outList := concat(term,outList)
+ predicate(ord,ordExtreme) =>
+ ordExtreme := ord
+ outList := list term
+ -- advance pointers on "exponent terms" on terms on 'outList'
+ for term in outList repeat
+ setExponentTerms_!(term,rest exponentTerms term)
+ [outList,ordExtreme]
+
+ dominantTermOnList(termList,ord0,signum) ==
+ -- finds dominant term on 'termList'
+ -- it is known that "exponent terms" of order < 'ord0' are
+ -- the same for all terms on 'termList'
+ newList := termsWithExtremeLeadingCoef(termList,ord0,signum)
+ newList case "failed" => "failed"
+ termList := newList :: List Term
+ empty? rest termList => first termList
+ filtered :=
+ signum = 1 => filterByOrder(termList,#1 < #2)
+ filterByOrder(termList,#1 > #2)
+ termList := filtered.%list
+ empty? rest termList => first termList
+ dominantTermOnList(termList,filtered.%order,signum)
+
+ iDominantTerm termList ==
+ termRecord := sortAndDiscardTerms termList
+ zeroTerms := termRecord.%zeroTerms
+ infiniteTerms := termRecord.%infiniteTerms
+ failedTerms := termRecord.%failedTerms
+ pSeries := termRecord.%puiseuxSeries
+ -- in future versions, we will deal with "failed terms"
+ -- at present, if any occur, we cannot determine the limit
+ not empty? failedTerms => "failed"
+ not zero? pSeries => [makeTerm(pSeries,0),"series"]
+ not empty? infiniteTerms =>
+ empty? rest infiniteTerms => [first infiniteTerms,"infinity"]
+ for term in infiniteTerms repeat computeExponentTerms_! term
+ ord0 := order exponent first infiniteTerms
+ (dTerm := dominantTermOnList(infiniteTerms,ord0,1)) case "failed" =>
+ return "failed"
+ [dTerm :: Term,"infinity"]
+ empty? rest zeroTerms => [first zeroTerms,"zero"]
+ for term in zeroTerms repeat computeExponentTerms_! term
+ ord0 := order exponent first zeroTerms
+ (dTerm := dominantTermOnList(zeroTerms,ord0,-1)) case "failed" =>
+ return "failed"
+ [dTerm :: Term,"zero"]
+
+ dominantTerm f == iDominantTerm terms f
+
+ limitPlus f ==
+ -- list the terms occurring in 'f'; if there are none, then f = 0
+ empty?(termList := terms f) => 0
+ -- compute dominant term
+ (tInfo := iDominantTerm termList) case "failed" => "failed"
+ termInfo := tInfo :: Record(%term:Term,%type:String)
+ domTerm := termInfo.%term
+ (type := termInfo.%type) = "series" =>
+ -- find limit of series term
+ (ord := order(pSeries := coeff domTerm,1)) > 0 => 0
+ coef := coefficient(pSeries,ord)
+ member?(var,variables coef) => "failed"
+ ord = 0 => coef :: OFE
+ -- in the case of an infinite limit, we need to know the sign
+ -- of the first non-zero coefficient
+ (signum := sign(coef)$SIGNEF) case "failed" => "failed"
+ (signum :: Integer) = 1 => plusInfinity()
+ minusInfinity()
+ type = "zero" => 0
+ -- examine lowest order coefficient in series part of 'domTerm'
+ ord := order(pSeries := coeff domTerm)
+ coef := coefficient(pSeries,ord)
+ member?(var,variables coef) => "failed"
+ (signum := sign(coef)$SIGNEF) case "failed" => "failed"
+ (signum :: Integer) = 1 => plusInfinity()
+ minusInfinity()
+
+@
+\section{domain EXPEXPAN ExponentialExpansion}
+<<domain EXPEXPAN ExponentialExpansion>>=
+)abbrev domain EXPEXPAN ExponentialExpansion
+++ Author: Clifton J. Williamson
+++ Date Created: 13 August 1992
+++ Date Last Updated: 27 August 1992
+++ Basic Operations:
+++ Related Domains: UnivariatePuiseuxSeries(FE,var,cen),
+++ ExponentialOfUnivariatePuiseuxSeries(FE,var,cen)
+++ Also See:
+++ AMS Classifications:
+++ Keywords: limit, functional expression, power series
+++ Examples:
+++ References:
+++ Description:
+++ UnivariatePuiseuxSeriesWithExponentialSingularity is a domain used to
+++ represent essential singularities of functions. Objects in this domain
+++ are quotients of sums, where each term in the sum is a univariate Puiseux
+++ series times the exponential of a univariate Puiseux series.
+ExponentialExpansion(R,FE,var,cen): Exports == Implementation where
+ R : Join(OrderedSet,RetractableTo Integer,_
+ LinearlyExplicitRingOver Integer,GcdDomain)
+ FE : Join(AlgebraicallyClosedField,TranscendentalFunctionCategory,_
+ FunctionSpace R)
+ var : Symbol
+ cen : FE
+ RN ==> Fraction Integer
+ UPXS ==> UnivariatePuiseuxSeries(FE,var,cen)
+ EXPUPXS ==> ExponentialOfUnivariatePuiseuxSeries(FE,var,cen)
+ UPXSSING ==> UnivariatePuiseuxSeriesWithExponentialSingularity(R,FE,var,cen)
+ OFE ==> OrderedCompletion FE
+ Result ==> Union(OFE,"failed")
+ PxRec ==> Record(k: Fraction Integer,c:FE)
+ Term ==> Record(%coef:UPXS,%expon:EXPUPXS,%expTerms:List PxRec)
+ TypedTerm ==> Record(%term:Term,%type:String)
+ SIGNEF ==> ElementaryFunctionSign(R,FE)
+
+ Exports ==> Join(QuotientFieldCategory UPXSSING,RetractableTo UPXS) with
+ limitPlus : % -> Union(OFE,"failed")
+ ++ limitPlus(f(var)) returns \spad{limit(var -> a+,f(var))}.
+ coerce: UPXS -> %
+ ++ coerce(f) converts a \spadtype{UnivariatePuiseuxSeries} to
+ ++ an \spadtype{ExponentialExpansion}.
+
+ Implementation ==> Fraction(UPXSSING) add
+ coeff : Term -> UPXS
+ exponent : Term -> EXPUPXS
+ upxssingIfCan : % -> Union(UPXSSING,"failed")
+ seriesQuotientLimit: (UPXS,UPXS) -> Union(OFE,"failed")
+ seriesQuotientInfinity: (UPXS,UPXS) -> Union(OFE,"failed")
+
+ Rep := Fraction UPXSSING
+
+ ZEROCOUNT : RN := 1000/1
+
+ coeff term == term.%coef
+ exponent term == term.%expon
+
+ --!! why is this necessary?
+ --!! code can run forever in retractIfCan if original assignment
+ --!! for 'ff' is used
+ upxssingIfCan f ==
+-- one? denom f => numer f
+ (denom f = 1) => numer f
+ "failed"
+
+ retractIfCan(f:%):Union(UPXS,"failed") ==
+ --ff := (retractIfCan$Rep)(f)@Union(UPXSSING,"failed")
+ --ff case "failed" => "failed"
+ (ff := upxssingIfCan f) case "failed" => "failed"
+ (fff := retractIfCan(ff::UPXSSING)@Union(UPXS,"failed")) case "failed" =>
+ "failed"
+ fff :: UPXS
+
+ f:UPXSSING / g:UPXSSING ==
+ (rec := recip g) case "failed" => f /$Rep g
+ f * (rec :: UPXSSING) :: %
+
+ f:% / g:% ==
+ (rec := recip numer g) case "failed" => f /$Rep g
+ (rec :: UPXSSING) * (denom g) * f
+
+ coerce(f:UPXS) == f :: UPXSSING :: %
+
+ seriesQuotientLimit(num,den) ==
+ -- limit of the quotient of two series
+ series := num / den
+ (ord := order(series,1)) > 0 => 0
+ coef := coefficient(series,ord)
+ member?(var,variables coef) => "failed"
+ ord = 0 => coef :: OFE
+ (sig := sign(coef)$SIGNEF) case "failed" => return "failed"
+ (sig :: Integer) = 1 => plusInfinity()
+ minusInfinity()
+
+ seriesQuotientInfinity(num,den) ==
+ -- infinite limit: plus or minus?
+ -- look at leading coefficients of series to tell
+ (numOrd := order(num,ZEROCOUNT)) = ZEROCOUNT => "failed"
+ (denOrd := order(den,ZEROCOUNT)) = ZEROCOUNT => "failed"
+ cc := coefficient(num,numOrd)/coefficient(den,denOrd)
+ member?(var,variables cc) => "failed"
+ (sig := sign(cc)$SIGNEF) case "failed" => return "failed"
+ (sig :: Integer) = 1 => plusInfinity()
+ minusInfinity()
+
+ limitPlus f ==
+ zero? f => 0
+ (den := denom f) = 1 => limitPlus numer f
+ (numerTerm := dominantTerm(num := numer f)) case "failed" => "failed"
+ numType := (numTerm := numerTerm :: TypedTerm).%type
+ (denomTerm := dominantTerm den) case "failed" => "failed"
+ denType := (denTerm := denomTerm :: TypedTerm).%type
+ numExpon := exponent numTerm.%term; denExpon := exponent denTerm.%term
+ numCoef := coeff numTerm.%term; denCoef := coeff denTerm.%term
+ -- numerator tends to zero exponentially
+ (numType = "zero") =>
+ -- denominator tends to zero exponentially
+ (denType = "zero") =>
+ (exponDiff := numExpon - denExpon) = 0 =>
+ seriesQuotientLimit(numCoef,denCoef)
+ expCoef := coefficient(exponDiff,order exponDiff)
+ (sig := sign(expCoef)$SIGNEF) case "failed" => return "failed"
+ (sig :: Integer) = -1 => 0
+ seriesQuotientInfinity(numCoef,denCoef)
+ 0 -- otherwise limit is zero
+ -- numerator is a Puiseux series
+ (numType = "series") =>
+ -- denominator tends to zero exponentially
+ (denType = "zero") =>
+ seriesQuotientInfinity(numCoef,denCoef)
+ -- denominator is a series
+ (denType = "series") => seriesQuotientLimit(numCoef,denCoef)
+ 0
+ -- remaining case: numerator tends to infinity exponentially
+ -- denominator tends to infinity exponentially
+ (denType = "infinity") =>
+ (exponDiff := numExpon - denExpon) = 0 =>
+ seriesQuotientLimit(numCoef,denCoef)
+ expCoef := coefficient(exponDiff,order exponDiff)
+ (sig := sign(expCoef)$SIGNEF) case "failed" => return "failed"
+ (sig :: Integer) = -1 => 0
+ seriesQuotientInfinity(numCoef,denCoef)
+ -- denominator tends to zero exponentially or is a series
+ seriesQuotientInfinity(numCoef,denCoef)
+
+@
+\section{License}
+<<license>>=
+--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.
+@
+<<*>>=
+<<license>>
+
+<<domain EXPUPXS ExponentialOfUnivariatePuiseuxSeries>>
+<<domain UPXSSING UnivariatePuiseuxSeriesWithExponentialSingularity>>
+<<domain EXPEXPAN ExponentialExpansion>>
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}