You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							359 lines
						
					
					
						
							12 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							359 lines
						
					
					
						
							12 KiB
						
					
					
				
								<HTML>
							 | 
						|
								<HEAD>
							 | 
						|
								<!-- Created by texi2html 1.56k from cln.texi on 19 May 2000 -->
							 | 
						|
								
							 | 
						|
								<TITLE>CLN, a Class Library for Numbers - 9. Univariate polynomials</TITLE>
							 | 
						|
								</HEAD>
							 | 
						|
								<BODY>
							 | 
						|
								Go to the <A HREF="cln_1.html">first</A>, <A HREF="cln_8.html">previous</A>, <A HREF="cln_10.html">next</A>, <A HREF="cln_13.html">last</A> section, <A HREF="cln_toc.html">table of contents</A>.
							 | 
						|
								<P><HR><P>
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<H1><A NAME="SEC55" HREF="cln_toc.html#TOC55">9. Univariate polynomials</A></H1>
							 | 
						|
								<P>
							 | 
						|
								<A NAME="IDX280"></A>
							 | 
						|
								<A NAME="IDX281"></A>
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<H2><A NAME="SEC56" HREF="cln_toc.html#TOC56">9.1 Univariate polynomial rings</A></H2>
							 | 
						|
								
							 | 
						|
								<P>
							 | 
						|
								CLN implements univariate polynomials (polynomials in one variable) over an
							 | 
						|
								arbitrary ring. The indeterminate variable may be either unnamed (and will be
							 | 
						|
								printed according to <CODE>cl_default_print_flags.univpoly_varname</CODE>, which
							 | 
						|
								defaults to <SAMP>`x'</SAMP>) or carry a given name. The base ring and the
							 | 
						|
								indeterminate are explicitly part of every polynomial. CLN doesn't allow you to
							 | 
						|
								(accidentally) mix elements of different polynomial rings, e.g.
							 | 
						|
								<CODE>(a^2+1) * (b^3-1)</CODE> will result in a runtime error. (Ideally this should
							 | 
						|
								return a multivariate polynomial, but they are not yet implemented in CLN.)
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<P>
							 | 
						|
								The classes of univariate polynomial rings are
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<PRE>
							 | 
						|
								                           Ring
							 | 
						|
								                         cl_ring
							 | 
						|
								                        <cl_ring.h>
							 | 
						|
								                            |
							 | 
						|
								                            |
							 | 
						|
								                 Univariate polynomial ring
							 | 
						|
								                      cl_univpoly_ring
							 | 
						|
								                      <cl_univpoly.h>
							 | 
						|
								                            |
							 | 
						|
								           +----------------+-------------------+
							 | 
						|
								           |                |                   |
							 | 
						|
								 Complex polynomial ring    |    Modular integer polynomial ring
							 | 
						|
								 cl_univpoly_complex_ring   |        cl_univpoly_modint_ring
							 | 
						|
								  <cl_univpoly_complex.h>   |        <cl_univpoly_modint.h>
							 | 
						|
								                            |
							 | 
						|
								           +----------------+
							 | 
						|
								           |                |
							 | 
						|
								   Real polynomial ring     |
							 | 
						|
								   cl_univpoly_real_ring    |
							 | 
						|
								    <cl_univpoly_real.h>    |
							 | 
						|
								                            |
							 | 
						|
								           +----------------+
							 | 
						|
								           |                |
							 | 
						|
								 Rational polynomial ring   |
							 | 
						|
								 cl_univpoly_rational_ring  |
							 | 
						|
								  <cl_univpoly_rational.h>  |
							 | 
						|
								                            |
							 | 
						|
								           +----------------+
							 | 
						|
								           |
							 | 
						|
								 Integer polynomial ring
							 | 
						|
								 cl_univpoly_integer_ring
							 | 
						|
								  <cl_univpoly_integer.h>
							 | 
						|
								</PRE>
							 | 
						|
								
							 | 
						|
								<P>
							 | 
						|
								and the corresponding classes of univariate polynomials are
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<PRE>
							 | 
						|
								                   Univariate polynomial
							 | 
						|
								                          cl_UP
							 | 
						|
								                      <cl_univpoly.h>
							 | 
						|
								                            |
							 | 
						|
								           +----------------+-------------------+
							 | 
						|
								           |                |                   |
							 | 
						|
								   Complex polynomial       |      Modular integer polynomial
							 | 
						|
								        cl_UP_N             |                cl_UP_MI
							 | 
						|
								  <cl_univpoly_complex.h>   |        <cl_univpoly_modint.h>
							 | 
						|
								                            |
							 | 
						|
								           +----------------+
							 | 
						|
								           |                |
							 | 
						|
								     Real polynomial        |
							 | 
						|
								        cl_UP_R             |
							 | 
						|
								    <cl_univpoly_real.h>    |
							 | 
						|
								                            |
							 | 
						|
								           +----------------+
							 | 
						|
								           |                |
							 | 
						|
								   Rational polynomial      |
							 | 
						|
								        cl_UP_RA            |
							 | 
						|
								  <cl_univpoly_rational.h>  |
							 | 
						|
								                            |
							 | 
						|
								           +----------------+
							 | 
						|
								           |
							 | 
						|
								   Integer polynomial
							 | 
						|
								        cl_UP_I
							 | 
						|
								  <cl_univpoly_integer.h>
							 | 
						|
								</PRE>
							 | 
						|
								
							 | 
						|
								<P>
							 | 
						|
								Univariate polynomial rings are constructed using the functions
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<DL COMPACT>
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_univpoly_ring cl_find_univpoly_ring (const cl_ring& R)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<DT><CODE>cl_univpoly_ring cl_find_univpoly_ring (const cl_ring& R, const cl_symbol& varname)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								This function returns the polynomial ring <SAMP>`R[X]'</SAMP>, unnamed or named.
							 | 
						|
								<CODE>R</CODE> may be an arbitrary ring. This function takes care of finding out
							 | 
						|
								about special cases of <CODE>R</CODE>, such as the rings of complex numbers,
							 | 
						|
								real numbers, rational numbers, integers, or modular integer rings.
							 | 
						|
								There is a cache table of rings, indexed by <CODE>R</CODE> and <CODE>varname</CODE>.
							 | 
						|
								This ensures that two calls of this function with the same arguments will
							 | 
						|
								return the same polynomial ring.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_univpoly_complex_ring cl_find_univpoly_ring (const cl_complex_ring& R)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX282"></A>
							 | 
						|
								<DT><CODE>cl_univpoly_complex_ring cl_find_univpoly_ring (const cl_complex_ring& R, const cl_symbol& varname)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<DT><CODE>cl_univpoly_real_ring cl_find_univpoly_ring (const cl_real_ring& R)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<DT><CODE>cl_univpoly_real_ring cl_find_univpoly_ring (const cl_real_ring& R, const cl_symbol& varname)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<DT><CODE>cl_univpoly_rational_ring cl_find_univpoly_ring (const cl_rational_ring& R)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<DT><CODE>cl_univpoly_rational_ring cl_find_univpoly_ring (const cl_rational_ring& R, const cl_symbol& varname)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<DT><CODE>cl_univpoly_integer_ring cl_find_univpoly_ring (const cl_integer_ring& R)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<DT><CODE>cl_univpoly_integer_ring cl_find_univpoly_ring (const cl_integer_ring& R, const cl_symbol& varname)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<DT><CODE>cl_univpoly_modint_ring cl_find_univpoly_ring (const cl_modint_ring& R)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<DT><CODE>cl_univpoly_modint_ring cl_find_univpoly_ring (const cl_modint_ring& R, const cl_symbol& varname)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								These functions are equivalent to the general <CODE>cl_find_univpoly_ring</CODE>,
							 | 
						|
								only the return type is more specific, according to the base ring's type.
							 | 
						|
								</DL>
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<H2><A NAME="SEC57" HREF="cln_toc.html#TOC57">9.2 Functions on univariate polynomials</A></H2>
							 | 
						|
								
							 | 
						|
								<P>
							 | 
						|
								Given a univariate polynomial ring <CODE>R</CODE>, the following members can be used.
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<DL COMPACT>
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_ring R->basering()</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX283"></A>
							 | 
						|
								This returns the base ring, as passed to <SAMP>`cl_find_univpoly_ring'</SAMP>.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP R->zero()</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX284"></A>
							 | 
						|
								This returns <CODE>0 in R</CODE>, a polynomial of degree -1.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP R->one()</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX285"></A>
							 | 
						|
								This returns <CODE>1 in R</CODE>, a polynomial of degree <= 0.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP R->canonhom (const cl_I& x)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX286"></A>
							 | 
						|
								This returns <CODE>x in R</CODE>, a polynomial of degree <= 0.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP R->monomial (const cl_ring_element& x, uintL e)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX287"></A>
							 | 
						|
								This returns a sparse polynomial: <CODE>x * X^e</CODE>, where <CODE>X</CODE> is the
							 | 
						|
								indeterminate.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP R->create (sintL degree)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX288"></A>
							 | 
						|
								Creates a new polynomial with a given degree. The zero polynomial has degree
							 | 
						|
								<CODE>-1</CODE>. After creating the polynomial, you should put in the coefficients,
							 | 
						|
								using the <CODE>set_coeff</CODE> member function, and then call the <CODE>finalize</CODE>
							 | 
						|
								member function.
							 | 
						|
								</DL>
							 | 
						|
								
							 | 
						|
								<P>
							 | 
						|
								The following are the only destructive operations on univariate polynomials.
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<DL COMPACT>
							 | 
						|
								
							 | 
						|
								<DT><CODE>void set_coeff (cl_UP& x, uintL index, const cl_ring_element& y)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX289"></A>
							 | 
						|
								This changes the coefficient of <CODE>X^index</CODE> in <CODE>x</CODE> to be <CODE>y</CODE>.
							 | 
						|
								After changing a polynomial and before applying any "normal" operation on it,
							 | 
						|
								you should call its <CODE>finalize</CODE> member function.
							 | 
						|
								
							 | 
						|
								<DT><CODE>void finalize (cl_UP& x)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX290"></A>
							 | 
						|
								This function marks the endpoint of destructive modifications of a polynomial.
							 | 
						|
								It normalizes the internal representation so that subsequent computations have
							 | 
						|
								less overhead. Doing normal computations on unnormalized polynomials may
							 | 
						|
								produce wrong results or crash the program.
							 | 
						|
								</DL>
							 | 
						|
								
							 | 
						|
								<P>
							 | 
						|
								The following operations are defined on univariate polynomials.
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<DL COMPACT>
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_univpoly_ring x.ring ()</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX291"></A>
							 | 
						|
								Returns the ring to which the univariate polynomial <CODE>x</CODE> belongs.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP operator+ (const cl_UP&, const cl_UP&)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX292"></A>
							 | 
						|
								Returns the sum of two univariate polynomials.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP operator- (const cl_UP&, const cl_UP&)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX293"></A>
							 | 
						|
								Returns the difference of two univariate polynomials.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP operator- (const cl_UP&)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								Returns the negative of a univariate polynomial.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP operator* (const cl_UP&, const cl_UP&)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX294"></A>
							 | 
						|
								Returns the product of two univariate polynomials. One of the arguments may
							 | 
						|
								also be a plain integer or an element of the base ring.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP square (const cl_UP&)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX295"></A>
							 | 
						|
								Returns the square of a univariate polynomial.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP expt_pos (const cl_UP& x, const cl_I& y)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX296"></A>
							 | 
						|
								<CODE>y</CODE> must be > 0. Returns <CODE>x^y</CODE>.
							 | 
						|
								
							 | 
						|
								<DT><CODE>bool operator== (const cl_UP&, const cl_UP&)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX297"></A>
							 | 
						|
								<DT><CODE>bool operator!= (const cl_UP&, const cl_UP&)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX298"></A>
							 | 
						|
								Compares two univariate polynomials, belonging to the same univariate
							 | 
						|
								polynomial ring, for equality.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_boolean zerop (const cl_UP& x)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX299"></A>
							 | 
						|
								Returns true if <CODE>x</CODE> is <CODE>0 in R</CODE>.
							 | 
						|
								
							 | 
						|
								<DT><CODE>sintL degree (const cl_UP& x)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX300"></A>
							 | 
						|
								Returns the degree of the polynomial. The zero polynomial has degree <CODE>-1</CODE>.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_ring_element coeff (const cl_UP& x, uintL index)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX301"></A>
							 | 
						|
								Returns the coefficient of <CODE>X^index</CODE> in the polynomial <CODE>x</CODE>.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_ring_element x (const cl_ring_element& y)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX302"></A>
							 | 
						|
								Evaluation: If <CODE>x</CODE> is a polynomial and <CODE>y</CODE> belongs to the base ring,
							 | 
						|
								then <SAMP>`x(y)'</SAMP> returns the value of the substitution of <CODE>y</CODE> into
							 | 
						|
								<CODE>x</CODE>.
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP deriv (const cl_UP& x)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX303"></A>
							 | 
						|
								Returns the derivative of the polynomial <CODE>x</CODE> with respect to the
							 | 
						|
								indeterminate <CODE>X</CODE>.
							 | 
						|
								</DL>
							 | 
						|
								
							 | 
						|
								<P>
							 | 
						|
								The following output functions are defined (see also the chapter on
							 | 
						|
								input/output).
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<DL COMPACT>
							 | 
						|
								
							 | 
						|
								<DT><CODE>void fprint (cl_ostream stream, const cl_UP& x)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX304"></A>
							 | 
						|
								<DT><CODE>cl_ostream operator<< (cl_ostream stream, const cl_UP& x)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX305"></A>
							 | 
						|
								Prints the univariate polynomial <CODE>x</CODE> on the <CODE>stream</CODE>. The output may
							 | 
						|
								depend on the global printer settings in the variable
							 | 
						|
								<CODE>cl_default_print_flags</CODE>.
							 | 
						|
								</DL>
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<H2><A NAME="SEC58" HREF="cln_toc.html#TOC58">9.3 Special polynomials</A></H2>
							 | 
						|
								
							 | 
						|
								<P>
							 | 
						|
								The following functions return special polynomials.
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<DL COMPACT>
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP_I cl_tschebychev (sintL n)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX306"></A>
							 | 
						|
								<A NAME="IDX307"></A>
							 | 
						|
								Returns the n-th Tchebychev polynomial (n >= 0).
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP_I cl_hermite (sintL n)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX308"></A>
							 | 
						|
								<A NAME="IDX309"></A>
							 | 
						|
								Returns the n-th Hermite polynomial (n >= 0).
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP_RA cl_legendre (sintL n)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX310"></A>
							 | 
						|
								<A NAME="IDX311"></A>
							 | 
						|
								Returns the n-th Legendre polynomial (n >= 0).
							 | 
						|
								
							 | 
						|
								<DT><CODE>cl_UP_I cl_laguerre (sintL n)</CODE>
							 | 
						|
								<DD>
							 | 
						|
								<A NAME="IDX312"></A>
							 | 
						|
								<A NAME="IDX313"></A>
							 | 
						|
								Returns the n-th Laguerre polynomial (n >= 0).
							 | 
						|
								</DL>
							 | 
						|
								
							 | 
						|
								<P>
							 | 
						|
								Information how to derive the differential equation satisfied by each
							 | 
						|
								of these polynomials from their definition can be found in the
							 | 
						|
								<CODE>doc/polynomial/</CODE> directory.
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								<P><HR><P>
							 | 
						|
								Go to the <A HREF="cln_1.html">first</A>, <A HREF="cln_8.html">previous</A>, <A HREF="cln_10.html">next</A>, <A HREF="cln_13.html">last</A> section, <A HREF="cln_toc.html">table of contents</A>.
							 | 
						|
								</BODY>
							 | 
						|
								</HTML>
							 |