diff options
Diffstat (limited to 'src/algebra/pscat.spad.pamphlet')
-rw-r--r-- | src/algebra/pscat.spad.pamphlet | 691 |
1 files changed, 691 insertions, 0 deletions
diff --git a/src/algebra/pscat.spad.pamphlet b/src/algebra/pscat.spad.pamphlet new file mode 100644 index 00000000..115c4ac9 --- /dev/null +++ b/src/algebra/pscat.spad.pamphlet @@ -0,0 +1,691 @@ +\documentclass{article} +\usepackage{axiom} +\begin{document} +\title{\$SPAD/src/algebra pscat.spad} +\author{Clifton J. Williamson} +\maketitle +\begin{abstract} +\end{abstract} +\eject +\tableofcontents +\eject +\section{category PSCAT PowerSeriesCategory} +<<category PSCAT PowerSeriesCategory>>= +)abbrev category PSCAT PowerSeriesCategory +++ Author: Clifton J. Williamson +++ Date Created: 21 December 1989 +++ Date Last Updated: 25 February 1990 +++ Basic Operations: +++ Related Domains: +++ Also See: +++ AMS Classifications: +++ Keywords: power series +++ Examples: +++ References: +++ Description: +++ \spadtype{PowerSeriesCategory} is the most general power series +++ category with exponents in an ordered abelian monoid. +PowerSeriesCategory(Coef,Expon,Var): Category == Definition where + Coef : Ring + Expon : OrderedAbelianMonoid + Var : OrderedSet + I ==> Integer + RN ==> Fraction Integer + + Definition ==> AbelianMonoidRing(Coef,Expon) with + + monomial: (%,Var,Expon) -> % + ++ \spad{monomial(a,x,n)} computes \spad{a*x**n}. + monomial: (%,List Var,List Expon) -> % + ++ \spad{monomial(a,[x1,..,xk],[n1,..,nk])} computes + ++ \spad{a * x1**n1 * .. * xk**nk}. + leadingMonomial: % -> % + ++ leadingMonomial(f) returns the monomial of \spad{f} of lowest order. + leadingCoefficient: % -> Coef + ++ leadingCoefficient(f) returns the coefficient of the lowest order + ++ term of \spad{f} + degree : % -> Expon + ++ degree(f) returns the exponent of the lowest order term of \spad{f}. + variables: % -> List Var + ++ \spad{variables(f)} returns a list of the variables occuring in the + ++ power series f. + pole?: % -> Boolean + ++ \spad{pole?(f)} determines if the power series f has a pole. + complete: % -> % + ++ \spad{complete(f)} causes all terms of f to be computed. + ++ Note: this results in an infinite loop + ++ if f has infinitely many terms. + + add + n:I * ps:% == (zero? n => 0; map(n * #1,ps)) + r:Coef * ps:% == (zero? r => 0; map(r * #1,ps)) + ps:% * r:Coef == (zero? r => 0; map(#1 * r,ps)) + - ps == map(- #1,ps) + + if Coef has Algebra Fraction Integer then + r:RN * ps:% == (zero? r => 0; map(r * #1,ps)) + ps:% * r:RN == (zero? r => 0; map(#1 * r,ps)) + + if Coef has Field then + ps:% / r:Coef == map(#1 / r,ps) + +@ +\section{category UPSCAT UnivariatePowerSeriesCategory} +<<category UPSCAT UnivariatePowerSeriesCategory>>= +)abbrev category UPSCAT UnivariatePowerSeriesCategory +++ Author: Clifton J. Williamson +++ Date Created: 21 December 1989 +++ Date Last Updated: 20 September 1993 +++ Basic Operations: +++ Related Domains: +++ Also See: +++ AMS Classifications: +++ Keywords: +++ Examples: +++ References: +++ Description: +++ \spadtype{UnivariatePowerSeriesCategory} is the most general +++ univariate power series category with exponents in an ordered +++ abelian monoid. +++ Note: this category exports a substitution function if it is +++ possible to multiply exponents. +++ Note: this category exports a derivative operation if it is possible +++ to multiply coefficients by exponents. +UnivariatePowerSeriesCategory(Coef,Expon): Category == Definition where + Coef : Ring + Expon : OrderedAbelianMonoid + Term ==> Record(k:Expon,c:Coef) + + Definition ==> PowerSeriesCategory(Coef,Expon,SingletonAsOrderedSet) with + + terms: % -> Stream Term + ++ \spad{terms(f(x))} returns a stream of non-zero terms, where a + ++ a term is an exponent-coefficient pair. The terms in the stream + ++ are ordered by increasing order of exponents. + --series: Stream Term -> % + --++ \spad{series(st)} creates a series from a stream of non-zero terms, + --++ where a term is an exponent-coefficient pair. The terms in the + --++ stream should be ordered by increasing order of exponents. + elt: (%,Expon) -> Coef + ++ \spad{elt(f(x),r)} returns the coefficient of the term of degree r in + ++ \spad{f(x)}. This is the same as the function \spadfun{coefficient}. + variable: % -> Symbol + ++ \spad{variable(f)} returns the (unique) power series variable of + ++ the power series f. + center: % -> Coef + ++ \spad{center(f)} returns the point about which the series f is + ++ expanded. + multiplyExponents: (%,PositiveInteger) -> % + ++ \spad{multiplyExponents(f,n)} multiplies all exponents of the power + ++ series f by the positive integer n. + order: % -> Expon + ++ \spad{order(f)} is the degree of the lowest order non-zero term in f. + ++ This will result in an infinite loop if f has no non-zero terms. + order: (%,Expon) -> Expon + ++ \spad{order(f,n) = min(m,n)}, where m is the degree of the + ++ lowest order non-zero term in f. + truncate: (%,Expon) -> % + ++ \spad{truncate(f,k)} returns a (finite) power series consisting of + ++ the sum of all terms of f of degree \spad{<= k}. + truncate: (%,Expon,Expon) -> % + ++ \spad{truncate(f,k1,k2)} returns a (finite) power + ++ series consisting of + ++ the sum of all terms of f of degree d with \spad{k1 <= d <= k2}. + if Coef has coerce: Symbol -> Coef then + if Coef has "**":(Coef,Expon) -> Coef then + approximate: (%,Expon) -> Coef + ++ \spad{approximate(f)} returns a truncated power series with the + ++ series variable viewed as an element of the coefficient domain. + extend: (%,Expon) -> % + ++ \spad{extend(f,n)} causes all terms of f of degree <= n to be computed. + if Expon has SemiGroup then Eltable(%,%) + if Coef has "*": (Expon,Coef) -> Coef then + DifferentialRing + --!! DifferentialExtension Coef + if Coef has PartialDifferentialRing Symbol then + PartialDifferentialRing Symbol + if Coef has "**": (Coef,Expon) -> Coef then + eval: (%,Coef) -> Stream Coef + ++ \spad{eval(f,a)} evaluates a power series at a value in the + ++ ground ring by returning a stream of partial sums. + + add + degree f == order f + leadingCoefficient f == coefficient(f,order f) + leadingMonomial f == + ord := order f + monomial(coefficient(f,ord),ord) + monomial(f:%,listVar:List SingletonAsOrderedSet,listExpon:List Expon) == + empty? listVar or not empty? rest listVar => + error "monomial: variable list must have exactly one entry" + empty? listExpon or not empty? rest listExpon => + error "monomial: exponent list must have exactly one entry" + f * monomial(1,first listExpon) + monomial(f:%,v:SingletonAsOrderedSet,n:Expon) == + f * monomial(1,n) + reductum f == f - leadingMonomial f + variables f == list create() + +@ +\section{category UTSCAT UnivariateTaylorSeriesCategory} +<<category UTSCAT UnivariateTaylorSeriesCategory>>= +)abbrev category UTSCAT UnivariateTaylorSeriesCategory +++ Author: Clifton J. Williamson +++ Date Created: 21 December 1989 +++ Date Last Updated: 26 May 1994 +++ Basic Operations: +++ Related Domains: +++ Also See: +++ AMS Classifications: +++ Keywords: series, Taylor, linebacker +++ Examples: +++ References: +++ Description: +++ \spadtype{UnivariateTaylorSeriesCategory} is the category of Taylor +++ series in one variable. +UnivariateTaylorSeriesCategory(Coef): Category == Definition where + Coef : Ring + I ==> Integer + L ==> List + NNI ==> NonNegativeInteger + OUT ==> OutputForm + RN ==> Fraction Integer + STTA ==> StreamTaylorSeriesOperations Coef + STTF ==> StreamTranscendentalFunctions Coef + STNC ==> StreamTranscendentalFunctionsNonCommutative Coef + Term ==> Record(k:NNI,c:Coef) + + Definition ==> UnivariatePowerSeriesCategory(Coef,NNI) with + + series: Stream Term -> % + ++ \spad{series(st)} creates a series from a stream of non-zero terms, + ++ where a term is an exponent-coefficient pair. The terms in the + ++ stream should be ordered by increasing order of exponents. + coefficients: % -> Stream Coef + ++ \spad{coefficients(a0 + a1 x + a2 x**2 + ...)} returns a stream + ++ of coefficients: \spad{[a0,a1,a2,...]}. The entries of the stream + ++ may be zero. + series: Stream Coef -> % + ++ \spad{series([a0,a1,a2,...])} is the Taylor series + ++ \spad{a0 + a1 x + a2 x**2 + ...}. + quoByVar: % -> % + ++ \spad{quoByVar(a0 + a1 x + a2 x**2 + ...)} + ++ returns \spad{a1 + a2 x + a3 x**2 + ...} + ++ Thus, this function substracts the constant term and divides by + ++ the series variable. This function is used when Laurent series + ++ are represented by a Taylor series and an order. + multiplyCoefficients: (I -> Coef,%) -> % + ++ \spad{multiplyCoefficients(f,sum(n = 0..infinity,a[n] * x**n))} + ++ returns \spad{sum(n = 0..infinity,f(n) * a[n] * x**n)}. + ++ This function is used when Laurent series are represented by + ++ a Taylor series and an order. + polynomial: (%,NNI) -> Polynomial Coef + ++ \spad{polynomial(f,k)} returns a polynomial consisting of the sum + ++ of all terms of f of degree \spad{<= k}. + polynomial: (%,NNI,NNI) -> Polynomial Coef + ++ \spad{polynomial(f,k1,k2)} returns a polynomial consisting of the + ++ sum of all terms of f of degree d with \spad{k1 <= d <= k2}. + + if Coef has Field then + "**": (%,Coef) -> % + ++ \spad{f(x) ** a} computes a power of a power series. + ++ When the coefficient ring is a field, we may raise a series + ++ to an exponent from the coefficient ring provided that the + ++ constant coefficient of the series is 1. + + if Coef has Algebra Fraction Integer then + integrate: % -> % + ++ \spad{integrate(f(x))} returns an anti-derivative of the power + ++ series \spad{f(x)} with constant coefficient 0. + ++ We may integrate a series when we can divide coefficients + ++ by integers. + if Coef has integrate: (Coef,Symbol) -> Coef and _ + Coef has variables: Coef -> List Symbol then + integrate: (%,Symbol) -> % + ++ \spad{integrate(f(x),y)} returns an anti-derivative of the + ++ power series \spad{f(x)} with respect to the variable \spad{y}. + if Coef has TranscendentalFunctionCategory and _ + Coef has PrimitiveFunctionCategory and _ + Coef has AlgebraicallyClosedFunctionSpace Integer then + integrate: (%,Symbol) -> % + ++ \spad{integrate(f(x),y)} returns an anti-derivative of + ++ the power series \spad{f(x)} with respect to the variable + ++ \spad{y}. + RadicalCategory + --++ We provide rational powers when we can divide coefficients + --++ by integers. + TranscendentalFunctionCategory + --++ We provide transcendental functions when we can divide + --++ coefficients by integers. + + add + + zero? x == + empty? (coefs := coefficients x) => true + (zero? frst coefs) and (empty? rst coefs) => true + false + +--% OutputForms + +-- We provide defaulr output functions on UTSCAT using the functions +-- 'coefficients', 'center', and 'variable'. + + factorials?: () -> Boolean + -- check a global Lisp variable + factorials?() == false + + termOutput: (I,Coef,OUT) -> OUT + termOutput(k,c,vv) == + -- creates a term c * vv ** k + k = 0 => c :: OUT + mon := (k = 1 => vv; vv ** (k :: OUT)) +-- if factorials?() and k > 1 then +-- c := factorial(k)$IntegerCombinatoricFunctions * c +-- mon := mon / hconcat(k :: OUT,"!" :: OUT) + c = 1 => mon + c = -1 => -mon + (c :: OUT) * mon + + showAll?: () -> Boolean + -- check a global Lisp variable + showAll?() == true + + coerce(p:%):OUT == + empty? (uu := coefficients p) => (0$Coef) :: OUT + var := variable p; cen := center p + vv := + zero? cen => var :: OUT + paren(var :: OUT - cen :: OUT) + n : NNI ; count : NNI := _$streamCount$Lisp + l : L OUT := empty() + for n in 0..count while not empty? uu repeat + if frst(uu) ^= 0 then + l := concat(termOutput(n :: I,frst uu,vv),l) + uu := rst uu + if showAll?() then + for n in (count + 1).. while explicitEntries? uu and _ + not eq?(uu,rst uu) repeat + if frst(uu) ^= 0 then + l := concat(termOutput(n :: I,frst uu,vv),l) + uu := rst uu + l := + explicitlyEmpty? uu => l + eq?(uu,rst uu) and frst uu = 0 => l + concat(prefix("O" :: OUT,[vv ** (n :: OUT)]),l) + empty? l => (0$Coef) :: OUT + reduce("+",reverse_! l) + + if Coef has Field then + (x:%) ** (r:Coef) == series power(r,coefficients x)$STTA + + if Coef has Algebra Fraction Integer then + if Coef has CommutativeRing then + (x:%) ** (y:%) == series(coefficients x **$STTF coefficients y) + (x:%) ** (r:RN) == series powern(r,coefficients x)$STTA + + exp x == series exp(coefficients x)$STTF + log x == series log(coefficients x)$STTF + + sin x == series sin(coefficients x)$STTF + cos x == series cos(coefficients x)$STTF + tan x == series tan(coefficients x)$STTF + cot x == series cot(coefficients x)$STTF + sec x == series sec(coefficients x)$STTF + csc x == series csc(coefficients x)$STTF + + asin x == series asin(coefficients x)$STTF + acos x == series acos(coefficients x)$STTF + atan x == series atan(coefficients x)$STTF + acot x == series acot(coefficients x)$STTF + asec x == series asec(coefficients x)$STTF + acsc x == series acsc(coefficients x)$STTF + + sinh x == series sinh(coefficients x)$STTF + cosh x == series cosh(coefficients x)$STTF + tanh x == series tanh(coefficients x)$STTF + coth x == series coth(coefficients x)$STTF + sech x == series sech(coefficients x)$STTF + csch x == series csch(coefficients x)$STTF + + asinh x == series asinh(coefficients x)$STTF + acosh x == series acosh(coefficients x)$STTF + atanh x == series atanh(coefficients x)$STTF + acoth x == series acoth(coefficients x)$STTF + asech x == series asech(coefficients x)$STTF + acsch x == series acsch(coefficients x)$STTF + + else + (x:%) ** (y:%) == series(coefficients x **$STNC coefficients y) + + (x:%) ** (r:RN) == + coefs := coefficients x + empty? coefs => + positive? r => 0 + zero? r => error "0**0 undefined" + error "0 raised to a negative power" +-- not one? frst coefs => + not (frst coefs = 1) => + error "**: constant coefficient should be 1" + coefs := concat(0,rst coefs) + onePlusX := monom(1,0)$STTA + $STTA monom(1,1)$STTA + ratPow := powern(r,onePlusX)$STTA + series compose(ratPow,coefs)$STTA + + exp x == series exp(coefficients x)$STNC + log x == series log(coefficients x)$STNC + + sin x == series sin(coefficients x)$STNC + cos x == series cos(coefficients x)$STNC + tan x == series tan(coefficients x)$STNC + cot x == series cot(coefficients x)$STNC + sec x == series sec(coefficients x)$STNC + csc x == series csc(coefficients x)$STNC + + asin x == series asin(coefficients x)$STNC + acos x == series acos(coefficients x)$STNC + atan x == series atan(coefficients x)$STNC + acot x == series acot(coefficients x)$STNC + asec x == series asec(coefficients x)$STNC + acsc x == series acsc(coefficients x)$STNC + + sinh x == series sinh(coefficients x)$STNC + cosh x == series cosh(coefficients x)$STNC + tanh x == series tanh(coefficients x)$STNC + coth x == series coth(coefficients x)$STNC + sech x == series sech(coefficients x)$STNC + csch x == series csch(coefficients x)$STNC + + asinh x == series asinh(coefficients x)$STNC + acosh x == series acosh(coefficients x)$STNC + atanh x == series atanh(coefficients x)$STNC + acoth x == series acoth(coefficients x)$STNC + asech x == series asech(coefficients x)$STNC + acsch x == series acsch(coefficients x)$STNC + +@ +\section{category ULSCAT UnivariateLaurentSeriesCategory} +<<category ULSCAT UnivariateLaurentSeriesCategory>>= +)abbrev category ULSCAT UnivariateLaurentSeriesCategory +++ Author: Clifton J. Williamson +++ Date Created: 21 December 1989 +++ Date Last Updated: 20 September 1993 +++ Basic Operations: +++ Related Domains: +++ Also See: +++ AMS Classifications: +++ Keywords: series, Laurent +++ Examples: +++ References: +++ Description: +++ \spadtype{UnivariateLaurentSeriesCategory} is the category of +++ Laurent series in one variable. +UnivariateLaurentSeriesCategory(Coef): Category == Definition where + Coef : Ring + I ==> Integer + NNI ==> NonNegativeInteger + Term ==> Record(k:I,c:Coef) + + Definition ==> UnivariatePowerSeriesCategory(Coef,Integer) with + + series: Stream Term -> % + ++ \spad{series(st)} creates a series from a stream of non-zero terms, + ++ where a term is an exponent-coefficient pair. The terms in the + ++ stream should be ordered by increasing order of exponents. + multiplyCoefficients: (I -> Coef,%) -> % + ++ \spad{multiplyCoefficients(f,sum(n = n0..infinity,a[n] * x**n)) = + ++ sum(n = 0..infinity,f(n) * a[n] * x**n)}. + ++ This function is used when Puiseux series are represented by + ++ a Laurent series and an exponent. + if Coef has IntegralDomain then + rationalFunction: (%,I) -> Fraction Polynomial Coef + ++ \spad{rationalFunction(f,k)} returns a rational function + ++ consisting of the sum of all terms of f of degree <= k. + rationalFunction: (%,I,I) -> Fraction Polynomial Coef + ++ \spad{rationalFunction(f,k1,k2)} returns a rational function + ++ consisting of the sum of all terms of f of degree d with + ++ \spad{k1 <= d <= k2}. + + if Coef has Algebra Fraction Integer then + integrate: % -> % + ++ \spad{integrate(f(x))} returns an anti-derivative of the power + ++ series \spad{f(x)} with constant coefficient 1. + ++ We may integrate a series when we can divide coefficients + ++ by integers. + if Coef has integrate: (Coef,Symbol) -> Coef and _ + Coef has variables: Coef -> List Symbol then + integrate: (%,Symbol) -> % + ++ \spad{integrate(f(x),y)} returns an anti-derivative of the power + ++ series \spad{f(x)} with respect to the variable \spad{y}. + if Coef has TranscendentalFunctionCategory and _ + Coef has PrimitiveFunctionCategory and _ + Coef has AlgebraicallyClosedFunctionSpace Integer then + integrate: (%,Symbol) -> % + ++ \spad{integrate(f(x),y)} returns an anti-derivative of + ++ the power series \spad{f(x)} with respect to the variable + ++ \spad{y}. + RadicalCategory + --++ We provide rational powers when we can divide coefficients + --++ by integers. + TranscendentalFunctionCategory + --++ We provide transcendental functions when we can divide + --++ coefficients by integers. + if Coef has Field then Field + --++ Univariate Laurent series over a field form a field. + --++ In fact, K((x)) is the quotient field of K[[x]]. + +@ +\section{ULSCAT.lsp BOOTSTRAP} +{\bf ULSCAT} depends on a chain of files. We need to break this cycle to build +the algebra. So we keep a cached copy of the translated {\bf ULSCAT} +category which we can write into the {\bf MID} directory. We compile +the lisp code and copy the {\bf ULSCAT.o} file to the {\bf OUT} directory. +This is eventually forcibly replaced by a recompiled version. + +Note that this code is not included in the generated catdef.spad file. + +<<ULSCAT.lsp BOOTSTRAP>>= + +(|/VERSIONCHECK| 2) + +(SETQ |UnivariateLaurentSeriesCategory;CAT| (QUOTE NIL)) + +(SETQ |UnivariateLaurentSeriesCategory;AL| (QUOTE NIL)) + +(DEFUN |UnivariateLaurentSeriesCategory| (#1=#:G83278) (LET (#2=#:G83279) (COND ((SETQ #2# (|assoc| (|devaluate| #1#) |UnivariateLaurentSeriesCategory;AL|)) (CDR #2#)) (T (SETQ |UnivariateLaurentSeriesCategory;AL| (|cons5| (CONS (|devaluate| #1#) (SETQ #2# (|UnivariateLaurentSeriesCategory;| #1#))) |UnivariateLaurentSeriesCategory;AL|)) #2#)))) + +(DEFUN |UnivariateLaurentSeriesCategory;| (|t#1|) (PROG (#1=#:G83277) (RETURN (PROG1 (LETT #1# (|sublisV| (PAIR (QUOTE (|t#1|)) (LIST (|devaluate| |t#1|))) (|sublisV| (PAIR (QUOTE (#2=#:G83276)) (LIST (QUOTE (|Integer|)))) (COND (|UnivariateLaurentSeriesCategory;CAT|) ((QUOTE T) (LETT |UnivariateLaurentSeriesCategory;CAT| (|Join| (|UnivariatePowerSeriesCategory| (QUOTE |t#1|) (QUOTE #2#)) (|mkCategory| (QUOTE |domain|) (QUOTE (((|series| (|$| (|Stream| (|Record| (|:| |k| (|Integer|)) (|:| |c| |t#1|))))) T) ((|multiplyCoefficients| (|$| (|Mapping| |t#1| (|Integer|)) |$|)) T) ((|rationalFunction| ((|Fraction| (|Polynomial| |t#1|)) |$| (|Integer|))) (|has| |t#1| (|IntegralDomain|))) ((|rationalFunction| ((|Fraction| (|Polynomial| |t#1|)) |$| (|Integer|) (|Integer|))) (|has| |t#1| (|IntegralDomain|))) ((|integrate| (|$| |$|)) (|has| |t#1| (|Algebra| (|Fraction| (|Integer|))))) ((|integrate| (|$| |$| (|Symbol|))) (AND (|has| |t#1| (SIGNATURE |variables| ((|List| (|Symbol|)) |t#1|))) (|has| |t#1| (SIGNATURE |integrate| (|t#1| |t#1| (|Symbol|)))) (|has| |t#1| (|Algebra| (|Fraction| (|Integer|)))))) ((|integrate| (|$| |$| (|Symbol|))) (AND (|has| |t#1| (|AlgebraicallyClosedFunctionSpace| (|Integer|))) (|has| |t#1| (|PrimitiveFunctionCategory|)) (|has| |t#1| (|TranscendentalFunctionCategory|)) (|has| |t#1| (|Algebra| (|Fraction| (|Integer|)))))))) (QUOTE (((|RadicalCategory|) (|has| |t#1| (|Algebra| (|Fraction| (|Integer|))))) ((|TranscendentalFunctionCategory|) (|has| |t#1| (|Algebra| (|Fraction| (|Integer|))))) ((|Field|) (|has| |t#1| (|Field|))))) (QUOTE ((|Symbol|) (|Fraction| (|Polynomial| |t#1|)) (|Integer|) (|Stream| (|Record| (|:| |k| (|Integer|)) (|:| |c| |t#1|))))) NIL)) . #3=(|UnivariateLaurentSeriesCategory|)))))) . #3#) (SETELT #1# 0 (LIST (QUOTE |UnivariateLaurentSeriesCategory|) (|devaluate| |t#1|))))))) +@ +\section{category UPXSCAT UnivariatePuiseuxSeriesCategory} +<<category UPXSCAT UnivariatePuiseuxSeriesCategory>>= +)abbrev category UPXSCAT UnivariatePuiseuxSeriesCategory +++ Author: Clifton J. Williamson +++ Date Created: 21 December 1989 +++ Date Last Updated: 20 September 1993 +++ Basic Operations: +++ Related Domains: +++ Also See: +++ AMS Classifications: +++ Keywords: series, Puiseux +++ Examples: +++ References: +++ Description: +++ \spadtype{UnivariatePuiseuxSeriesCategory} is the category of Puiseux +++ series in one variable. +UnivariatePuiseuxSeriesCategory(Coef): Category == Definition where + Coef : Ring + NNI ==> NonNegativeInteger + RN ==> Fraction Integer + Term ==> Record(k:RN,c:Coef) + + Definition ==> UnivariatePowerSeriesCategory(Coef,RN) with + + series: (NNI,Stream Term) -> % + ++ \spad{series(n,st)} creates a series from a common denomiator and + ++ a stream of non-zero terms, where a term is an exponent-coefficient + ++ pair. The terms in the stream should be ordered by increasing order + ++ of exponents and \spad{n} should be a common denominator for the + ++ exponents in the stream of terms. + multiplyExponents: (%,Fraction Integer) -> % + ++ \spad{multiplyExponents(f,r)} multiplies all exponents of the power + ++ series f by the positive rational number r. + + if Coef has Algebra Fraction Integer then + integrate: % -> % + ++ \spad{integrate(f(x))} returns an anti-derivative of the power + ++ series \spad{f(x)} with constant coefficient 1. + ++ We may integrate a series when we can divide coefficients + ++ by rational numbers. + if Coef has integrate: (Coef,Symbol) -> Coef and _ + Coef has variables: Coef -> List Symbol then + integrate: (%,Symbol) -> % + ++ \spad{integrate(f(x),var)} returns an anti-derivative of the power + ++ series \spad{f(x)} with respect to the variable \spad{var}. + if Coef has TranscendentalFunctionCategory and _ + Coef has PrimitiveFunctionCategory and _ + Coef has AlgebraicallyClosedFunctionSpace Integer then + integrate: (%,Symbol) -> % + ++ \spad{integrate(f(x),y)} returns an anti-derivative of + ++ the power series \spad{f(x)} with respect to the variable + ++ \spad{y}. + RadicalCategory + --++ We provide rational powers when we can divide coefficients + --++ by integers. + TranscendentalFunctionCategory + --++ We provide transcendental functions when we can divide + --++ coefficients by integers. + if Coef has Field then Field + --++ Univariate Puiseux series over a field form a field. + +@ +\section{category MTSCAT MultivariateTaylorSeriesCategory} +<<category MTSCAT MultivariateTaylorSeriesCategory>>= +)abbrev category MTSCAT MultivariateTaylorSeriesCategory +++ Author: Clifton J. Williamson +++ Date Created: 6 March 1990 +++ Date Last Updated: 6 March 1990 +++ Basic Operations: +++ Related Domains: +++ Also See: +++ AMS Classifications: +++ Keywords: multivariate, Taylor, series +++ Examples: +++ References: +++ Description: +++ \spadtype{MultivariateTaylorSeriesCategory} is the most general +++ multivariate Taylor series category. +MultivariateTaylorSeriesCategory(Coef,Var): Category == Definition where + Coef : Ring + Var : OrderedSet + L ==> List + NNI ==> NonNegativeInteger + + Definition ==> Join(PartialDifferentialRing Var,_ + PowerSeriesCategory(Coef,IndexedExponents Var,Var),_ + InnerEvalable(Var,%),Evalable %) with + coefficient: (%,Var,NNI) -> % + ++ \spad{coefficient(f,x,n)} returns the coefficient of \spad{x^n} in f. + coefficient: (%,L Var,L NNI) -> % + ++ \spad{coefficient(f,[x1,x2,...,xk],[n1,n2,...,nk])} returns the + ++ coefficient of \spad{x1^n1 * ... * xk^nk} in f. + extend: (%,NNI) -> % + ++ \spad{extend(f,n)} causes all terms of f of degree + ++ \spad{<= n} to be computed. + monomial: (%,Var,NNI) -> % + ++ \spad{monomial(a,x,n)} returns \spad{a*x^n}. + monomial: (%,L Var,L NNI) -> % + ++ \spad{monomial(a,[x1,x2,...,xk],[n1,n2,...,nk])} returns + ++ \spad{a * x1^n1 * ... * xk^nk}. + order: (%,Var) -> NNI + ++ \spad{order(f,x)} returns the order of f viewed as a series in x + ++ may result in an infinite loop if f has no non-zero terms. + order: (%,Var,NNI) -> NNI + ++ \spad{order(f,x,n)} returns \spad{min(n,order(f,x))}. + polynomial: (%,NNI) -> Polynomial Coef + ++ \spad{polynomial(f,k)} returns a polynomial consisting of the sum + ++ of all terms of f of degree \spad{<= k}. + polynomial: (%,NNI,NNI) -> Polynomial Coef + ++ \spad{polynomial(f,k1,k2)} returns a polynomial consisting of the + ++ sum of all terms of f of degree d with \spad{k1 <= d <= k2}. + if Coef has Algebra Fraction Integer then + integrate: (%,Var) -> % + ++ \spad{integrate(f,x)} returns the anti-derivative of the power + ++ series \spad{f(x)} with respect to the variable x with constant + ++ coefficient 1. We may integrate a series when we can divide + ++ coefficients by integers. + RadicalCategory + --++ We provide rational powers when we can divide coefficients + --++ by integers. + TranscendentalFunctionCategory + --++ We provide transcendental functions when we can divide + --++ coefficients by integers. + +@ +\section{MTSCAT.lsp BOOTSTRAP} +{\bf MTSCAT} depends on a chain of files. We need to break this cycle to build +the algebra. So we keep a cached copy of the translated {\bf MTSCAT} +category which we can write into the {\bf MID} directory. We compile +the lisp code and copy the {\bf MTSCAT.o} file to the {\bf OUT} directory. +This is eventually forcibly replaced by a recompiled version. + +Note that this code is not included in the generated catdef.spad file. + +<<MTSCAT.lsp BOOTSTRAP>>= + +(|/VERSIONCHECK| 2) + +(SETQ |MultivariateTaylorSeriesCategory;CAT| (QUOTE NIL)) + +(SETQ |MultivariateTaylorSeriesCategory;AL| (QUOTE NIL)) + +(DEFUN |MultivariateTaylorSeriesCategory| (|&REST| #1=#:G83334 |&AUX| #2=#:G83332) (DSETQ #2# #1#) (LET (#3=#:G83333) (COND ((SETQ #3# (|assoc| (|devaluateList| #2#) |MultivariateTaylorSeriesCategory;AL|)) (CDR #3#)) (T (SETQ |MultivariateTaylorSeriesCategory;AL| (|cons5| (CONS (|devaluateList| #2#) (SETQ #3# (APPLY (FUNCTION |MultivariateTaylorSeriesCategory;|) #2#))) |MultivariateTaylorSeriesCategory;AL|)) #3#)))) + +(DEFUN |MultivariateTaylorSeriesCategory;| (|t#1| |t#2|) (PROG (#1=#:G83331) (RETURN (PROG1 (LETT #1# (|sublisV| (PAIR (QUOTE (|t#1| |t#2|)) (LIST (|devaluate| |t#1|) (|devaluate| |t#2|))) (|sublisV| (PAIR (QUOTE (#2=#:G83330)) (LIST (QUOTE (|IndexedExponents| |t#2|)))) (COND (|MultivariateTaylorSeriesCategory;CAT|) ((QUOTE T) (LETT |MultivariateTaylorSeriesCategory;CAT| (|Join| (|PartialDifferentialRing| (QUOTE |t#2|)) (|PowerSeriesCategory| (QUOTE |t#1|) (QUOTE #2#) (QUOTE |t#2|)) (|InnerEvalable| (QUOTE |t#2|) (QUOTE |$|)) (|Evalable| (QUOTE |$|)) (|mkCategory| (QUOTE |domain|) (QUOTE (((|coefficient| (|$| |$| |t#2| (|NonNegativeInteger|))) T) ((|coefficient| (|$| |$| (|List| |t#2|) (|List| (|NonNegativeInteger|)))) T) ((|extend| (|$| |$| (|NonNegativeInteger|))) T) ((|monomial| (|$| |$| |t#2| (|NonNegativeInteger|))) T) ((|monomial| (|$| |$| (|List| |t#2|) (|List| (|NonNegativeInteger|)))) T) ((|order| ((|NonNegativeInteger|) |$| |t#2|)) T) ((|order| ((|NonNegativeInteger|) |$| |t#2| (|NonNegativeInteger|))) T) ((|polynomial| ((|Polynomial| |t#1|) |$| (|NonNegativeInteger|))) T) ((|polynomial| ((|Polynomial| |t#1|) |$| (|NonNegativeInteger|) (|NonNegativeInteger|))) T) ((|integrate| (|$| |$| |t#2|)) (|has| |t#1| (|Algebra| (|Fraction| (|Integer|))))))) (QUOTE (((|RadicalCategory|) (|has| |t#1| (|Algebra| (|Fraction| (|Integer|))))) ((|TranscendentalFunctionCategory|) (|has| |t#1| (|Algebra| (|Fraction| (|Integer|))))))) (QUOTE ((|Polynomial| |t#1|) (|NonNegativeInteger|) (|List| |t#2|) (|List| (|NonNegativeInteger|)))) NIL)) . #3=(|MultivariateTaylorSeriesCategory|)))))) . #3#) (SETELT #1# 0 (LIST (QUOTE |MultivariateTaylorSeriesCategory|) (|devaluate| |t#1|) (|devaluate| |t#2|))))))) +@ +\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>> + +<<category PSCAT PowerSeriesCategory>> +<<category UPSCAT UnivariatePowerSeriesCategory>> +<<category UTSCAT UnivariateTaylorSeriesCategory>> +<<category ULSCAT UnivariateLaurentSeriesCategory>> +<<category UPXSCAT UnivariatePuiseuxSeriesCategory>> +<<category MTSCAT MultivariateTaylorSeriesCategory>> +@ +\eject +\begin{thebibliography}{99} +\bibitem{1} nothing +\end{thebibliography} +\end{document} |