summaryrefslogtreecommitdiffstats
path: root/slib_5.html
diff options
context:
space:
mode:
authorThomas Bushnell, BSG <tb@debian.org>2005-11-02 14:55:21 -0800
committerBryan Newbold <bnewbold@robocracy.org>2017-02-20 00:05:32 -0800
commit34c54a22ff7818bb8b38ef4d9c87dbbcb221ba73 (patch)
tree1189d06a81277bcf8539b0260a69a19f6038effb /slib_5.html
parent611b3db17894e5fdc0db3d49eaf6743d27b44233 (diff)
parent5145dd3aa0c02c9fc496d1432fc4410674206e1d (diff)
downloadslib-34c54a22ff7818bb8b38ef4d9c87dbbcb221ba73.tar.gz
slib-34c54a22ff7818bb8b38ef4d9c87dbbcb221ba73.zip
Import Debian changes 3a2-1debian/3a2-1
slib (3a2-1) unstable; urgency=low * New upstream release. * Acknowledge NMU. (Closes: #281809) * Makefile: Don't hack Makefile; use rules instead. * debian/rules: Set on make invocations: prefix, htmldir, TEXI2HTML. * debian/rules (clean): Clean more stuff here. * Makefile: Comment out old rule for $(htmldir)slib_toc.html. Instead, specify directly that the texi2html invocation produces that file. * debian/rules (binary-indep): Find web files in slib subdir. * debian/control (Build-Depends-Indep): Go back to using scm.
Diffstat (limited to 'slib_5.html')
-rw-r--r--slib_5.html6100
1 files changed, 0 insertions, 6100 deletions
diff --git a/slib_5.html b/slib_5.html
deleted file mode 100644
index b3ef4b8..0000000
--- a/slib_5.html
+++ /dev/null
@@ -1,6100 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html40/loose.dtd">
-<HTML>
-<!-- Created on January, 10 2005 by texi2html 1.66 -->
-<!--
-Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
- Karl Berry <karl@freefriends.org>
- Olaf Bachmann <obachman@mathematik.uni-kl.de>
- and many others.
-Maintained by: Many creative people <dev@texi2html.cvshome.org>
-Send bugs and suggestions to <users@texi2html.cvshome.org>
-
--->
-<HEAD>
-<TITLE>SLIB: Mathematical Packages</TITLE>
-
-<META NAME="description" CONTENT="SLIB: Mathematical Packages">
-<META NAME="keywords" CONTENT="SLIB: Mathematical Packages">
-<META NAME="resource-type" CONTENT="document">
-<META NAME="distribution" CONTENT="global">
-<META NAME="Generator" CONTENT="texi2html 1.66">
-
-</HEAD>
-
-<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
-
-<A NAME="SEC88"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC87"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC89"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H1> 5. Mathematical Packages </H1>
-<!--docid::SEC88::-->
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC89">5.1 Bit-Twiddling</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'logical</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'modular</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'factor</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC97">5.4 Random Numbers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'random</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'fft</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'crc</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC102">5.7 Graphing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">VRML97</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC118">5.9 Color</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'root</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC135">5.11 Minimizing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'minimize</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'commutative-ring</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'determinant</TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Bit-Twiddling"></A>
-<HR SIZE="6">
-<A NAME="SEC89"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC90"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.1 Bit-Twiddling </H2>
-<!--docid::SEC89::-->
-<P>
-
-<CODE>(require 'logical)</CODE>
-<A NAME="IDX476"></A>
-</P>
-<P>
-
-The bit-twiddling functions are made available through the use of the
-<CODE>logical</CODE> package. <CODE>logical</CODE> is loaded by inserting
-<CODE>(require 'logical)</CODE> before the code that uses these
-<A NAME="IDX477"></A>
-functions. These functions behave as though operating on integers
-in two's-complement representation.
-</P>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC90"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC89"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC91"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.1.1 Bitwise Operations </H3>
-<!--docid::SEC90::-->
-<P>
-
-<A NAME="IDX478"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>logand</B> <I>n1 n1</I>
-<DD>Returns the integer which is the bit-wise AND of the two integer
-arguments.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (logand #b1100 #b1010) 2)
- => &quot;1000&quot;
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX479"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>logior</B> <I>n1 n2</I>
-<DD>Returns the integer which is the bit-wise OR of the two integer
-arguments.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (logior #b1100 #b1010) 2)
- => &quot;1110&quot;
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX480"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>logxor</B> <I>n1 n2</I>
-<DD>Returns the integer which is the bit-wise XOR of the two integer
-arguments.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (logxor #b1100 #b1010) 2)
- => &quot;110&quot;
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX481"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>lognot</B> <I>n</I>
-<DD>Returns the integer which is the 2s-complement of the integer argument.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (lognot #b10000000) 2)
- => &quot;-10000001&quot;
-(number-&gt;string (lognot #b0) 2)
- => &quot;-1&quot;
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX482"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bitwise-if</B> <I>mask n0 n1</I>
-<DD>Returns an integer composed of some bits from integer <VAR>n0</VAR> and some
-from integer <VAR>n1</VAR>. A bit of the result is taken from <VAR>n0</VAR> if the
-corresponding bit of integer <VAR>mask</VAR> is 1 and from <VAR>n1</VAR> if that bit
-of <VAR>mask</VAR> is 0.
-</DL>
-<P>
-
-<A NAME="IDX483"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>logtest</B> <I>j k</I>
-<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>(logtest j k) == (not (zero? (logand j k)))
-
-(logtest #b0100 #b1011) => #f
-(logtest #b0100 #b0111) => #t
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX484"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>logcount</B> <I>n</I>
-<DD>Returns the number of bits in integer <VAR>n</VAR>. If integer is positive,
-the 1-bits in its binary representation are counted. If negative, the
-0-bits in its two's-complement binary representation are counted. If 0,
-0 is returned.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(logcount #b10101010)
- => 4
-(logcount 0)
- => 0
-(logcount -2)
- => 1
-</pre></td></tr></table></DL>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC91"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC90"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC92"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.1.2 Bit Within Word </H3>
-<!--docid::SEC91::-->
-<P>
-
-<A NAME="IDX485"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>logbit?</B> <I>index j</I>
-<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>(logbit? index j) == (logtest (integer-expt 2 index) j)
-
-(logbit? 0 #b1101) => #t
-(logbit? 1 #b1101) => #f
-(logbit? 2 #b1101) => #t
-(logbit? 3 #b1101) => #t
-(logbit? 4 #b1101) => #f
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX486"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>copy-bit</B> <I>index from bit</I>
-<DD>Returns an integer the same as <VAR>from</VAR> except in the <VAR>index</VAR>th bit,
-which is 1 if <VAR>bit</VAR> is <CODE>#t</CODE> and 0 if <VAR>bit</VAR> is <CODE>#f</CODE>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (copy-bit 0 0 #t) 2) => &quot;1&quot;
-(number-&gt;string (copy-bit 2 0 #t) 2) => &quot;100&quot;
-(number-&gt;string (copy-bit 2 #b1111 #f) 2) => &quot;1011&quot;
-</pre></td></tr></table></DL>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC92"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC91"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC93"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.1.3 Fields of Bits </H3>
-<!--docid::SEC92::-->
-<P>
-
-<A NAME="IDX487"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>logical:ones</B> <I>n</I>
-<DD>Returns the smallest non-negative integer having <VAR>n</VAR> binary ones.
-</DL>
-<P>
-
-<A NAME="IDX488"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bit-field</B> <I>n start end</I>
-<DD>Returns the integer composed of the <VAR>start</VAR> (inclusive) through
-<VAR>end</VAR> (exclusive) bits of <VAR>n</VAR>. The <VAR>start</VAR>th bit becomes
-the 0-th bit in the result.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (bit-field #b1101101010 0 4) 2)
- => &quot;1010&quot;
-(number-&gt;string (bit-field #b1101101010 4 9) 2)
- => &quot;10110&quot;
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX489"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>copy-bit-field</B> <I>to start end from</I>
-<DD>Returns an integer the same as <VAR>to</VAR> except possibly in the
-<VAR>start</VAR> (inclusive) through <VAR>end</VAR> (exclusive) bits, which are
-the same as those of <VAR>from</VAR>. The 0-th bit of <VAR>from</VAR> becomes the
-<VAR>start</VAR>th bit of the result.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (copy-bit-field #b1101101010 0 4 0) 2)
- => &quot;1101100000&quot;
-(number-&gt;string (copy-bit-field #b1101101010 0 4 -1) 2)
- => &quot;1101101111&quot;
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX490"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>ash</B> <I>n count</I>
-<DD>Returns an integer equivalent to
-<CODE>(inexact-&gt;exact (floor (* <VAR>n</VAR> (expt 2 <VAR>count</VAR>))))</CODE>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (ash #b1 3) 2)
- => &quot;1000&quot;
-(number-&gt;string (ash #b1010 -1) 2)
- => &quot;101&quot;
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX491"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>integer-length</B> <I>n</I>
-<DD>Returns the number of bits neccessary to represent <VAR>n</VAR>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(integer-length #b10101010)
- => 8
-(integer-length 0)
- => 0
-(integer-length #b1111)
- => 4
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX492"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>integer-expt</B> <I>n k</I>
-<DD>Returns <VAR>n</VAR> raised to the non-negative integer exponent <VAR>k</VAR>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(integer-expt 2 5)
- => 32
-(integer-expt -3 3)
- => -27
-</pre></td></tr></table></DL>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC93"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC92"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC94"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.1.4 Bit order and Lamination </H3>
-<!--docid::SEC93::-->
-<P>
-
-<A NAME="IDX493"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>logical:rotate</B> <I>k count len</I>
-<DD>Returns the low-order <VAR>len</VAR> bits of <VAR>k</VAR> cyclically permuted
-<VAR>count</VAR> bits towards high-order.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (logical:rotate #b0100 3 4) 2)
-=> &quot;10&quot;
-(number-&gt;string (logical:rotate #b0100 -1 4) 2)
-=> &quot;10&quot;
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX494"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bit-reverse</B> <I>k n</I>
-<DD>Returns the low-order <VAR>k</VAR> bits of <VAR>n</VAR> with the bit order
-reversed. The low-order bit of <VAR>n</VAR> is the high order bit of the
-returned value.
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (bit-reverse 8 #xa7) 16)
- => &quot;e5&quot;
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX495"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>integer-&gt;list</B> <I>k len</I>
-<DD><A NAME="IDX496"></A>
-<DT><U>Function:</U> <B>integer-&gt;list</B> <I>k</I>
-<DD><CODE>integer-&gt;list</CODE> returns a list of <VAR>len</VAR> booleans corresponding
-to each bit of the given integer. #t is coded for each 1; #f for 0.
-The <VAR>len</VAR> argument defaults to <CODE>(integer-length <VAR>k</VAR>)</CODE>.
-<P>
-
-<A NAME="IDX497"></A>
-<DT><U>Function:</U> <B>list-&gt;integer</B> <I>list</I>
-<DD><CODE>list-&gt;integer</CODE> returns an integer formed from the booleans in the
-list <VAR>list</VAR>, which must be a list of booleans. A 1 bit is coded for
-each #t; a 0 bit for #f.
-</P>
-<P>
-
-<CODE>integer-&gt;list</CODE> and <CODE>list-&gt;integer</CODE> are inverses so far as
-<CODE>equal?</CODE> is concerned.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX498"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>booleans-&gt;integer</B> <I>bool1 <small>...</small></I>
-<DD>Returns the integer coded by the <VAR>bool1</VAR> <small>...</small> arguments.
-</DL>
-<P>
-
-<A NAME="IDX499"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bitwise:laminate</B> <I>k1 <small>...</small></I>
-<DD>Returns an integer composed of the bits of <VAR>k1</VAR> <small>...</small> interlaced
-in argument order. Given <VAR>k1</VAR>, <small>...</small> <VAR>kn</VAR>, the n low-order
-bits of the returned value will be the lowest-order bit of each
-argument.
-<P>
-
-<A NAME="IDX500"></A>
-<DT><U>Function:</U> <B>bitwise:delaminate</B> <I>count k</I>
-<DD>Returns a list of <VAR>count</VAR> integers comprised of every <VAR>count</VAR>h
-bit of the integer <VAR>k</VAR>.
-</P>
-<P>
-
-For any non-negative integers <VAR>k</VAR> and <VAR>count</VAR>:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(eqv? k (bitwise:laminate (bitwise:delaminate count k)))
-</pre></td></tr></table></DL>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC94"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC93"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC95"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.1.5 Gray code </H3>
-<!--docid::SEC94::-->
-<P>
-
-<A NAME="IDX501"></A>
-A <EM>Gray code</EM> is an ordering of non-negative integers in which
-exactly one bit differs between each pair of successive elements. There
-are multiple Gray codings. An n-bit Gray code corresponds to a
-Hamiltonian cycle on an n-dimensional hypercube.
-</P>
-<P>
-
-Gray codes find use communicating incrementally changing values between
-asynchronous agents. De-laminated Gray codes comprise the coordinates
-of Peano-Hilbert space-filling curves.
-</P>
-<P>
-
-<A NAME="IDX502"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>integer-&gt;gray-code</B> <I>k</I>
-<DD>Converts <VAR>k</VAR> to a Gray code of the same <CODE>integer-length</CODE> as
-<VAR>k</VAR>.
-<P>
-
-<A NAME="IDX503"></A>
-<DT><U>Function:</U> <B>gray-code-&gt;integer</B> <I>k</I>
-<DD>Converts the Gray code <VAR>k</VAR> to an integer of the same
-<CODE>integer-length</CODE> as <VAR>k</VAR>.
-</P>
-<P>
-
-For any non-negative integer <VAR>k</VAR>,
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(eqv? k (gray-code-&gt;integer (integer-&gt;gray-code k)))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX504"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>=</B> <I>k1 k2</I>
-<DD><A NAME="IDX505"></A>
-<DT><U>Function:</U> <B>gray-code&lt;?</B> <I>k1 k2</I>
-<DD><A NAME="IDX506"></A>
-<DT><U>Function:</U> <B>gray-code&gt;?</B> <I>k1 k2</I>
-<DD><A NAME="IDX507"></A>
-<DT><U>Function:</U> <B>gray-code&lt;=?</B> <I>k1 k2</I>
-<DD><A NAME="IDX508"></A>
-<DT><U>Function:</U> <B>gray-code&gt;=?</B> <I>k1 k2</I>
-<DD>These procedures return #t if their Gray code arguments are
-(respectively): equal, monotonically increasing, monotonically
-decreasing, monotonically nondecreasing, or monotonically nonincreasing.
-<P>
-
-For any non-negative integers <VAR>k1</VAR> and <VAR>k2</VAR>, the Gray code
-predicate of <CODE>(integer-&gt;gray-code k1)</CODE> and
-<CODE>(integer-&gt;gray-code k2)</CODE> will return the same value as the
-corresponding predicate of <VAR>k1</VAR> and <VAR>k2</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="Modular Arithmetic"></A>
-<HR SIZE="6">
-<A NAME="SEC95"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC94"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC96"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.2 Modular Arithmetic </H2>
-<!--docid::SEC95::-->
-<P>
-
-<CODE>(require 'modular)</CODE>
-<A NAME="IDX509"></A>
-</P>
-<P>
-
-<A NAME="IDX510"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>mod</B> <I>x1 x2</I>
-<DD><A NAME="IDX511"></A>
-<DT><U>Function:</U> <B>rem</B> <I>x1 x2</I>
-<DD><P>
-
-These procedures implement the Common-Lisp functions of the same names.
-The real number <VAR>x2</VAR> must be non-zero.
-<CODE>mod</CODE> returns <CODE>(- <VAR>x1</VAR> (* <VAR>x2</VAR> (floor (/ <VAR>x1</VAR> <VAR>x2</VAR>))))</CODE>.
-<CODE>rem</CODE> returns <CODE>(- <VAR>x1</VAR> (* <VAR>x2</VAR> (truncate (/ <VAR>x1</VAR> <VAR>x2</VAR>))))</CODE>.
-</P>
-<P>
-
-If <VAR>x1</VAR> and <VAR>x2</VAR> are integers, then <CODE>mod</CODE> behaves like
-<CODE>modulo</CODE> and <CODE>rem</CODE> behaves like <CODE>remainder</CODE>.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"><TT>(mod -90 360) => 270
-(rem -90 180) => -90
-
-(mod 540 360) => 180
-(rem 540 360) => 180
-
-(mod (* 5/2 pi) (* 2 pi)) => 1.5707963267948965
-(rem (* -5/2 pi) (* 2 pi)) => -1.5707963267948965
-</TT>
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX512"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>extended-euclid</B> <I>n1 n2</I>
-<DD><P>
-
-Returns a list of 3 integers <CODE>(d x y)</CODE> such that d = gcd(<VAR>n1</VAR>,
-<VAR>n2</VAR>) = <VAR>n1</VAR> * x + <VAR>n2</VAR> * y.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX513"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>symmetric:modulus</B> <I>n</I>
-<DD><P>
-
-Returns <CODE>(quotient (+ -1 n) -2)</CODE> for positive odd integer <VAR>n</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX514"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>modulus-&gt;integer</B> <I>modulus</I>
-<DD><P>
-
-Returns the non-negative integer characteristic of the ring formed when
-<VAR>modulus</VAR> is used with <CODE>modular:</CODE> procedures.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX515"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>modular:normalize</B> <I>modulus n</I>
-<DD><P>
-
-Returns the integer <CODE>(modulo <VAR>n</VAR> (modulus-&gt;integer
-<VAR>modulus</VAR>))</CODE> in the representation specified by <VAR>modulus</VAR>.
-</P>
-</DL>
-The rest of these functions assume normalized arguments; That is, the
-arguments are constrained by the following table:
-<P>
-
-For all of these functions, if the first argument (<VAR>modulus</VAR>) is:
-</P>
-<DL COMPACT>
-<DT><CODE>positive?</CODE>
-<DD>Work as before. The result is between 0 and <VAR>modulus</VAR>.
-<P>
-
-</P>
-<DT><CODE>zero?</CODE>
-<DD>The arguments are treated as integers. An integer is returned.
-<P>
-
-</P>
-<DT><CODE>negative?</CODE>
-<DD>The arguments and result are treated as members of the integers modulo
-<CODE>(+ 1 (* -2 <VAR>modulus</VAR>))</CODE>, but with <EM>symmetric</EM>
-<A NAME="IDX516"></A>
-representation; i.e. <CODE>(&lt;= (- <VAR>modulus</VAR>) <VAR>n</VAR>
-<VAR>modulus</VAR>)</CODE>.
-</DL>
-<P>
-
-If all the arguments are fixnums the computation will use only fixnums.
-</P>
-<P>
-
-<A NAME="IDX517"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>modular:invertable?</B> <I>modulus k</I>
-<DD><P>
-
-Returns <CODE>#t</CODE> if there exists an integer n such that <VAR>k</VAR> * n
-== 1 mod <VAR>modulus</VAR>, and <CODE>#f</CODE> otherwise.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX518"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>modular:invert</B> <I>modulus n2</I>
-<DD><P>
-
-Returns an integer n such that 1 = (n * <VAR>n2</VAR>) mod <VAR>modulus</VAR>. If
-<VAR>n2</VAR> has no inverse mod <VAR>modulus</VAR> an error is signaled.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX519"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>modular:negate</B> <I>modulus n2</I>
-<DD><P>
-
-Returns (-<VAR>n2</VAR>) mod <VAR>modulus</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX520"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>modular:+</B> <I>modulus n2 n3</I>
-<DD><P>
-
-Returns (<VAR>n2</VAR> + <VAR>n3</VAR>) mod <VAR>modulus</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX521"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>modular:-</B> <I>modulus n2 n3</I>
-<DD><P>
-
-Returns (<VAR>n2</VAR> - <VAR>n3</VAR>) mod <VAR>modulus</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX522"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>modular:*</B> <I>modulus n2 n3</I>
-<DD><P>
-
-Returns (<VAR>n2</VAR> * <VAR>n3</VAR>) mod <VAR>modulus</VAR>.
-</P>
-<P>
-
-The Scheme code for <CODE>modular:*</CODE> with negative <VAR>modulus</VAR> is
-not completed for fixnum-only implementations.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX523"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>modular:expt</B> <I>modulus n2 n3</I>
-<DD><P>
-
-Returns (<VAR>n2</VAR> ^ <VAR>n3</VAR>) mod <VAR>modulus</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="Prime Numbers"></A>
-<HR SIZE="6">
-<A NAME="SEC96"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC95"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.3 Prime Numbers </H2>
-<!--docid::SEC96::-->
-<P>
-
-<CODE>(require 'factor)</CODE>
-<A NAME="IDX524"></A>
-<A NAME="IDX525"></A>
-</P>
-<P>
-
-<A NAME="IDX526"></A>
-</P>
-<DL>
-<DT><U>Variable:</U> <B>prime:prngs</B>
-<DD><P>
-
-<VAR>prime:prngs</VAR> is the random-state (see section <A HREF="slib_5.html#SEC97">5.4 Random Numbers</A>) used by these
-procedures. If you call these procedures from more than one thread
-(or from interrupt), <CODE>random</CODE> may complain about reentrant
-calls.
-</P>
-</DL>
-<EM>Note:</EM> The prime test and generation procedures implement (or
-use) the Solovay-Strassen primality test. See
-<P>
-
-<UL>
-<LI>Robert Solovay and Volker Strassen,
-<CITE>A Fast Monte-Carlo Test for Primality</CITE>,
-SIAM Journal on Computing, 1977, pp 84-85.
-</UL>
-<P>
-
-<A NAME="IDX527"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>jacobi-symbol</B> <I>p q</I>
-<DD><P>
-
-Returns the value (+1, -1, or 0) of the Jacobi-Symbol of
-exact non-negative integer <VAR>p</VAR> and exact positive odd integer <VAR>q</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX528"></A>
-</P>
-<DL>
-<DT><U>Variable:</U> <B>prime:trials</B>
-<DD><P>
-
-<VAR>prime:trials</VAR> the maxinum number of iterations of Solovay-Strassen that will
-be done to test a number for primality.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX529"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>prime?</B> <I>n</I>
-<DD><P>
-
-Returns <CODE>#f</CODE> if <VAR>n</VAR> is composite; <CODE>#t</CODE> if <VAR>n</VAR> is prime.
-There is a slight chance <CODE>(expt 2 (- prime:trials))</CODE> that a
-composite will return <CODE>#t</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX530"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>primes&lt;</B> <I>start count</I>
-<DD><P>
-
-Returns a list of the first <VAR>count</VAR> prime numbers less than
-<VAR>start</VAR>. If there are fewer than <VAR>count</VAR> prime numbers
-less than <VAR>start</VAR>, then the returned list will have fewer than
-<VAR>start</VAR> elements.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX531"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>primes&gt;</B> <I>start count</I>
-<DD><P>
-
-Returns a list of the first <VAR>count</VAR> prime numbers greater than <VAR>start</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX532"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>factor</B> <I>k</I>
-<DD><P>
-
-Returns a list of the prime factors of <VAR>k</VAR>. The order of the
-factors is unspecified. In order to obtain a sorted list do
-<CODE>(sort! (factor <VAR>k</VAR>) &lt;)</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="Random Numbers"></A>
-<HR SIZE="6">
-<A NAME="SEC97"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC96"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC98"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.4 Random Numbers </H2>
-<!--docid::SEC97::-->
-<P>
-
-<A NAME="IDX533"></A>
-<A NAME="IDX534"></A>
-A pseudo-random number generator is only as good as the tests it passes.
-George Marsaglia of Florida State University developed a battery of
-tests named <EM>DIEHARD</EM> (<A HREF="http://stat.fsu.edu/~geo/diehard.html">http://stat.fsu.edu/~geo/diehard.html</A>).
-`<TT>diehard.c</TT>' has a bug which the patch
-<A HREF="http://swissnet.ai.mit.edu/ftpdir/users/jaffer/diehard.c.pat">http://swissnet.ai.mit.edu/ftpdir/users/jaffer/diehard.c.pat</A> corrects.
-</P>
-<P>
-
-SLIB's PRNG generates 8 bits at a time. With the degenerate seed
-`<SAMP>0</SAMP>', the numbers generated pass DIEHARD; but when bits are
-combined from sequential bytes, tests fail. With the seed
-`<SAMP>http://swissnet.ai.mit.edu/~jaffer/SLIB.html</SAMP>', all of those
-tests pass.
-</P>
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'random</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'random-inexact</TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Exact Random Numbers"></A>
-<HR SIZE="6">
-<A NAME="SEC98"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC99"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.4.1 Exact Random Numbers </H3>
-<!--docid::SEC98::-->
-<P>
-
-<CODE>(require 'random)</CODE>
-<A NAME="IDX535"></A>
-</P>
-<P>
-
-<A NAME="IDX536"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>random</B> <I>n state</I>
-<DD><P>
-
-<A NAME="IDX537"></A>
-<DT><U>Function:</U> <B>random</B> <I>n</I>
-<DD></P>
-<P>
-
-<VAR>n</VAR> must be an exact positive integer. <CODE>random</CODE> returns an exact integer
-between zero (inclusive) and <VAR>n</VAR> (exclusive). The values returned by
-<CODE>random</CODE> are uniformly distributed from 0 to <VAR>n</VAR>.
-</P>
-<P>
-
-The optional argument <VAR>state</VAR> must be of the type returned by
-<CODE>(seed-&gt;random-state)</CODE> or <CODE>(make-random-state)</CODE>. It
-defaults to the value of the variable <CODE>*random-state*</CODE>. This
-object is used to maintain the state of the pseudo-random-number
-generator and is altered as a side effect of calls to <CODE>random</CODE>.
-</P>
-</DL>
-<A NAME="IDX538"></A>
-<DL>
-<DT><U>Variable:</U> <B>*random-state*</B>
-<DD>Holds a data structure that encodes the internal state of the
-random-number generator that <CODE>random</CODE> uses by default. The nature
-of this data structure is implementation-dependent. It may be printed
-out and successfully read back in, but may or may not function correctly
-as a random-number state object in another implementation.
-</DL>
-<P>
-
-<A NAME="IDX539"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>copy-random-state</B> <I>state</I>
-<DD><P>
-
-Returns a new copy of argument <VAR>state</VAR>.
-</P>
-<P>
-
-<A NAME="IDX540"></A>
-<DT><U>Function:</U> <B>copy-random-state</B>
-<DD>Returns a new copy of <CODE>*random-state*</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX541"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>seed-&gt;random-state</B> <I>seed</I>
-<DD><P>
-
-Returns a new object of type suitable for use as the value of the
-variable <CODE>*random-state*</CODE> or as a second argument to <CODE>random</CODE>.
-The number or string <VAR>seed</VAR> is used to initialize the state. If
-<CODE>seed-&gt;random-state</CODE> is called twice with arguments which are
-<CODE>equal?</CODE>, then the returned data structures will be <CODE>equal?</CODE>.
-Calling <CODE>seed-&gt;random-state</CODE> with unequal arguments will nearly
-always return unequal states.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX542"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-random-state</B>
-<DD><P>
-
-<A NAME="IDX543"></A>
-<DT><U>Function:</U> <B>make-random-state</B> <I>obj</I>
-<DD>Returns a new object of type suitable for use as the value of the
-variable <CODE>*random-state*</CODE> or as a second argument to <CODE>random</CODE>.
-If the optional argument <VAR>obj</VAR> is given, it should be a printable
-Scheme object; the first 50 characters of its printed representation
-will be used as the seed. Otherwise the value of <CODE>*random-state*</CODE>
-is used as the seed.
-</P>
-</DL>
-<P>
-
-<A NAME="Inexact Random Numbers"></A>
-<HR SIZE="6">
-<A NAME="SEC99"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC98"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC100"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.4.2 Inexact Random Numbers </H3>
-<!--docid::SEC99::-->
-<P>
-
-<CODE>(require 'random-inexact)</CODE>
-<A NAME="IDX544"></A>
-</P>
-<P>
-
-<A NAME="IDX545"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>random:uniform</B>
-<DD><P>
-
-<A NAME="IDX546"></A>
-<DT><U>Function:</U> <B>random:uniform</B> <I>state</I>
-<DD>Returns an uniformly distributed inexact real random number in the
-range between 0 and 1.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX547"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>random:exp</B>
-<DD><P>
-
-<A NAME="IDX548"></A>
-<DT><U>Function:</U> <B>random:exp</B> <I>state</I>
-<DD>Returns an inexact real in an exponential distribution with mean 1. For
-an exponential distribution with mean <VAR>u</VAR> use
-<CODE>(* <VAR>u</VAR> (random:exp))</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX549"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>random:normal</B>
-<DD><P>
-
-<A NAME="IDX550"></A>
-<DT><U>Function:</U> <B>random:normal</B> <I>state</I>
-<DD>Returns an inexact real in a normal distribution with mean 0 and
-standard deviation 1. For a normal distribution with mean <VAR>m</VAR> and
-standard deviation <VAR>d</VAR> use
-<CODE>(+ <VAR>m</VAR> (* <VAR>d</VAR> (random:normal)))</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX551"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>random:normal-vector!</B> <I>vect</I>
-<DD><P>
-
-<A NAME="IDX552"></A>
-<DT><U>Procedure:</U> <B>random:normal-vector!</B> <I>vect state</I>
-<DD>Fills <VAR>vect</VAR> with inexact real random numbers which are independent
-and standard normally distributed (i.e., with mean 0 and variance 1).
-</P>
-</DL>
-<P>
-
-<A NAME="IDX553"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>random:hollow-sphere!</B> <I>vect</I>
-<DD><P>
-
-<A NAME="IDX554"></A>
-<DT><U>Procedure:</U> <B>random:hollow-sphere!</B> <I>vect state</I>
-<DD>Fills <VAR>vect</VAR> with inexact real random numbers the sum of whose
-squares is equal to 1.0. Thinking of <VAR>vect</VAR> as coordinates in space
-of dimension n = <CODE>(vector-length <VAR>vect</VAR>)</CODE>, the coordinates are
-uniformly distributed over the surface of the unit n-shere.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX555"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>random:solid-sphere!</B> <I>vect</I>
-<DD><P>
-
-<A NAME="IDX556"></A>
-<DT><U>Procedure:</U> <B>random:solid-sphere!</B> <I>vect state</I>
-<DD>Fills <VAR>vect</VAR> with inexact real random numbers the sum of whose
-squares is less than 1.0. Thinking of <VAR>vect</VAR> as coordinates in
-space of dimension <VAR>n</VAR> = <CODE>(vector-length <VAR>vect</VAR>)</CODE>, the
-coordinates are uniformly distributed within the unit <VAR>n</VAR>-shere.
-The sum of the squares of the numbers is returned.
-</P>
-</DL>
-<P>
-
-<A NAME="Fast Fourier Transform"></A>
-<HR SIZE="6">
-<A NAME="SEC100"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC99"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC101"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.5 Fast Fourier Transform </H2>
-<!--docid::SEC100::-->
-<P>
-
-<CODE>(require 'fft)</CODE>
-<A NAME="IDX557"></A>
-</P>
-<P>
-
-<A NAME="IDX558"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>fft</B> <I>array</I>
-<DD><P>
-
-<VAR>array</VAR> is an array of <CODE>(expt 2 n)</CODE> numbers. <CODE>fft</CODE>
-returns an array of complex numbers comprising the
-<EM>Discrete Fourier Transform</EM> of <VAR>array</VAR>.
-<A NAME="IDX559"></A>
-</P>
-</DL>
-<P>
-
-<A NAME="IDX560"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>fft-1</B> <I>array</I>
-<DD><P>
-
-<CODE>fft-1</CODE> returns an array of complex numbers comprising the
-inverse Discrete Fourier Transform of <VAR>array</VAR>.
-</P>
-</DL>
-<CODE>(fft-1 (fft <VAR>array</VAR>))</CODE> will return an array of values close to
-<VAR>array</VAR>.
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(fft '#(1 0+i -1 0-i 1 0+i -1 0-i)) =>
-
-#(0.0 0.0 0.0+628.0783185208527e-18i 0.0
- 0.0 0.0 8.0-628.0783185208527e-18i 0.0)
-
-(fft-1 '#(0 0 0 0 0 0 8 0)) =>
-
-#(1.0 -61.23031769111886e-18+1.0i -1.0 61.23031769111886e-18-1.0i
- 1.0 -61.23031769111886e-18+1.0i -1.0 61.23031769111886e-18-1.0i)
-</pre></td></tr></table><P>
-
-<A NAME="Cyclic Checksum"></A>
-<HR SIZE="6">
-<A NAME="SEC101"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC100"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.6 Cyclic Checksum </H2>
-<!--docid::SEC101::-->
-<P>
-
-<CODE>(require 'crc)</CODE>
-<A NAME="IDX561"></A>
-Cyclic Redundancy Checks using Galois field GF(2) polynomial
-arithmetic are used for error detection in many data transmission
-and storage applications.
-</P>
-<P>
-
-The generator polynomials for various CRC protocols are availble
-from many sources. But the polynomial is just one of many
-parameters which must match in order for a CRC implementation to
-interoperate with existing systems:
-</P>
-<P>
-
-<UL>
-
-<LI>
-the byte-order and bit-order of the data stream;
-<P>
-
-</P>
-<LI>
-whether the CRC or its inverse is being calculated;
-<P>
-
-</P>
-<LI>
-the initial CRC value; and
-<P>
-
-</P>
-<LI>
-whether and where the CRC value is appended (inverted
-or non-inverted) to the data stream.
-<P>
-
-</UL>
-<P>
-
-There is even some controversy over the polynomials themselves.
-</P>
-<P>
-
-<A NAME="IDX562"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>crc-32-polynomial</B>
-<DD>For CRC-32, http://www2.sis.pitt.edu/~jkabara/tele-2100/lect08.html
-gives x^32+x^26+x^23+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+1.
-<P>
-
-But
-http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html,
-http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm,
-http://spinroot.com/spin/Doc/Book91_PDF/ch3.pdf,
-http://www.erg.abdn.ac.uk/users/gorry/course/dl-pages/crc.html,
-http://www.rad.com/networks/1994/err_con/crc_most.htm, and
-http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html,
-http://www.nobugconsulting.ro/crc.php give
-x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
-</P>
-<P>
-
-SLIB <CODE>crc-32-polynomial</CODE> uses the latter definition.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX563"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>crc-ccitt-polynomial</B>
-<DD><P>
-
-http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html,
-http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm,
-http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html,
-http://www2.sis.pitt.edu/~jkabara/tele-2100/lect08.html, and
-http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html give
-CRC-CCITT: x^16+x^12+x^5+1.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX564"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>crc-16-polynomial</B>
-<DD><P>
-
-http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html,
-http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm,
-http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html,
-http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html, and
-http://www.usb.org/developers/data/crcdes.pdf give
-CRC-16: x^16+x^15+x^2+1.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX565"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>crc-12-polynomial</B>
-<DD><P>
-
-http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html,
-http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html,
-http://www.it.iitb.ac.in/it605/lectures/link/node4.html, and
-http://spinroot.com/spin/Doc/Book91_PDF/ch3.pdf give
-CRC-12: x^12+x^11+x^3+x^2+1.
-</P>
-<P>
-
-But
-http://www.ffldusoe.edu/Faculty/Denenberg/Topics/Networks/Error_Detection_Correction/crc.html,
-http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm,
-http://www.eng.uwi.tt/depts/elec/staff/kimal/errorcc.html,
-http://www.ee.uwa.edu.au/~roberto/teach/itc314/java/CRC/,
-http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html, and
-http://www.efg2.com/Lab/Mathematics/CRC.htm give
-CRC-12: x^12+x^11+x^3+x^2+x+1.
-</P>
-<P>
-
-These differ in bit 1 and calculations using them return different
-values. With citations near evenly split, it is hard to know which is
-correct.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX566"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>crc-10-polynomial</B>
-<DD><P>
-
-http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html gives
-CRC-10: x^10+x^9+x^5+x^4+1;
-but
-http://cell-relay.indiana.edu/cell-relay/publications/software/CRC/crc10.html,
-http://www.it.iitb.ac.in/it605/lectures/link/node4.html,
-http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html,
-http://www.techfest.com/networking/atm/atm.htm,
-http://www.protocols.com/pbook/atmcell2.htm, and
-http://www.nobugconsulting.ro/crc.php give
-CRC-10: x^10+x^9+x^5+x^4+x+1.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX567"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>crc-08-polynomial</B>
-<DD><P>
-
-http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html,
-http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html,
-http://www.it.iitb.ac.in/it605/lectures/link/node4.html, and
-http://www.nobugconsulting.ro/crc.php give
-CRC-8: x^8+x^2+x^1+1
-</P>
-</DL>
-<P>
-
-<A NAME="IDX568"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>atm-hec-polynomial</B>
-<DD><P>
-
-http://cell-relay.indiana.edu/cell-relay/publications/software/CRC/32bitCRC.tutorial.html and
-http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html give
-ATM HEC: x^8+x^2+x+1.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX569"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>dowcrc-polynomial</B>
-<DD><P>
-
-http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html gives
-DOWCRC: x^8+x^5+x^4+1.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX570"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>usb-token-polynomial</B>
-<DD><P>
-
-http://www.usb.org/developers/data/crcdes.pdf and
-http://www.nobugconsulting.ro/crc.php give
-USB-token: x^5+x^2+1.
-</P>
-</DL>
-<P>
-
-Each of these polynomial constants is a string of `<SAMP>1</SAMP>'s and
-`<SAMP>0</SAMP>'s, the exponent of each power of <VAR>x</VAR> in descending order.
-</P>
-<P>
-
-<A NAME="IDX571"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>crc:make-table</B> <I>poly</I>
-<DD><P>
-
-<VAR>poly</VAR> must be string of `<SAMP>1</SAMP>'s and `<SAMP>0</SAMP>'s beginning with
-`<SAMP>1</SAMP>' and having length greater than 8. <CODE>crc:make-table</CODE>
-returns a vector of 256 integers, such that:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! <VAR>crc</VAR>
- (logxor (ash (logand (+ -1 (ash 1 (- <VAR>deg</VAR> 8))) <VAR>crc</VAR>) 8)
- (vector-ref <VAR>crc-table</VAR>
- (logxor (ash <VAR>crc</VAR> (- 8 <VAR>deg</VAR>)) <VAR>byte</VAR>))))
-</pre></td></tr></table><P>
-
-will compute the <VAR>crc</VAR> with the 8 additional bits in <VAR>byte</VAR>;
-where <VAR>crc</VAR> is the previous accumulated CRC value, <VAR>deg</VAR> is
-the degree of <VAR>poly</VAR>, and <VAR>crc-table</VAR> is the vector returned
-by <CODE>crc:make-table</CODE>.
-</P>
-<P>
-
-If the implementation does not support <VAR>deg</VAR>-bit integers, then
-<CODE>crc:make-table</CODE> returns #f.
-</P>
-<P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX572"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>cksum</B> <I>file</I>
-<DD><P>
-
-Computes the P1003.2/D11.2 (POSIX.2) 32-bit checksum of <VAR>file</VAR>.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'crc)
-<A NAME="IDX573"></A>(cksum (in-vicinity (library-vicinity) &quot;ratize.scm&quot;))
-=> 157103930
-</pre></td></tr></table><P>
-
-<A NAME="IDX574"></A>
-<DT><U>Function:</U> <B>cksum</B> <I>port</I>
-<DD>Computes the checksum of the bytes read from <VAR>port</VAR> until the
-end-of-file.
-</P>
-<P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX575"></A>
-<CODE>cksum-string</CODE>, which returns the P1003.2/D11.2 (POSIX.2) 32-bit
-checksum of the bytes in <VAR>str</VAR>, can be defined as follows:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'string-port)
-(define (cksum-string str) (call-with-input-string str cksum))
-</pre></td></tr></table><P>
-
-<A NAME="IDX576"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>crc16</B> <I>file</I>
-<DD><P>
-
-Computes the USB data-packet (16-bit) CRC of <VAR>file</VAR>.
-</P>
-<P>
-
-<A NAME="IDX577"></A>
-<DT><U>Function:</U> <B>crc16</B> <I>port</I>
-<DD>Computes the USB data-packet (16-bit) CRC of the bytes read from
-<VAR>port</VAR> until the end-of-file.
-</P>
-<P>
-
-<CODE>crc16</CODE> calculates the same values as the crc16.pl program given
-in http://www.usb.org/developers/data/crcdes.pdf.
-</P>
-<P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX578"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>crc5</B> <I>file</I>
-<DD><P>
-
-Computes the USB token (5-bit) CRC of <VAR>file</VAR>.
-</P>
-<P>
-
-<A NAME="IDX579"></A>
-<DT><U>Function:</U> <B>crc5</B> <I>port</I>
-<DD>Computes the USB token (5-bit) CRC of the bytes read from
-<VAR>port</VAR> until the end-of-file.
-</P>
-<P>
-
-<CODE>crc5</CODE> calculates the same values as the crc5.pl program given
-in http://www.usb.org/developers/data/crcdes.pdf.
-</P>
-<P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="Graphing"></A>
-<HR SIZE="6">
-<A NAME="SEC102"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC101"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC103"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.7 Graphing </H2>
-<!--docid::SEC102::-->
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC104">5.7.2 PostScript Graphing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Character Plotting"></A>
-<HR SIZE="6">
-<A NAME="SEC103"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.7.1 Character Plotting </H3>
-<!--docid::SEC103::-->
-<P>
-
-<CODE>(require 'charplot)</CODE>
-<A NAME="IDX580"></A>
-</P>
-<P>
-
-<A NAME="IDX581"></A>
-</P>
-<DL>
-<DT><U>Variable:</U> <B>charplot:dimensions</B>
-<DD>A list of the maximum height (number of lines) and maximum width (number
-of columns) for the graph, its scales, and labels.
-<P>
-
-The default value for <VAR>charplot:dimensions</VAR> is the
-<CODE>output-port-height</CODE> and <CODE>output-port-width</CODE> of
-<CODE>current-output-port</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX582"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>plot</B> <I>coords x-label y-label</I>
-<DD><VAR>coords</VAR> is a list or vector of coordinates, lists of x and y
-coordinates. <VAR>x-label</VAR> and <VAR>y-label</VAR> are strings with which to
-label the x and y axes.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'charplot)
-<A NAME="IDX583"></A>(set! charplot:dimensions '(20 55))
-
-(define (make-points n)
- (if (zero? n)
- '()
- (cons (list (/ n 6) (sin (/ n 6))) (make-points (1- n)))))
-
-(plot (make-points 40) &quot;x&quot; &quot;Sin(x)&quot;)
--|
- Sin(x) _________________________________________
- 1|- **** |
- | ** ** |
- 0.75|- * * |
- | * * |
- 0.5|- * * |
- | * *|
- 0.25|- * * |
- | * * |
- 0|-------------------*------------------*--|
- | * |
- -0.25|- * * |
- | * * |
- -0.5|- * |
- | * * |
- -0.75|- * * |
- | ** ** |
- -1|- **** |
- |:_____._____:_____._____:_____._____:____|
- x 2 4 6
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX584"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>plot</B> <I>func x1 x2</I>
-<DD><A NAME="IDX585"></A>
-<DT><U>Procedure:</U> <B>plot</B> <I>func x1 x2 npts</I>
-<DD>Plots the function of one argument <VAR>func</VAR> over the range <VAR>x1</VAR> to
-<VAR>x2</VAR>. If the optional integer argument <VAR>npts</VAR> is supplied, it
-specifies the number of points to evaluate <VAR>func</VAR> at.
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(plot sin 0 (* 2 pi))
--|
- _________________________________________
- 1|-: **** |
- | : ** ** |
- 0.75|-: * * |
- | : * * |
- 0.5|-: ** ** |
- | : * * |
- 0.25|-:** ** |
- | :* * |
- 0|-*------------------*--------------------|
- | : * * |
- -0.25|-: ** ** |
- | : * * |
- -0.5|-: * ** |
- | : * * |
- -0.75|-: * ** |
- | : ** ** |
- -1|-: **** |
- |_:_____._____:_____._____:_____._____:___|
- 0 2 4 6
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX586"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>histograph</B> <I>data label</I>
-<DD>Creates and displays a histogram of the numerical values contained in
-vector or list <VAR>data</VAR>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'random-inexact)
-(histograph (do ((idx 99 (+ -1 idx))
- (lst '() (cons (* .02 (random:normal)) lst)))
- ((negative? idx) lst))
- &quot;normal&quot;)
--|
- _________________________________________
- 8|- : I |
- | : I |
- 7|- I I : I |
- | I I : I |
- 6|- III I :I I |
- | III I :I I |
- 5|- IIIIIIIIII I |
- | IIIIIIIIII I |
- 4|- IIIIIIIIIIII |
- | IIIIIIIIIIII |
- 3|-I I I IIIIIIIIIIII II I |
- | I I I IIIIIIIIIIII II I |
- 2|-I I I IIIIIIIIIIIIIIIII I |
- | I I I IIIIIIIIIIIIIIIII I |
- 1|-II I I IIIIIIIIIIIIIIIIIIIII I I I |
- | II I I IIIIIIIIIIIIIIIIIIIII I I I |
- 0|-IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII----|
- |__.____:____.____:____.____:____.____:___|
- normal -0.025 0 0.025 0.05
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="PostScript Graphing"></A>
-<HR SIZE="6">
-<A NAME="SEC104"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC103"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC105"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.7.2 PostScript Graphing </H3>
-<!--docid::SEC104::-->
-<P>
-
-<CODE>(require 'eps-graph)</CODE>
-</P>
-<P>
-
-This is a graphing package creating encapsulated-PostScript files.
-Its motivations and design choice are described in
-<A HREF="http://swissnet.ai.mit.edu/~jaffer/Docupage/grapheps">http://swissnet.ai.mit.edu/~jaffer/Docupage/grapheps</A>
-</P>
-<P>
-
-A dataset to be plotted is taken from a 2-dimensional array.
-Corresponding coordinates are in rows. Coordinates from any
-pair of columns can be plotted.
-</P>
-<P>
-
-<A NAME="IDX587"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>create-postscript-graph</B> <I>filename.eps size elt1 <small>...</small></I>
-<DD><P>
-
-<VAR>filename.eps</VAR> should be a string naming an output file to be created. <VAR>size</VAR>
-should be an exact integer, a list of two exact integers, or #f.
-<VAR>elt1</VAR>, ... are values returned by graphing primitives described here.
-</P>
-<P>
-
-<CODE>create-postscript-graph</CODE> creates an <EM>Encapsulated-PostScript</EM> file named <VAR>filename.eps</VAR> containing
-<A NAME="IDX588"></A>
-graphs as directed by the <VAR>elt1</VAR>, ... arguments.
-</P>
-<P>
-
-The size of the graph is determined by the <VAR>size</VAR> argument. If a list
-of two integers, they specify the width and height. If one integer,
-then that integer is the width and the height is 3/4 of the width.
-If #f, the graph will be 800 by 600.
-</P>
-</DL>
-These graphing procedures should be called as arguments to
-<CODE>create-postscript-graph</CODE>. The order of these arguments is
-significant; PostScript graphics state is affected serially from the
-first <VAR>elt</VAR> argument to the last.
-<P>
-
-<A NAME="IDX589"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>whole-page</B>
-<DD><P>
-
-Pushes a rectangle for the whole encapsulated page onto the
-PostScript stack. This pushed rectangle is an implicit argument to
-<CODE>partition-page</CODE> or <CODE>setup-plot</CODE>.
-</P>
-</DL>
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC106">5.7.2.2 Drawing the Graph</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC111">5.7.2.7 Example Graph</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Column Ranges"></A>
-<HR SIZE="6">
-<A NAME="SEC105"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC106"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 5.7.2.1 Column Ranges </H4>
-<!--docid::SEC105::-->
-<P>
-
-A <EM>range</EM> is a list of two numbers, the minimum and the maximum.
-<A NAME="IDX590"></A>
-<A NAME="IDX591"></A>
-Ranges can be given explicity or computed in PostScript by
-<CODE>column-range</CODE>.
-</P>
-<P>
-
-<A NAME="IDX592"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>column-range</B> <I>array k</I>
-<DD><P>
-
-Returns the range of values in 2-dimensional <VAR>array</VAR> column <VAR>k</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX593"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>pad-range</B> <I>range p</I>
-<DD><P>
-
-Expands <VAR>range</VAR> by <VAR>p</VAR>/100 on each end.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX594"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>snap-range</B> <I>range</I>
-<DD><P>
-
-Expands <VAR>range</VAR> to round number of ticks.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX595"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>combine-ranges</B> <I>range1 range2 <small>...</small></I>
-<DD><P>
-
-Returns the minimal range covering all <VAR>range1</VAR>, <VAR>range2</VAR>, ...
-</P>
-</DL>
-<P>
-
-<A NAME="IDX596"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>setup-plot</B> <I>x-range y-range pagerect</I>
-<DD><P>
-
-<A NAME="IDX597"></A>
-<DT><U>Function:</U> <B>setup-plot</B> <I>x-range y-range</I>
-<DD><VAR>x-range</VAR> and <VAR>y-range</VAR> should each be a list of two numbers or the value returned
-by <CODE>pad-range</CODE>, <CODE>snap-range</CODE>, or <CODE>combine-range</CODE>.
-<VAR>pagerect</VAR> is the rectangle bounding the graph to be drawn; if missing, the
-rectangle from the top of the PostScript stack is popped and used.
-</P>
-<P>
-
-Based on the given ranges, <CODE>setup-plot</CODE> sets up scaling and margins for making
-a graph. The margins are sized proportional to the <VAR>fontheight</VAR>
-value at the time of the call to setup-plot. <CODE>setup-plot</CODE> sets two variables:
-</P>
-<P>
-
-</P>
-<DL COMPACT>
-<DT><VAR>plotrect</VAR>
-<DD>The region where data points will be plotted.
-<DT><VAR>graphrect</VAR>
-<DD>The <VAR>pagerect</VAR> argument to <CODE>setup-plot</CODE>. Includes plotrect, legends, etc.
-</DL>
-</DL>
-<A NAME="Drawing the Graph"></A>
-<HR SIZE="6">
-<A NAME="SEC106"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC105"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC107"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 5.7.2.2 Drawing the Graph </H4>
-<!--docid::SEC106::-->
-<P>
-
-<A NAME="IDX598"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>plot-column</B> <I>array x-column y-column proc3s</I>
-<DD><P>
-
-Plots points with x coordinate in <VAR>x-column</VAR> of <VAR>array</VAR> and y coordinate <VAR>y-column</VAR> of
-<VAR>array</VAR>. The symbol <VAR>proc3s</VAR> specifies the type of glyph or drawing style for
-presenting these coordinates.
-</P>
-</DL>
-The glyphs and drawing styles available are:
-<P>
-
-</P>
-<DL COMPACT>
-<DT><CODE>line</CODE>
-<DD>Draws line connecting points in order.
-<DT><CODE>mountain</CODE>
-<DD>Fill area below line connecting points.
-<DT><CODE>cloud</CODE>
-<DD>Fill area above line connecting points.
-<DT><CODE>impulse</CODE>
-<DD>Draw line from x-axis to each point.
-<DT><CODE>bargraph</CODE>
-<DD>Draw rectangle from x-axis to each point.
-<DT><CODE>disc</CODE>
-<DD>Solid round dot.
-<DT><CODE>point</CODE>
-<DD>Minimal point -- invisible if linewidth is 0.
-<DT><CODE>square</CODE>
-<DD>Square box.
-<DT><CODE>diamond</CODE>
-<DD>Square box at 45.o
-<DT><CODE>plus</CODE>
-<DD>Plus sign.
-<DT><CODE>cross</CODE>
-<DD>X sign.
-<DT><CODE>triup</CODE>
-<DD>Triangle pointing upward
-<DT><CODE>tridown</CODE>
-<DD>Triangle pointing downward
-<DT><CODE>pentagon</CODE>
-<DD>Five sided polygon
-<DT><CODE>circle</CODE>
-<DD>Hollow circle
-</DL>
-<P>
-
-<A NAME="Graphics Context"></A>
-<HR SIZE="6">
-<A NAME="SEC107"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC106"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC108"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 5.7.2.3 Graphics Context </H4>
-<!--docid::SEC107::-->
-<P>
-
-<A NAME="IDX599"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>in-graphic-context</B> <I>arg <small>...</small></I>
-<DD><P>
-
-Saves the current graphics state, executes <VAR>args</VAR>, then restores
-to saved graphics state.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX600"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>set-color</B> <I>color</I>
-<DD><P>
-
-<VAR>color</VAR> should be a string naming a Resene color, a saturate color, or a
-number between 0 and 100.
-</P>
-<P>
-
-<CODE>set-color</CODE> sets the PostScript color to the color of the given string, or a
-grey value between black (0) and white (100).
-</P>
-</DL>
-<P>
-
-<A NAME="IDX601"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>set-font</B> <I>name fontheight</I>
-<DD><P>
-
-<VAR>name</VAR> should be a (case-sensitive) string naming a PostScript font.
-<VAR>fontheight</VAR> should be a positive real number.
-</P>
-<P>
-
-<CODE>set-font</CODE> Changes the current PostScript font to <VAR>name</VAR> with height equal to
-<VAR>fontheight</VAR>. The default font is Helvetica (12pt).
-</P>
-</DL>
-The base set of PostScript fonts is:
-<P>
-
-</P>
-<TABLE>
-<TR><TD>Times </TD><TD> Times-Italic </TD><TD> Times-Bold </TD><TD> Times-BoldItalic</TD>
-</TR>
-<TR><TD>Helvetica </TD><TD> Helvetica-Oblique </TD><TD> Helvetica-Bold </TD><TD> Helvetica-BoldOblique</TD>
-</TR>
-<TR><TD>Courier </TD><TD> Courier-Oblique </TD><TD> Courier-Bold </TD><TD> Courier-BoldOblique</TD>
-</TR>
-<TR><TD>Symbol</TD>
-</TR></TABLE>
-<P>
-
-Line parameters do no affect fonts; they do effect glyphs.
-</P>
-<P>
-
-<A NAME="IDX602"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>set-linewidth</B> <I>w</I>
-<DD><P>
-
-The default linewidth is 1. Setting it to 0 makes the lines drawn
-as skinny as possible. Linewidth must be much smaller than
-glyphsize for readable glyphs.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX603"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>set-linedash</B> <I>j k</I>
-<DD><P>
-
-Lines are drawn <VAR>j</VAR>-on <VAR>k</VAR>-off.
-</P>
-<P>
-
-<A NAME="IDX604"></A>
-<DT><U>Function:</U> <B>set-linedash</B> <I>j</I>
-<DD>Lines are drawn <VAR>j</VAR>-on <VAR>j</VAR>-off.
-</P>
-<P>
-
-<A NAME="IDX605"></A>
-<DT><U>Function:</U> <B>set-linedash</B>
-<DD>Turns off dashing.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX606"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>set-glyphsize</B> <I>w</I>
-<DD><P>
-
-Sets the (PostScript) variable glyphsize to <VAR>w</VAR>. The default
-glyphsize is 6.
-</P>
-</DL>
-The effects of <CODE>clip-to-rect</CODE> are also part of the graphic
-context.
-<P>
-
-<A NAME="Rectangles"></A>
-<HR SIZE="6">
-<A NAME="SEC108"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC107"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC109"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 5.7.2.4 Rectangles </H4>
-<!--docid::SEC108::-->
-<P>
-
-A <EM>rectangle</EM> is a list of 4 numbers; the first two elements are
-<A NAME="IDX607"></A>
-the x and y coordinates of lower left corner of the rectangle. The
-other two elements are the width and height of the rectangle.
-</P>
-<P>
-
-<A NAME="IDX608"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>whole-page</B>
-<DD><P>
-
-Pushes a rectangle for the whole encapsulated page onto the
-PostScript stack. This pushed rectangle is an implicit argument to
-<CODE>partition-page</CODE> or <CODE>setup-plot</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX609"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>partition-page</B> <I>xparts yparts</I>
-<DD><P>
-
-Pops the rectangle currently on top of the stack and pushes <VAR>xparts</VAR> * <VAR>yparts</VAR>
-sub-rectangles onto the stack in decreasing y and increasing x order.
-If you are drawing just one graph, then you don't need <CODE>partition-page</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX610"></A>
-</P>
-<DL>
-<DT><U>Variable:</U> <B>plotrect</B>
-<DD><P>
-
-The rectangle where data points should be plotted. <VAR>plotrect</VAR> is set by
-<CODE>setup-plot</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX611"></A>
-</P>
-<DL>
-<DT><U>Variable:</U> <B>graphrect</B>
-<DD><P>
-
-The <VAR>pagerect</VAR> argument of the most recent call to
-<CODE>setup-plot</CODE>. Includes plotrect, legends, etc.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX612"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>fill-rect</B> <I>rect</I>
-<DD><P>
-
-fills <VAR>rect</VAR> with the current color.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX613"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>outline-rect</B> <I>rect</I>
-<DD><P>
-
-Draws the perimiter of <VAR>rect</VAR> in the current color.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX614"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>clip-to-rect</B> <I>rect</I>
-<DD><P>
-
-Modifies the current graphics-state so that nothing will be drawn
-outside of the rectangle <VAR>rect</VAR>. Use <CODE>in-graphic-context</CODE> to limit
-the extent of <CODE>clip-to-rect</CODE>.
-</P>
-</DL>
-<A NAME="Legending"></A>
-<HR SIZE="6">
-<A NAME="SEC109"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC108"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC110"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 5.7.2.5 Legending </H4>
-<!--docid::SEC109::-->
-<P>
-
-<A NAME="IDX615"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>title-top</B> <I>title subtitle</I>
-<DD><P>
-
-<A NAME="IDX616"></A>
-<DT><U>Function:</U> <B>title-top</B> <I>title</I>
-<DD>Puts a <VAR>title</VAR> line and an optional <VAR>subtitle</VAR> line above the <CODE>graphrect</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX617"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>title-bottom</B> <I>title subtitle</I>
-<DD><P>
-
-<A NAME="IDX618"></A>
-<DT><U>Function:</U> <B>title-bottom</B> <I>title</I>
-<DD>Puts a <VAR>title</VAR> line and an optional <VAR>subtitle</VAR> line below the <CODE>graphrect</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX619"></A>
-</P>
-<DL>
-<DT><U>Variable:</U> <B>topedge</B>
-<DD><A NAME="IDX620"></A>
-<DT><U>Variable:</U> <B>bottomedge</B>
-<DD><P>
-
-These edge coordinates of <CODE>graphrect</CODE> are suitable for passing
-as the first argument to <CODE>rule-horizontal</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX621"></A>
-</P>
-<DL>
-<DT><U>Variable:</U> <B>leftedge</B>
-<DD><A NAME="IDX622"></A>
-<DT><U>Variable:</U> <B>rightedge</B>
-<DD><P>
-
-These edge coordinates of <CODE>graphrect</CODE> are suitable for passing
-as the first argument to <CODE>rule-vertical</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX623"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>rule-vertical</B> <I>x-coord text tick-width</I>
-<DD><P>
-
-Draws a vertical ruler with X coordinate <VAR>x-coord</VAR> and labeled with string
-<VAR>text</VAR>. If <VAR>tick-width</VAR> is positive, then the ticks are <VAR>tick-width</VAR> long on the right side
-of <VAR>x-coord</VAR>; and <VAR>text</VAR> and numeric legends are on the left. If <VAR>tick-width</VAR> is
-negative, then the ticks are -<VAR>tick-width</VAR> long on the left side of <VAR>x-coord</VAR>; and <VAR>text</VAR>
-and numeric legends are on the right.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX624"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>rule-horizontal</B> <I>x-coord text tick-height</I>
-<DD><P>
-
-Draws a horizontal ruler with X coordinate <VAR>x-coord</VAR> and labeled with
-string <VAR>text</VAR>. If <VAR>tick-height</VAR> is positive, then the ticks are <VAR>tick-height</VAR> long on the
-right side of <VAR>x-coord</VAR>; and <VAR>text</VAR> and numeric legends are on the left. If <VAR>tick-height</VAR>
-is negative, then the ticks are -<VAR>tick-height</VAR> long on the left side of <VAR>x-coord</VAR>; and
-<VAR>text</VAR> and numeric legends are on the right.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX625"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>y-axis</B>
-<DD><P>
-
-Draws the y-axis.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX626"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>x-axis</B>
-<DD><P>
-
-Draws the x-axis.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX627"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>grid-verticals</B>
-<DD><P>
-
-Draws vertical lines through <CODE>graphrect</CODE> at each tick on the
-vertical ruler.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX628"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>grid-horizontals</B>
-<DD><P>
-
-Draws horizontal lines through <CODE>graphrect</CODE> at each tick on the
-horizontal ruler.
-</P>
-</DL>
-<A NAME="Legacy Plotting"></A>
-<HR SIZE="6">
-<A NAME="SEC110"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC109"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC111"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 5.7.2.6 Legacy Plotting </H4>
-<!--docid::SEC110::-->
-<P>
-
-<A NAME="IDX629"></A>
-</P>
-<DL>
-<DT><U>Variable:</U> <B>graph:dimensions</B>
-<DD><P>
-
-A list of the width and height of the graph to be plotted using
-<CODE>plot</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX630"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>plot</B> <I>func x1 x2 npts</I>
-<DD><P>
-
-<A NAME="IDX631"></A>
-<DT><U>Function:</U> <B>plot</B> <I>func x1 x2</I>
-<DD>Creates and displays using <CODE>(system &quot;gv tmp.eps&quot;)</CODE> an
-encapsulated PostScript graph of the function of one argument <VAR>func</VAR>
-over the range <VAR>x1</VAR> to <VAR>x2</VAR>. If the optional integer argument <VAR>npts</VAR> is
-supplied, it specifies the number of points to evaluate <VAR>func</VAR> at.
-</P>
-<P>
-
-<A NAME="IDX632"></A>
-<DT><U>Function:</U> <B>plot</B> <I>coords x-label y-label</I>
-<DD><VAR>coords</VAR> is a list or vector of coordinates, lists of x and y
-coordinates. <VAR>x-label</VAR> and <VAR>y-label</VAR> are strings with which
-to label the x and y axes.
-</P>
-</DL>
-<A NAME="Example Graph"></A>
-<HR SIZE="6">
-<A NAME="SEC111"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC110"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC112"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 5.7.2.7 Example Graph </H4>
-<!--docid::SEC111::-->
-<P>
-
-The file `<TT>am1.5.html</TT>', a table of solar irradiance, is fetched
-with `<SAMP>wget</SAMP>' if it isn't already in the working directory. The
-file is read and stored into an array, <VAR>irradiance</VAR>.
-</P>
-<P>
-
-<CODE>create-postscript-graph</CODE> is then called to create an
-encapsulated-PostScript file, `<TT>solarad.eps</TT>'. The size of the
-page is set to 600 by 300. <CODE>whole-page</CODE> is called and leaves
-the rectangle on the PostScript stack. <CODE>setup-plot</CODE> is called
-with a literal range for x and computes the range for column 1.
-</P>
-<P>
-
-Two calls to <CODE>top-title</CODE> are made so a different font can be
-used for the lower half. <CODE>in-graphic-context</CODE> is used to limit
-the scope of the font change. The graphing area is outlined and a
-rule drawn on the left side.
-</P>
-<P>
-
-Because the X range was intentionally reduced,
-<CODE>in-graphic-context</CODE> is called and <CODE>clip-to-rect</CODE> limits
-drawing to the plotting area. A black line is drawn from data
-column 1. That line is then overlayed with a mountain plot of the
-same column colored &quot;Bright Sun&quot;.
-</P>
-<P>
-
-After returning from the <CODE>in-graphic-context</CODE>, the bottom ruler
-is drawn. Had it been drawn earlier, all its ticks would have been
-painted over by the mountain plot.
-</P>
-<P>
-
-The color is then changed to `<SAMP>seagreen</SAMP>' and the same graphrect
-is setup again, this time with a different Y scale, 0 to 1000. The
-graphic context is again clipped to <VAR>plotrect</VAR>, linedash is set,
-and column 2 is plotted as a dashed line. Finally the rightedge is
-ruled. Having the line and its scale both in green helps
-disambiguate the scales.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'eps-graph)
-(require 'line-i/o)
-(require 'string-port)
-
-(define irradiance
- (let ((url &quot;http://www.pv.unsw.edu.au/am1.5.html&quot;)
- (file &quot;am1.5.html&quot;))
- (define (read-&gt;list line)
- (define elts '())
- (call-with-input-string line
- (lambda (iprt) (do ((elt (read iprt) (read iprt)))
- ((eof-object? elt) elts)
- (set! elts (cons elt elts))))))
- (if (not (file-exists? file))
- (system (string-append &quot;wget -c -O&quot; file &quot; &quot; url)))
- (call-with-input-file file
- (lambda (iprt)
- (define lines '())
- (do ((line (read-line iprt) (read-line iprt)))
- ((eof-object? line)
- (let ((nra (create-array (Ar64)
- (length lines)
- (length (car lines)))))
- (do ((lns lines (cdr lns))
- (idx (+ -1 (length lines)) (+ -1 idx)))
- ((null? lns) nra)
- (do ((kdx (+ -1 (length (car lines))) (+ -1 kdx))
- (lst (car lns) (cdr lst)))
- ((null? lst))
- (array-set! nra (car lst) idx kdx)))))
- (if (and (positive? (string-length line))
- (char-numeric? (string-ref line 0)))
- (set! lines (cons (read-&gt;list line) lines))))))))
-
-(let ((xrange '(.25 2.5)))
- (create-postscript-graph
- &quot;solarad.eps&quot; '(600 300)
- (whole-page)
- (setup-plot xrange (column-range irradiance 1))
- (title-top
- &quot;Solar Irradiance http://www.pv.unsw.edu.au/am1.5.html&quot;)
- (in-graphic-context
- (set-font &quot;Helvetica-Oblique&quot; 12)
- (title-top
- &quot;&quot;
- &quot;Key Centre for Photovoltaic Engineering UNSW - Air Mass 1.5 Global Spectrum&quot;))
- (outline-rect plotrect)
- (rule-vertical leftedge &quot;W/(m^2.um)&quot; 10)
- (in-graphic-context (clip-to-rect plotrect)
- (plot-column irradiance 0 1 'line)
- (set-color &quot;Bright Sun&quot;)
- (plot-column irradiance 0 1 'mountain)
- )
- (rule-horizontal bottomedge &quot;Wavelength in .um&quot; 5)
- (set-color 'seagreen)
-
- (setup-plot xrange '(0 1000) graphrect)
- (in-graphic-context (clip-to-rect plotrect)
- (set-linedash 5 2)
- (plot-column irradiance 0 2 'line))
- (rule-vertical rightedge &quot;Integrated .W/(m^2)&quot; -10)
- ))
-
-(system &quot;gv solarad.eps&quot;)
-</pre></td></tr></table><P>
-
-<A NAME="Solid Modeling"></A>
-<HR SIZE="6">
-<A NAME="SEC112"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC111"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.8 Solid Modeling </H2>
-<!--docid::SEC112::-->
-<P>
-
-&lt;A NAME=&quot;Solid&quot;&gt;
-<CODE>(require 'solid)</CODE>
-&lt;/A&gt;
-<A NAME="IDX633"></A>
-<A NAME="IDX634"></A>
-<A NAME="IDX635"></A>
-</P>
-<P>
-
-<A HREF="http://swissnet.ai.mit.edu/~jaffer/Solid/#Example">http://swissnet.ai.mit.edu/~jaffer/Solid/#Example</A> gives an
-example use of this package.
-</P>
-<P>
-
-<A NAME="IDX636"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>vrml</B> <I>node <small>...</small></I>
-<DD>Returns the VRML97 string (including header) of the concatenation
-of strings <VAR>nodes</VAR>, <small>...</small>.
-</DL>
-<P>
-
-<A NAME="IDX637"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>vrml-append</B> <I>node1 node2 <small>...</small></I>
-<DD>Returns the concatenation with interdigitated newlines of
-strings <VAR>node1</VAR>, <VAR>node2</VAR>, <small>...</small>.
-</DL>
-<P>
-
-<A NAME="IDX638"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>vrml-to-file</B> <I>file node <small>...</small></I>
-<DD>Writes to file named <VAR>file</VAR> the VRML97 string (including header) of
-the concatenation of strings <VAR>nodes</VAR>, <small>...</small>.
-</DL>
-<P>
-
-<A NAME="IDX639"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>world:info</B> <I>title info <small>...</small></I>
-<DD>Returns a VRML97 string setting the title of the file in which
-it appears to <VAR>title</VAR>. Additional strings <VAR>info</VAR>, <small>...</small> are comments.
-</DL>
-<P>
-
-VRML97 strings passed to <CODE>vrml</CODE> and <CODE>vrml-to-file</CODE> as
-arguments will appear in the resulting VRML code. This string turns
-off the headlight at the viewpoint:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>&quot; NavigationInfo {headlight FALSE}&quot;
-</pre></td></tr></table><P>
-
-<A NAME="IDX640"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>scene:panorama</B> <I>front right back left top bottom</I>
-<DD>Specifies the distant images on the inside faces of the cube
-enclosing the virtual world.
-</DL>
-<P>
-
-<A NAME="IDX641"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>scene:sphere</B> <I>colors angles</I>
-<DD><P>
-
-<VAR>colors</VAR> is a list of color objects. Each may be of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB integer, or a list of 3 numbers
-between 0.0 and 1.0.
-</P>
-<P>
-
-<VAR>angles</VAR> is a list of non-increasing angles the same length as
-<VAR>colors</VAR>. Each angle is between 90 and -90 degrees. If 90 or -90 are not
-elements of <VAR>angles</VAR>, then the color at the zenith and nadir are taken from
-the colors paired with the angles nearest them.
-</P>
-<P>
-
-<CODE>scene:sphere</CODE> fills horizontal bands with interpolated colors on the backgroud
-sphere encasing the world.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX642"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>scene:sky-and-dirt</B>
-<DD>Returns a blue and brown backgroud sphere encasing the world.
-</DL>
-<P>
-
-<A NAME="IDX643"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>scene:sky-and-grass</B>
-<DD>Returns a blue and green backgroud sphere encasing the world.
-</DL>
-<P>
-
-<A NAME="IDX644"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>scene:sun</B> <I>latitude julian-day hour turbidity strength</I>
-<DD><P>
-
-<A NAME="IDX645"></A>
-<DT><U>Function:</U> <B>scene:sun</B> <I>latitude julian-day hour turbidity</I>
-<DD></P>
-<P>
-
-<VAR>latitude</VAR> is the virtual place's latitude in degrees. <VAR>julian-day</VAR> is an integer from
-0 to 366, the day of the year. <VAR>hour</VAR> is a real number from 0 to 24 for
-the time of day; 12 is noon. <VAR>turbidity</VAR> is the degree of fogginess described
-in See section <A HREF="slib_5.html#SEC133">turbidity</A>.
-</P>
-<P>
-
-<CODE>scene:sun</CODE> returns a bright yellow, distant sphere where the sun would be at
-<VAR>hour</VAR> on <VAR>julian-day</VAR> at <VAR>latitude</VAR>. If <VAR>strength</VAR> is positive, included is a light source of <VAR>strength</VAR>
-(default 1).
-</P>
-</DL>
-<P>
-
-<A NAME="IDX646"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>scene:overcast</B> <I>latitude julian-day hour turbidity strength</I>
-<DD><P>
-
-<A NAME="IDX647"></A>
-<DT><U>Function:</U> <B>scene:overcast</B> <I>latitude julian-day hour turbidity</I>
-<DD></P>
-<P>
-
-<VAR>latitude</VAR> is the virtual place's latitude in degrees. <VAR>julian-day</VAR> is an integer from
-0 to 366, the day of the year. <VAR>hour</VAR> is a real number from 0 to 24 for
-the time of day; 12 is noon. <VAR>turbidity</VAR> is the degree of cloudiness described
-in See section <A HREF="slib_5.html#SEC133">turbidity</A>.
-</P>
-<P>
-
-<CODE>scene:overcast</CODE> returns an overcast sky as it might look at <VAR>hour</VAR> on <VAR>julian-day</VAR> at <VAR>latitude</VAR>. If <VAR>strength</VAR>
-is positive, included is an ambient light source of <VAR>strength</VAR> (default 1).
-</P>
-</DL>
-Viewpoints are objects in the virtual world, and can be transformed
-individually or with solid objects.
-<P>
-
-<A NAME="IDX648"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>scene:viewpoint</B> <I>name distance compass pitch</I>
-<DD><P>
-
-<A NAME="IDX649"></A>
-<DT><U>Function:</U> <B>scene:viewpoint</B> <I>name distance compass</I>
-<DD>Returns a viewpoint named <VAR>name</VAR> facing the origin and placed <VAR>distance</VAR> from it.
-<VAR>compass</VAR> is a number from 0 to 360 giving the compass heading. <VAR>pitch</VAR> is a
-number from -90 to 90, defaulting to 0, specifying the angle from the
-horizontal.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX650"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>scene:viewpoints</B> <I>proximity</I>
-<DD>Returns 6 viewpoints, one at the center of each face of a cube
-with sides 2 * <VAR>proximity</VAR>, centered on the origin.
-</DL>
-<A NAME="SEC113"></A>
-<H3> Light Sources </H3>
-<!--docid::SEC113::-->
-<P>
-
-In VRML97, lights shine only on objects within the same children node
-and descendants of that node. Although it would have been convenient
-to let light direction be rotated by <CODE>solid:rotation</CODE>, this
-restricts a rotated light's visibility to objects rotated with it.
-</P>
-<P>
-
-To workaround this limitation, these directional light source
-procedures accept either Cartesian or spherical coordinates for
-direction. A spherical coordinate is a list <CODE>(<VAR>theta</VAR>
-<VAR>azimuth</VAR>)</CODE>; where <VAR>theta</VAR> is the angle in degrees from the
-zenith, and <VAR>azimuth</VAR> is the angle in degrees due west of south.
-</P>
-<P>
-
-It is sometimes useful for light sources to be brighter than `<SAMP>1</SAMP>'.
-When <VAR>intensity</VAR> arguments are greater than 1, these functions
-gang multiple sources to reach the desired strength.
-</P>
-<P>
-
-<A NAME="IDX651"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>light:ambient</B> <I>color intensity</I>
-<DD><P>
-
-<A NAME="IDX652"></A>
-<DT><U>Function:</U> <B>light:ambient</B> <I>color</I>
-<DD>Ambient light shines on all surfaces with which it is grouped.
-</P>
-<P>
-
-<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB
-integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f,
-then the default color will be used. <VAR>intensity</VAR> is a real non-negative number
-defaulting to `<SAMP>1</SAMP>'.
-</P>
-<P>
-
-<CODE>light:ambient</CODE> returns a light source or sources of <VAR>color</VAR> with total strength of <VAR>intensity</VAR>
-(or 1 if omitted).
-</P>
-</DL>
-<P>
-
-<A NAME="IDX653"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>light:directional</B> <I>color direction intensity</I>
-<DD><P>
-
-<A NAME="IDX654"></A>
-<DT><U>Function:</U> <B>light:directional</B> <I>color direction</I>
-<DD></P>
-<P>
-
-<A NAME="IDX655"></A>
-<DT><U>Function:</U> <B>light:directional</B> <I>color</I>
-<DD>Directional light shines parallel rays with uniform intensity on all
-objects with which it is grouped.
-</P>
-<P>
-
-<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB
-integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f,
-then the default color will be used.
-</P>
-<P>
-
-<VAR>direction</VAR> must be a list or vector of 2 or 3 numbers specifying the direction
-to this light. If <VAR>direction</VAR> has 2 numbers, then these numbers are the angle
-from zenith and the azimuth in degrees; if <VAR>direction</VAR> has 3 numbers, then
-these are taken as a Cartesian vector specifying the direction to the
-light source. The default direction is upwards; thus its light will
-shine down.
-</P>
-<P>
-
-<VAR>intensity</VAR> is a real non-negative number defaulting to `<SAMP>1</SAMP>'.
-</P>
-<P>
-
-<CODE>light:directional</CODE> returns a light source or sources of <VAR>color</VAR> with total strength of <VAR>intensity</VAR>,
-shining from <VAR>direction</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX656"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>light:beam</B> <I>attenuation radius aperture peak</I>
-<DD><P>
-
-<A NAME="IDX657"></A>
-<DT><U>Function:</U> <B>light:beam</B> <I>attenuation radius aperture</I>
-<DD></P>
-<P>
-
-<A NAME="IDX658"></A>
-<DT><U>Function:</U> <B>light:beam</B> <I>attenuation radius</I>
-<DD></P>
-<P>
-
-<A NAME="IDX659"></A>
-<DT><U>Function:</U> <B>light:beam</B> <I>attenuation</I>
-<DD></P>
-<P>
-
-<VAR>attenuation</VAR> is a list or vector of three nonnegative real numbers specifying
-the reduction of intensity, the reduction of intensity with distance,
-and the reduction of intensity as the square of distance. <VAR>radius</VAR> is the
-distance beyond which the light does not shine. <VAR>radius</VAR> defaults to
-`<SAMP>100</SAMP>'.
-</P>
-<P>
-
-<VAR>aperture</VAR> is a real number between 0 and 180, the angle centered on the
-light's axis through which it sheds some light. <VAR>peak</VAR> is a real number
-between 0 and 90, the angle of greatest illumination.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX660"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>light:point</B> <I>location color intensity beam</I>
-<DD><P>
-
-<A NAME="IDX661"></A>
-<DT><U>Function:</U> <B>light:point</B> <I>location color intensity</I>
-<DD></P>
-<P>
-
-<A NAME="IDX662"></A>
-<DT><U>Function:</U> <B>light:point</B> <I>location color</I>
-<DD></P>
-<P>
-
-<A NAME="IDX663"></A>
-<DT><U>Function:</U> <B>light:point</B> <I>location</I>
-<DD></P>
-<P>
-
-Point light radiates from <VAR>location</VAR>, intensity decreasing with distance,
-towards all objects with which it is grouped.
-</P>
-<P>
-
-<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB
-integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f,
-then the default color will be used. <VAR>intensity</VAR> is a real non-negative number
-defaulting to `<SAMP>1</SAMP>'. <VAR>beam</VAR> is a structure returned by
-<CODE>light:beam</CODE> or #f.
-</P>
-<P>
-
-<CODE>light:point</CODE> returns a light source or sources at <VAR>location</VAR> of <VAR>color</VAR> with total strength
-<VAR>intensity</VAR> and <VAR>beam</VAR> properties. Note that the pointlight itself is not visible.
-To make it so, place an object with emissive appearance at <VAR>location</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX664"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>light:spot</B> <I>location direction color intensity beam</I>
-<DD><P>
-
-<A NAME="IDX665"></A>
-<DT><U>Function:</U> <B>light:spot</B> <I>location direction color intensity</I>
-<DD></P>
-<P>
-
-<A NAME="IDX666"></A>
-<DT><U>Function:</U> <B>light:spot</B> <I>location direction color</I>
-<DD></P>
-<P>
-
-<A NAME="IDX667"></A>
-<DT><U>Function:</U> <B>light:spot</B> <I>location direction</I>
-<DD></P>
-<P>
-
-<A NAME="IDX668"></A>
-<DT><U>Function:</U> <B>light:spot</B> <I>location</I>
-<DD></P>
-<P>
-
-Spot light radiates from <VAR>location</VAR> towards <VAR>direction</VAR>, intensity decreasing with
-distance, illuminating objects with which it is grouped.
-</P>
-<P>
-
-<VAR>direction</VAR> must be a list or vector of 2 or 3 numbers specifying the direction
-to this light. If <VAR>direction</VAR> has 2 numbers, then these numbers are the angle
-from zenith and the azimuth in degrees; if <VAR>direction</VAR> has 3 numbers, then
-these are taken as a Cartesian vector specifying the direction to the
-light source. The default direction is upwards; thus its light will
-shine down.
-</P>
-<P>
-
-<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB
-integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f,
-then the default color will be used.
-</P>
-<P>
-
-<VAR>intensity</VAR> is a real non-negative number defaulting to `<SAMP>1</SAMP>'.
-</P>
-<P>
-
-<CODE>light:spot</CODE> returns a light source or sources at <VAR>location</VAR> of <VAR>direction</VAR> with total strength
-<VAR>color</VAR>. Note that the spotlight itself is not visible. To make it so,
-place an object with emissive appearance at <VAR>location</VAR>.
-</P>
-</DL>
-<A NAME="SEC114"></A>
-<H3> Object Primitives </H3>
-<!--docid::SEC114::-->
-<P>
-
-<A NAME="IDX669"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:box</B> <I>geometry appearance</I>
-<DD><P>
-
-<A NAME="IDX670"></A>
-<DT><U>Function:</U> <B>solid:box</B> <I>geometry</I>
-<DD><VAR>geometry</VAR> must be a number or a list or vector of three numbers. If <VAR>geometry</VAR> is a
-number, the <CODE>solid:box</CODE> returns a cube with sides of length <VAR>geometry</VAR> centered on the
-origin. Otherwise, <CODE>solid:box</CODE> returns a rectangular box with dimensions <VAR>geometry</VAR>
-centered on the origin. <VAR>appearance</VAR> determines the surface properties of the
-returned object.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX671"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:cylinder</B> <I>radius height appearance</I>
-<DD><P>
-
-<A NAME="IDX672"></A>
-<DT><U>Function:</U> <B>solid:cylinder</B> <I>radius height</I>
-<DD>Returns a right cylinder with dimensions <VAR>radius</VAR> and <CODE>(abs <VAR>height</VAR>)</CODE>
-centered on the origin. If <VAR>height</VAR> is positive, then the cylinder ends
-will be capped. <VAR>appearance</VAR> determines the surface properties of the returned
-object.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX673"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:disk</B> <I>radius thickness appearance</I>
-<DD><P>
-
-<A NAME="IDX674"></A>
-<DT><U>Function:</U> <B>solid:disk</B> <I>radius thickness</I>
-<DD><VAR>thickness</VAR> must be a positive real number. <CODE>solid:disk</CODE> returns a circular disk
-with dimensions <VAR>radius</VAR> and <VAR>thickness</VAR> centered on the origin. <VAR>appearance</VAR> determines the
-surface properties of the returned object.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX675"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:cone</B> <I>radius height appearance</I>
-<DD><P>
-
-<A NAME="IDX676"></A>
-<DT><U>Function:</U> <B>solid:cone</B> <I>radius height</I>
-<DD>Returns an isosceles cone with dimensions <VAR>radius</VAR> and <VAR>height</VAR> centered on
-the origin. <VAR>appearance</VAR> determines the surface properties of the returned
-object.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX677"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:pyramid</B> <I>side height appearance</I>
-<DD><P>
-
-<A NAME="IDX678"></A>
-<DT><U>Function:</U> <B>solid:pyramid</B> <I>side height</I>
-<DD>Returns an isosceles pyramid with dimensions <VAR>side</VAR> and <VAR>height</VAR> centered on
-the origin. <VAR>appearance</VAR> determines the surface properties of the returned
-object.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX679"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:sphere</B> <I>radius appearance</I>
-<DD><P>
-
-<A NAME="IDX680"></A>
-<DT><U>Function:</U> <B>solid:sphere</B> <I>radius</I>
-<DD>Returns a sphere of radius <VAR>radius</VAR> centered on the origin. <VAR>appearance</VAR> determines
-the surface properties of the returned object.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX681"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:ellipsoid</B> <I>geometry appearance</I>
-<DD><P>
-
-<A NAME="IDX682"></A>
-<DT><U>Function:</U> <B>solid:ellipsoid</B> <I>geometry</I>
-<DD><VAR>geometry</VAR> must be a number or a list or vector of three numbers. If <VAR>geometry</VAR> is a
-number, the <CODE>solid:ellipsoid</CODE> returns a sphere of diameter <VAR>geometry</VAR> centered on the origin.
-Otherwise, <CODE>solid:ellipsoid</CODE> returns an ellipsoid with diameters <VAR>geometry</VAR> centered on the
-origin. <VAR>appearance</VAR> determines the surface properties of the returned object.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX683"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:basrelief</B> <I>width height depth colorray appearance</I>
-<DD><P>
-
-<A NAME="IDX684"></A>
-<DT><U>Function:</U> <B>solid:basrelief</B> <I>width height depth appearance</I>
-<DD></P>
-<P>
-
-<A NAME="IDX685"></A>
-<DT><U>Function:</U> <B>solid:basrelief</B> <I>width height depth</I>
-<DD>One of <VAR>width</VAR>, <VAR>height</VAR>, or <VAR>depth</VAR> must be a 2-dimensional array; the others must
-be real numbers giving the length of the basrelief in those
-dimensions. The rest of this description assumes that <VAR>height</VAR> is an
-array of heights.
-</P>
-<P>
-
-<CODE>solid:basrelief</CODE> returns a <VAR>width</VAR> by <VAR>depth</VAR> basrelief solid with heights per array <VAR>height</VAR> with
-the buttom surface centered on the origin.
-</P>
-<P>
-
-If present, <VAR>appearance</VAR> determines the surface properties of the returned
-object. If present, <VAR>colorray</VAR> must be an array of objects of type
-<A HREF="slib_5.html#SEC119">color</A>, 24-bit sRGB integers or lists of 3
-numbers between 0.0 and 1.0.
-</P>
-<P>
-
-If <VAR>colorray</VAR>'s dimensions match <VAR>height</VAR>, then each element of <VAR>colorray</VAR> paints its
-corresponding vertex of <VAR>height</VAR>. If <VAR>colorray</VAR> has all dimensions one smaller
-than <VAR>height</VAR>, then each element of <VAR>colorray</VAR> paints the corresponding face of
-<VAR>height</VAR>. Other dimensions for <VAR>colorray</VAR> are in error.
-</P>
-</DL>
-<A NAME="SEC115"></A>
-<H3> Surface Attributes </H3>
-<!--docid::SEC115::-->
-<P>
-
-<A NAME="IDX686"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor shininess emissiveColor transparency</I>
-<DD><P>
-
-<A NAME="IDX687"></A>
-<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor shininess emissiveColor</I>
-<DD></P>
-<P>
-
-<A NAME="IDX688"></A>
-<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor shininess</I>
-<DD></P>
-<P>
-
-<A NAME="IDX689"></A>
-<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor</I>
-<DD></P>
-<P>
-
-<A NAME="IDX690"></A>
-<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity</I>
-<DD></P>
-<P>
-
-<A NAME="IDX691"></A>
-<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor</I>
-<DD></P>
-<P>
-
-Returns an <EM>appearance</EM>, the optical properties of the objects
-<A NAME="IDX692"></A>
-with which it is associated. <VAR>ambientIntensity</VAR>, <VAR>shininess</VAR>, and <VAR>transparency</VAR> must be numbers between 0
-and 1. <VAR>diffuseColor</VAR>, <VAR>specularColor</VAR>, and <VAR>emissiveColor</VAR> are objects of type <A HREF="slib_5.html#SEC119">color</A>,
-24-bit sRGB integers or lists of 3 numbers between 0.0 and 1.0.
-If a color argument is omitted or #f, then the default color will be used.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX693"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale rotation center translation</I>
-<DD><P>
-
-<A NAME="IDX694"></A>
-<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale rotation center</I>
-<DD></P>
-<P>
-
-<A NAME="IDX695"></A>
-<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale rotation</I>
-<DD></P>
-<P>
-
-<A NAME="IDX696"></A>
-<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale</I>
-<DD></P>
-<P>
-
-<A NAME="IDX697"></A>
-<DT><U>Function:</U> <B>solid:texture</B> <I>image color</I>
-<DD></P>
-<P>
-
-<A NAME="IDX698"></A>
-<DT><U>Function:</U> <B>solid:texture</B> <I>image</I>
-<DD></P>
-<P>
-
-Returns an <EM>appearance</EM>, the optical properties of the objects
-<A NAME="IDX699"></A>
-with which it is associated. <VAR>image</VAR> is a string naming a JPEG or PNG
-image resource. <VAR>color</VAR> is #f, a color, or the string returned by
-<CODE>solid:color</CODE>. The rest of the optional arguments specify
-2-dimensional transforms applying to the <VAR>image</VAR>.
-</P>
-<P>
-
-<VAR>scale</VAR> must be #f, a number, or list or vector of 2 numbers specifying the
-scale to apply to <VAR>image</VAR>. <VAR>rotation</VAR> must be #f or the number of degrees to
-rotate <VAR>image</VAR>. <VAR>center</VAR> must be #f or a list or vector of 2 numbers specifying
-the center of <VAR>image</VAR> relative to the <VAR>image</VAR> dimensions. <VAR>translation</VAR> must be #f or a
-list or vector of 2 numbers specifying the translation to apply to <VAR>image</VAR>.
-</P>
-</DL>
-<A NAME="SEC116"></A>
-<H3> Aggregating Objects </H3>
-<!--docid::SEC116::-->
-<P>
-
-<A NAME="IDX700"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:center-row-of</B> <I>number solid spacing</I>
-<DD>Returns a row of <VAR>number</VAR> <VAR>solid</VAR> objects spaced evenly <VAR>spacing</VAR> apart.
-</DL>
-<P>
-
-<A NAME="IDX701"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:center-array-of</B> <I>number-a number-b solid spacing-a spacing-b</I>
-<DD>Returns <VAR>number-b</VAR> rows, <VAR>spacing-b</VAR> apart, of <VAR>number-a</VAR> <VAR>solid</VAR> objects <VAR>spacing-a</VAR> apart.
-</DL>
-<P>
-
-<A NAME="IDX702"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:center-pile-of</B> <I>number-a number-b number-c solid spacing-a spacing-b spacing-c</I>
-<DD>Returns <VAR>number-c</VAR> planes, <VAR>spacing-c</VAR> apart, of <VAR>number-b</VAR> rows, <VAR>spacing-b</VAR> apart, of <VAR>number-a</VAR> <VAR>solid</VAR> objects <VAR>spacing-a</VAR> apart.
-</DL>
-<P>
-
-<A NAME="IDX703"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:arrow</B> <I>center</I>
-<DD><P>
-
-<VAR>center</VAR> must be a list or vector of three numbers. Returns an upward
-pointing metallic arrow centered at <VAR>center</VAR>.
-</P>
-<P>
-
-<A NAME="IDX704"></A>
-<DT><U>Function:</U> <B>solid:arrow</B>
-<DD>Returns an upward pointing metallic arrow centered at the origin.
-</P>
-</DL>
-<A NAME="SEC117"></A>
-<H3> Spatial Transformations </H3>
-<!--docid::SEC117::-->
-<P>
-
-<A NAME="IDX705"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:translation</B> <I>center solid <small>...</small></I>
-<DD><VAR>center</VAR> must be a list or vector of three numbers. <CODE>solid:translation</CODE> Returns an
-aggregate of <VAR>solids</VAR>, <small>...</small> with their origin moved to <VAR>center</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX706"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:scale</B> <I>scale solid <small>...</small></I>
-<DD><VAR>scale</VAR> must be a number or a list or vector of three numbers. <CODE>solid:scale</CODE>
-Returns an aggregate of <VAR>solids</VAR>, <small>...</small> scaled per <VAR>scale</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX707"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solid:rotation</B> <I>axis angle solid <small>...</small></I>
-<DD><VAR>axis</VAR> must be a list or vector of three numbers. <CODE>solid:rotation</CODE> Returns an
-aggregate of <VAR>solids</VAR>, <small>...</small> rotated <VAR>angle</VAR> degrees around the axis <VAR>axis</VAR>.
-</DL>
-<P>
-
-<A NAME="Color"></A>
-<HR SIZE="6">
-<A NAME="SEC118"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC112"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC119"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.9 Color </H2>
-<!--docid::SEC118::-->
-<P>
-
-&lt;A NAME=&quot;Color&quot;&gt;&lt;/A&gt;
-</P>
-<P>
-
-<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color">http://swissnet.ai.mit.edu/~jaffer/Color</A>
-</P>
-<P>
-
-The goals of this package are to provide methods to specify, compute,
-and transform colors in a core set of additive color spaces. The color
-spaces supported should be sufficient for working with the color data
-encountered in practice and the literature.
-</P>
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'color</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC122">5.9.2 Color Spaces</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">XYZ, L*a*b*, L*u*v*, L*C*h, RGB709, sRGB</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Color Temperatures and CIEXYZ(1931)</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Society of Dyers and Colorists</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Low-level</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">in relational databases</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Sunlight and sky colors</TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Color Data-Type"></A>
-<HR SIZE="6">
-<A NAME="SEC119"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC120"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.9.1 Color Data-Type </H3>
-<!--docid::SEC119::-->
-<P>
-
-&lt;A NAME=&quot;Color_Data-Type&quot;&gt;&lt;/A&gt;
-<CODE>(require 'color)</CODE>
-</P>
-<P>
-
-<A NAME="IDX708"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color?</B> <I>obj</I>
-<DD>Returns #t if <VAR>obj</VAR> is a color.
-<P>
-
-<A NAME="IDX709"></A>
-<DT><U>Function:</U> <B>color?</B> <I>obj typ</I>
-<DD>Returns #t if <VAR>obj</VAR> is a color of color-space <VAR>typ</VAR>. The symbol
-<VAR>typ</VAR> must be one of:
-</P>
-<P>
-
-<UL>
-<LI>
-CIEXYZ
-<LI>
-RGB709
-<LI>
-L*a*b*
-<LI>
-L*u*v*
-<LI>
-sRGB
-<LI>
-e-sRGB
-<LI>
-L*C*h
-</UL>
-</DL>
-<P>
-
-<A NAME="IDX710"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-color</B> <I>space arg <small>...</small></I>
-<DD>Returns a color of type <VAR>space</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX711"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-space</B> <I>color</I>
-<DD>Returns the symbol for the color-space in which <VAR>color</VAR> is embedded.
-</DL>
-<P>
-
-<A NAME="IDX712"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-precision</B> <I>color</I>
-<DD>For colors in digital color-spaces, <CODE>color-precision</CODE> returns the
-number of bits used for each of the R, G, and B channels of the
-encoding. Otherwise, <CODE>color-precision</CODE> returns #f
-</DL>
-<P>
-
-<A NAME="IDX713"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-white-point</B> <I>color</I>
-<DD>Returns the white-point of <VAR>color</VAR> in all color-spaces except CIEXYZ.
-</DL>
-<P>
-
-<A NAME="IDX714"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>convert-color</B> <I>color space white-point</I>
-<DD><A NAME="IDX715"></A>
-<DT><U>Function:</U> <B>convert-color</B> <I>color space</I>
-<DD><A NAME="IDX716"></A>
-<DT><U>Function:</U> <B>convert-color</B> <I>color e-sRGB precision</I>
-<DD>Converts <VAR>color</VAR> into <VAR>space</VAR> at optional <VAR>white-point</VAR>.
-</DL>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC120"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC119"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC121"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 5.9.1.1 External Representation </H4>
-<!--docid::SEC120::-->
-<P>
-
-Each color encoding has an external, case-insensitive representation.
-To ensure portability, the white-point for all color strings is D65.
-<A NAME="DOCF4" HREF="slib_fot.html#FOOT4">(4)</A>
-</P>
-<P>
-
-</P>
-<TABLE>
-<TR><TD>Color Space</TD>
-</TD><TD> External Representation
-</TR>
-<TR><TD>CIEXYZ</TD>
-</TD><TD> CIEXYZ:<I>&lt;X&gt;</I>/<I>&lt;Y&gt;</I>/<I>&lt;Z&gt;</I>
-</TR>
-<TR><TD>RGB709</TD>
-</TD><TD> RGBi:<I>&lt;R&gt;</I>/<I>&lt;G&gt;</I>/<I>&lt;B&gt;</I>
-</TR>
-<TR><TD>L*a*b*</TD>
-</TD><TD> CIELAB:<I>&lt;L&gt;</I>/<I>&lt;a&gt;</I>/<I>&lt;b&gt;</I>
-</TR>
-<TR><TD>L*u*v*</TD>
-</TD><TD> CIELuv:<I>&lt;L&gt;</I>/<I>&lt;u&gt;</I>/<I>&lt;v&gt;</I>
-</TR>
-<TR><TD>L*C*h</TD>
-</TD><TD> CIELCh:<I>&lt;L&gt;</I>/<I>&lt;C&gt;</I>/<I>&lt;h&gt;</I>
-</TR></TABLE>
-<P>
-
-The <VAR>X</VAR>, <VAR>Y</VAR>, <VAR>Z</VAR>, <VAR>L</VAR>, <VAR>a</VAR>, <VAR>b</VAR>, <VAR>u</VAR>,
-<VAR>v</VAR>, <VAR>C</VAR>, <VAR>h</VAR>, <VAR>R</VAR>, <VAR>G</VAR>, and <VAR>B</VAR> fields are
-(Scheme) real numbers within the appropriate ranges.
-</P>
-<P>
-
-</P>
-<TABLE>
-<TR><TD>Color Space</TD>
-</TD><TD> External Representation
-</TR>
-<TR><TD>sRGB</TD>
-</TD><TD> sRGB:<I>&lt;R&gt;</I>/<I>&lt;G&gt;</I>/<I>&lt;B&gt;</I>
-</TR>
-<TR><TD>e-sRGB10</TD>
-</TD><TD> e-sRGB10:<I>&lt;R&gt;</I>/<I>&lt;G&gt;</I>/<I>&lt;B&gt;</I>
-</TR>
-<TR><TD>e-sRGB12</TD>
-</TD><TD> e-sRGB12:<I>&lt;R&gt;</I>/<I>&lt;G&gt;</I>/<I>&lt;B&gt;</I>
-</TR>
-<TR><TD>e-sRGB16</TD>
-</TD><TD> e-sRGB16:<I>&lt;R&gt;</I>/<I>&lt;G&gt;</I>/<I>&lt;B&gt;</I>
-</TR></TABLE>
-<P>
-
-The <VAR>R</VAR>, <VAR>G</VAR>, and <VAR>B</VAR>, fields are non-negative exact decimal
-integers within the appropriate ranges.
-</P>
-<P>
-
-Several additional syntaxes are supported by <CODE>string-&gt;color</CODE>:
-</P>
-<P>
-
-</P>
-<TABLE>
-<TR><TD>Color Space</TD>
-</TD><TD> External Representation
-</TR>
-<TR><TD>sRGB</TD>
-</TD><TD> sRGB:<I>&lt;RRGGBB&gt;</I>
-</TR>
-<TR><TD>sRGB</TD>
-</TD><TD> #<I>&lt;RRGGBB&gt;</I>
-</TR>
-<TR><TD>sRGB</TD>
-</TD><TD> 0x<I>&lt;RRGGBB&gt;</I>
-</TR>
-<TR><TD>sRGB</TD>
-</TD><TD> #x<I>&lt;RRGGBB&gt;</I>
-</TR></TABLE>
-<P>
-
-Where <VAR>RRGGBB</VAR> is a non-negative six-digit hexadecimal number.
-</P>
-<P>
-
-<A NAME="IDX717"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-&gt;string</B> <I>color</I>
-<DD>Returns a string representation of <VAR>color</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX718"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>string-&gt;color</B> <I>string</I>
-<DD>Returns the color represented by <VAR>string</VAR>. If <VAR>string</VAR> is not a
-syntactically valid notation for a color, then <CODE>string-&gt;color</CODE>
-returns #f.
-</DL>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC121"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC120"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC122"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 5.9.1.2 White </H4>
-<!--docid::SEC121::-->
-<P>
-
-We experience color relative to the illumination around us.
-CIEXYZ coordinates, although subject to uniform scaling, are
-objective. Thus other color spaces are specified relative to a
-<A NAME="IDX719"></A>
-<EM>white point</EM> in CIEXYZ coordinates.
-<A NAME="IDX720"></A>
-</P>
-<P>
-
-The white point for digital color spaces is set to D65. For the other
-spaces a <VAR>white-point</VAR> argument can be specified. The default if
-none is specified is the white-point with which the color was created
-or last converted; and D65 if none has been specified.
-</P>
-<P>
-
-<A NAME="IDX721"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>D65</B>
-<DD>Is the color of 6500.K (blackbody) illumination. D65 is close
-to the average color of daylight.
-</DL>
-<P>
-
-<A NAME="IDX722"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>D50</B>
-<DD>Is the color of 5000.K (blackbody) illumination. D50 is the color of
-indoor lighting by incandescent bulbs, whose filaments have
-temperatures around 5000.K.
-</DL>
-<P>
-
-<A NAME="Color Spaces"></A>
-<HR SIZE="6">
-<A NAME="SEC122"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC121"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC127"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.9.2 Color Spaces </H3>
-<!--docid::SEC122::-->
-<P>
-
-&lt;A NAME=&quot;Color_Spaces&quot;&gt;&lt;/A&gt;
-<A NAME="SEC123"></A>
-<H4> Measurement-based Color Spaces </H4>
-<!--docid::SEC123::-->
-<P>
-
-<A NAME="IDX723"></A>
-The <EM>tristimulus</EM> color spaces are those whose component values
-<A NAME="IDX724"></A>
-are proportional measurements of light intensity. The CIEXYZ(1931)
-system provides 3 sets of spectra to convolve with a spectrum of
-interest. The result of those convolutions is coordinates in CIEXYZ
-space. All tristimuls color spaces are related to CIEXYZ by linear
-transforms, namely matrix multiplication. Of the color spaces listed
-here, CIEXYZ and RGB709 are tristimulus spaces.
-</P>
-<P>
-
-<A NAME="IDX725"></A>
-</P>
-<DL>
-<DT><U>Color Space:</U> <B>CIEXYZ</B>
-<DD>The CIEXYZ color space covers the full <EM>gamut</EM>.
-<A NAME="IDX726"></A>
-It is the basis for color-space conversions.
-<P>
-
-CIEXYZ is a list of three inexact numbers between 0 and 1.1.
-'(0. 0. 0.) is black; '(1. 1. 1.) is white.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX727"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>ciexyz-&gt;color</B> <I>xyz</I>
-<DD><P>
-
-<VAR>xyz</VAR> must be a list of 3 numbers. If <VAR>xyz</VAR> is valid CIEXYZ coordinates,
-then <CODE>ciexyz-&gt;color</CODE> returns the color specified by <VAR>xyz</VAR>; otherwise returns #f.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX728"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color:ciexyz</B> <I>x y z</I>
-<DD><P>
-
-Returns the CIEXYZ color composed of <VAR>x</VAR>, <VAR>y</VAR>, <VAR>z</VAR>. If the
-coordinates do not encode a valid CIEXYZ color, then an error is
-signaled.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX729"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-&gt;ciexyz</B> <I>color</I>
-<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in CIEXYZ.
-</DL>
-<A NAME="IDX730"></A>
-<DL>
-<DT><U>Color Space:</U> <B>RGB709</B>
-<DD>BT.709-4 (03/00) <CITE>Parameter values for the HDTV standards for
-production and international programme exchange</CITE> specifies parameter
-values for chromaticity, sampling, signal format, frame rates, etc., of
-high definition television signals.
-<P>
-
-An RGB709 color is represented by a list of three inexact numbers
-between 0 and 1. '(0. 0. 0.) is black '(1. 1. 1.) is white.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX731"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>rgb709-&gt;color</B> <I>rgb</I>
-<DD><P>
-
-<VAR>rgb</VAR> must be a list of 3 numbers. If <VAR>rgb</VAR> is valid RGB709 coordinates,
-then <CODE>rgb709-&gt;color</CODE> returns the color specified by <VAR>rgb</VAR>; otherwise returns #f.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX732"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color:rgb709</B> <I>r g b</I>
-<DD><P>
-
-Returns the RGB709 color composed of <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>. If the
-coordinates do not encode a valid RGB709 color, then an error is
-signaled.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX733"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-&gt;rgb709</B> <I>color</I>
-<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in RGB709.
-</DL>
-<A NAME="SEC124"></A>
-<H4> Perceptual Uniformity </H4>
-<!--docid::SEC124::-->
-<P>
-
-Although properly encoding the chromaticity, tristimulus spaces do not
-match the logarithmic response of human visual systems to intensity.
-Minimum detectable differences between colors correspond to a smaller
-range of distances (6:1) in the L*a*b* and L*u*v* spaces than in
-tristimulus spaces (80:1). For this reason, color distances are
-computed in L*a*b* (or L*C*h).
-</P>
-<P>
-
-<A NAME="IDX734"></A>
-</P>
-<DL>
-<DT><U>Color Space:</U> <B>L*a*b*</B>
-<DD>Is a CIE color space which better matches the human visual system's
-perception of color. It is a list of three numbers:
-<P>
-
-<UL>
-<LI>
-0 &lt;= L* &lt;= 100 (CIE <EM>Lightness</EM>)
-<A NAME="IDX735"></A>
-<P>
-
-</P>
-<LI>
--500 &lt;= a* &lt;= 500
-<LI>
--200 &lt;= b* &lt;= 200
-</UL>
-</DL>
-<P>
-
-<A NAME="IDX736"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>l*a*b*-&gt;color</B> <I>L*a*b* white-point</I>
-<DD><P>
-
-<VAR>L*a*b*</VAR> must be a list of 3 numbers. If <VAR>L*a*b*</VAR> is valid L*a*b* coordinates,
-then <CODE>l*a*b*-&gt;color</CODE> returns the color specified by <VAR>L*a*b*</VAR>; otherwise returns #f.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX737"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color:l*a*b*</B> <I>L* a* b* white-point</I>
-<DD><P>
-
-Returns the L*a*b* color composed of <VAR>L*</VAR>, <VAR>a*</VAR>, <VAR>b*</VAR> with <VAR>white-point</VAR>.
-</P>
-<P>
-
-<A NAME="IDX738"></A>
-<DT><U>Function:</U> <B>color:l*a*b*</B> <I>L* a* b*</I>
-<DD>Returns the L*a*b* color composed of <VAR>L*</VAR>, <VAR>a*</VAR>, <VAR>b*</VAR>. If the coordinates
-do not encode a valid L*a*b* color, then an error is signaled.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX739"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-&gt;l*a*b*</B> <I>color white-point</I>
-<DD><P>
-
-Returns the list of 3 numbers encoding <VAR>color</VAR> in L*a*b* with <VAR>white-point</VAR>.
-</P>
-<P>
-
-<A NAME="IDX740"></A>
-<DT><U>Function:</U> <B>color-&gt;l*a*b*</B> <I>color</I>
-<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in L*a*b*.
-</P>
-</DL>
-<A NAME="IDX741"></A>
-<DL>
-<DT><U>Color Space:</U> <B>L*u*v*</B>
-<DD>Is another CIE encoding designed to better match the human visual
-system's perception of color.
-</DL>
-<P>
-
-<A NAME="IDX742"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>l*u*v*-&gt;color</B> <I>L*u*v* white-point</I>
-<DD><P>
-
-<VAR>L*u*v*</VAR> must be a list of 3 numbers. If <VAR>L*u*v*</VAR> is valid L*u*v* coordinates,
-then <CODE>l*u*v*-&gt;color</CODE> returns the color specified by <VAR>L*u*v*</VAR>; otherwise returns #f.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX743"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color:l*u*v*</B> <I>L* u* v* white-point</I>
-<DD><P>
-
-Returns the L*u*v* color composed of <VAR>L*</VAR>, <VAR>u*</VAR>, <VAR>v*</VAR> with <VAR>white-point</VAR>.
-</P>
-<P>
-
-<A NAME="IDX744"></A>
-<DT><U>Function:</U> <B>color:l*u*v*</B> <I>L* u* v*</I>
-<DD>Returns the L*u*v* color composed of <VAR>L*</VAR>, <VAR>u*</VAR>, <VAR>v*</VAR>. If the coordinates
-do not encode a valid L*u*v* color, then an error is signaled.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX745"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-&gt;l*u*v*</B> <I>color white-point</I>
-<DD><P>
-
-Returns the list of 3 numbers encoding <VAR>color</VAR> in L*u*v* with <VAR>white-point</VAR>.
-</P>
-<P>
-
-<A NAME="IDX746"></A>
-<DT><U>Function:</U> <B>color-&gt;l*u*v*</B> <I>color</I>
-<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in L*u*v*.
-</P>
-</DL>
-<A NAME="SEC125"></A>
-<H4> Cylindrical Coordinates </H4>
-<!--docid::SEC125::-->
-<P>
-
-HSL (Hue Saturation Lightness), HSV (Hue Saturation Value), HSI (Hue
-Saturation Intensity) and HCI (Hue Chroma Intensity) are cylindrical
-color spaces (with angle hue). But these spaces are all defined in
-terms device-dependent RGB spaces.
-</P>
-<P>
-
-One might wonder if there is some fundamental reason why intuitive
-specification of color must be device-dependent. But take heart! A
-cylindrical system can be based on L*a*b* and is used for predicting how
-close colors seem to observers.
-</P>
-<P>
-
-<A NAME="IDX747"></A>
-</P>
-<DL>
-<DT><U>Color Space:</U> <B>L*C*h</B>
-<DD>Expresses the *a and b* of L*a*b* in polar coordinates. It is a list of
-three numbers:
-<P>
-
-<UL>
-<LI>
-0 &lt;= L* &lt;= 100 (CIE <EM>Lightness</EM>)
-<A NAME="IDX748"></A>
-<P>
-
-</P>
-<LI>
-C* (CIE <EM>Chroma</EM>) is the distance from the neutral (gray) axis.
-<A NAME="IDX749"></A>
-<LI>
-0 &lt;= h &lt;= 360 (CIE <EM>Hue</EM>) is the angle.
-<A NAME="IDX750"></A>
-</UL>
-<P>
-
-The colors by quadrant of h are:
-</P>
-<P>
-
-</P>
-<TABLE>
-<TR><TD>0 </TD><TD> red, orange, yellow </TD><TD> 90</TD>
-</TR>
-<TR><TD>90 </TD><TD> yellow, yellow-green, green </TD><TD> 180</TD>
-</TR>
-<TR><TD>180 </TD><TD> green, cyan (blue-green), blue </TD><TD> 270</TD>
-</TR>
-<TR><TD>270 </TD><TD> blue, purple, magenta </TD><TD> 360</TD>
-</TR></TABLE>
-<P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX751"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>l*c*h-&gt;color</B> <I>L*C*h white-point</I>
-<DD><P>
-
-<VAR>L*C*h</VAR> must be a list of 3 numbers. If <VAR>L*C*h</VAR> is valid L*C*h coordinates,
-then <CODE>l*c*h-&gt;color</CODE> returns the color specified by <VAR>L*C*h</VAR>; otherwise returns #f.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX752"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color:l*c*h</B> <I>L* C* h white-point</I>
-<DD><P>
-
-Returns the L*C*h color composed of <VAR>L*</VAR>, <VAR>C*</VAR>, <VAR>h</VAR> with <VAR>white-point</VAR>.
-</P>
-<P>
-
-<A NAME="IDX753"></A>
-<DT><U>Function:</U> <B>color:l*c*h</B> <I>L* C* h</I>
-<DD>Returns the L*C*h color composed of <VAR>L*</VAR>, <VAR>C*</VAR>, <VAR>h</VAR>. If the coordinates
-do not encode a valid L*C*h color, then an error is signaled.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX754"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-&gt;l*c*h</B> <I>color white-point</I>
-<DD><P>
-
-Returns the list of 3 numbers encoding <VAR>color</VAR> in L*C*h with <VAR>white-point</VAR>.
-</P>
-<P>
-
-<A NAME="IDX755"></A>
-<DT><U>Function:</U> <B>color-&gt;l*c*h</B> <I>color</I>
-<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in L*C*h.
-</P>
-</DL>
-<A NAME="SEC126"></A>
-<H4> Digital Color Spaces </H4>
-<!--docid::SEC126::-->
-<P>
-
-The color spaces discussed so far are impractical for image data because
-of numerical precision and computational requirements. In 1998 the IEC
-adopted <CITE>A Standard Default Color Space for the Internet - sRGB</CITE>
-(<A HREF="http://www.w3.org/Graphics/Color/sRGB">http://www.w3.org/Graphics/Color/sRGB</A>). sRGB was cleverly
-designed to employ the 24-bit (256x256x256) color encoding already in
-widespread use; and the 2.2 gamma intrinsic to CRT monitors.
-</P>
-<P>
-
-Conversion from CIEXYZ to digital (sRGB) color spaces is accomplished by
-conversion first to a RGB709 tristimulus space with D65 white-point;
-then each coordinate is individually subjected to the same non-linear
-mapping. Inverse operations in the reverse order create the inverse
-transform.
-</P>
-<P>
-
-<A NAME="IDX756"></A>
-</P>
-<DL>
-<DT><U>Color Space:</U> <B>sRGB</B>
-<DD>Is &quot;A Standard Default Color Space for the Internet&quot;. Most display
-monitors will work fairly well with sRGB directly. Systems using ICC
-profiles
-<A NAME="IDX757"></A>
-<A NAME="DOCF5" HREF="slib_fot.html#FOOT5">(5)</A>
-should work very well with sRGB.
-<P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX758"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>srgb-&gt;color</B> <I>rgb</I>
-<DD><P>
-
-<VAR>rgb</VAR> must be a list of 3 numbers. If <VAR>rgb</VAR> is valid sRGB coordinates,
-then <CODE>srgb-&gt;color</CODE> returns the color specified by <VAR>rgb</VAR>; otherwise returns #f.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX759"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color:srgb</B> <I>r g b</I>
-<DD><P>
-
-Returns the sRGB color composed of <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>. If the
-coordinates do not encode a valid sRGB color, then an error is
-signaled.
-</P>
-</DL>
-<A NAME="IDX760"></A>
-<DL>
-<DT><U>Color Space:</U> <B>xRGB</B>
-<DD>Represents the equivalent sRGB color with a single 24-bit integer. The
-most significant 8 bits encode red, the middle 8 bits blue, and the
-least significant 8 bits green.
-</DL>
-<P>
-
-<A NAME="IDX761"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-&gt;srgb</B> <I>color</I>
-<DD><P>
-
-Returns the list of 3 integers encoding <VAR>color</VAR> in sRGB.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX762"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-&gt;xrgb</B> <I>color</I>
-<DD>Returns the 24-bit integer encoding <VAR>color</VAR> in sRGB.
-</DL>
-<P>
-
-<A NAME="IDX763"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>xrgb-&gt;color</B> <I>k</I>
-<DD><P>
-
-Returns the sRGB color composed of the 24-bit integer <VAR>k</VAR>.
-</P>
-</DL>
-<A NAME="IDX764"></A>
-<DL>
-<DT><U>Color Space:</U> <B>e-sRGB</B>
-<DD>Is &quot;Photography - Electronic still picture imaging - Extended sRGB color
-encoding&quot; (PIMA 7667:2001). It extends the gamut of sRGB; and its
-higher precision numbers provide a larger dynamic range.
-<P>
-
-A triplet of integers represent e-sRGB colors. Three precisions are
-supported:
-</P>
-<P>
-
-</P>
-<DL COMPACT>
-<DT>e-sRGB10
-<DD>0 to 1023
-<DT>e-sRGB12
-<DD>0 to 4095
-<DT>e-sRGB16
-<DD>0 to 65535
-</DL>
-</DL>
-<P>
-
-<A NAME="IDX765"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>e-srgb-&gt;color</B> <I>precision rgb</I>
-<DD><VAR>precision</VAR> must be the integer 10, 12, or 16. <VAR>rgb</VAR> must be a list of 3
-numbers. If <VAR>rgb</VAR> is valid e-sRGB coordinates, then <CODE>e-srgb-&gt;color</CODE> returns the color
-specified by <VAR>rgb</VAR>; otherwise returns #f.
-</DL>
-<P>
-
-<A NAME="IDX766"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color:e-srgb</B> <I>10 r g b</I>
-<DD><P>
-
-Returns the e-sRGB10 color composed of integers <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>.
-</P>
-<P>
-
-<A NAME="IDX767"></A>
-<DT><U>Function:</U> <B>color:e-srgb</B> <I>12 r g b</I>
-<DD>Returns the e-sRGB12 color composed of integers <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>.
-</P>
-<P>
-
-<A NAME="IDX768"></A>
-<DT><U>Function:</U> <B>color:e-srgb</B> <I>16 r g b</I>
-<DD>Returns the e-sRGB16 color composed of integers <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>.
-If the coordinates do not encode a valid e-sRGB color, then an error
-is signaled.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX769"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-&gt;e-srgb</B> <I>precision color</I>
-<DD><VAR>precision</VAR> must be the integer 10, 12, or 16. <CODE>color-&gt;e-srgb</CODE> returns the list of 3
-integers encoding <VAR>color</VAR> in sRGB10, sRGB12, or sRGB16.
-</DL>
-<P>
-
-<A NAME="Spectra"></A>
-<HR SIZE="6">
-<A NAME="SEC127"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC122"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC128"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.9.3 Spectra </H3>
-<!--docid::SEC127::-->
-<P>
-
-&lt;A NAME=&quot;Spectra&quot;&gt;&lt;/A&gt;
-The following functions compute colors from spectra, scale color
-luminance, and extract chromaticity. XYZ is used in the names of
-procedures for unnormalized colors; the coordinates of CIEXYZ colors are
-constrained as described in <A HREF="slib_5.html#SEC122">5.9.2 Color Spaces</A>.
-</P>
-<P>
-
-<CODE>(require 'color-space)</CODE>
-</P>
-<P>
-
-A spectrum may be represented as:
-</P>
-<P>
-
-<UL>
-<LI>
-A procedure of one argument accepting real numbers from 380e-9 to
-780e-9, the wavelength in meters; or
-<LI>
-A vector of real numbers representing intensity samples evenly spaced
-over some range of wavelengths overlapping the range 380e-9 to 780e-9.
-</UL>
-<P>
-
-CIEXYZ values are calculated as dot-product with the X, Y (Luminance),
-and Z <EM>Spectral Tristimulus Values</EM>. The files `<TT>cie1931.xyz</TT>'
-and `<TT>cie1964.xyz</TT>' in the distribution contain these CIE-defined
-values.
-<A NAME="IDX770"></A>
-</P>
-<P>
-
-<A NAME="IDX771"></A>
-</P>
-<DL>
-<DT><U>Feature:</U> <B>cie1964</B>
-<DD><A NAME="IDX772"></A>
-Loads the Spectral Tristimulus Values defining <CITE>CIE 1964
-Supplementary Standard Colorimetric Observer</CITE>.
-<A NAME="IDX773"></A>
-<DT><U>Feature:</U> <B>cie1931</B>
-<DD><A NAME="IDX774"></A>
-Loads the Spectral Tristimulus Values defining <CITE>CIE 1931
-Supplementary Standard Colorimetric Observer</CITE>.
-<A NAME="IDX775"></A>
-<DT><U>Feature:</U> <B>ciexyz</B>
-<DD><A NAME="IDX776"></A>
-Requires Spectral Tristimulus Values, defaulting to cie1931.
-</DL>
-<P>
-
-<CODE>(require 'cie1964)</CODE> or <CODE>(require 'cie1931)</CODE> will
-<A NAME="IDX777"></A>
-<CODE>load-ciexyz</CODE> specific values used by the following spectrum
-conversion procedures. The spectrum conversion procedures
-<CODE>(require 'ciexyz)</CODE> to assure that a set is loaded.
-</P>
-<P>
-
-<A NAME="IDX778"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>spectrum-&gt;XYZ</B> <I>proc</I>
-<DD><VAR>proc</VAR> must be a function of one argument. <CODE>spectrum-&gt;XYZ</CODE>
-computes the CIEXYZ(1931) values for the spectrum returned by <VAR>proc</VAR>
-when called with arguments from 380e-9 to 780e-9, the wavelength in
-meters.
-<P>
-
-<A NAME="IDX779"></A>
-<DT><U>Function:</U> <B>spectrum-&gt;XYZ</B> <I>spectrum x1 x2</I>
-<DD><VAR>x1</VAR> and <VAR>x2</VAR> must be positive real numbers specifying the
-wavelengths (in meters) corresponding to the zeroth and last elements of
-vector or list <VAR>spectrum</VAR>. <CODE>spectrum-&gt;XYZ</CODE> returns the
-CIEXYZ(1931) values for a light source with spectral values proportional
-to the elements of <VAR>spectrum</VAR> at evenly spaced wavelengths between
-<VAR>x1</VAR> and <VAR>x2</VAR>.
-</P>
-<P>
-
-Compute the colors of 6500.K and 5000.K blackbody radiation:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'color-space)
-(define xyz (spectrum-&gt;XYZ (blackbody-spectrum 6500)))
-(define y_n (cadr xyz))
-(map (lambda (x) (/ x y_n)) xyz)
- => (0.9687111145512467 1.0 1.1210875945303613)
-
-(define xyz (spectrum-&gt;XYZ (blackbody-spectrum 5000)))
-(map (lambda (x) (/ x y_n)) xyz)
- => (0.2933441826889158 0.2988931825387761 0.25783646831201573)
-</pre></td></tr></table><P>
-
-<A NAME="IDX780"></A>
-<DT><U>Function:</U> <B>spectrum-&gt;CIEXYZ</B> <I>proc</I>
-<DD><A NAME="IDX781"></A>
-<DT><U>Function:</U> <B>spectrum-&gt;CIEXYZ</B> <I>spectrum x1 x2</I>
-<DD><CODE>spectrum-&gt;CIEXYZ</CODE> computes the CIEXYZ(1931) values for the
-spectrum, scaled so their sum is 1.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX782"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>spectrum-&gt;chromaticity</B> <I>proc</I>
-<DD><A NAME="IDX783"></A>
-<DT><U>Function:</U> <B>spectrum-&gt;chromaticity</B> <I>spectrum x1 x2</I>
-<DD>Computes the chromaticity for the given spectrum.
-</DL>
-<P>
-
-<A NAME="IDX784"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>wavelength-&gt;XYZ</B> <I>w</I>
-<DD><A NAME="IDX785"></A>
-<DT><U>Function:</U> <B>wavelength-&gt;chromaticity</B> <I>w</I>
-<DD><A NAME="IDX786"></A>
-<DT><U>Function:</U> <B>wavelength-&gt;CIEXYZ</B> <I>w</I>
-<DD><VAR>w</VAR> must be a number between 380e-9 to 780e-9.
-<CODE>wavelength-&gt;XYZ</CODE> returns (unnormalized) XYZ values for a
-monochromatic light source with wavelength <VAR>w</VAR>.
-<CODE>wavelength-&gt;chromaticity</CODE> returns the chromaticity for a
-monochromatic light source with wavelength <VAR>w</VAR>.
-<CODE>wavelength-&gt;CIEXYZ</CODE> returns XYZ values for the saturated color
-having chromaticity of a monochromatic light source with wavelength
-<VAR>w</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX787"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>blackbody-spectrum</B> <I>temp</I>
-<DD><A NAME="IDX788"></A>
-<DT><U>Function:</U> <B>blackbody-spectrum</B> <I>temp span</I>
-<DD>Returns a procedure of one argument (wavelength in meters), which
-returns the radiance of a black body at <VAR>temp</VAR>.
-<P>
-
-The optional argument <VAR>span</VAR> is the wavelength analog of bandwidth.
-With the default <VAR>span</VAR> of 1.nm (1e-9.m), the values returned by the
-procedure correspond to the power of the photons with wavelengths
-<VAR>w</VAR> to <VAR>w</VAR>+1e-9.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX789"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>temperature-&gt;XYZ</B> <I>x</I>
-<DD>The positive number <VAR>x</VAR> is a temperature in degrees kelvin.
-<CODE>temperature-&gt;XYZ</CODE> computes the CIEXYZ(1931) values for the
-spectrum of a black body at temperature <VAR>x</VAR>.
-<P>
-
-Compute the chromaticities of 6500.K and 5000.K blackbody radiation:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'color-space)
-(XYZ-&gt;chromaticity (temperature-&gt;XYZ 6500))
- => (0.3135191660557008 0.3236456786200268)
-
-(XYZ-&gt;chromaticity (temperature-&gt;XYZ 5000))
- => (0.34508082841161052 0.3516084965163377)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX790"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>temperature-&gt;CIEXYZ</B> <I>x</I>
-<DD>The positive number <VAR>x</VAR> is a temperature in degrees kelvin.
-<CODE>temperature-&gt;CIEXYZ</CODE> computes the CIEXYZ(1931) values for the
-spectrum of a black body at temperature <VAR>x</VAR>, scaled to be just
-inside the RGB709 gamut.
-</DL>
-<P>
-
-<A NAME="IDX791"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>temperature-&gt;chromaticity</B> <I>x</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX792"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>XYZ:normalize</B> <I>xyz</I>
-<DD><VAR>xyz</VAR> is a list of three non-negative real numbers.
-<CODE>XYZ:normalize</CODE> returns a list of numbers proportional to
-<VAR>xyz</VAR>; scaled so their sum is 1.
-</DL>
-<P>
-
-<A NAME="IDX793"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>XYZ:normalize-colors</B> <I>colors <small>...</small></I>
-<DD><VAR>colors</VAR> is a list of XYZ triples. <CODE>XYZ:normalize-colors</CODE>
-scales all the triples by a common factor such that the maximum sum of
-numbers in a scaled triple is 1.
-</DL>
-<P>
-
-<A NAME="IDX794"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>XYZ-&gt;chromaticity</B> <I>xyz</I>
-<DD>Returns a two element list: the x and y components of <VAR>xyz</VAR>
-normalized to 1 (= <VAR>x</VAR> + <VAR>y</VAR> + <VAR>z</VAR>).
-</DL>
-<P>
-
-<A NAME="IDX795"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>chromaticity-&gt;CIEXYZ</B> <I>x y</I>
-<DD>Returns the list of <VAR>x</VAR>, and <VAR>y</VAR>, 1 - <VAR>y</VAR> - <VAR>x</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX796"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>chromaticity-&gt;whitepoint</B> <I>x y</I>
-<DD>Returns the CIEXYZ(1931) values having luminosity 1 and chromaticity
-<VAR>x</VAR> and <VAR>y</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX797"></A>
-Many color datasets are expressed in <EM>xyY</EM> format; chromaticity with
-CIE luminance (Y). But xyY is not a CIE standard like CIEXYZ, CIELAB,
-and CIELUV. Although chrominance is well defined, the luminance
-component is sometimes scaled to 1, sometimes to 100, but usually has no
-obvious range. With no given whitepoint, the only reasonable course is
-to ascertain the luminance range of a dataset and normalize the values
-to lie from 0 to 1.
-</P>
-<P>
-
-<A NAME="IDX798"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>XYZ-&gt;xyY</B> <I>xyz</I>
-<DD>Returns a three element list: the <VAR>x</VAR> and <VAR>y</VAR> components of
-<VAR>XYZ</VAR> normalized to 1, and CIE luminance <VAR>Y</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX799"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>xyY-&gt;XYZ</B> <I>xyY</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX800"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>xyY:normalize-colors</B> <I>colors</I>
-<DD><VAR>colors</VAR> is a list of xyY triples. <CODE>xyY:normalize-colors</CODE>
-scales each chromaticity so it sums to 1 or less; and divides the
-<VAR>Y</VAR> values by the maximum <VAR>Y</VAR> in the dataset, so all lie between
-0 and 1.
-<P>
-
-<A NAME="IDX801"></A>
-<DT><U>Function:</U> <B>xyY:normalize-colors</B> <I>colors n</I>
-<DD>If <VAR>n</VAR> is positive real, then <CODE>xyY:normalize-colors</CODE> divides
-the <VAR>Y</VAR> values by <VAR>n</VAR> times the maximum <VAR>Y</VAR> in the dataset.
-</P>
-<P>
-
-If <VAR>n</VAR> is an exact non-positive integer, then
-<CODE>xyY:normalize-colors</CODE> divides the <VAR>Y</VAR> values by the maximum of
-the <VAR>Y</VAR>s in the dataset excepting the -<VAR>n</VAR> largest <VAR>Y</VAR>
-values.
-</P>
-<P>
-
-In all cases, returned <VAR>Y</VAR> values are limited to lie from 0 to 1.
-</P>
-</DL>
-<P>
-
-Why would one want to normalize to other than 1? If the sun or its
-reflection is the brightest object in a scene, then normalizing to its
-luminance will tend to make the rest of the scene very dark. As with
-photographs, limiting the specular highlights looks better than
-darkening everything else.
-</P>
-<P>
-
-The results of measurements being what they are,
-<CODE>xyY:normalize-colors</CODE> is extremely tolerant. Negative numbers are
-replaced with zero, and chromaticities with sums greater than one are
-scaled to sum to one.
-</P>
-<P>
-
-<A NAME="Color Difference Metrics"></A>
-<HR SIZE="6">
-<A NAME="SEC128"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC127"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC129"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.9.4 Color Difference Metrics </H3>
-<!--docid::SEC128::-->
-<P>
-
-&lt;A NAME=&quot;Color_Difference_Metrics&quot;&gt;&lt;/A&gt;
-</P>
-<P>
-
-<CODE>(require 'color-space)</CODE>
-</P>
-<P>
-
-The low-level metric functions operate on lists of 3 numbers, lab1,
-lab2, lch1, or lch2.
-</P>
-<P>
-
-<CODE>(require 'color)</CODE>
-</P>
-<P>
-
-The wrapped functions operate on objects of type color, color1 and
-color2 in the function entries.
-</P>
-<P>
-
-<A NAME="IDX802"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>L*a*b*:DE*</B> <I>lab1 lab2</I>
-<DD>Returns the Euclidean distance between <VAR>lab1</VAR> and <VAR>lab2</VAR>.
-<P>
-
-<A NAME="IDX803"></A>
-<DT><U>Function:</U> <B>CIE:DE*</B> <I>color1 color2 white-point</I>
-<DD><A NAME="IDX804"></A>
-<DT><U>Function:</U> <B>CIE:DE*</B> <I>color1 color2</I>
-<DD>Returns the Euclidean distance in L*a*b* space between <VAR>color1</VAR> and
-<VAR>color2</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX805"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>L*C*h:DE*94</B> <I>lch1 lch2 parametric-factors</I>
-<DD><A NAME="IDX806"></A>
-<DT><U>Function:</U> <B>L*C*h:DE*94</B> <I>lch1 lch2</I>
-<DD><P>
-
-<A NAME="IDX807"></A>
-<DT><U>Function:</U> <B>CIE:DE*94</B> <I>color1 color2 parametric-factors</I>
-<DD><A NAME="IDX808"></A>
-<DT><U>Function:</U> <B>CIE:DE*94</B> <I>color1 color2</I>
-<DD></P>
-<P>
-
-Measures distance in the L*C*h cylindrical color-space.
-The three axes are individually scaled (depending on C*) in their
-contributions to the total distance.
-</P>
-<P>
-
-The CIE has defined reference conditions under which the metric with
-default parameters can be expected to perform well. These are:
-</P>
-<P>
-
-<UL>
-<LI>
-The specimens are homogeneous in colour.
-<LI>
-The colour difference (CIELAB) is &lt;= 5 units.
-<LI>
-They are placed in direct edge contact.
-<LI>
-Each specimen subtends an angle of &gt;4 degrees to the assessor, whose
-colour vision is normal.
-<LI>
-They are illuminated at 1000 lux, and viewed against a background of
-uniform grey, with L* of 50, under illumination simulating D65.
-</UL>
-<P>
-
-The <VAR>parametric-factors</VAR> argument is a list of 3 quantities kL, kC
-and kH. <VAR>parametric-factors</VAR> independently adjust each
-colour-difference term to account for any deviations from the reference
-viewing conditions. Under the reference conditions explained above, the
-default is kL = kC = kH = 1.
-</P>
-</DL>
-<P>
-
-The Color Measurement Committee of The Society of Dyers and Colorists in
-Great Britain created a more sophisticated color-distance function for
-use in judging the consistency of dye lots. With CMC:DE* it is possible
-to use a single value pass/fail tolerance for all shades.
-</P>
-<P>
-
-<A NAME="IDX809"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2 parametric-factors</I>
-<DD><A NAME="IDX810"></A>
-<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2 l c</I>
-<DD><A NAME="IDX811"></A>
-<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2 l</I>
-<DD><A NAME="IDX812"></A>
-<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2</I>
-<DD><P>
-
-<A NAME="IDX813"></A>
-<DT><U>Function:</U> <B>CMC:DE*</B> <I>color1 color2 l c</I>
-<DD><A NAME="IDX814"></A>
-<DT><U>Function:</U> <B>CMC:DE*</B> <I>color1 color2</I>
-<DD></P>
-<P>
-
-<CODE>CMC:DE</CODE> is a L*C*h metric. The <VAR>parametric-factors</VAR>
-argument is a list of 2 numbers <VAR>l</VAR> and <VAR>c</VAR>. <VAR>l</VAR> and
-<VAR>c</VAR> parameterize this metric. 1 and 1 are recommended for
-perceptibility; the default, 2 and 1, for acceptability.
-</P>
-</DL>
-<P>
-
-<A NAME="Color Conversions"></A>
-<HR SIZE="6">
-<A NAME="SEC129"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC128"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC130"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.9.5 Color Conversions </H3>
-<!--docid::SEC129::-->
-<P>
-
-&lt;A NAME=&quot;Color_Conversions&quot;&gt;&lt;/A&gt;
-</P>
-<P>
-
-This package contains the low-level color conversion and color metric
-routines operating on lists of 3 numbers. There is no type or range
-checking.
-</P>
-<P>
-
-<CODE>(require 'color-space)</CODE>
-</P>
-<P>
-
-<A NAME="IDX815"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>CIEXYZ:D65</B>
-<DD>Is the color of 6500.K (blackbody) illumination. D65 is close to the
-average color of daylight.
-</DL>
-<P>
-
-<A NAME="IDX816"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>CIEXYZ:D50</B>
-<DD>Is the color of 5000.K (blackbody) illumination. D50 is the color of
-indoor lighting by incandescent bulbs.
-</DL>
-<P>
-
-<A NAME="IDX817"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>CIEXYZ:A</B>
-<DD><A NAME="IDX818"></A>
-<DT><U>Constant:</U> <B>CIEXYZ:B</B>
-<DD><A NAME="IDX819"></A>
-<DT><U>Constant:</U> <B>CIEXYZ:C</B>
-<DD><A NAME="IDX820"></A>
-<DT><U>Constant:</U> <B>CIEXYZ:E</B>
-<DD>CIE 1931 illuminants normalized to 1 = y.
-</DL>
-<P>
-
-<A NAME="IDX821"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color:linear-transform</B> <I>matrix row</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX822"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>CIEXYZ-&gt;RGB709</B> <I>xyz</I>
-<DD><A NAME="IDX823"></A>
-<DT><U>Function:</U> <B>RGB709-&gt;CIEXYZ</B> <I>srgb</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX824"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>CIEXYZ-&gt;L*u*v*</B> <I>xyz white-point</I>
-<DD><A NAME="IDX825"></A>
-<DT><U>Function:</U> <B>CIEXYZ-&gt;L*u*v*</B> <I>xyz</I>
-<DD><A NAME="IDX826"></A>
-<DT><U>Function:</U> <B>L*u*v*-&gt;CIEXYZ</B> <I>L*u*v* white-point</I>
-<DD><A NAME="IDX827"></A>
-<DT><U>Function:</U> <B>L*u*v*-&gt;CIEXYZ</B> <I>L*u*v*</I>
-<DD>The <VAR>white-point</VAR> defaults to CIEXYZ:D65.
-</DL>
-<P>
-
-<A NAME="IDX828"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>CIEXYZ-&gt;L*a*b*</B> <I>xyz white-point</I>
-<DD><A NAME="IDX829"></A>
-<DT><U>Function:</U> <B>CIEXYZ-&gt;L*a*b*</B> <I>xyz</I>
-<DD><A NAME="IDX830"></A>
-<DT><U>Function:</U> <B>L*a*b*-&gt;CIEXYZ</B> <I>L*a*b* white-point</I>
-<DD><A NAME="IDX831"></A>
-<DT><U>Function:</U> <B>L*a*b*-&gt;CIEXYZ</B> <I>L*a*b*</I>
-<DD>The XYZ <VAR>white-point</VAR> defaults to CIEXYZ:D65.
-</DL>
-<P>
-
-<A NAME="IDX832"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>L*a*b*-&gt;L*C*h</B> <I>L*a*b*</I>
-<DD><A NAME="IDX833"></A>
-<DT><U>Function:</U> <B>L*C*h-&gt;L*a*b*</B> <I>L*C*h</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX834"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>CIEXYZ-&gt;sRGB</B> <I>xyz</I>
-<DD><A NAME="IDX835"></A>
-<DT><U>Function:</U> <B>sRGB-&gt;CIEXYZ</B> <I>srgb</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX836"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>CIEXYZ-&gt;xRGB</B> <I>xyz</I>
-<DD><A NAME="IDX837"></A>
-<DT><U>Function:</U> <B>xRGB-&gt;CIEXYZ</B> <I>srgb</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX838"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>sRGB-&gt;xRGB</B> <I>xyz</I>
-<DD><A NAME="IDX839"></A>
-<DT><U>Function:</U> <B>xRGB-&gt;sRGB</B> <I>srgb</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX840"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>CIEXYZ-&gt;e-sRGB</B> <I>n xyz</I>
-<DD><A NAME="IDX841"></A>
-<DT><U>Function:</U> <B>e-sRGB-&gt;CIEXYZ</B> <I>n srgb</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX842"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>sRGB-&gt;e-sRGB</B> <I>n srgb</I>
-<DD><A NAME="IDX843"></A>
-<DT><U>Function:</U> <B>e-sRGB-&gt;sRGB</B> <I>n srgb</I>
-<DD>The integer <VAR>n</VAR> must be 10, 12, or 16. Because sRGB and e-sRGB use
-the same RGB709 chromaticities, conversion between them is simpler than
-conversion through CIEXYZ.
-</DL>
-<P>
-
-Do not convert e-sRGB precision through <CODE>e-sRGB-&gt;sRGB</CODE> then
-<CODE>sRGB-&gt;e-sRGB</CODE> -- values would be truncated to 8-bits!
-</P>
-<P>
-
-<A NAME="IDX844"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>e-sRGB-&gt;e-sRGB</B> <I>n1 srgb n2</I>
-<DD>The integers <VAR>n1</VAR> and <VAR>n2</VAR> must be 10, 12, or 16.
-<CODE>e-sRGB-&gt;e-sRGB</CODE> converts <VAR>srgb</VAR> to e-sRGB of precision
-<VAR>n2</VAR>.
-</DL>
-<P>
-
-<A NAME="Color Names"></A>
-<HR SIZE="6">
-<A NAME="SEC130"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC129"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC133"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.9.6 Color Names </H3>
-<!--docid::SEC130::-->
-<P>
-
-&lt;A NAME=&quot;Color_Names&quot;&gt;&lt;/A&gt;
-<CODE>(require 'color-names)</CODE>
-<A NAME="IDX845"></A>
-</P>
-<P>
-
-Rather than ballast the color dictionaries with numbered grays,
-<CODE>file-&gt;color-dictionary</CODE> discards them. They are provided
-through the <CODE>grey</CODE> procedure:
-</P>
-<P>
-
-<A NAME="IDX846"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>grey</B> <I>k</I>
-<DD><P>
-
-Returns <CODE>(inexact-&gt;exact (round (* k 2.55)))</CODE>, the X11 color
-grey<I>&lt;k&gt;</I>.
-</P>
-</DL>
-A color dictionary is a database table relating <EM>canonical</EM>
-<A NAME="IDX847"></A>
-color-names to color-strings
-(see section <A HREF="slib_5.html#SEC119">External Representation</A>).
-<P>
-
-The column names in a color dictionary are unimportant; the first
-field is the key, and the second is the color-string.
-</P>
-<P>
-
-<A NAME="IDX848"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-name:canonicalize</B> <I>name</I>
-<DD>Returns a downcased copy of the string or symbol <VAR>name</VAR> with
-`<SAMP>_</SAMP>', `<SAMP>-</SAMP>', and whitespace removed.
-</DL>
-<P>
-
-<A NAME="IDX849"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-name-&gt;color</B> <I>name table1 table2 <small>...</small></I>
-<DD><P>
-
-<VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small> must be color-dictionary tables. <CODE>color-name-&gt;color</CODE> searches for the
-canonical form of <VAR>name</VAR> in <VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small> in order; returning the
-color-string of the first matching record; #f otherwise.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX850"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-dictionaries-&gt;lookup</B> <I>table1 table2 <small>...</small></I>
-<DD><P>
-
-<VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small> must be color-dictionary tables. <CODE>color-dictionaries-&gt;lookup</CODE> returns a
-procedure which searches for the canonical form of its string argument
-in <VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small>; returning the color-string of the first matching
-record; and #f otherwise.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX851"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>color-dictionary</B> <I>name rdb base-table-type</I>
-<DD><P>
-
-<VAR>rdb</VAR> must be a string naming a relational database file; and the symbol
-<VAR>name</VAR> a table therein. The database will be opened as
-<VAR>base-table-type</VAR>. <CODE>color-dictionary</CODE> returns the read-only table <VAR>name</VAR> in database
-<VAR>name</VAR> if it exists; #f otherwise.
-</P>
-<P>
-
-<A NAME="IDX852"></A>
-<DT><U>Function:</U> <B>color-dictionary</B> <I>name rdb</I>
-<DD></P>
-<P>
-
-<VAR>rdb</VAR> must be an open relational database or a string naming a relational
-database file; and the symbol <VAR>name</VAR> a table therein. <CODE>color-dictionary</CODE> returns the
-read-only table <VAR>name</VAR> in database <VAR>name</VAR> if it exists; #f otherwise.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX853"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>load-color-dictionary</B> <I>name rdb base-table-type</I>
-<DD><P>
-
-<A NAME="IDX854"></A>
-<DT><U>Function:</U> <B>load-color-dictionary</B> <I>name rdb</I>
-<DD></P>
-<P>
-
-<VAR>rdb</VAR> must be a string naming a relational database file; and the symbol
-<VAR>name</VAR> a table therein. If the symbol <VAR>base-table-type</VAR> is provided, the database will
-be opened as <VAR>base-table-type</VAR>. <CODE>load-color-dictionary</CODE> creates a top-level definition of the symbol <VAR>name</VAR>
-to a lookup procedure for the color dictionary <VAR>name</VAR> in <VAR>rdb</VAR>.
-</P>
-<P>
-
-The value returned by <CODE>load-color-dictionary</CODE> is unspecified.
-</P>
-</DL>
-<P>
-
-<A NAME="SEC131"></A>
-<H4> Dictionary Creation </H4>
-<!--docid::SEC131::-->
-<P>
-
-<CODE>(require 'color-database)</CODE>
-<A NAME="IDX855"></A>
-</P>
-<P>
-
-<A NAME="IDX856"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>file-&gt;color-dictionary</B> <I>file table-name rdb base-table-type</I>
-<DD><P>
-
-<A NAME="IDX857"></A>
-<DT><U>Function:</U> <B>file-&gt;color-dictionary</B> <I>file table-name rdb</I>
-<DD></P>
-<P>
-
-<VAR>rdb</VAR> must be an open relational database or a string naming a relational
-database file, <VAR>table-name</VAR> a symbol, and the string <VAR>file</VAR> must name an existing
-file with colornames and their corresponding xRGB (6-digit hex)
-values. <CODE>file-&gt;color-dictionary</CODE> creates a table <VAR>table-name</VAR> in <VAR>rdb</VAR> and enters the associations found
-in <VAR>file</VAR> into it.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX858"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>url-&gt;color-dictionary</B> <I>url table-name rdb base-table-type</I>
-<DD><P>
-
-<A NAME="IDX859"></A>
-<DT><U>Function:</U> <B>url-&gt;color-dictionary</B> <I>url table-name rdb</I>
-<DD></P>
-<P>
-
-<VAR>rdb</VAR> must be an open relational database or a string naming a relational
-database file and <VAR>table-name</VAR> a symbol. <CODE>url-&gt;color-dictionary</CODE> retrieves the resource named by the
-string <VAR>url</VAR> using the <EM>wget</EM> program; then calls
-<A NAME="IDX860"></A>
-<CODE>file-&gt;color-dictionary</CODE> to enter its associations in <VAR>table-name</VAR> in <VAR>url</VAR>.
-</P>
-</DL>
-This section has detailed the procedures for creating and loading
-color dictionaries. So where are the dictionaries to load?
-<P>
-
-<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color/Dictionaries.html">http://swissnet.ai.mit.edu/~jaffer/Color/Dictionaries.html</A>
-</P>
-<P>
-
-Describes and evaluates several color-name dictionaries on the web.
-The following procedure creates a database containing two of these
-dictionaries.
-</P>
-<P>
-
-<A NAME="IDX861"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-slib-color-name-db</B>
-<DD><P>
-
-Creates an alist-table relational database in library-vicinity
-containing the <EM>Resene</EM> and <EM>saturate</EM> color-name
-<A NAME="IDX862"></A>
-<A NAME="IDX863"></A>
-dictionaries.
-</P>
-<P>
-
-If the files `<TT>resenecolours.txt</TT>' and `<TT>saturate.txt</TT>' exist in
-the library-vicinity, then they used as the source of color-name
-data. Otherwise, <CODE>make-slib-color-name-db</CODE> calls url-&gt;color-dictionary with the URLs of
-appropriate source files.
-</P>
-</DL>
-<P>
-
-<A NAME="SEC132"></A>
-<H4> The Short List </H4>
-<!--docid::SEC132::-->
-<P>
-
-<CODE>(require 'saturate)</CODE>
-<A NAME="IDX864"></A>
-</P>
-<P>
-
-<A NAME="IDX865"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>saturate</B> <I>name</I>
-<DD>Looks for <VAR>name</VAR> among the 19 saturated colors from
-<CITE>Approximate Colors on CIE Chromaticity Diagram</CITE>:
-<P>
-
-</P>
-<TABLE>
-<TR><TD>reddish orange </TD><TD> orange </TD><TD> yellowish orange </TD><TD> yellow</TD>
-</TR>
-<TR><TD>greenish yellow </TD><TD> yellow green </TD><TD> yellowish green </TD><TD> green</TD>
-</TR>
-<TR><TD>bluish green </TD><TD> blue green </TD><TD> greenish blue </TD><TD> blue</TD>
-</TR>
-<TR><TD>purplish blue </TD><TD> bluish purple </TD><TD> purple </TD><TD> reddish purple</TD>
-</TR>
-<TR><TD>red purple </TD><TD> purplish red </TD><TD> red</TD>
-</TR></TABLE>
-<P>
-
-(<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color/saturate.pdf">http://swissnet.ai.mit.edu/~jaffer/Color/saturate.pdf</A>). If
-<VAR>name</VAR> is found, the corresponding color is returned. Otherwise #f
-is returned. Use saturate only for light source colors.
-</P>
-</DL>
-<P>
-
-Resene Paints Limited, New Zealand's largest privately-owned and
-operated paint manufacturing company, has generously made their
-<CITE>Resene RGB Values List</CITE> available.
-</P>
-<P>
-
-<CODE>(require 'resene)</CODE>
-<A NAME="IDX866"></A>
-</P>
-<P>
-
-<A NAME="IDX867"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>resene</B> <I>name</I>
-<DD>Looks for <VAR>name</VAR> among the 1300 entries in the Resene color-name
-dictionary (<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color/resene.pdf">http://swissnet.ai.mit.edu/~jaffer/Color/resene.pdf</A>).
-If <VAR>name</VAR> is found, the corresponding color is returned. Otherwise
-#f is returned. The <CITE>Resene RGB Values List</CITE> is an excellent
-source for surface colors.
-</DL>
-<P>
-
-If you include the <EM>Resene RGB Values List</EM> in binary form in a
-program, then you must include its license with your program:
-</P>
-<P>
-
-<BLOCKQUOTE>
-Resene RGB Values List<BR>
-For further information refer to http://www.resene.co.nz<BR>
-Copyright Resene Paints Ltd 2001
-<P>
-
-Permission to copy this dictionary, to modify it, to redistribute it,
-to distribute modified versions, and to use it for any purpose is
-granted, subject to the following restrictions and understandings.
-</P>
-<P>
-
-<OL>
-<LI>
-Any text copy made of this dictionary must include this copyright
-notice in full.
-<P>
-
-</P>
-<LI>
-Any redistribution in binary form must reproduce this copyright
-notice in the documentation or other materials provided with the
-distribution.
-<P>
-
-</P>
-<LI>
-Resene Paints Ltd makes no warranty or representation that this
-dictionary is error-free, and is under no obligation to provide any
-services, by way of maintenance, update, or otherwise.
-<P>
-
-</P>
-<LI>
-There shall be no use of the name of Resene or Resene Paints Ltd
-in any advertising, promotional, or sales literature without prior
-written consent in each case.
-<P>
-
-</P>
-<LI>
-These RGB colour formulations may not be used to the detriment of
-Resene Paints Ltd.
-</OL>
-</BLOCKQUOTE>
-<P>
-
-<A NAME="Daylight"></A>
-<HR SIZE="6">
-<A NAME="SEC133"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC130"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC134"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 5.9.7 Daylight </H3>
-<!--docid::SEC133::-->
-<P>
-
-&lt;A NAME=&quot;Daylight&quot;&gt;&lt;/A&gt;
-<CODE>(require 'daylight)</CODE>
-<A NAME="IDX868"></A>
-<A NAME="IDX869"></A>
-<A NAME="IDX870"></A>
-<A NAME="IDX871"></A>
-</P>
-<P>
-
-This package calculates the colors of sky as detailed in:<BR>
-<A HREF="http://www.cs.utah.edu/vissim/papers/sunsky/sunsky.pdf">http://www.cs.utah.edu/vissim/papers/sunsky/sunsky.pdf</A><BR>
-<CITE>A Practical Analytic Model for Daylight</CITE><BR>
-A. J. Preetham, Peter Shirley, Brian Smits
-</P>
-<P>
-
-<A NAME="IDX872"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solar-hour</B> <I>julian-day hour</I>
-<DD><P>
-
-Returns the solar-time in hours given the integer <VAR>julian-day</VAR> in the range 1 to
-366, and the local time in hours.
-</P>
-<P>
-
-To be meticulous, subtract 4 minutes for each degree of longitude west
-of the standard meridian of your time zone.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX873"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solar-declination</B> <I>julian-day</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX874"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>solar-polar</B> <I>declination latitude solar-hour</I>
-<DD>Returns a list of <VAR>theta_s</VAR>, the solar angle from the
-zenith, and <VAR>phi_s</VAR>, the solar azimuth. 0 &lt;= <VAR>theta_s</VAR>
-measured in degrees. <VAR>phi_s</VAR> is measured in degrees from due
-south; west of south being positive.
-</DL>
-In the following procedures, the number 0 &lt;= <VAR>theta_s</VAR> &lt;= 90 is
-the solar angle from the zenith in degrees.
-<P>
-
-<A NAME="IDX875"></A>
-Turbidity is a measure of the fraction of scattering due to haze as
-opposed to molecules. This is a convenient quantity because it can be
-estimated based on visibility of distant objects. This model fails
-for turbidity values less than 1.3.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre> _______________________________________________________________
-512|-: |
- | * pure-air |
-256|-:** |
- | : ** exceptionally-clear |
-128|-: * |
- | : ** |
- 64|-: * |
- | : ** very-clear |
- 32|-: ** |
- | : ** |
- 16|-: *** clear |
- | : **** |
- 8|-: **** |
- | : **** light-haze |
- 4|-: **** |
- | : ****** |
- 2|-: ******** haze thin-|
- | : *********** fog |
- 1|-:----------------------------------------------------*******--|
- |_:____.____:____.____:____.____:____.____:____.____:____.____:_|
- 1 2 4 8 16 32 64
- Meterorological range (km) versus Turbidity
-</pre></td></tr></table><P>
-
-<A NAME="IDX876"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>sunlight-spectrum</B> <I>turbidity theta_s</I>
-<DD>Returns a vector of 41 values, the spectrum of sunlight from
-380.nm to 790.nm for a given <VAR>turbidity</VAR> and <VAR>theta_s</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX877"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>sunlight-xyz</B> <I>turbidity theta_s</I>
-<DD>Returns (unnormalized) XYZ values for color of sunlight for a
-given <VAR>turbidity</VAR> and <VAR>theta_s</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX878"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>sunlight-ciexyz</B> <I>turbidity theta_s</I>
-<DD>Given <VAR>turbidity</VAR> and <VAR>theta_s</VAR>, <CODE>sunlight-ciexyz</CODE> returns the CIEXYZ triple for color of
-sunlight scaled to be just inside the RGB709 gamut.
-</DL>
-<P>
-
-<A NAME="IDX879"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>zenith-xyy</B> <I>turbidity theta_s</I>
-<DD>Returns the xyY (chromaticity and luminance) at the zenith. The
-Luminance has units kcd/m^2.
-</DL>
-<P>
-
-<A NAME="IDX880"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>overcast-sky-color-xyy</B> <I>turbidity theta_s</I>
-<DD><VAR>turbidity</VAR> is a positive real number expressing the amount of light
-scattering. The real number <VAR>theta_s</VAR> is the solar angle from the zenith in
-degrees.
-<P>
-
-<CODE>overcast-sky-color-xyy</CODE> returns a function of one angle <VAR>theta</VAR>, the angle from the
-zenith of the viewing direction (in degrees); and returning the xyY
-value for light coming from that elevation of the sky.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX881"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>clear-sky-color-xyy</B> <I>turbidity theta_s phi_s</I>
-<DD><A NAME="IDX882"></A>
-<DT><U>Function:</U> <B>sky-color-xyy</B> <I>turbidity theta_s phi_s</I>
-<DD><VAR>turbidity</VAR> is a positive real number expressing the amount of light
-scattering. The real number <VAR>theta_s</VAR> is the solar angle from the zenith in
-degrees. The real number <VAR>phi_s</VAR> is the solar angle from south.
-<P>
-
-<CODE>clear-sky-color-xyy</CODE> returns a function of two angles, <VAR>theta</VAR> and <VAR>phi</VAR> which
-specify the angles from the zenith and south meridian of the viewing
-direction (in degrees); returning the xyY value for light coming from
-that direction of the sky.
-</P>
-<P>
-
-<CODE>sky-color-xyY</CODE> calls <CODE>overcast-sky-color-xyY</CODE> for
-<VAR>turbidity</VAR> &lt;= 20; otherwise the <CODE>clear-sky-color-xyy</CODE> function.
-</P>
-</DL>
-<P>
-
-<A NAME="Root Finding"></A>
-<HR SIZE="6">
-<A NAME="SEC134"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC133"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC135"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.10 Root Finding </H2>
-<!--docid::SEC134::-->
-<P>
-
-<CODE>(require 'root)</CODE>
-<A NAME="IDX883"></A>
-</P>
-<P>
-
-<A NAME="IDX884"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>newton:find-integer-root</B> <I>f df/dx x0</I>
-<DD>Given integer valued procedure <VAR>f</VAR>, its derivative (with respect to
-its argument) <VAR>df/dx</VAR>, and initial integer value <VAR>x0</VAR> for which
-<VAR>df/dx</VAR>(<VAR>x0</VAR>) is non-zero, returns an integer <VAR>x</VAR> for which
-<VAR>f</VAR>(<VAR>x</VAR>) is closer to zero than either of the integers adjacent
-to <VAR>x</VAR>; or returns <CODE>#f</CODE> if such an integer can't be found.
-<P>
-
-To find the closest integer to a given integers square root:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (integer-sqrt y)
- (newton:find-integer-root
- (lambda (x) (- (* x x) y))
- (lambda (x) (* 2 x))
- (ash 1 (quotient (integer-length y) 2))))
-
-(integer-sqrt 15) => 4
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX885"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>integer-sqrt</B> <I>y</I>
-<DD>Given a non-negative integer <VAR>y</VAR>, returns the rounded square-root of
-<VAR>y</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX886"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>newton:find-root</B> <I>f df/dx x0 prec</I>
-<DD>Given real valued procedures <VAR>f</VAR>, <VAR>df/dx</VAR> of one (real)
-argument, initial real value <VAR>x0</VAR> for which <VAR>df/dx</VAR>(<VAR>x0</VAR>) is
-non-zero, and positive real number <VAR>prec</VAR>, returns a real <VAR>x</VAR>
-for which <CODE>abs</CODE>(<VAR>f</VAR>(<VAR>x</VAR>)) is less than <VAR>prec</VAR>; or
-returns <CODE>#f</CODE> if such a real can't be found.
-<P>
-
-If <VAR>prec</VAR> is instead a negative integer, <CODE>newton:find-root</CODE>
-returns the result of -<VAR>prec</VAR> iterations.
-</P>
-</DL>
-<P>
-
-H. J. Orchard, <CITE>The Laguerre Method for Finding the Zeros of
-Polynomials</CITE>, IEEE Transactions on Circuits and Systems, Vol. 36,
-No. 11, November 1989, pp 1377-1381.
-</P>
-<P>
-
-<BLOCKQUOTE>
-There are 2 errors in Orchard's Table II. Line k=2 for starting
-value of 1000+j0 should have Z_k of 1.0475 + j4.1036 and line k=2
-for starting value of 0+j1000 should have Z_k of 1.0988 + j4.0833.
-</BLOCKQUOTE>
-<P>
-
-<A NAME="IDX887"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>laguerre:find-root</B> <I>f df/dz ddf/dz^2 z0 prec</I>
-<DD>Given complex valued procedure <VAR>f</VAR> of one (complex) argument, its
-derivative (with respect to its argument) <VAR>df/dx</VAR>, its second
-derivative <VAR>ddf/dz^2</VAR>, initial complex value <VAR>z0</VAR>, and positive
-real number <VAR>prec</VAR>, returns a complex number <VAR>z</VAR> for which
-<CODE>magnitude</CODE>(<VAR>f</VAR>(<VAR>z</VAR>)) is less than <VAR>prec</VAR>; or returns
-<CODE>#f</CODE> if such a number can't be found.
-<P>
-
-If <VAR>prec</VAR> is instead a negative integer, <CODE>laguerre:find-root</CODE>
-returns the result of -<VAR>prec</VAR> iterations.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX888"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>laguerre:find-polynomial-root</B> <I>deg f df/dz ddf/dz^2 z0 prec</I>
-<DD>Given polynomial procedure <VAR>f</VAR> of integer degree <VAR>deg</VAR> of one
-argument, its derivative (with respect to its argument) <VAR>df/dx</VAR>, its
-second derivative <VAR>ddf/dz^2</VAR>, initial complex value <VAR>z0</VAR>, and
-positive real number <VAR>prec</VAR>, returns a complex number <VAR>z</VAR> for
-which <CODE>magnitude</CODE>(<VAR>f</VAR>(<VAR>z</VAR>)) is less than <VAR>prec</VAR>; or
-returns <CODE>#f</CODE> if such a number can't be found.
-<P>
-
-If <VAR>prec</VAR> is instead a negative integer,
-<CODE>laguerre:find-polynomial-root</CODE> returns the result of -<VAR>prec</VAR>
-iterations.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX889"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>secant:find-root</B> <I>f x0 x1 prec</I>
-<DD><A NAME="IDX890"></A>
-<DT><U>Function:</U> <B>secant:find-bracketed-root</B> <I>f x0 x1 prec</I>
-<DD>Given a real valued procedure <VAR>f</VAR> and two real valued starting
-points <VAR>x0</VAR> and <VAR>x1</VAR>, returns a real <VAR>x</VAR> for which
-<CODE>(abs (f x))</CODE> is less than <VAR>prec</VAR>; or returns
-<CODE>#f</CODE> if such a real can't be found.
-<P>
-
-If <VAR>x0</VAR> and <VAR>x1</VAR> are chosen such that they bracket a root, that is
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(or (&lt; (f x0) 0 (f x1))
- (&lt; (f x1) 0 (f x0)))
-</pre></td></tr></table>then the root returned will be between <VAR>x0</VAR> and <VAR>x1</VAR>, and
-<VAR>f</VAR> will not be passed an argument outside of that interval.
-<P>
-
-<CODE>secant:find-bracketed-root</CODE> will return <CODE>#f</CODE> unless <VAR>x0</VAR>
-and <VAR>x1</VAR> bracket a root.
-</P>
-<P>
-
-The secant method is used until a bracketing interval is found, at which point
-a modified <I>regula falsi</I> method is used.
-</P>
-<P>
-
-If <VAR>prec</VAR> is instead a negative integer, <CODE>secant:find-root</CODE>
-returns the result of -<VAR>prec</VAR> iterations.
-</P>
-<P>
-
-If <VAR>prec</VAR> is a procedure it should accept 5 arguments: <VAR>x0</VAR>
-<VAR>f0</VAR> <VAR>x1</VAR> <VAR>f1</VAR> and <VAR>count</VAR>, where <VAR>f0</VAR> will be
-<CODE>(f x0)</CODE>, <VAR>f1</VAR> <CODE>(f x1)</CODE>, and <VAR>count</VAR> the number of
-iterations performed so far. <VAR>prec</VAR> should return non-false
-if the iteration should be stopped.
-</P>
-</DL>
-<P>
-
-<A NAME="Minimizing"></A>
-<HR SIZE="6">
-<A NAME="SEC135"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC134"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC136"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.11 Minimizing </H2>
-<!--docid::SEC135::-->
-<P>
-
-<CODE>(require 'minimize)</CODE>
-<A NAME="IDX891"></A>
-<A NAME="IDX892"></A>
-</P>
-<P>
-
-</P>
-<P>
-
-The Golden Section Search
-<A NAME="DOCF6" HREF="slib_fot.html#FOOT6">(6)</A>
-algorithm finds minima of functions which
-are expensive to compute or for which derivatives are not available.
-Although optimum for the general case, convergence is slow,
-requiring nearly 100 iterations for the example (x^3-2x-5).
-</P>
-<P>
-
-</P>
-<P>
-
-If the derivative is available, Newton-Raphson is probably a better
-choice. If the function is inexpensive to compute, consider
-approximating the derivative.
-</P>
-<P>
-
-<A NAME="IDX893"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>golden-section-search</B> <I>f x0 x1 prec</I>
-<DD><P>
-
-<VAR>x_0</VAR> are <VAR>x_1</VAR> real numbers. The (single argument)
-procedure <VAR>f</VAR> is unimodal over the open interval (<VAR>x_0</VAR>,
-<VAR>x_1</VAR>). That is, there is exactly one point in the interval for
-which the derivative of <VAR>f</VAR> is zero.
-</P>
-<P>
-
-<CODE>golden-section-search</CODE> returns a pair (<VAR>x</VAR> . <VAR>f</VAR>(<VAR>x</VAR>)) where <VAR>f</VAR>(<VAR>x</VAR>)
-is the minimum. The <VAR>prec</VAR> parameter is the stop criterion. If
-<VAR>prec</VAR> is a positive number, then the iteration continues until
-<VAR>x</VAR> is within <VAR>prec</VAR> from the true value. If <VAR>prec</VAR> is
-a negative integer, then the procedure will iterate <VAR>-prec</VAR>
-times or until convergence. If <VAR>prec</VAR> is a procedure of seven
-arguments, <VAR>x0</VAR>, <VAR>x1</VAR>, <VAR>a</VAR>, <VAR>b</VAR>, <VAR>fa</VAR>, <VAR>fb</VAR>,
-and <VAR>count</VAR>, then the iterations will stop when the procedure
-returns <CODE>#t</CODE>.
-</P>
-<P>
-
-Analytically, the minimum of x^3-2x-5 is 0.816497.
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define func (lambda (x) (+ (* x (+ (* x x) -2)) -5)))
-(golden-section-search func 0 1 (/ 10000))
- ==&gt; (816.4883855245578e-3 . -6.0886621077391165)
-(golden-section-search func 0 1 -5)
- ==&gt; (819.6601125010515e-3 . -6.088637561916407)
-(golden-section-search func 0 1
- (lambda (a b c d e f g ) (= g 500)))
- ==&gt; (816.4965933140557e-3 . -6.088662107903635)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="Commutative Rings"></A>
-<HR SIZE="6">
-<A NAME="SEC136"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC135"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC137"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.12 Commutative Rings </H2>
-<!--docid::SEC136::-->
-<P>
-
-Scheme provides a consistent and capable set of numeric functions.
-Inexacts implement a field; integers a commutative ring (and Euclidean
-domain). This package allows one to use basic Scheme numeric functions
-with symbols and non-numeric elements of commutative rings.
-</P>
-<P>
-
-<CODE>(require 'commutative-ring)</CODE>
-<A NAME="IDX894"></A>
-<A NAME="IDX895"></A>
-</P>
-<P>
-
-The <EM>commutative-ring</EM> package makes the procedures <CODE>+</CODE>,
-<CODE>-</CODE>, <CODE>*</CODE>, <CODE>/</CODE>, and <CODE>^</CODE> <EM>careful</EM> in the sense
-<A NAME="IDX896"></A>
-that any non-numeric arguments they do not reduce appear in the
-expression output. In order to see what working with this package is
-like, self-set all the single letter identifiers (to their corresponding
-symbols).
-<A NAME="IDX897"></A>
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define a 'a)
-<small>...</small>
-(define z 'z)
-</pre></td></tr></table><P>
-
-Or just <CODE>(require 'self-set)</CODE>. Now try some sample expressions:
-<A NAME="IDX898"></A>
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(+ (+ a b) (- a b)) => (* a 2)
-(* (+ a b) (+ a b)) => (^ (+ a b) 2)
-(* (+ a b) (- a b)) => (* (+ a b) (- a b))
-(* (- a b) (- a b)) => (^ (- a b) 2)
-(* (- a b) (+ a b)) => (* (+ a b) (- a b))
-(/ (+ a b) (+ c d)) => (/ (+ a b) (+ c d))
-(^ (+ a b) 3) => (^ (+ a b) 3)
-(^ (+ a 2) 3) => (^ (+ 2 a) 3)
-</pre></td></tr></table><P>
-
-Associative rules have been applied and repeated addition and
-multiplication converted to multiplication and exponentiation.
-</P>
-<P>
-
-We can enable distributive rules, thus expanding to sum of products
-form:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! *ruleset* (combined-rulesets distribute* distribute/))
-
-(* (+ a b) (+ a b)) => (+ (* 2 a b) (^ a 2) (^ b 2))
-(* (+ a b) (- a b)) => (- (^ a 2) (^ b 2))
-(* (- a b) (- a b)) => (- (+ (^ a 2) (^ b 2)) (* 2 a b))
-(* (- a b) (+ a b)) => (- (^ a 2) (^ b 2))
-(/ (+ a b) (+ c d)) => (+ (/ a (+ c d)) (/ b (+ c d)))
-(/ (+ a b) (- c d)) => (+ (/ a (- c d)) (/ b (- c d)))
-(/ (- a b) (- c d)) => (- (/ a (- c d)) (/ b (- c d)))
-(/ (- a b) (+ c d)) => (- (/ a (+ c d)) (/ b (+ c d)))
-(^ (+ a b) 3) => (+ (* 3 a (^ b 2)) (* 3 b (^ a 2)) (^ a 3) (^ b 3))
-(^ (+ a 2) 3) => (+ 8 (* a 12) (* (^ a 2) 6) (^ a 3))
-</pre></td></tr></table><P>
-
-Use of this package is not restricted to simple arithmetic expressions:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'determinant)
-
-(determinant '((a b c) (d e f) (g h i))) =>
-(- (+ (* a e i) (* b f g) (* c d h)) (* a f h) (* b d i) (* c e g))
-</pre></td></tr></table><P>
-
-Currently, only <CODE>+</CODE>, <CODE>-</CODE>, <CODE>*</CODE>, <CODE>/</CODE>, and <CODE>^</CODE>
-support non-numeric elements. Expressions with <CODE>-</CODE> are converted
-to equivalent expressions without <CODE>-</CODE>, so behavior for <CODE>-</CODE> is
-not defined separately. <CODE>/</CODE> expressions are handled similarly.
-</P>
-<P>
-
-This list might be extended to include <CODE>quotient</CODE>, <CODE>modulo</CODE>,
-<CODE>remainder</CODE>, <CODE>lcm</CODE>, and <CODE>gcd</CODE>; but these work only for
-the more restrictive Euclidean (Unique Factorization) Domain.
-<A NAME="IDX899"></A>
-<A NAME="IDX900"></A>
-</P>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC137"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC136"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC138"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.13 Rules and Rulesets </H2>
-<!--docid::SEC137::-->
-<P>
-
-The <EM>commutative-ring</EM> package allows control of ring properties
-through the use of <EM>rulesets</EM>.
-</P>
-<P>
-
-<A NAME="IDX901"></A>
-</P>
-<DL>
-<DT><U>Variable:</U> <B>*ruleset*</B>
-<DD>Contains the set of rules currently in effect. Rules defined by
-<CODE>cring:define-rule</CODE> are stored within the value of *ruleset* at the
-time <CODE>cring:define-rule</CODE> is called. If <VAR>*ruleset*</VAR> is
-<CODE>#f</CODE>, then no rules apply.
-</DL>
-<P>
-
-<A NAME="IDX902"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-ruleset</B> <I>rule1 <small>...</small></I>
-<DD><A NAME="IDX903"></A>
-<DT><U>Function:</U> <B>make-ruleset</B> <I>name rule1 <small>...</small></I>
-<DD>Returns a new ruleset containing the rules formed by applying
-<CODE>cring:define-rule</CODE> to each 4-element list argument <VAR>rule</VAR>. If
-the first argument to <CODE>make-ruleset</CODE> is a symbol, then the database
-table created for the new ruleset will be named <VAR>name</VAR>. Calling
-<CODE>make-ruleset</CODE> with no rule arguments creates an empty ruleset.
-</DL>
-<P>
-
-<A NAME="IDX904"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>combined-rulesets</B> <I>ruleset1 <small>...</small></I>
-<DD><A NAME="IDX905"></A>
-<DT><U>Function:</U> <B>combined-rulesets</B> <I>name ruleset1 <small>...</small></I>
-<DD>Returns a new ruleset containing the rules contained in each ruleset
-argument <VAR>ruleset</VAR>. If the first argument to
-<CODE>combined-ruleset</CODE> is a symbol, then the database table created for
-the new ruleset will be named <VAR>name</VAR>. Calling
-<CODE>combined-ruleset</CODE> with no ruleset arguments creates an empty
-ruleset.
-</DL>
-<P>
-
-Two rulesets are defined by this package.
-</P>
-<P>
-
-<A NAME="IDX906"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>distribute*</B>
-<DD>Contains the ruleset to distribute multiplication over addition and
-subtraction.
-</DL>
-<P>
-
-<A NAME="IDX907"></A>
-</P>
-<DL>
-<DT><U>Constant:</U> <B>distribute/</B>
-<DD>Contains the ruleset to distribute division over addition and
-subtraction.
-<P>
-
-Take care when using both <VAR>distribute*</VAR> and <VAR>distribute/</VAR>
-simultaneously. It is possible to put <CODE>/</CODE> into an infinite loop.
-</P>
-</DL>
-<P>
-
-You can specify how sum and product expressions containing non-numeric
-elements simplify by specifying the rules for <CODE>+</CODE> or <CODE>*</CODE> for
-cases where expressions involving objects reduce to numbers or to
-expressions involving different non-numeric elements.
-</P>
-<P>
-
-<A NAME="IDX908"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>cring:define-rule</B> <I>op sub-op1 sub-op2 reduction</I>
-<DD>Defines a rule for the case when the operation represented by symbol
-<VAR>op</VAR> is applied to lists whose <CODE>car</CODE>s are <VAR>sub-op1</VAR> and
-<VAR>sub-op2</VAR>, respectively. The argument <VAR>reduction</VAR> is a
-procedure accepting 2 arguments which will be lists whose <CODE>car</CODE>s
-are <VAR>sub-op1</VAR> and <VAR>sub-op2</VAR>.
-<P>
-
-<A NAME="IDX909"></A>
-<DT><U>Function:</U> <B>cring:define-rule</B> <I>op sub-op1 'identity reduction</I>
-<DD>Defines a rule for the case when the operation represented by symbol
-<VAR>op</VAR> is applied to a list whose <CODE>car</CODE> is <VAR>sub-op1</VAR>, and
-some other argument. <VAR>Reduction</VAR> will be called with the list whose
-<CODE>car</CODE> is <VAR>sub-op1</VAR> and some other argument.
-</P>
-<P>
-
-If <VAR>reduction</VAR> returns <CODE>#f</CODE>, the reduction has failed and other
-reductions will be tried. If <VAR>reduction</VAR> returns a non-false value,
-that value will replace the two arguments in arithmetic (<CODE>+</CODE>,
-<CODE>-</CODE>, and <CODE>*</CODE>) calculations involving non-numeric elements.
-</P>
-<P>
-
-The operations <CODE>+</CODE> and <CODE>*</CODE> are assumed commutative; hence both
-orders of arguments to <VAR>reduction</VAR> will be tried if necessary.
-</P>
-<P>
-
-The following rule is the definition for distributing <CODE>*</CODE> over
-<CODE>+</CODE>.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(cring:define-rule
- '* '+ 'identity
- (lambda (exp1 exp2)
- (apply + (map (lambda (trm) (* trm exp2)) (cdr exp1))))))
-</pre></td></tr></table></DL>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC138"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC137"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC139"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.14 How to Create a Commutative Ring </H2>
-<!--docid::SEC138::-->
-<P>
-
-The first step in creating your commutative ring is to write procedures
-to create elements of the ring. A non-numeric element of the ring must
-be represented as a list whose first element is a symbol or string.
-This first element identifies the type of the object. A convenient and
-clear convention is to make the type-identifying element be the same
-symbol whose top-level value is the procedure to create it.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (n . list1)
- (cond ((and (= 2 (length list1))
- (eq? (car list1) (cadr list1)))
- 0)
- ((not (term&lt; (first list1) (last1 list1)))
- (apply n (reverse list1)))
- (else (cons 'n list1))))
-
-(define (s x y) (n x y))
-
-(define (m . list1)
- (cond ((neq? (first list1) (term_min list1))
- (apply m (cyclicrotate list1)))
- ((term&lt; (last1 list1) (cadr list1))
- (apply m (reverse (cyclicrotate list1))))
- (else (cons 'm list1))))
-</pre></td></tr></table><P>
-
-Define a procedure to multiply 2 non-numeric elements of the ring.
-Other multiplicatons are handled automatically. Objects for which rules
-have <EM>not</EM> been defined are not changed.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (n*n ni nj)
- (let ((list1 (cdr ni)) (list2 (cdr nj)))
- (cond ((null? (intersection list1 list2)) #f)
- ((and (eq? (last1 list1) (first list2))
- (neq? (first list1) (last1 list2)))
- (apply n (splice list1 list2)))
- ((and (eq? (first list1) (first list2))
- (neq? (last1 list1) (last1 list2)))
- (apply n (splice (reverse list1) list2)))
- ((and (eq? (last1 list1) (last1 list2))
- (neq? (first list1) (first list2)))
- (apply n (splice list1 (reverse list2))))
- ((and (eq? (last1 list1) (first list2))
- (eq? (first list1) (last1 list2)))
- (apply m (cyclicsplice list1 list2)))
- ((and (eq? (first list1) (first list2))
- (eq? (last1 list1) (last1 list2)))
- (apply m (cyclicsplice (reverse list1) list2)))
- (else #f))))
-</pre></td></tr></table><P>
-
-Test the procedures to see if they work.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>;;; where cyclicrotate(list) is cyclic rotation of the list one step
-;;; by putting the first element at the end
-(define (cyclicrotate list1)
- (append (rest list1) (list (first list1))))
-;;; and where term_min(list) is the element of the list which is
-;;; first in the term ordering.
-(define (term_min list1)
- (car (sort list1 term&lt;)))
-(define (term&lt; sym1 sym2)
- (string&lt;? (symbol-&gt;string sym1) (symbol-&gt;string sym2)))
-(define first car)
-(define rest cdr)
-(define (last1 list1) (car (last-pair list1)))
-(define (neq? obj1 obj2) (not (eq? obj1 obj2)))
-;;; where splice is the concatenation of list1 and list2 except that their
-;;; common element is not repeated.
-(define (splice list1 list2)
- (cond ((eq? (last1 list1) (first list2))
- (append list1 (cdr list2)))
- (else (slib:error 'splice list1 list2))))
-;;; where cyclicsplice is the result of leaving off the last element of
-;;; splice(list1,list2).
-(define (cyclicsplice list1 list2)
- (cond ((and (eq? (last1 list1) (first list2))
- (eq? (first list1) (last1 list2)))
- (butlast (splice list1 list2) 1))
- (else (slib:error 'cyclicsplice list1 list2))))
-
-(N*N (S a b) (S a b)) => (m a b)
-</pre></td></tr></table><P>
-
-Then register the rule for multiplying type N objects by type N objects.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(cring:define-rule '* 'N 'N N*N))
-</pre></td></tr></table><P>
-
-Now we are ready to compute!
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (t)
- (define detM
- (+ (* (S g b)
- (+ (* (S f d)
- (- (* (S a f) (S d g)) (* (S a g) (S d f))))
- (* (S f f)
- (- (* (S a g) (S d d)) (* (S a d) (S d g))))
- (* (S f g)
- (- (* (S a d) (S d f)) (* (S a f) (S d d))))))
- (* (S g d)
- (+ (* (S f b)
- (- (* (S a g) (S d f)) (* (S a f) (S d g))))
- (* (S f f)
- (- (* (S a b) (S d g)) (* (S a g) (S d b))))
- (* (S f g)
- (- (* (S a f) (S d b)) (* (S a b) (S d f))))))
- (* (S g f)
- (+ (* (S f b)
- (- (* (S a d) (S d g)) (* (S a g) (S d d))))
- (* (S f d)
- (- (* (S a g) (S d b)) (* (S a b) (S d g))))
- (* (S f g)
- (- (* (S a b) (S d d)) (* (S a d) (S d b))))))
- (* (S g g)
- (+ (* (S f b)
- (- (* (S a f) (S d d)) (* (S a d) (S d f))))
- (* (S f d)
- (- (* (S a b) (S d f)) (* (S a f) (S d b))))
- (* (S f f)
- (- (* (S a d) (S d b)) (* (S a b) (S d d))))))))
- (* (S b e) (S c a) (S e c)
- detM
- ))
-(pretty-print (t))
--|
-(- (+ (m a c e b d f g)
- (m a c e b d g f)
- (m a c e b f d g)
- (m a c e b f g d)
- (m a c e b g d f)
- (m a c e b g f d))
- (* 2 (m a b e c) (m d f g))
- (* (m a c e b d) (m f g))
- (* (m a c e b f) (m d g))
- (* (m a c e b g) (m d f)))
-</pre></td></tr></table><P>
-
-<A NAME="Matrix Algebra"></A>
-<HR SIZE="6">
-<A NAME="SEC139"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC138"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 5.15 Matrix Algebra </H2>
-<!--docid::SEC139::-->
-<P>
-
-<CODE>(require 'determinant)</CODE>
-<A NAME="IDX910"></A>
-</P>
-<P>
-
-A Matrix can be either a list of lists (rows) or an array.
-As with linear-algebra texts, this package uses 1-based coordinates.
-</P>
-<P>
-
-<A NAME="IDX911"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>matrix-&gt;lists</B> <I>matrix</I>
-<DD><P>
-
-Returns the list-of-lists form of <VAR>matrix</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX912"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>matrix-&gt;array</B> <I>matrix</I>
-<DD><P>
-
-Returns the (ones-based) array form of <VAR>matrix</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX913"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>determinant</B> <I>matrix</I>
-<DD><P>
-
-<VAR>matrix</VAR> must be a square matrix.
-<CODE>determinant</CODE> returns the determinant of <VAR>matrix</VAR>.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'determinant)
-(determinant '((1 2) (3 4))) => -2
-(determinant '((1 2 3) (4 5 6) (7 8 9))) => 0
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX914"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>transpose</B> <I>matrix</I>
-<DD><P>
-
-Returns a copy of <VAR>matrix</VAR> flipped over the diagonal containing the 1,1
-element.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX915"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>matrix:product</B> <I>m1 m2</I>
-<DD><P>
-
-Returns the product of matrices <VAR>m1</VAR> and <VAR>m2</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX916"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>matrix:inverse</B> <I>matrix</I>
-<DD><P>
-
-<VAR>matrix</VAR> must be a square matrix.
-If <VAR>matrix</VAR> is singlar, then <CODE>matrix:inverse</CODE> returns #f; otherwise <CODE>matrix:inverse</CODE> returns the
-<CODE>matrix:product</CODE> inverse of <VAR>matrix</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="Database Packages"></A>
-<HR SIZE="6">
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<BR>
-<FONT SIZE="-1">
-This document was generated
-by <I>Steve Langasek</I> on <I>January, 10 2005</I>
-using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A>
-</FONT>
-
-</BODY>
-</HTML>