\documentclass{article} \usepackage{open-axiom} \begin{document} \title{\$SPAD/src/algebra cden.spad} \author{Manuel Bronstein} \maketitle \begin{abstract} \end{abstract} \eject \tableofcontents \eject \section{package ICDEN InnerCommonDenominator} <>= )abbrev package ICDEN InnerCommonDenominator --% InnerCommonDenominator ++ Author: Manuel Bronstein ++ Date Created: 2 May 1988 ++ Date Last Updated: 22 Nov 1989 ++ Description: InnerCommonDenominator provides functions to compute ++ the common denominator of a finite linear aggregate of elements ++ of the quotient field of an integral domain. ++ Keywords: gcd, quotient, common, denominator. InnerCommonDenominator(R, Q, A, B): Exports == Implementation where R: IntegralDomain Q: QuotientFieldCategory R A: FiniteLinearAggregate R B: FiniteLinearAggregate Q Exports ==> with commonDenominator: B -> R ++ commonDenominator([q1,...,qn]) returns a common denominator ++ d for q1,...,qn. clearDenominator : B -> A ++ clearDenominator([q1,...,qn]) returns \spad{[p1,...,pn]} such that ++ \spad{qi = pi/d} where d is a common denominator for the qi's. splitDenominator : B -> Record(num: A, den: R) ++ splitDenominator([q1,...,qn]) returns ++ \spad{[[p1,...,pn], d]} such that ++ \spad{qi = pi/d} and d is a common denominator for the qi's. Implementation ==> add import FiniteLinearAggregateFunctions2(Q, B, R, A) clearDenominator l == d := commonDenominator l map(numer(d * #1), l) splitDenominator l == d := commonDenominator l [map(numer(d * #1), l), d] if R has GcdDomain then commonDenominator l == reduce(lcm, map(denom, l),1) else commonDenominator l == reduce("*", map(denom, l), 1) @ \section{package CDEN CommonDenominator} <>= )abbrev package CDEN CommonDenominator --% CommonDenominator ++ Author: Manuel Bronstein ++ Date Created: 2 May 1988 ++ Date Last Updated: 22 Nov 1989 ++ Description: CommonDenominator provides functions to compute the ++ common denominator of a finite linear aggregate of elements of ++ the quotient field of an integral domain. ++ Keywords: gcd, quotient, common, denominator. CommonDenominator(R, Q, A): Exports == Implementation where R: IntegralDomain Q: QuotientFieldCategory R A: FiniteLinearAggregate Q Exports ==> with commonDenominator: A -> R ++ commonDenominator([q1,...,qn]) returns a common denominator ++ d for q1,...,qn. clearDenominator : A -> A ++ clearDenominator([q1,...,qn]) returns \spad{[p1,...,pn]} such that ++ \spad{qi = pi/d} where d is a common denominator for the qi's. splitDenominator : A -> Record(num: A, den: R) ++ splitDenominator([q1,...,qn]) returns ++ \spad{[[p1,...,pn], d]} such that ++ \spad{qi = pi/d} and d is a common denominator for the qi's. Implementation ==> add clearDenominator l == d := commonDenominator l map(numer(d * #1)::Q, l) splitDenominator l == d := commonDenominator l [map(numer(d * #1)::Q, l), d] if R has GcdDomain then qlcm: (Q, Q) -> Q qlcm(a, b) == lcm(numer a, numer b)::Q commonDenominator l == numer reduce(qlcm, map(denom(#1)::Q, l), 1) else commonDenominator l == numer reduce("*", map(denom(#1)::Q, l), 1) @ \section{package UPCDEN UnivariatePolynomialCommonDenominator} <>= )abbrev package UPCDEN UnivariatePolynomialCommonDenominator --% UnivariatePolynomialCommonDenominator ++ Author: Manuel Bronstein ++ Date Created: 2 May 1988 ++ Date Last Updated: 22 Feb 1990 ++ Description: UnivariatePolynomialCommonDenominator provides ++ functions to compute the common denominator of the coefficients of ++ univariate polynomials over the quotient field of a gcd domain. ++ Keywords: gcd, quotient, common, denominator, polynomial. UnivariatePolynomialCommonDenominator(R, Q, UP): Exports == Impl where R : IntegralDomain Q : QuotientFieldCategory R UP: UnivariatePolynomialCategory Q Exports ==> with commonDenominator: UP -> R ++ commonDenominator(q) returns a common denominator d for ++ the coefficients of q. clearDenominator : UP -> UP ++ clearDenominator(q) returns p such that \spad{q = p/d} where d is ++ a common denominator for the coefficients of q. splitDenominator : UP -> Record(num: UP, den: R) ++ splitDenominator(q) returns \spad{[p, d]} such that \spad{q = p/d} and d ++ is a common denominator for the coefficients of q. Impl ==> add import CommonDenominator(R, Q, List Q) commonDenominator p == commonDenominator coefficients p clearDenominator p == d := commonDenominator p map(numer(d * #1)::Q, p) splitDenominator p == d := commonDenominator p [map(numer(d * #1)::Q, p), d] @ \section{package MCDEN MatrixCommonDenominator} <>= )abbrev package MCDEN MatrixCommonDenominator --% MatrixCommonDenominator ++ Author: Manuel Bronstein ++ Date Created: 2 May 1988 ++ Date Last Updated: 20 Jul 1990 ++ Description: MatrixCommonDenominator provides functions to ++ compute the common denominator of a matrix of elements of the ++ quotient field of an integral domain. ++ Keywords: gcd, quotient, matrix, common, denominator. MatrixCommonDenominator(R, Q): Exports == Implementation where R: IntegralDomain Q: QuotientFieldCategory R VR ==> Vector R VQ ==> Vector Q Exports ==> with commonDenominator: Matrix Q -> R ++ commonDenominator(q) returns a common denominator d for ++ the elements of q. clearDenominator : Matrix Q -> Matrix R ++ clearDenominator(q) returns p such that \spad{q = p/d} where d is ++ a common denominator for the elements of q. splitDenominator : Matrix Q -> Record(num: Matrix R, den: R) ++ splitDenominator(q) returns \spad{[p, d]} such that \spad{q = p/d} and d ++ is a common denominator for the elements of q. Implementation ==> add import ListFunctions2(Q, R) import MatrixCategoryFunctions2(Q,VQ,VQ,Matrix Q,R,VR,VR,Matrix R) clearDenominator m == d := commonDenominator m map(numer(d * #1), m) splitDenominator m == d := commonDenominator m [map(numer(d * #1), m), d] if R has GcdDomain then commonDenominator m == lcm map(denom, members m) else commonDenominator m == reduce("*",map(denom, members m),1)$List(R) @ \section{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. @ <<*>>= <> <> <> <> <> @ \eject \begin{thebibliography}{99} \bibitem{1} nothing \end{thebibliography} \end{document}