aboutsummaryrefslogtreecommitdiff
path: root/src/hyper/pages/UP.ht
diff options
context:
space:
mode:
Diffstat (limited to 'src/hyper/pages/UP.ht')
-rw-r--r--src/hyper/pages/UP.ht274
1 files changed, 274 insertions, 0 deletions
diff --git a/src/hyper/pages/UP.ht b/src/hyper/pages/UP.ht
new file mode 100644
index 00000000..b3afe6e0
--- /dev/null
+++ b/src/hyper/pages/UP.ht
@@ -0,0 +1,274 @@
+% Copyright The Numerical Algorithms Group Limited 1992-94. All rights reserved.
+% !! DO NOT MODIFY THIS FILE BY HAND !! Created by ht.awk.
+\newcommand{\UnivariatePolynomialXmpTitle}{UnivariatePolynomial}
+\newcommand{\UnivariatePolynomialXmpNumber}{9.83}
+%
+% =====================================================================
+\begin{page}{UnivariatePolynomialXmpPage}{9.83 UnivariatePolynomial}
+% =====================================================================
+\beginscroll
+
+The domain constructor \spadtype{UnivariatePolynomial}
+%-% \HDindex{polynomial!one variable}{UnivariatePolynomialXmpPage}{9.83}{UnivariatePolynomial}
+(abbreviated \spadtype{UP})
+creates domains of univariate polynomials in a specified variable.
+For example, the domain
+\spadtype{UP(a1,POLY FRAC INT)} provides polynomials in the single variable
+\spad{a1} whose coefficients are general polynomials with rational
+number coefficients.
+
+\beginImportant
+\noindent {\bf Restriction:}
+\texht{\begin{quotation}\noindent}{\newline\indent{5}}
+\Language{} does not allow you to create types where
+\spadtype{UnivariatePolynomial} is contained in the coefficient type of
+\spadtype{Polynomial}. Therefore,
+\spadtype{UP(x,POLY INT)} is legal but \spadtype{POLY UP(x,INT)} is not.
+\texht{\end{quotation}}{\indent{0}}
+\endImportant
+
+\xtc{
+\spadtype{UP(x,INT)} is the domain of polynomials in the single
+variable \spad{x} with integer coefficients.
+}{
+\spadpaste{(p,q) : UP(x,INT) \bound{pdec}\bound{qdec}}
+}
+\xtc{
+}{
+\spadpaste{p := (3*x-1)**2 * (2*x + 8) \free{pdec}\bound{p}}
+}
+\xtc{
+}{
+\spadpaste{q := (1 - 6*x + 9*x**2)**2 \free{qdec}\bound{q}}
+}
+\xtc{
+The usual arithmetic operations are available for univariate
+polynomials.
+}{
+\spadpaste{p**2 + p*q \free{p q}}
+}
+\xtc{
+The operation \spadfunFrom{leadingCoefficient}{UnivariatePolynomial}
+extracts the coefficient of the term of highest degree.
+}{
+\spadpaste{leadingCoefficient p \free{p}}
+}
+\xtc{
+The operation \spadfunFrom{degree}{UnivariatePolynomial} returns
+the degree of the polynomial.
+Since the polynomial has only one variable, the variable is not supplied
+to operations like \spadfunFrom{degree}{UnivariatePolynomial}.
+}{
+\spadpaste{degree p \free{p}}
+}
+\xtc{
+The reductum of the polynomial, the polynomial obtained by
+subtracting the term of highest order, is returned by
+\spadfunFrom{reductum}{UnivariatePolynomial}.
+}{
+\spadpaste{reductum p \free{p}}
+}
+\xtc{
+The operation \spadfunFrom{gcd}{UnivariatePolynomial} computes the
+greatest common divisor of two polynomials.
+}{
+\spadpaste{gcd(p,q) \free{p q}}
+}
+\xtc{
+The operation \spadfunFrom{lcm}{UnivariatePolynomial} computes the
+least common multiple.
+}{
+\spadpaste{lcm(p,q) \free{p q}}
+}
+\xtc{
+The operation \spadfunFrom{resultant}{UnivariatePolynomial}
+computes the resultant of two univariate polynomials.
+In the case of \spad{p} and \spad{q}, the resultant is \spad{0} because they
+share a common root.
+}{
+\spadpaste{resultant(p,q) \free{p q}}
+}
+\xtc{
+To compute the derivative of a univariate polynomial with respect to its
+variable, use \spadfunFrom{D}{UnivariatePolynomial}.
+}{
+\spadpaste{D p \free{p}}
+}
+\xtc{
+Univariate polynomials can also be used as if they were functions.
+To evaluate a univariate polynomial at some point, apply
+the polynomial to the point.
+}{
+\spadpaste{p(2) \free{p}}
+}
+\xtc{
+The same syntax is used for composing two univariate polynomials, i.e.
+substituting one polynomial for the variable in another.
+This substitutes \spad{q} for the variable in \spad{p}.
+}{
+\spadpaste{p(q) \free{p q}}
+}
+\xtc{
+This substitutes \spad{p} for the variable in \spad{q}.
+}{
+\spadpaste{q(p) \free{p q}}
+}
+\xtc{
+To obtain a list of coefficients of the polynomial, use
+\spadfunFrom{coefficients}{UnivariatePolynomial}.
+}{
+\spadpaste{l := coefficients p \free{p}\bound{l}}
+}
+\xtc{
+From this you can use \spadfunFrom{gcd}{UnivariatePolynomial}
+and \spadfunFrom{reduce}{List}
+to compute the content of the polynomial.
+}{
+\spadpaste{reduce(gcd,l) \free{l}}
+}
+\xtc{
+Alternatively (and more easily),
+you can just call \spadfunFrom{content}{UnivariatePolynomial}.
+}{
+\spadpaste{content p \free{p}}
+}
+
+Note that the operation \spadfunFrom{coefficients}{UnivariatePolynomial}
+omits the zero coefficients from the list.
+Sometimes it is useful to convert a univariate polynomial
+to a vector whose \eth{\spad{i }} position contains the degree \spad{i-1}
+coefficient of the polynomial.
+\xtc{
+}{
+\spadpaste{ux := (x**4+2*x+3)::UP(x,INT) \bound{ux}}
+}
+\xtc{
+To get a complete vector of coefficients, use the operation
+\spadfunFrom{vectorise}{UnivariatePolynomial}, which takes a
+univariate polynomial and an integer denoting the length of the
+desired vector.
+}{
+\spadpaste{vectorise(ux,5) \free{ux}}
+}
+
+It is common to want to do something to every term of a polynomial,
+creating a new polynomial in the process.
+\xtc{
+This is a function for iterating across the terms of a polynomial,
+squaring each term.
+}{
+\begin{spadsrc}[\bound{squareTerms}]
+squareTerms(p) ==
+ reduce(+,[t**2 for t in monomials p])
+\end{spadsrc}
+}
+\xtc{
+Recall what \spad{p} looked like.
+}{
+\spadpaste{p \free{p}}
+}
+\xtc{
+We can demonstrate \userfun{squareTerms} on \spad{p}.
+}{
+\spadpaste{squareTerms p \free{p}\free{squareTerms}}
+}
+
+When the coefficients of the univariate polynomial belong to a
+field,\footnote{For example, when the coefficients are rational
+numbers, as opposed to integers. The important property of
+a field is that non-zero elements can be divided and produce
+another element. The quotient of the integers 2 and 3 is not
+another integer.}
+it is possible to compute quotients and remainders.
+\xtc{
+}{
+\spadpaste{(r,s) : UP(a1,FRAC INT) \bound{rdec}\bound{sdec}}
+}
+\xtc{
+}{
+\spadpaste{r := a1**2 - 2/3 \free{rdec}\bound{r}}
+}
+\xtc{
+}{
+\spadpaste{s := a1 + 4 \free{sdec}\bound{s}}
+}
+\xtc{
+When the coefficients are rational numbers or rational expressions, the
+operation \spadfunFrom{quo}{UnivariatePolynomial} computes the quotient
+of two polynomials.
+}{
+\spadpaste{r quo s \free{r s}}
+}
+\xtc{
+The operation
+\spadfunFrom{rem}{UnivariatePolynomial} computes the remainder.
+}{
+\spadpaste{r rem s \free{r s}}
+}
+\xtc{
+The operation \spadfunFrom{divide}{UnivariatePolynomial} can be used to
+return a record of both components.
+}{
+\spadpaste{d := divide(r, s) \free{r s}\bound{d}}
+}
+\xtc{
+Now we check the arithmetic!
+}{
+\spadpaste{r - (d.quotient * s + d.remainder) \free{r s d}}
+}
+\xtc{
+It is also possible to integrate univariate polynomials when the
+coefficients belong to a field.
+}{
+\spadpaste{integrate r \free{r}}
+}
+\xtc{
+}{
+\spadpaste{integrate s \free{s}}
+}
+
+One application of univariate polynomials is to see expressions in terms
+of a specific variable.
+%
+\xtc{
+We start with a polynomial in \spad{a1} whose coefficients
+are quotients of polynomials in \spad{b1} and \spad{b2}.
+}{
+\spadpaste{t : UP(a1,FRAC POLY INT) \bound{tdec}}
+}
+\xtc{
+Since in this case we are not talking about using multivariate
+polynomials in only two variables, we use \spadtype{Polynomial}.
+We also use \spadtype{Fraction} because we want fractions.
+}{
+\spadpaste{t := a1**2 - a1/b2 + (b1**2-b1)/(b2+3) \free{tdec}\bound{t}}
+}
+\xtc{
+We push all the variables into a single quotient of polynomials.
+}{
+\spadpaste{u : FRAC POLY INT := t \bound{u}\free{t}}
+}
+\xtc{
+Alternatively, we can view this as a polynomial in the variable
+This is a {\it mode-directed} conversion: you indicate
+as much of the structure as you care about and let \Language{}
+decide on the full type and how to do the transformation.
+}{
+\spadpaste{u :: UP(b1,?) \free{u}}
+}
+
+See \downlink{``\ugProblemFactorTitle''}{ugProblemFactorPage} in Section \ugProblemFactorNumber\ignore{ugProblemFactor}
+for a discussion of the factorization facilities
+in \Language{} for univariate polynomials.
+For more information on related topics, see
+\downlink{``\ugIntroVariablesTitle''}{ugIntroVariablesPage} in Section \ugIntroVariablesNumber\ignore{ugIntroVariables},
+\downlink{``\ugTypesConvertTitle''}{ugTypesConvertPage} in Section \ugTypesConvertNumber\ignore{ugTypesConvert},
+\downlink{`Polynomial'}{PolynomialXmpPage}\ignore{Polynomial},
+\downlink{`MultivariatePolynomial'}{MultivariatePolynomialXmpPage}\ignore{MultivariatePolynomial}, and
+\downlink{`DistributedMultivariatePolynomial'}{DistributedMultivariatePolynomialXmpPage}\ignore{DistributedMultivariatePolynomial}.
+%
+\showBlurb{UnivariatePolynomial}
+\endscroll
+\autobuttons
+\end{page}
+%