<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY app "<application>Genius Mathematics Tool</application>">
<!ENTITY appname "Genius">
<!ENTITY appversion "1.0.15">
<!ENTITY date "March 2012">
<!ENTITY legal SYSTEM "legal.xml">
<!ENTITY manrevision "0.2">
<!ENTITY lt "&#60;">
<!ENTITY gt "&#62;">
<!ENTITY le "&#8804;">
<!ENTITY ge "&#8805;">
<!ENTITY lsquo "&#8216;">
<!ENTITY rsquo "&#8217;">
<!ENTITY gel-function-list SYSTEM "gel-function-list.xml">
]>
<!-- 
      (Do not remove this comment block.)
  Maintained by the GNOME Documentation Project
  http://developer.gnome.org/projects/gdp
  Template version: 2.0 beta
  Template last modified Apr 11, 2002
-->
<!-- =============Document Header ============================= -->
<book id="index" lang="es">
<!-- please do not change the id; for translations, change lang to -->
<!-- appropriate code -->
  <bookinfo>
	  <abstract role="description"><para>Manual de la herramienta matemática Genius.</para></abstract>
    <title>Manual de Genius</title>       

    <copyright>
      <year>1997-2012</year>
      <holder>Jiří (George) Lebl</holder>
    </copyright>
    <copyright>
      <year>2004</year>
      <holder>Kai Willadsen</holder>
    </copyright><copyright><year>2011</year><holder>Daniel Mustieles (daniel.mustieles@gmail.com)</holder></copyright>
<!-- translators: uncomment this:
  <copyright>
   <year>2002</year>
   <holder>ME-THE-TRANSLATOR (Latin translation)</holder>
  </copyright>
-->

    <publisher> 
      <publishername/> 
    </publisher> 

     <legalnotice id="legalnotice">
	<para>Se concede permiso para copiar, distribuir o modificar este documento según las condiciones de la GNU Free Documentation License (GFDL), Versión 1.1 o cualquier versión posterior publicada por la Free Software Foundation sin Secciones invariantes, Textos de portada y Textos de contraportada. Encontrará una copia de la GFDL en este <ulink type="help" url="ghelp:fdl">enlace</ulink> o en el archivo COPYING-DOCS distribuido con este manual.</para>
         <para>Este manual es parte de la colección de manuales GNOME distribuidos bajo la GFDL. Si quiere distribuir este manual separadamente de la colección, puede hacerlo añadiendo una copia de la licencia al manual, tal como se describe en la sección 6 de la licencia.</para>

	<para>Muchos de los nombres usados por empresas para distinguir sus productos y servicios se mencionan como marcas comerciales. Donde aparezcan dichos nombres en cualquier documentación GNOME, y para que los miembros del proyecto de documentación reconozcan dichas marcas comerciales, dichos nombres se imprimen en mayúsculas o iniciales mayúsculas.</para>

	<para>EL DOCUMENTO Y LAS VERSIONES MODIFICADAS DEL MISMO SE PROPORCIONAN CON SUJECIÓN A LOS TÉRMINOS DE LA GFDL, QUEDANDO BIEN ENTENDIDO, ADEMÁS, QUE: <orderedlist>
		<listitem>
		  <para>EL DOCUMENTO SE ENTREGA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, NI EXPLÍCITA NI IMPLÍCITA INCLUYENDO, SIN LIMITACIÓN, GARANTÍA DE QUE EL DOCUMENTO O VERSIÓN MODIFICADA DE ÉSTE CAREZCA DE DEFECTOS EN EL MOMENTO DE SU VENTA, SEA ADECUADO A UN FIN CONCRETO O INCUMPLA ALGUNA NORMATIVA. TODO EL RIESGO RELATIVO A LA CALIDAD, PRECISIÓN Y UTILIDAD DEL DOCUMENTO O SU VERSIÓN MODIFICADA RECAE EN USTED. SI CUALQUIER DOCUMENTO O VERSIÓN MODIFICADA DE AQUÉL RESULTARA DEFECTUOSO EN CUALQUIER ASPECTO, USTED (Y NO EL REDACTOR INICIAL, AUTOR O AUTOR DE APORTACIONES) ASUMIRÁ LOS COSTES DE TODA REPARACIÓN, MANTENIMIENTO O CORRECCIÓN NECESARIOS. ESTA EXENCIÓN DE RESPONSABILIDAD SOBRE LA GARANTÍA ES UNA PARTE ESENCIAL DE ESTA LICENCIA. NO SE AUTORIZA EL USO DE NINGÚN DOCUMENTO NI VERSIÓN MODIFICADA DE ÉSTE POR EL PRESENTE, SALVO DENTRO DEL CUMPLIMIENTO DE LA EXENCIÓN DE RESPONSABILIDAD;Y</para>
		</listitem>
		<listitem>
		  <para>BAJO NINGUNA CIRCUNSTANCIA NI BAJO NINGUNA TEORÍA LEGAL, SEA POR ERROR (INCLUYENDO NEGLIGENCIA), CONTRATO O DE ALGÚN OTRO MODO, EL AUTOR, EL ESCRITOR INICIAL, CUALQUIER CONTRIBUIDOR, O CUALQUIER DISTRIBUIDOR DEL DOCUMENTO O VERSIÓN MODIFICADA DEL DOCUMENTO, O CUALQUIER PROVEEDOR DE CUALQUIERA DE ESAS PARTES, SERÁ RESPONSABLE ANTE NINGUNA PERSONA POR NINGÚN DAÑO DIRECTO, INDIRECTO, ESPECIAL, INCIDENTAL O DERIVADO DE NINGÚN TIPO, INCLUYENDO, SIN LIMITACIÓN DAÑOS POR PÉRDIDA DE MERCANCÍAS, PARO TÉCNICO, FALLO INFORMÁTICO O MAL FUNCIONAMIENTO O CUALQUIER OTRO POSIBLE DAÑO O PÉRDIDAS DERIVADAS O RELACIONADAS CON EL USO DEL DOCUMENTO O SUS VERSIONES MODIFICADAS, AUNQUE DICHA PARTE HAYA SIDO INFORMADA DE LA POSIBILIDAD DE QUE SE PRODUJESEN DICHOS DAÑOS.</para>
		</listitem>
	  </orderedlist></para>
  </legalnotice>


   <!-- This file  contains link to license for the documentation (GNU FDL), and 
        other legal stuff such as "NO WARRANTY" statement. Please do not change 
	any of this. -->

    <authorgroup> 
      <author role="maintainer"> 
		<firstname>Jiří</firstname> 
		<surname>Lebl</surname> 
		<affiliation> 
	  		<orgname>University of Wisconsin-Madison</orgname> 
	  		<address> <email>jirka@5z.com</email> </address> 
		</affiliation> 
      </author> 
      <author> 
		<firstname>Kai</firstname> 
		<surname>Willadsen</surname> 
		<affiliation> 
	  		<orgname>Universidad de Queensland, Australia</orgname> 
	  		<address> <email>kaiw@itee.uq.edu.au</email> </address> 
		</affiliation> 
      </author> 
      
<!-- This is appropriate place for other contributors: translators,
     maintainers,  etc. Commented out by default.
     
      <othercredit role="translator">
		<firstname>Latin</firstname> 
		<surname>Translator 1</surname> 
		<affiliation> 
	  		<orgname>Latin Translation Team</orgname> 
	  		<address> <email>translator@gnome.org</email> </address> 
		</affiliation>
		<contrib>Latin translation</contrib>
      </othercredit>
-->
    </authorgroup>


<!-- According to GNU FDL, revision history is mandatory if you are -->
<!-- modifying/reusing someone else's document.  If not, you can omit it. -->
<!-- Remember to remove the &manrevision; entity from the revision entries other
-->
<!-- than the current revision. -->
<!-- The revision numbering system for GNOME manuals is as follows: -->
<!-- * the revision number consists of two components -->
<!-- * the first component of the revision number reflects the release version of the GNOME desktop. -->
<!-- * the second component of the revision number is a decimal unit that is incremented with each revision of the manual. -->
<!-- For example, if the GNOME desktop release is V2.x, the first version of the manual that -->
<!-- is written in that desktop timeframe is V2.0, the second version of the manual is V2.1, etc. -->
<!-- When the desktop release version changes to V3.x, the revision number of the manual changes -->
<!-- to V3.0, and so on. -->  
<!--  This is unmaintained quite a bit so screw this it just makes things
      ugly and we don't update the manrevision stuff anyway
    <revhistory>
      <revision> 
		<revnumber>&manrevision;</revnumber> 
		<date>&date;</date> 
		<revdescription> 
	  		<para role="author">Jiri (George) Lebl
	    	<email>jirka@5z.com</email>
	  		</para>
		</revdescription> 
      </revision> 
      <revision> 
		<revnumber>0.1</revnumber> 
		<date>September 2004</date> 
		<revdescription> 
	  		<para role="author">Kai Willadsen
	    	<email>kaiw@itee.uq.edu.au</email>
	  		</para>
		</revdescription> 
      </revision> 
      <revision> 
		<revnumber>Genius Calculator Manual</revnumber> 
		<date>August 2004</date> 
		<revdescription> 
	  		<para role="author">Jiri (George) Lebl
	    	<email>jirka@5z.com</email>
	  		</para>
		</revdescription> 
      </revision> 
    </revhistory> 
-->

    <revhistory>
      <revision> 
		<revnumber>0.2</revnumber> 
		<date>March 2012</date> 
		<revdescription> 
	  		<para role="author">Jiri (George) Lebl <email>jirka@5z.com</email></para>
		</revdescription> 
      </revision> 
    </revhistory>
    <releaseinfo>This manual describes version 1.0.15 of Genius.
    </releaseinfo> 
    <legalnotice> 
      <title>Comentarios</title> 
      <para>Para informar de un fallo, o hacer alguna sugerencia sobre la aplicación <application>herramienta matemática Genius</application>, o este manual, siga las instrucciones en la <ulink url="ghelp:gnome-feedback" type="help">página de comentarios de GNOME</ulink>.</para>
<!-- Translators may also add here feedback address for translations -->
    </legalnotice> 
  </bookinfo> 

<!-- ============= Introduction =============================== -->
  <chapter id="genius-introduction"> 
    <title>Introducción</title> 
    <para>La <application>Herramienta matemática Genius</application> es una calculadora de uso general para usarse como una calculadora de escritorio, una herramienta educativa para matemáticas, incluso es útil en investigaciones. El lenguaje utilizado por la <application>Herramienta matemática Genius</application> está diseñado para ser «matemático» en el sentido en que debería ser «lo que quieres decir es lo que obtienes». Por supuesto que no es una meta completamente alcanzable. La <application>Herramienta matemática Genius</application> soporta números racionales, enteros de precisión arbitraria y flotantes de precisión múltiple usando la librería GMP. Maneja números complejos usando notación cartesiana. Tiene buena manipulación de vectores y matrices, y puede manejar álgebra lineal básica. El lenguaje de programación permite funciones definidas por el usuario, variables y modificaciones de los parámetros.</para> 

    <para>Hay dos versiones de la <application>Herramienta matemática Genius</application>. Una es la versión gráfica para GNOME, que tiene una interfaz de tipo IDE y permite dibujar funciones de una y dos variables. La versión de línea de comandos no necesita GNOME, pero por supuesto no implementa ninguna característica que necesite la interfaz gráfica.</para> 

    <para>Este manual describe principalmente la versión gráfica de la calculadora pero, por supuesto, el lenguaje es el mismo. La línea de comandos carece de las capacidades de dibujo y de otras capacidades que necesitan la interfaz gráfica de usuario.</para>

  </chapter>

<!-- =========== Getting Started ============================== -->
  <chapter id="genius-getting-started"> 
    <title>Primeros pasos</title> 

    <sect1 id="genius-to-start">
      <title>Para iniciar la <application>herramienta matemática Genius</application></title>
      <para>Puede iniciar la <application>herramienta matemática Genius</application> de las siguientes formas:</para> 
      <variablelist>
        <varlistentry>
          <term>Menú<guimenu>Aplicaciones</guimenu></term>
          <listitem>
	    <para>Dependiendo de su sistema operativo y de su versión, el elemento de menú de la <application>Herramienta matemática Genius</application> puede aparecer en varios lugares diferentes. Puede estar en <guisubmenu>Educación</guisubmenu>, <guisubmenu>Accesorios</guisubmenu>, <guisubmenu>Oficina</guisubmenu>, <guisubmenu>Ciencia</guisubmenu>, o en un submenú similar, dependiendo de su configuración particular. El elemento de menú que está buscando es <guimenuitem>Herramienta matemática Genius</guimenuitem>. Cuando lo haya localizado, pulse en el para iniciar la <application>Herramienta matemática Genius</application>.</para>
	      </listitem>
        </varlistentry>
        <varlistentry>
          <term>Diálogo <guilabel>Ejecutar</guilabel></term>
          <listitem>
	    <para>Dependiendo de la instalación de su sistema, el elemento del menú puede no estar disponible. si no lo está, puede abrir el diálogo «Ejecutar» y ejecutar <command>gnome-genius</command>.</para>
	      </listitem>
        </varlistentry>
        <varlistentry>
    	  <term>Línea de comandos</term>
    	  <listitem>
    	    <para>Para iniciar la versión de GNOME de la<application>herramienta matemática Genius</application> ejecute <command>gnome-genius</command> desde la línea de comandos.</para>
	    <para>Para iniciar sólo la versión de línea de comandos, ejecute el siguiente comando: <command>genius</command>. Esta versión no incluye el entorno gráfico y ciertas funcionalidades, como dibujar, no estarán disponibles.</para> 
          </listitem>
        </varlistentry>
      </variablelist>
    </sect1>

    <sect1 id="genius-when-start">
    <title>Al iniciar Genius</title>
      <para>Cuando inicia la versión de la <application>herramienta matemática Genius</application> para GNOME, se muestra la ventana que aparece en la <xref linkend="mainwindow-fig"/>.</para>

      <figure id="mainwindow-fig"> 
        <title>Ventana de la <application>herramienta matemática Genius</application></title> 
        <screenshot> 
          <mediaobject> 
            <imageobject>
              <imagedata fileref="figures/genius_window.png" format="PNG" scale="50" scalefit="1"/> 
            </imageobject>
            <imageobject>
              <imagedata fileref="figures/genius_window.eps" format="EPS" scale="50" scalefit="1"/> 
            </imageobject>
            <textobject> 
	      <phrase>Muestra la ventana principal <application>Herramienta matemática Genius</application>. Contiene barra de título, barra de menús, barra de herramientas y área de trabajo. La barra de menú contiene los menús <guilabel>Archivo</guilabel>, <guilabel>Editar</guilabel>, <guilabel>Calculadora</guilabel>, <guilabel>Configuración</guilabel>, y <guilabel>Ayuda</guilabel>.</phrase> 
            </textobject> 
          </mediaobject>
        </screenshot> 
      </figure>

      <para>La ventana de la <application>herramienta matemática Genius</application> contiene los siguientes elementos:</para>
      <variablelist>
        <varlistentry>
          <term>Barra de menú.</term>
          <listitem>
            <para>Los menús de la barra de menús contienen todos los comandos que necesita para trabajar con archivos en la <application>Herramienta matemática Genius</application>. El menú <guilabel>Archivo</guilabel> contiene elementos para cargar y guardar elementos y crear programas nuevos. El comando <guilabel>Cargar y ejecutar...</guilabel> no abre una ventana nueva para el programa, sino que lo ejecuta directamente. Es equivalente al comando <command>load</command>.</para>
	    <para>El menú <guilabel>Calculadora</guilabel> controla el motor de la calculadora. Permite ejecutar el programa actualmente seleccionado o interrumpir el cálculo actual. También puede mirar la expresión completa del último resultado (útil si el último resultado fue demasiado grande para ajustar a la consola), y puede mirar una lista con los valores de todas las variables definidas por el usuario. Finalmente, permite trazar funciones usando un cuadro de diálogo amigable.</para>
	   <para>Los otros menús tienen funciones similares a las de otras aplicaciones.</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>Barra de herramientas.</term>
          <listitem>
            <para>La barra de herramientas contiene un subconjunto de comandos a los que puede acceder desde la barra de menús.</para>
          </listitem>
        </varlistentry>
        <varlistentry>
          <term>Área de trabajo</term>
          <listitem>
            <para>El área de trabajo es el método primario para interactuar con la aplicación.</para>
	    <para>Inicialmente, el área de trabajo sólo tenía la pestaña <guilabel>Consola</guilabel>, que es el principal medio de interacción con la calculadora. Aquí puede escribir expresiones y el resultado se devuelve inmediatamente después de pulsar la tecla «Intro».</para>
	    <para>Alternativamente, puede escribir programas más largos y éstos  pueden aparecer en pestañas separadas y se pueden guardar en archivos para su posterior recuperación.</para>
          </listitem>
        </varlistentry>
      </variablelist>
    </sect1>

  </chapter>

<!-- ================ Usage =================================== -->
  <chapter id="genius-usage"> 
    <title>Uso básico</title> 

    <sect1 id="genius-usage-workarea"> 
      <title>Usar el área de trabajo</title> 

      <para>Normalmente, interactúa con la calculadora en la pestaña <guilabel>Consola</guilabel>. Si ejecuta la versión de solo texto, entonces la consola será el único medio disponible. Si quiere usar la <application>Herramienta matemática Genius</application> como una calculadora solamente, simplemente escriba aquí su expresión y se evaluará.</para>

      <para>Escriba su expresión en el área de trabajo de la <guilabel>Consola</guilabel>, pulse «Intro» y la expresión se evaluará. Las expresiones están escritas en un lenguaje llamado GEL. Las expresiones GEL más simples parecen matemáticas. Por ejemplo <screen><prompt>genius&gt; </prompt><userinput>30*70 + 67^3.0 + ln(7) * (88.8/100)</userinput>
</screen> o <screen><prompt>genius&gt; </prompt><userinput>62734 + 812634 + 77^4 mod 5</userinput>
</screen> o <screen><prompt>genius&gt; </prompt><userinput>| sin(37) - e^7 |</userinput>
</screen> o <screen><prompt>genius&gt; </prompt><userinput>sum n=1 to 70 do 1/n</userinput>
</screen> (El último es la suma armónica de 1 a 70)</para>
<para>Para obtener una lista de todas las funciones y los comandos, escriba: <screen><prompt>genius&gt; </prompt><userinput>help</userinput>
</screen> Si quiere obtener más información sobre una función en concreto, escriba: <screen><prompt>genius&gt; </prompt><userinput>help nombre_de_la_función</userinput>
</screen> Para ver este manual, escriba: <screen><prompt>genius&gt; </prompt><userinput>manual</userinput>
</screen></para>
<para>Suponga que ha guardado algún comando GEL previamente como un programa en un archivo y quiere ejecutarlo. Para cargar este programa desde el archivo <filename>ruta/a/programa.gel</filename>, escriba <screen><prompt>genius&gt; </prompt><userinput>load ruta/a/programa.gel</userinput>
</screen> la<application>Herramienta matemática Genius</application> mantiene la ruta de la carpeta actual. Para listar los archivos de la carpeta actual, escriba <command>ls</command>, para cambiar de carpeta escriba <userinput>cd carpeta</userinput>, igual que en la línea de comandos de UNIX.</para>
    </sect1>

    <sect1 id="genius-usage-create-program"> 
      <title>Crear un programa nuevo</title> 
      <para>Para escribir un programa nuevo, eliga <menuchoice><guimenu>Archivo</guimenu><guimenuitem>Programa Nuevo</guimenuitem></menuchoice>. Aparecerá una pestaña nueva en el área de trabajo. Puede escribir un programa <link linkend="genius-gel">GEL</link> en esta área de trabajo. Una vez que haya escrito su programa, puede ejecutarlo desde <menuchoice><guimenu>Calculadora</guimenu><guimenuitem>Ejecutar</guimenuitem></menuchoice>. Esto ejecutará su programa y mostrará cualquier salida en la pestaña <guilabel>Consola</guilabel>. Ejecutar un programa es equivalente a tomar el texto del programa y escribirlo en la consola. La única diferencia es que esta entrada se realiza independientemente de la consola y solo la salida va hacia la consola. <menuchoice><guimenu>Calculadora</guimenu><guimenuitem>Ejecutar</guimenuitem></menuchoice> siempre ejecutará el programa actualmente seleccionado incluso si se encuentra en la pestaña <guilabel>Consola</guilabel>. El programa actual tiene su letra en negrita. Para seleccionar un programa, simplemente pulse sobre su pestaña.</para>
      <para>Para guardar el programa que ha escrito, elija <menuchoice><guimenu>Archivo</guimenu><guimenuitem>Guardar como...</guimenuitem></menuchoice></para>
    </sect1>

    <sect1 id="genius-usage-open-program"> 
      <title>Abrir y ejecutar un programa</title> 
      <para>Para abrir un archivo, elija <menuchoice><guimenu>Archivo</guimenu><guimenuitem>Abrir</guimenuitem></menuchoice>. En el área de trabajo aparecerá una pestaña nueva que contiene al archivo. Puede usarla para editarlo.</para>
      <para>Para ejecutar un programa desde un archivo, elija <menuchoice><guimenu>Archivo</guimenu><guimenuitem>Cargar y ejecutar...</guimenuitem></menuchoice>. Esto ejecutará el programa sin abrir en una pestaña separada. Es equivalente al comando <command>load</command>.</para>
    </sect1>

  </chapter>

  <!-- ============= Plotting ============================== -->
  <chapter id="genius-gel-plotting">
    <title>Dibujar</title>

    <para>El soporte de dibujo solo está disponible para la versión gráfica de GNOME. Todo el dibujo disponible desde la interfaz gráfica está disponible en la ventana <guilabel>Crear dibujo</guilabel>. Puede acceder a esta ventana pulsando en el botón  <guilabel>Dibujo</guilabel> de la barra de herramientas o seleccionando <guilabel>Dibujo</guilabel> desde el menú <guilabel>Calculadora</guilabel>. También puede acceder a las funcionalidades de dibujo usando las <link linkend="genius-gel-function-list-plotting">funciones de trazado</link> del lenguaje GEL. Consulte la <xref linkend="genius-gel"/> para aprender a introducir expresiones que entienda Genius.</para>

    <sect1 id="genius-line-plots">
      <title>Trazado de líneas</title>
      <para>Para crear gráficas de funciones de valores reales de una variable, abra la ventana <guilabel>Crear dibujo</guilabel>. También puede usar la función <link linkend="gel-function-LinePlot"><function>LinePlot</function></link> en la línea de comandos (consulte su documentación).</para>
      <para>Una vez que pulse el botón <guilabel>Dibujo</guilabel>, se abre una ventana con algunas pestañas en ella. Se encontrará con la pestaña <guilabel>Dibujo de la línea de función</guilabel> y dentro de ella encontrará la pestaña <guilabel>Funciones / Expresiones</guilabel>. Consulte la <xref linkend="lineplot-fig"/>.</para>

      <figure id="lineplot-fig"> 
        <title>Crear una ventana de dibujo</title> 
        <screenshot> 
          <mediaobject> 
            <imageobject>
              <imagedata fileref="figures/line_plot.png" format="PNG" scale="50" scalefit="1"/> 
            </imageobject>
            <imageobject>
              <imagedata fileref="figures/line_plot.eps" format="EPS" scale="50" scalefit="1"/> 
            </imageobject>
            <textobject> 
              <phrase>Muestra la ventana de trazado de líneas</phrase> 
            </textobject> 
          </mediaobject> 
        </screenshot> 
      </figure>

      <para>En los cuadros de texto escriba sólo las expresiones donde <userinput>x</userinput> es la variable independiente. También puede dar simplemente nombres de funciones como <userinput>cos</userinput> en lugar de tener que escribir <userinput>cos(x)</userinput>. Puede crear gráficas de hasta 10 funciones. Si comete un error y Genius no puede analizar la entrada, se señalará con un ícono de advertencia a la derecha del cuadro de texto donde ocurrió el error, así como se mostrará un diálogo de error. Puede cambiar los rangos de las variables dependientes e independientes en la parte inferior de la ventana de diálogo. Pulsando el botón <guilabel>Dibujar</guilabel> se producirá el gráfico mostrado en la <xref linkend="lineplot2-fig"/>.</para>

      <figure id="lineplot2-fig"> 
        <title>Ventana de dibujo</title> 
        <screenshot> 
          <mediaobject> 
            <imageobject>
              <imagedata fileref="figures/line_plot_graph.png" format="PNG" scale="50" scalefit="1"/> 
            </imageobject>
            <imageobject>
              <imagedata fileref="figures/line_plot_graph.eps" format="EPS" scale="50" scalefit="1"/> 
            </imageobject>
            <textobject> 
              <phrase>El gráfico producido.</phrase> 
            </textobject> 
          </mediaobject> 
        </screenshot> 
      </figure>

      <para>Desde aquí puede imprimir el dibujo, crear un PostScript encapsulado o un PNG del dibujo, o cambiar la escala. Si el eje dependiente no se ha establecido correctamente, puede hacer que Genius lo ajuste buscando los extremos de las funciones representadas.</para>

      <para>Para dibujar usando la línea de comandos, consulte la documentación de la función <link linkend="gel-function-LinePlot"><function>LinePlot</function></link>.</para>
    </sect1>

    <sect1 id="genius-parametric-plots">
      <title>Gráficos paramétricos</title>
      <para>En la ventana de crear dibujo, también puede elegir la pestaña <guilabel>Paramétrico</guilabel> para crear dibujos paramétricos bidimensionales. De este modo, puede dibujar una única función paramétrica. Puede especificar los puntos como X e Y, o dar un número complejo único. Consulte la <xref linkend="paramplot-fig"/>.</para>

      <figure id="paramplot-fig"> 
        <title>Pestaña dibujo paramétrico</title> 
        <screenshot> 
          <mediaobject> 
            <imageobject>
              <imagedata fileref="figures/parametric.png" format="PNG" scale="50" scalefit="1"/> 
            </imageobject>
            <imageobject>
              <imagedata fileref="figures/parametric.eps" format="EPS" scale="50" scalefit="1"/> 
            </imageobject>
            <textobject> 
              <phrase>Pestaña dibujo paramétrico en la ventana <guilabel>Crear dibujo</guilabel>.</phrase> 
            </textobject> 
          </mediaobject> 
        </screenshot> 
      </figure>

      <para>Puede ver un ejemplo de un dibujo paramétrico en la <xref linkend="paramplot-fig"/>. Puede realizar operaciones similares en este gráfico, así como en el otro dibujo de líneas. Para dibujar usando la línea de comandos, consulte la documentación de las funciones <link linkend="gel-function-LinePlotParametric"><function>LinePlotParametric</function></link> o <link linkend="gel-function-LinePlotCParametric"><function>LinePlotCParametric</function></link>.</para>

      <figure id="paramplot2-fig"> 
        <title>Gráfico paramétrico</title> 
        <screenshot> 
          <mediaobject> 
            <imageobject>
              <imagedata fileref="figures/parametric_graph.png" format="PNG" scale="50" scalefit="1"/> 
            </imageobject>
            <imageobject>
              <imagedata fileref="figures/parametric_graph.eps" format="EPS" scale="50" scalefit="1"/> 
            </imageobject>
            <textobject> 
              <phrase>Gráfico paramétrico producido</phrase> 
            </textobject> 
          </mediaobject> 
        </screenshot> 
      </figure>

    </sect1>

    <sect1 id="genius-slopefield-plots">
      <title>Dibujos de campos de inclinación</title>
      <para>En la ventana de crear dibujo, también puede elegir la pestaña <guilabel>Campo de inclinación</guilabel> para crear dibujos de campos de inclinación bidimensionales. Para dibujar usando la línea de comandos, conuslte la documentación de la función <link linkend="gel-function-SlopefieldPlot"><function>SlopefieldPlot</function></link>.</para>

      <para>Cuando un campo de inclinación está activo, hay un menú adicional disponible <guilabel>Solucionador</guilabel>, a través del cual puede abrir el cuadro de diálogo del mismo nombre. Aquí puede tener soluciones específicas de dibujo de Genius. Puede especificar condiciones iniciales en el diálogo, o puede pulsar directamente en el dibujo para indicar el punto inicial. Mientras el diálogo del solucionador esté activo, la ampliación al pulsar y arrastrar no funcionará. Si quiere ampliar usando el cursor tendrá que cerrar el diálogo primero.</para>

      <para>El solucionador usa el método Runge-Kutta estándar. Los gráficos se quedarán en la pantalla hasta que los borre. El solucionador se detendrá cuando alcance el límite de la ventana de dibujo. La ampliación no cambia los límites o los parámetros de la solución, tendrá que borrar y redibujar con los parámetros apropiados. También puede usar la función <link linkend="gel-function-SlopefieldDrawSolution"><function>SlopefieldDrawSolution</function></link> para dibujar soluciones desde la línea de comandos o programas.</para>

    </sect1>

    <sect1 id="genius-vectorfield-plots">
      <title>Gráficos de campos de vectores</title>
      <para>En la ventana de crear dibujo, también puede elegir la pestaña <guilabel>Campo vectorial</guilabel> para crear un dibujo de campos vectoriales bidimensionales. Con este tipo de gráficos se pueden realizar operaciones similares a las que se hacen con otros gráficos de líneas. Para dibujar usando la línea de comandos, consulte la documentación de la función <link linkend="gel-function-VectorfieldPlot"><function>VectorfieldPlot</function></link>.</para>

      <para>De manera predeterminada se muestra la dirección y la magnitud del campo vectorial. Para mostrar únicamente la dirección y no la magnitud, normalice la longitud de las flechas habilitando la opción pertinente.</para>

      <para>Cuando un campo vectorial está activo, hay un menú <guilabel>Resolutor</guilabel> adicional disponible a través del cuál puede abrir el diálogo del Resolutor. Aquí encontrará soluciones gráficas específicas de Genius para las condiciones iniciales dadas. Puede especificar condiciones iniciales en el diálogo o pulsar en el dibujo directamente para especificar el punto inicial. Mientras el diálogo del resolutor esté activa, la opción de aumentar el gráfico pulsando y arrastrando no funcionará. Debe cerrar el diálogo primero si quiere aumentar el gráfico con el ratón.</para>

      <para>El resolutor usa el método estándar de Runge-Kutta. Los gráficos resultantes permanecerán en la pantalla hasta que se limpie. Aumentar el gráfico no cambia los límites o parámetros de las soluciones, tendrá que limpiar y redibujarlos con los parametros adecuados. También puede usar la función <link linkend="gel-function-VectorfieldDrawSolution"><function>VectorfieldDrawSolution</function></link> para dibujar soluciones desde la línea de comandos o desde programas.</para>

    </sect1>

    <sect1 id="genius-surface-plots">
      <title>Gráficos de superficie</title>
      <para>Genius también puede dibujar superficies. Seleccione la pestaña <guilabel>Dibujar superficie</guilabel> en la sección principal de la ventana <guilabel>Crear gráfico</guilabel>. Aquí puede especificar una expresión que use o bien <varname>x</varname> e <varname>y</varname> como variables reales independientes o bien <varname>z</varname> como variable compleja (donde <varname>x</varname> sea la parte real de <varname>z</varname> e <varname>y</varname> la parte imaginaria). Por ejemplo, para dibujar el módulo de la función coseno de variable compleja puede escribir <userinput>|cos(z)|</userinput>. Esto sería equivalente a <userinput>|cos(x+1i*y)|</userinput>. Consulte la <xref linkend="surfaceplot-fig"/>. Para dibujar desde la línea de comandos véase la documentación de la función <link linkend="gel-function-SurfacePlot"><function>SurfacePlot</function></link>.</para>

      <figure id="surfaceplot-fig"> 
        <title>Gráfico de superficie</title> 
        <screenshot> 
          <mediaobject> 
            <imageobject>
              <imagedata fileref="figures/surface_graph.png" format="PNG" scale="50" scalefit="1"/> 
            </imageobject>
            <imageobject>
              <imagedata fileref="figures/surface_graph.eps" format="EPS" scale="50" scalefit="1"/> 
            </imageobject>
            <textobject> 
              <phrase>Valor absoluto de la función coseno complejo.</phrase> 
            </textobject> 
          </mediaobject> 
        </screenshot> 
      </figure>

    </sect1>

  </chapter>

  <!-- ============= GEL ====================================== -->
  <chapter id="genius-gel"> 
    <title>Conceptos de GEL</title> 

	<para>GEL significa Lenguaje de Extensión de Genius. Éste es el lenguaje que se utiliza para escribir programas para Genius. Un programa en GEL es simplemente una expresión que se evalúa como un número. Por lo tanto, la <application>Herramienta matemática Genius</application> se puede utilizar como una simple calculadora o como una herramienta de investigación teórica muy potente. La sintaxis está pensada para suavizar lo más posible la curva de aprendizaje, especialmente para usarlo como calculadora.</para>

    <sect1 id="genius-gel-values">
      <title>Valores</title>

      <para>Los valores en GEL pueden ser <link linkend="genius-gel-values-numbers">números</link>, <link linkend="genius-gel-values-booleans">booleanos</link> o <link linkend="genius-gel-values-strings">cadenas</link>. Los valores se pueden usar en cálculos, asignarse a variables y devolverse desde funciones, entre otros usos.</para>

      <sect2 id="genius-gel-values-numbers">
        <title>Números</title>
        <para>Los enteros son el primer tipo numérico en GEL. Los enteros se escriben de forma estándar. <programlisting>1234
</programlisting> Las formas hexadecimales y octales se pueden indicar mediante la notación de C. Por ejemplo: <programlisting>0x123ABC
01234
</programlisting> O bien puede indicar los enteros en una base arbitraria usando <literal>&lt;base&gt;\&lt;número&gt;</literal>. Los dígitos mayores que 9 usan letras de manera similar a la forma hexadecimal. Por ejemplo, un número en base 23 podría escribirse: <programlisting>23\1234ABCD
</programlisting></para>

        <para>El segundo tipo numérico de GEL son los racionales. Los números racionales se obtienen dividiendo dos enteros. De modo que se puede escribir: <programlisting>3/4
</programlisting> para obtener tres cuartos. Los racionales aceptan notación fraccionaria mixta. De modo que para obtener uno y tres décimos se podría indicar: <programlisting>1 3/10
</programlisting></para>

        <para>El siguiente tipo numérico es el de coma flotante. Estos se especifican de un modo muy similar a la notación en C. Puedes usar <literal>E</literal>, <literal>e</literal> o <literal>@</literal> como el delimitador de exponente. Tenga en cuenta que usando el delimitador de exponente da un coma flotante incluso si no está la coma decimal en el número. Ejemplos: <programlisting>1.315
7.887e77
7.887e-77
.3
0.3
77e5
</programlisting> Cuando Genius imprime un número en coma flotante siempre añade un <computeroutput>,0</computeroutput> incluso si el número está completo. Esto indica que los números en coma flotante se toman como cantidades imprecisas. Cuando un numero se escribe en notación científica, siempre será en coma flotante y, por tanto, Genius no imprime <computeroutput>,0</computeroutput>.</para>

        <para>El último tipo de números en GEL son los números complejos. Puede escribir un número complejo como la suma de su parte real y su parte imaginaria. La parte imaginaria termina con una <literal>i</literal>. Aquí hay algunos ejemplo de cómo escribir números complejos: <programlisting>1+2i
8.01i
77*e^(1.3i)
</programlisting></para>

        <important>
          <para>Al introducir números imaginarios, deba haber un número delante de la <literal>i</literal>. Si usa <literal>i</literal> por sí sola, Genius lo interpretará como una referencia a la variable <varname>i</varname>. Si necesita referirse a <literal>i</literal> por sí sola, use <literal>1i</literal> en su lugar.</para>

          <para>Para usar notación de fracciones mixtas con números imaginarios debe colocar las fracciones mixtas entre paréntesis (ej. <userinput>(1 2/5)i</userinput>).</para>
        </important>

      </sect2>


      <sect2 id="genius-gel-values-booleans">
        <title>Booleanos</title>
        <para>Genius también soporta valores booleanos nativos. Las dos constantes booleanas están definidas como <constant>true</constant> y <constant>false</constant>; estos identificadores se pueden utilizar como cualquier otra variable. Así mismo, puede utilizar los identificadores <constant>True</constant>, <constant>TRUE</constant>, <constant>False</constant> y <constant>FALSE</constant> como alias de las anteriores.</para>
        <para>Puede usar un valor booleano o cualquier expresión que produzca un número o valor booleano en cualquier lugar donde se espera una expresión Booleana. Si Genius necesita evaluar un valor numérico como un valor booleano interpretará «0» como <constant>false</constant> y cualquier otro valor como <constant>true</constant>.</para>
        <para>Además, puede efectuar operaciones con valores booleanos. Por ejemplo: <programlisting>( (1 + true) - false ) * true
</programlisting> equivale a: <programlisting>( (true or true) or not false ) and true
</programlisting> Solamente están soportadas la adición, la sustracción y la multiplicación. Si mezcla valores numéricos con booleanos en una expresión, los valores numéricos se convertirán a booleanos como se describió anteriormente. Esto significa que, por ejemplo: <programlisting>1 == true
</programlisting> siempre se evaluará como <constant>true</constant> dado que «1» siempre se convertirá a <constant>true</constant> antes de compararlo con <constant>true</constant>.</para>
      </sect2>


      <sect2 id="genius-gel-values-strings">
        <title>Cadenas</title>
        <para>Al igual que los números y los booleanos, las cadenas en GEL se pueden almacenar como valores dentro de variables y pasárselas a funciones. Puede concatenar una cadena con otra cadena mediante el operador <literal>+</literal>. Por ejemplo: <programlisting>a=2+3;«El resultado es: »+a
</programlisting> creará la cadena: <programlisting>El resultado es: 5
</programlisting> Puede usar secuencias de escape como en C tales como <literal>\n</literal>, <literal>\t</literal>, <literal>\b</literal>, <literal>\a</literal> y <literal>\r</literal>. Para insertar los caracteres <literal>\</literal> o <literal>"</literal> en una cadena puede escaparlo precediendolo de <literal>\</literal>. Por ejemplo: <programlisting>"Barra: \\ Comillas: \" Tabulaciones: \t1\t2\t3"
</programlisting> dará lugar a la cadena: <programlisting>Barra: \ Comillas: " Tabulaciones: 	1	2	3
</programlisting></para>
        <para>Además, puede usar la función <function>string</function> de la biblioteca para convertir cualquier cosa en una cadena. Por ejemplo: <programlisting>string(22)
</programlisting> devolverá <programlisting>"22"
</programlisting>. Las cadenas pueden compararse mediante los operadores <literal>==</literal> (igual), <literal>!=</literal> (distinto) y <literal>&lt;=&gt;</literal> (comparación).</para>
      </sect2>


      <sect2 id="genius-gel-values-null">
        <title>Nulo</title>
        <para>Existe un valor especial llamado <constant>null</constant>. No se permite efectuar operaciones sobre él y no se muestra nada cuando se devuelve este valor. Por lo tanto, <constant>null</constant> es útil cuando no quiera ninguna salida de una expresión. El valor <constant>null</constant> puede obtenerse como una expresión al escribir <literal>.</literal>, la constante <constant>null</constant> o nada. Nada referido a que si termina una expresión con un separador <literal>;</literal>, equivale a terminar la expresión con un separador seguido de <constant>null</constant>.</para>
        <para>Ejemplo: <programlisting>x=5;.
x=5;
</programlisting></para>
<para>Algunas funciones devuelven <constant>null</constant> cuando no pueden devolver un valor o producen algún error. También se usa <constant>null</constant> como un vector o matriz vacía o una referencia vacía.</para>
      </sect2>

    </sect1>

    <sect1 id="genius-gel-variables">
      <title>Usar variables</title>

      <para>Sintaxis: <programlisting>NombreVariable
</programlisting> Ejemplo: <screen><prompt>genius&gt; </prompt><userinput>e</userinput>
= 2.71828182846
</screen></para>

      <para>Para evaluar una variable por sí misma, simplemente introduzca el nombre de la variable. Esto devolverá el valor de la variable. Puede usar una variable en cualquier lugar donde pueda utilizar un número o cadena. Además, las variables son necesarias al definir funciones que toman argumentos (consulte la <xref linkend="genius-gel-functions-defining"/>).</para>

      <tip>
        <title>Usar completado con el tabulador</title>
        <para>Puede usar el completado con el tabulador para que Genius complete nombres de las variables. Intente escribir las primeras letras del nombre de la variable y pulse <userinput>Tab</userinput>.</para>
      </tip>

      <important>
        <title>Los nombres de variables son sensibles a la capitalización</title>
        <para>Los nombres de variables son sensibles a la capitalización. Esto significa que las variables <varname>hello</varname>, <varname>HELLO</varname> y <varname>Hello</varname> son todas diferentes.</para>
      </important>


      <sect2 id="genius-gel-variables-setting">
        <title>Configurar variables</title>
        <para>Sintaxis: <programlisting><![CDATA[<identifier> = <value>
<identifier> := <value>]]>
</programlisting> Ejemplo: <programlisting>x = 3
x := 3
</programlisting></para>

        <para>Para asignar una variable, use los operadores <literal>=</literal> o <literal>:=</literal>. Estos operadores establecen el valor de la variable y devuelven el número asignado, así puede hacer cosas como <programlisting>a = b = 5
</programlisting></para>

        <para>Los operadores <literal>=</literal> y <literal>:=</literal> se pueden usar para asignar variables. La diferencia entre ellos es que <literal>:=</literal> siempre actuará como operador de asignación mientras que <literal>=</literal> se puede interpretar como prueba de igualdad usado en un contexto donde se espera una variable booleana.</para>

	<para>Para temas relacionados con el ámbito de las variables, consulte la <xref linkend="genius-gel-variables-global"/>.</para>
      </sect2>

      <sect2 id="genius-gel-variables-built-in">
        <title>Variables integradas</title>
        <para>GEL tiene un número de «variables» predeterminadas, tales como <varname>e</varname>, <varname>pi</varname> o <varname>GoldenRatio</varname>. Éstas se usan ampliamente con su valor predeterminado y no se pueden modificar. Existen más variables predeterminadas. Consulte la <xref linkend="genius-gel-function-list-constants"/> para obtener la lista completa.</para>
      </sect2>


      <sect2 id="genius-gel-previous-result">
        <title>Resultado de la variable anterior</title>
        <para>Las variables <varname>Ans</varname> y <varname>ans</varname> se pueden usar para obtener el resultado de la última expresión utilizada. Por ejemplo, si acaba de realizar un cálculo y quiere añadirle 389 al resultado, podría hacer lo siguiente: <programlisting>Ans+389
</programlisting></para>
      </sect2>
    </sect1>

    <sect1 id="genius-gel-functions">
      <title>Usar funciones</title>

      <para>Sintaxis: <programlisting>NombreFuncion(argumento1, argumento2, ...)
</programlisting> Ejemplo: <programlisting>Factorial(5)
cos(2*pi)
gcd(921,317)
</programlisting> Para evaluar una funcion introduzca el nombre de ésta seguido de los argumentos (si si los hay) entre paréntesis. Esto devolverá el resultado de aplicar la función a sus argumentos. El número de argumentos es, por supuesto, diferente para cada función.</para>

      <para>Hay muchas funciones integradas, como <function>sin</function>, <function>cos</function> y <function>tan</function>. Puede usar la función integrada <function>help</function> para obtener una lista de todas las funciones integradas, o ver la <xref linkend="genius-gel-function-list"/> para obtener una lista completa..</para>

      <tip>
        <title>Usar completado con el tabulador</title>
        <para>Puede usar completado con el tabulador para que Genius complete nombres de funciones. Pruebe a escribir las primeras letras del nombre y pulse <userinput>Tab</userinput>.</para>
      </tip>

      <important>
        <title>Los nombres de las funciones son sensibles a mayúsculas.</title>
        <para>Los nombres de las funciones son sensibles a la capitalización. Esto significa que las funciones <function>haceralgo</function>, <function>HACERALGO</function> y <function>HacerAlgo</function> son todas diferentes entre sí.</para>
      </important>


      <sect2 id="genius-gel-functions-defining">
        <title>Definir funciones</title>
        <para>Sintaxis: <programlisting><![CDATA[function <identifier>(<comma separated arguments>) = <function body>
<identifier> = (`() = <function body>)
]]></programlisting> El caracter <literal>`</literal> es el acento invertido y significa función anónima. Estableciéndoselo a una variable se define una función.</para>

        <para>Una función toma cero o más argumentos separados por comas y devuelve el resultado del cuerpo de dicha función. Definir funciones propias es primordialmente una cuestión de conveniencia; un posible uso es tener un conjunto de funciones definidas en archivos GEL que Genius pueda cargar para tenerlas disponibles. Ejemplo: <programlisting>function addup(a,b,c) = a+b+c
</programlisting> por lo que <userinput>addup(1,4,9)</userinput> devuelve 14.</para>
      </sect2>

      <sect2 id="genius-gel-functions-variable-argument-lists">
        <title>Listas de argumentos de variables</title>
        <para>Si se incluye <literal>...</literal> después del último argumento en la declaración de una función Genius permitirá pasar a dicha función un número de argumentos arbitrario. Si no se pasa ningún argumento el último tendrá el valor <constant>null</constant>. De lo contrario, será un vector que contiene todos los argumentos. Por ejemplo: <programlisting>function f(a,b...) = b
</programlisting> Por tanto <userinput>f(1,2,3)</userinput> devuelve <computeroutput>[2,3]</computeroutput>, mientras que <userinput>f(1)</userinput> devuelve <constant>null</constant>.</para>
      </sect2>


      <sect2 id="genius-gel-functions-passing-functions">
        <title>Pasar funciones a funciones</title>

        <para>En Genius es posible pasar una función como argumento de otra función. Esto se puede hacer usando «nodos de funciones» o funciones anónimas.</para>

        <para>Si no se escriben los paréntesis después del nombre de la función, en lugar de evaluarse, la función se devolverá como un «nodo función». El nodo función se puede pasar a como argumento a otra función. Ejemplo: <programlisting>function f(a,b) = a(b)+1;
function b(x) = x*x;
f(b,2)
</programlisting></para>
        <para>Para pasar funciones que no están definidas se puede hacer uso de la función anónima (consulte la <xref linkend="genius-gel-functions-defining"/>). Es decir, cuando se quiere pasar una función sin dar un nombre. Sintaxis: <programlisting><![CDATA[function(<comma separated arguments>) = <function body>
`(<comma separated arguments>) = <function body>
]]></programlisting> Ejemplo: <programlisting>function f(a,b) = a(b)+1;
f(`(x) = x*x,2)
</programlisting> Devuelve 5.</para>
      </sect2>


    <sect2 id="genius-gel-functions-operations">
      <title>Operaciones con funciones</title>
      <para>Algunas funciones permiten operaciones aritméticas y algunos argumentos de función tales como <function>exp</function> o <function>ln</function>, para operar en la función. Por ejemplo, <programlisting>exp(sin*cos+4)
</programlisting> devolverá una función que toma  <varname>x</varname> y devuelve <userinput>exp(sin(x)*cos(x)+4)</userinput>. Esta funcionalidad es equivalente a escribir <programlisting>`(x) = exp(sin(x)*cos(x)+4)
</programlisting> Esta operación puede ser útil cuando se definen funciones rápidamente. Por ejemplo, para crear una función llamada <varname>f</varname> que realice la operación arriba descrita, simplemente puede escribir: <programlisting>f = exp(sin*cos+4)
</programlisting> También se puede usar al dibujar. Por ejemplo, para dibujar el cuadrado de un seno puede utilizar: <programlisting>LinePlot(sin^2)
</programlisting></para>

      <warning>
        <para>No todas las funciones se pueden usar de este modo. Por ejemplo, cuando usa una función binaria las funciones deben aceptar el mismo número de argumentos.</para>
      </warning>
    </sect2>


    </sect1>

    <sect1 id="genius-gel-absolute-value-modulus">
      <title>Valor absoluto / módulo</title>
      <para>Puede calcular el valor absoluto de algo encerrándolo entre <literal>|</literal>. Por ejemplo: <programlisting>|a-b|</programlisting></para>
<para>En el caso de que la expresión sea un número complejo el resultado será su módulo (distancia desde el origen). Por ejemplo: <userinput>|3 * e^(1i*pi)|</userinput> devuelve 3.</para>
    </sect1>

    <sect1 id="genius-gel-separator">
      <title>Separador</title>
      <para>En GEL, si quiere escribir más de un comando debe usar el operador <literal>;</literal>, para separar expresiones. Una combinación de expresiones devolverá el resultado de la última expresión. Suponga que escribe lo siguiente: <programlisting>3 ; 5
</programlisting> Esta expresión devolverá 5.</para>
      <para>Esto requiere poner algunos paréntesis para evitar ambigüedades, especialmente si el carácter <literal>;</literal> no es la primitiva más prioritaria. Esto difiere ligeramente de otros lenguajes de programación donde el carácter <literal>;</literal> es un finalizador de sentencias. En GEL es un operador binario. Si está familiarizado con Pascal esto debería ser natural para usted. Sin embargo, Genius le permite simular que es un terminador si el carácter <literal>;</literal> se encuentra al detrás de un paréntesis o un bloque, Genius añadirá automáticamente un nodo nulo como si hubiese escrito <userinput>;null</userinput>. Esto es útil en caso de que no quiera devolver ningún valor o si gestiona el retorno de un modo diferente. Tenga en cuenta que es ralentiza ligeramente el código si se ejecuta demasiado frecuentemente ya que se toma como un operador más.</para>
    </sect1>

    <sect1 id="genius-gel-modular-evaluation">
      <title>Evaluación modular</title>
      <para>Genius implementa aritmética modular. Para usarla, simplemente añada «mod &lt;entero&gt;» después de la expresión. Ejemplo: <programlisting>2^(5!) * 3^(6!) mod 5</programlisting> Podría ser posible realizar aritmética modular trabajando con enteros y aplicando el módulo al final con el operador <literal>%</literal>, pero puede ser más costoso o imposible cuando se trabaja con valores muy elevados. Por ejemplo <userinput>10^(10^10) % 6</userinput> puede que no funcione (el exponente es demasiado grande), sin embargo <userinput>10^(10^10) mod 6</userinput> es instantáneo.</para>
      <para>Dados dos números enteros a y b, puede calcular el inverso multiplicativo de a módulo b usando números racionales (desde luego, el inverso debe existir). Ejemplos: <programlisting>10^-1 mod 101
1/10 mod 101</programlisting> Puede obtener la evaluación modular de una matriz, calcular potencias, la matriz inversa y dividir. Ejemplo: <programlisting>A = [1,2;3,4]
B = A^-1 mod 5
A*B mod 5</programlisting> Es la matriz identidad, pues B es la matriz inversa de A módulo 5.</para>
      <para>Algunas funciones como <link linkend="gel-function-sqrt"><function>sqrt</function></link> o <link linkend="gel-function-log"><function>log</function></link> trabajan de una manera diferente en modo módulo. Éstas utilizarán sus versiones discretas trabajando en el entorno de enteros que el usuario ha seleccionado. Por ejemplo: <programlisting>genius&gt; sqrt(4) mod 7
=
[2, 5]
genius&gt; 2*2 mod 7
= 4</programlisting><function>sqrt</function> devolverá todas las raíces cuadradas posibles.</para>
    </sect1>

    <sect1 id="genius-gel-operator-list">
      <title>Lista de operadores GEL</title>

      <para>Todo en GEL es en realidad una expresión. Las expresiones se encadenan unas tras otras mediante diferentes operadores. Como hemos visto, incluso el separador es un operador binario en GEL. A continuación se muestra una lista de los operadores en GEL.</para>

      <variablelist>
        <varlistentry>
         <term><synopsis>a;b</synopsis></term>
         <listitem>
           <para>El separador evalúa <varname>a</varname> y <varname>b</varname>, pero sólo devuelve el valor de <varname>b</varname>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a=b</synopsis></term>
         <listitem>
           <para>El operador asignación. Asigna <varname>b</varname> a <varname>a</varname> (<varname>a</varname> debe ser un <link linkend="genius-gel-lvalues">lvalue</link> válido) (tenga en cuenta que este operador puede equivaler a <literal>==</literal> si se usa cuando se espera una expresión booleana)</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a:=b</synopsis></term>
         <listitem>
           <para>El operador asignación. Asigna <varname>b</varname> a <varname>a</varname> (<varname>a</varname> debe ser un <link linkend="genius-gel-lvalues">lvalue</link> válido). Se diferencia de <literal>=</literal> en que nunca equivale a <literal>==</literal>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>|a|</synopsis></term>
         <listitem>
           <para>Valor absoluto o módulo (si <varname>a</varname> es un número complejo).</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/AbsoluteValue.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a^b</synopsis></term>
         <listitem>
           <para>Exponenciación, eleva <varname>a</varname> a la <varname>b</varname>-ésima potencia.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a.^b</synopsis></term>
         <listitem>
           <para>Potencia elemento a elemento. Eleva cada elemento de una matriz <varname>a</varname> a la <varname>b</varname>-ésima potencia. O si <varname>b</varname> es una matriz del mismo tamaño que <varname>a</varname>, entonces realiza la operación elemento a elemento. Si <varname>a</varname> es un número y <varname>b</varname> es una matriz entonces crea una matriz del mismo tamaño que <varname>b</varname> formada por <varname>a</varname> elevado a todas las diferentes potencias de <varname>b</varname>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a+b</synopsis></term>
         <listitem>
           <para>Adición. Suma dos números, matrices, funciones o cadenas. Si suma una cadena a cualquier valor el resultado es una cadena.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a-b</synopsis></term>
         <listitem>
           <para>Sustracción. Resta dos números, matrices o funciones.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a*b</synopsis></term>
         <listitem>
           <para>Multiplicación. Es la multiplicación normal de matrices.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a.*b</synopsis></term>
         <listitem>
           <para>Multiplicación elemento a elemento si <varname>a</varname> y <varname>b</varname> son matrices.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a/b</synopsis></term>
         <listitem>
           <para>División.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a./b</synopsis></term>
         <listitem>
           <para>División elemento por elemento.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a\b</synopsis></term>
         <listitem>
           <para>División hacia atrás. Es lo mismo que <userinput>b/a</userinput>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a.\b</synopsis></term>
         <listitem>
           <para>División hacia atrás elemento por elemento.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a%b</synopsis></term>
         <listitem>
           <para>El operador mod. No activa el <link linkend="genius-gel-modular-evaluation">modo modular</link> sino que simplemente devuelve el resto de <userinput>a/b</userinput>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a.%b</synopsis></term>
         <listitem>
           <para>Operador mod elemento por elemento. Devuelve el resto de <userinput>a./b</userinput> elemento por elemento.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a mod b</synopsis></term>
         <listitem>
           <para>Operación de evaluación modular. La expresión <varname>a</varname> se evalúa módulo <varname>b</varname>. Consulte la <xref linkend="genius-gel-modular-evaluation"/>. Algunas de las funciones y operadores se comportan de un modo distinto cuando trabajan en módulo entero.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a!</synopsis></term>
         <listitem>
           <para>Operador factorial. Esto es <userinput>1*...*(n-2)*(n-1)*n</userinput>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a!!</synopsis></term>
         <listitem>
           <para>Operador doble factorial. Esto es <userinput>1*...*(n-4)*(n-2)*n</userinput>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a==b</synopsis></term>
         <listitem>
           <para>Operador de igualdad (devuelve <constant>true</constant> o <constant>false</constant>).</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a!=b</synopsis></term>
         <listitem>
           <para>Operador de desigualdad, devuelve <constant>true</constant> si <varname>a</varname> no es igual a <varname>b</varname>; si lo es, devuelve <constant>false</constant>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a&lt;&gt;b</synopsis></term>
         <listitem>
           <para>Operador distinto alternativo devuelve <constant>true</constant> si <varname>a</varname> no es igual a <varname>b</varname> en caso contrario devuelve <constant>false</constant>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a&lt;=b</synopsis></term>
         <listitem>
           <para>Operador menor o igual, devuelve <constant>true</constant> si <varname>a</varname> es menor o igual que <varname>b</varname>, si no, devuelve <constant>false</constant>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a&gt;=b</synopsis></term>
         <listitem>
           <para>Operador mayor o igual, devuelve <constant>true</constant> si <varname>a</varname> es mayor o igual que <varname>b</varname>, si no, devuelve <constant>false</constant>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a&lt;=&gt;b</synopsis></term>
         <listitem>
           <para>Operador de comparación. Si <varname>a</varname> es igual a <varname>b</varname> devuelve 0, si <varname>a</varname> es menor que <varname>b</varname> devuelve -1 y si <varname>a</varname> es mayor que <varname>b</varname> devuelve 1.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a and b</synopsis></term>
         <listitem>
           <para>AND lógico.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a or b</synopsis></term>
         <listitem>
           <para>OR lógico.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a xor b</synopsis></term>
         <listitem>
           <para>XOR lógico.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>not a</synopsis></term>
         <listitem>
           <para>NOT lógico.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>-a</synopsis></term>
         <listitem>
           <para>Operador de negación.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>&amp;a</synopsis></term>
         <listitem>
           <para>Referencia a variable (para pasar la referencia a algo). Consulte la <xref linkend="genius-gel-references"/>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>*a</synopsis></term>
         <listitem>
           <para>Desreferencia a variable (para acceder a una variable referenciada). Consulte la <xref linkend="genius-gel-references"/>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a'</synopsis></term>
         <listitem>
           <para>Matriz conjugada traspuesta.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a.'</synopsis></term>
         <listitem>
           <para>Matriz traspuesta, no conjuga los elementos.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a@(b,c)</synopsis></term>
         <listitem>
           <para>Devuelve el elemento en la fila <varname>b</varname> y columna <varname>c</varname>. Si <varname>b</varname>, <varname>c</varname> son vectores, devuelve las correspondientes filas, columnas o submatrices.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a@(b,)</synopsis></term>
         <listitem>
           <para>Devuelve la fila de la matriz (o filas si <varname>b</varname> es un vector).</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a@(b,:)</synopsis></term>
         <listitem>
           <para>Igual que el anterior</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a@(,c)</synopsis></term>
         <listitem>
           <para>Devuelve la columna de la matriz (o columnas si <varname>c</varname> es un vector).</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a@(:,c)</synopsis></term>
         <listitem>
           <para>Igual que el anterior</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a@(b)</synopsis></term>
         <listitem>
           <para>Obtiene un elemento de una matriz tratándola como vector. Recorre la matriz por filas.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a:b</synopsis></term>
         <listitem>
           <para>Crea un vector con valores de <varname>a</varname> a <varname>b</varname> (o específica una región de filas o columnas para el operador <literal>@</literal>). Por ejemplo para obtener las filas 2 a 4 de la matriz <varname>A</varname> se podría hacer <programlisting>A@(2:4,)
	     </programlisting> ya que <userinput>2:4</userinput> devolverá el vector <userinput>[2,3,4]</userinput>.</para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>a:b:c</synopsis></term>
         <listitem>
           <para>Crea un vector con valores desde <varname>a</varname> a <varname>c</varname> usando <varname>b</varname> como paso. Por ejemplo: <programlisting>genius&gt; 1:2:9
=
`[1, 3, 5, 7, 9]
</programlisting></para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>(a)i</synopsis></term>
         <listitem>
           <para>Crea un número imaginario (multiplicando <varname>a</varname> por el imaginario). Tenga en cuenta que normalmente el número<varname>i</varname> se escribe <userinput>1i</userinput>. De modo que lo descrito arriba es equivalente a <programlisting>(a)*1i
	     </programlisting></para>
         </listitem>
        </varlistentry>


        <varlistentry>
         <term><synopsis>`a</synopsis></term>
         <listitem>
           <para>Escapa un identificador de modo que no sea evaluado. O escapa una matriz de modo que no sea expandida.</para>
         </listitem>
        </varlistentry>

        <varlistentry>
         <term><synopsis>a swapwith b</synopsis></term>
         <listitem>
           <para>Intercambia el valor de <varname>a</varname> con el valor de <varname>b</varname>. Actualmente no funciona con rangos de elementos matriciales. Devuelve <constant>null</constant>. Está disponible desde la versión 1.0.13.</para>
         </listitem>
        </varlistentry>

        <varlistentry>
         <term><synopsis>increment a</synopsis></term>
         <listitem>
           <para>Incrementa la variable <varname>a</varname> en 1. Si <varname>a</varname> es una matriz entonces incrementará cada uno de los elementos. Es equivalente a <userinput>a=a+1</userinput> pero más rápido. Devuelve <constant>null</constant>. Está disponible desde la versión 1.0.13.</para>
         </listitem>
        </varlistentry>

        <varlistentry>
         <term><synopsis>increment a by b</synopsis></term>
         <listitem>
           <para>Incrementa la variable <varname>a</varname> en <varname>b</varname>. Si <varname>a</varname> es una matriz, entonces incrementa cada elemento. Es equivalente a <userinput>a=a+b</userinput>, pero más rápido. Devuelve null <constant>null</constant>. Está disponible desde la versión 1.0.13.</para>
         </listitem>
        </varlistentry>


      </variablelist>

<note>
<para>El operador @() hace el operador «:» más útil. Con éste puede especificar regiones dentro de una matriz. De modo que a@(2:4,6) representa las filas 2, 3 y 4 de la columna 6. O @(,1:2) devuelve las dos primeras columnas de una matriz. Puede asignar al operador @() siempre que el valor sea una matriz cuyo tamaño coincida con el tamaño de la región asignada o cualquier otro tipo de valor.</para>
</note>

<note>
<para>Los operadores de comparación (excepto el operador &lt;=&gt; que se comporta de un modo normal), no son estrictamente operadores binarios, de hecho pueden agruparse agruparse de una forma matemática estándar, ej.: (1&lt;x&lt;=y&lt;5) es una expresión booleana válida y significa lo que debería, es decir, (1&lt;x and x≤y and y&lt;5)</para>
</note>

<note>
<para>El operador unario «menos» opera de un modo distinto dependiendo del lugar donde aparece. Si lo hace antes de un número su prioridad es muy alta. Si aparece delante de una expresión tendrá menos prioridad que los operadores potencia y factorial. De este modo, por ejemplo, <userinput>-1^k</userinput> es en realidad <userinput>(-1)^k</userinput>, sin embargo <userinput>-foo(1)^k</userinput> es realmente <userinput>-(foo(1)^k)</userinput>. Por lo tanto, tenga cuidado con el uso de este operador y si tiene alguna duda, use paréntesis.</para>
</note>
    </sect1>

  </chapter>

  <!-- ============= GEL Programming ========================== -->
  <chapter id="genius-gel-programming">
    <title>Programar con GEL</title>

    <sect1 id="genius-gel-conditionals">
      <title>Condicionales</title>
      <para>Sintaxis: <programlisting><![CDATA[if <expression1> then <expression2> [else <expression3>]
]]></programlisting> si se omite <literal>else</literal>, si la expresión <literal>expression1</literal> devuelve <constant>false</constant> o <literal>0</literal>, devolverá <literal>NULL</literal>.</para>
      <para>Ejemplos: <programlisting><![CDATA[if(a==5)then(a=a-1)
if b<a then b=a
if c>0 then c=c-1 else c=0
a = ( if b>0 then b else 1 )
]]></programlisting> tenga en cuenta que <literal>=</literal> se traducirá como <literal>==</literal> si se usa dentro de una expresión <literal>if</literal>, por lo que <programlisting>if a=5 then a=a-1
</programlisting> se interpretará como: <programlisting>if a==5 then a:=a-1
</programlisting></para>
    </sect1>

    <sect1 id="genius-gel-loops">
      <title>Bucles</title>

      <sect2 id="genius-gel-loops-while">
        <title>Bucles «while»</title>
        <para>Sintaxis: <programlisting><![CDATA[while <expression1> do <expression2>
until <expression1> do <expression2>
do <expression2> while <expression1>
do <expression2> until <expression1>]]></programlisting> son similares a otros lenguajes. Sin embargo, puesto que GEL es una única expresión que debe devolver algo, estas construcciones devolverán el resultado de la última iteración o <literal>NULL</literal> si no se realiza ninguna operación. En la expresión booleana, <literal>=</literal> se traduce a <literal>==</literal> sólo para la sentencia <literal>if</literal>.</para>
      </sect2>

      <sect2 id="genius-gel-loops-for">
        <title>Bucles «for»</title>
        <para>Sintaxis: <programlisting><![CDATA[for <identifier> = <from> to <to> do <body>
for <identifier> = <from> to <to> by <increment> do <body>]]></programlisting> bucle en el que el identificador es un conjunto de todos los valores desde <literal>&lt;from&gt;</literal> hasta <literal>&lt;to&gt;</literal>, opcionalmente se puede usar un incremento distinto de 1. Dichos bucles son más rápidos, cómodos y compactos que los bucles normales descritos previamente pero menos flexibles. El identificador se debe tratar como tal y no se puede eliminar su referencia. El valor del identificador corresponde al último valor de éste o a <literal>&lt;from&gt;</literal> si el cuerpo del bucle no se ha evaluado todavía. Se garantiza que la variable permanezca inicializada tras el bucle, de modo que puede usarla sin problemas. Además, <literal>&lt;from&gt;</literal>, <literal>&lt;to&gt;</literal> e <literal>&lt;increment&gt;</literal> no pueden ser valores complejos. Tampoco se garantiza que se alcance <literal>&lt;to&gt;</literal>, pero sí que nunca se rebasará. El ejemplo siguiente imprime todos los números pares desde 1 a 19: <programlisting>for i = 1 to 20 by 2 do print(i)
</programlisting></para>
      </sect2>

      <sect2 id="genius-gel-loops-foreach">
        <title>Bucles «foreach»</title>
        <para>Sintaxis: <programlisting><![CDATA[for <identifier> in <matrix> do <body>]]></programlisting> ejecuta el cuerpo del bucle para cada uno de los elementos de la matriz recorriendo ésta fila por fila y de izquierda a derecha. Para imprimir los números 1, 2, 3 y 4 en este orden se podría hacer lo siguiente: <programlisting>for n in [1,2:3,4] do print(n)
</programlisting> Si desea recorrer las filas y columnas de una matriz puede usar las funciones <function>RowsOf</function> y <function>ColumnsOf</function> que devuelven un vector de filas o columnas de la matriz. Por lo tanto, <programlisting>for n in RowsOf ([1,2:3,4]) do print(n)
</programlisting> imprimirá <literal>[1,2]</literal> y después <literal>[3,4]</literal>.</para>
      </sect2>

      <sect2 id="genius-gel-loops-break-continue">
        <title>Parar y continuar</title>
        <para>También puede utilizar los comandos <literal>break</literal> y <literal>continue</literal> en un bucle. El comando <literal>continue</literal> reinicia el bucle actual en la siguiente iteración, mientras que el comando <literal>break</literal> sale del bucle actual. <programlisting><![CDATA[while(<expression1>) do (
  if(<expression2>) break
  else if(<expression3>) continue;
  <expression4>
)
]]></programlisting></para>
      </sect2>
    </sect1>

    <sect1 id="genius-gel-sums-products">
      <title>Sumas y productos</title>
      <para>Sintaxis: <programlisting><![CDATA[sum <identifier> = <from> to <to> do <body>
sum <identifier> = <from> to <to> by <increment> do <body>
sum <identifier> in <matrix> do <body>
prod <identifier> = <from> to <to> do <body>
prod <identifier> = <from> to <to> by <increment> do <body>
prod <identifier> in <matrix> do <body>]]></programlisting> Si sustituye <literal>for</literal> por <literal>sum</literal> o <literal>prod</literal>, obtendrá una suma o un producto en lugar de un bucle <literal>for</literal>. En vez de el último valor del bucle, devolverá la suma o el producto de todos los valores obtenidos respectivamente.</para>
      <para>Si no se ejecuta ningún comando (por ejemplo <userinput>sum i=1 to 0 do ...</userinput>), <literal>sum</literal> devuelve el valor 0 y <literal>prod</literal> devuelve el valor 1, que es el convenio estándar.</para>
    </sect1>

    <sect1 id="genius-gel-comparison-operators">
      <title>Operadores de comparación</title>
      <para>Los siguientes operadores de comparación comunes están soportados en GEL, y tienen el significado obvio: <literal>==</literal>, <literal>&gt;=</literal>, <literal>&lt;=</literal>, <literal>!=</literal>, <literal>&lt;&gt;</literal>, <literal>&lt;</literal>, <literal>&gt;</literal>. Éstos devuelven los valores <constant>true</constant> o <constant>false</constant>. Los operadores <literal>!=</literal> y <literal>&lt;&gt;</literal> son lo mismo y significan «no es igual a». GEL también permite utilizar el operador <literal>&lt;=&gt;</literal>, que devuelve el valor -1 si el lado izquierdo es menor, 0 si ambos lados son iguales, y 1 si el lado izquierdo es mayor.</para>

      <para>Generalmente <literal>=</literal> se traduce como <literal>==</literal> si aparece en algún lugar dónde GEL espera una condición, como la condición «if». Por ejemplo <programlisting>if a=b then c
if a==b then c
</programlisting> son lo mismo en GEL. Sin embargo, debería utilizar <literal>==</literal> o <literal>:=</literal> cuando se quiere comparar o asignar, respectivamente, si quiere que su código sea fácil de leer. Además le ayuda a evitar errores.</para>

      <para>No todos los operadores de comparación (salvo el operador <literal>&lt;=&gt;</literal>, que se comporta de manera normal), son operadores binarios en el sentido estricto del concepto. De hecho, se pueden agrupar en el modo matemático usual. Por ejemplo, (<literal>1&lt;x&lt;=y&lt;5</literal>) es una expresión booleana legítima que significa lo que debería: (1&lt;x and x≤y and y&lt;5).</para>
      <para>Para construir expresiones lógicas utilice las palabras <literal>not</literal>, <literal>and</literal>, <literal>or</literal>, <literal>xor</literal>. Los operadores <literal>or</literal> y <literal>and</literal> son especiales pues evalúan sus argumentos de uno en uno, por lo que la técnica usual para implementar la evaluación condicional también funciona aquí. Por ejemplo, <literal>1 or a=1</literal> no ejecuta el comando <literal>a=1</literal>, pues el primer argumento es verdadero.</para>
    </sect1>

      <sect1 id="genius-gel-variables-global">
        <title>Variables globales y ámbito de variables</title>
	<para>GEL es un <ulink url="http://es.wikipedia.org/wiki/%C3%81mbito_(programaci%C3%B3n)">lenguaje con ámbitos dinámicos</ulink>. Esto se explicará más adelante. Esto significa que a las variables ordinarias y a las funciones se les asigna un ámbito de manera dinámica. La única excepción son las <link linkend="genius-gel-parameters">variables de parámetros</link>, que siempre son globales.</para>
	<para>Al igual que la mayoría de los lenguajes de programación, GEL tiene diferentes tipos de variables. Normalmente, cuando se define una variable en una función ésta es visible desde esa función y desde todas las funciones que se llamen (todos los contextos superiores). Por ejemplo, suponga que una función <function>f</function> define una variable <varname>a</varname> y luego llama a otra función <function>g</function>. Entonces, la función <function>g</function> puede hacer referencia a la variable <varname>a</varname>. Pero, una vez que la ejecución de <function>f</function> concluye, la variable <varname>a</varname> sale del ámbito. Por ejemplo, el siguiente código imprime el número 5. No se puede llamar a la función <function>g</function> desde el nivel más alto (fuera de <function>f</function>, dado que <varname>a</varname> no se habrá definido).</para>
        <para>Si define una variable dentro de una función, ésta anulará toda variable definida al llamar a funciones. Por ejemplo, si modifica el código anterior y escribe: <programlisting>function f() = (a:=5; g());
function g() = print(a);
a:=10;
f();
</programlisting> Este código aún imprime 5. Pero si llama a la función <function>g</function> fuera de <function>f</function>, entonces se imprimirá 10. Observe que al definir <varname>a</varname> como 5 dentro de <function>f</function> no cambia el valor de <varname>a</varname> al nivel superior (global), por lo que si verifica el valor de <varname>a</varname> es aún 10.</para>
	<para>Los argumentos de funciones son exactamente como variables definidas dentro de la función, salvo que éstas se inicializan con el valor que se introduce en la función. Además de esto, se les trata como a cualquier otra variable definida dentro de la función.</para>
	<para>Las funciones se tratan exactamente como variables. Por lo tanto, puede redefinir funciones. Normalmente, (en el nivel superior) no puede redefinir variables y funciones protegidas. Pero localmente si lo puede hacer. Considere la siguiente sesión: <screen><prompt>genius&gt; </prompt><userinput>function f(x) = sin(x)^2</userinput>
= (`(x)=(sin(x)^2))
<prompt>genius&gt; </prompt><userinput>function f(x) = sin(x)^2</userinput>
= (`(x)=(sin(x)^2))
<prompt>genius&gt; </prompt><userinput>function g(x) = ((function sin(x)=x^10);f(x))</userinput>
= (`(x)=((sin:=(`(x)=(x^10)));f(x)))
<prompt>genius&gt; </prompt><userinput>g(10)</userinput>
= 1e20
</screen></para>
	<para>Las funciones definidas en el nivel superior se consideran globales. Éstas son visibles desde cualquier parte. Como se dijo, la función <function>f</function> no cambiará el valor de <varname>a</varname> a 5. <programlisting>a=6;
function f() = (a:=5);
f();
</programlisting> Sin embargo, en algunas ocasiones es necesario fijar una variable global dentro de una función. Cuando este comportamiento es necesario, utilice la función <function>set</function>. Si introduce una cadena o un identificador entrecomillado a esta función, ésta fija la variable globalmente (al nivel superior). Por ejemplo, podría utilizar <programlisting>set(`a,3)
</programlisting> o <programlisting>set("a",3)
</programlisting> para fijar el valor 3 en la variable <varname>a</varname>.</para>
        <para>La función <function>set</function> siempre fija el nivel superior global. No existe alguna manera de definir una variable local en alguna función desde alguna subrutina. Si se necesita hacer esto, debe utilizar ...</para>
	<para>Para recapitular en un lenguaje más técnico: Genius opera con diferentes contextos numerados. El nivel más alto es el contexto 0 (cero). Siempre que se introduce una función , el contexto aumenta, y cuando la función devuelve su resultado el contexto disminuye. Siempre se puede ver una función o una variable desde los contextos mayores. Cuando una variable se define en un contexto menor, al fijar esta variable se crea una nueva variable local en el contexto actual y esta variable sera visible desde los contextos mayores.</para>
	<para>
	  There are also true local variables, which are not seen from
	  anywhere but the current context.  Also when returning functions
	  by value it may reference variables not visible from higher context
	  and this may be a problem.  See the sections
	  <link linkend="genius-gel-true-local-variables">True
	  Local Variables</link> and
	  <link linkend="genius-gel-returning-functions">Returning
	  Functions</link>.
	</para>
      </sect1>

      <sect1 id="genius-gel-parameters">
        <title>Variables de parámetros</title>
	<para>Como se dijo, existen variables especiales llamadas parámetros. Éstas existen en todos los ámbitos. Para declarar un parámetro llamado <varname>foo</varname> con valor inicial 1, escriba <programlisting><![CDATA[parameter foo = 1
]]></programlisting> A partir de ahí, <varname>foo</varname> es una variable estrictamente global. Si asigna un valor a <varname>foo</varname> dentro de cualquier función, modificará la variable en todos los contextos. Esto significa que las funciones no tienen una copia privada de los parámetros.</para>
        <para>Cuando define un parámetro utilizando la función <link linkend="gel-function-undefine"><function>undefine</function></link>, éste deja de ser un parámetro.</para>
        <para>Algunos parámetros están integrados de manera predeterminada y modifican el comportamiento de genius.</para>
      </sect1>

    <sect1 id="genius-gel-returning">
      <title>Retorno</title>
	<para>Normalmente, una función se compone de una o varias expresiones separadas con punto y coma, y se devuelve el valor de la última expresión. Esto resulta útil en funciones sencillas, pero algunas veces no querrá que una función devuelva el resultado del último cálculo. Podría, por ejemplo, preferir que ésta devolviera algún valor obtenido a la mitad de la función. En este caso, puede utilizar la palabra <literal>return</literal>. La función <literal>return</literal> toma un único valor, que es el valor que se devolverá.</para>
      <para>Ejemplo: <programlisting><![CDATA[function f(x) = (
  y=1;
  while true do (
    if x>50 then return y;
    y=y+1;
    x=x+1
  )
)
]]></programlisting></para>
    </sect1>


    <sect1 id="genius-gel-references">
      <title>Referencias</title>
      <para>
	It may be necessary for some functions to return more than one value.
	This may be accomplished by returning a vector of values, but many
	times it is convenient to use passing a reference to a variable.
	You pass a reference to a variable to a function, and the function
	will set the variable for you using a dereference.  You do not have
	to use references only for this purpose, but this is their main use.
      </para>
      <para>
	When using functions that return values through references
	in the argument list, just pass the variable name with an ampersand.
	For example the following code will compute an eigenvalue of a matrix
	<varname>A</varname> with initial eigenvector guess
	<varname>x</varname>, and store the computed eigenvector
	into the variable named <varname>v</varname>:
<programlisting><![CDATA[RayleighQuotientIteration (A,x,0.001,100,&v)
]]></programlisting>
      </para>
      <para>
The details of how references work and the syntax is similar to the C language.
The operator
<literal>&amp;</literal> references a variable
and <literal>*</literal> dereferences a variable. Both can only be applied to an identifier,
so <literal>**a</literal> is not a legal expression in GEL.
      </para>
      <para>
References are best explained by an example:
<programlisting><![CDATA[a=1;
b=&a;
*b=2;
]]></programlisting>
now <varname>a</varname> contains 2.  You can also reference functions:
<programlisting><![CDATA[function f(x) = x+1;
t=&f;
*t(3)
]]></programlisting>
gives us 4.
      </para>
    </sect1>

    <sect1 id="genius-gel-lvalues">
      <title>Lvalues</title>
      <para>
	An lvalue is the left hand side of an assignment. In other words, an
	lvalue is what you assign something to.  Valid lvalues are:
<variablelist>
  <varlistentry>
    <term><userinput>a</userinput></term>
    <listitem>
      <para>Identificador. Aquí se asignará la variable de nombre <varname>a</varname>.</para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><userinput>*a</userinput></term>
    <listitem>
      <para>
	Dereference of an identifier.  This will set whatever variable
	<varname>a</varname> points to.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><userinput>a@(&lt;region&gt;)</userinput></term>
    <listitem>
      <para>Región de una matriz. Aquí, la región normalmente se especifica como con el operador regular @(), y puede ser un sola entrada, o una región completa de una matriz.</para>
    </listitem>
  </varlistentry>
</variablelist>
      </para>
      <para>
Examples:
<programlisting>a:=4
*tmp := 89
a@(1,1) := 5
a@(4:8,3) := [1,2,3,4,5]'
</programlisting>
Note that both <literal>:=</literal> and <literal>=</literal> can be used
interchangably.  Except if the assignment appears in a condition.
It is thus always safer to just use
<literal>:=</literal> when you mean assignment, and <literal>==</literal>
when you mean comparison.
      </para>
    </sect1>

  </chapter>

  <chapter id="genius-gel-programming-advanced">
    <title>Programación avanzada con GEL</title>

    <sect1 id="genius-gel-error-handling">
      <title>Control de errores</title>
      <para>Si detecta un error en su función, puede salir de ella. Para errores normales, como argumentos del tipo equivocado, puede impedir que se calcule el resultado de la función al agregar la frase <literal>bailout</literal>. Si algo saliera de verdad mal y quisiera interrumpir definitivamente el cálculo en curso, puede utilizar la palabra <literal>exception</literal>.</para>
      <para>Por ejemplo, si quiere verificar argumentos en una función. Podría utilizar el siguiente código: <programlisting>function f(M) = (
  if not IsMatrix (M) then (
    error ("M no es una matriz");
    bailout
  );
  ...
)
</programlisting></para>
    </sect1>

    <sect1 id="genius-gel-toplevel-syntax">
      <title>Sintaxis de nivel superior</title>
      <para>
	The synatax is slightly different if you enter statements on
	the top level versus when they are inside parentheses or
	inside functions.  On the top level, enter acts the same as if
	you press return on the command line.  Therefore think of programs
	as just sequence of lines as if were entered on the command line.
	In particular, you do not need to enter the separator at the end of the
	line (unless it is of course part of several statements inside
	parentheses).
      </para>
      <para>El siguiente código, aunque funcione bien en la función, puede producir un error al introducirlo en el nivel más alto de un programa. <programlisting>if Algo() then
  HacerAlgo()
else
  HacerOtraCosa()
</programlisting></para>
      <para>
	The problem is that after <application>Genius Mathematics Tool</application> sees the end of line after the
	second line, it will decide that we have whole statement and
	it will execute it.  After the execution is done, <application>Genius Mathematics Tool</application> will
	go on to the next
	line, it will see <literal>else</literal>, and it will produce
	a parsing error.  To fix this, use parentheses.  <application>Genius Mathematics Tool</application> will not
	be satisfied until it has found that all parentheses are closed.
<programlisting>if Algo() then (
  HacerAlgo()
) else (
  HacerOtraCosa()
)
</programlisting>
      </para>
    </sect1>

     <sect1 id="genius-gel-returning-functions">
       <title>Devolver funciones</title>
	<para>
	  It is possible to return functions as value.  This way you can
	  build functions that construct special purpose functions according
	  to some parameters.  The tricky bit is what variables does the
	  function see.  The way this works in GEL is that when a function
	  returns another function, all identifiers referenced in the
	  function body that went out of scope
	  are prepended a private dictionary of the returned
	  function.  So the function will see all variables that were in
	  scope
	  when it was defined.  For example, we define a function that
	  returns a function that adds 5 to its argument.
<programlisting>function f() = (
  k = 5;
  `(x) = (x+k)
)
</programlisting>
	  Notice that the function adds <varname>k</varname> to
	  <varname>x</varname>.  You could use this as follows.
<programlisting>g = f();
g(5)
</programlisting>
	  And <userinput>g(5)</userinput> should return 10.
        </para>
	<para>
	  One thing to note is that the value of <varname>k</varname>
	  that is used is the one that's in effect when the
	  <function>f</function> returns.  For example:
<programlisting>function f() = (
  k := 5;
  function r(x) = (x+k);
  k := 10;
  r
)
</programlisting>
	  will return a function that adds 10 to its argument rather than
	  5.  This is because the extra dictionary is created only when
	  the context
	  in which the function was defined ends, which is when the function
	  <function>f</function> returns.  This is consistent with how you
	  would expect the function <function>r</function> to work inside
	  the function <function>f</function> according to the rules of
	  scope of variables in GEL.  Only those variables are added to the
	  extra dictionary that are in the context that just ended and
	  no longer exists.  Variables
	  used in the function that are in still valid contexts will work
	  as usual, using the current value of the variable.
	  The only difference is with global variables and functions.
	  All identifiers that referenced global variables at time of
	  the function definition are not added to the private dictionary.
	  This is to avoid much unnecessary work when returning functions
	  and would rarely be a problem.  For example, suppose that you
	  delete the "k=5" from the function <function>f</function>,
	  and at the top level you define <varname>k</varname> to be
	  say 5.  Then when you run <function>f</function>, the function
	  <function>r</function> will not put <varname>k</varname> into
	  the private dictionary because it was global (toplevel)
	  at the time of definition of <function>r</function>.
	</para>
	<para>
	  Sometimes it is better to have more control over how variables
	  are copied into the private dictionary.  Since version 1.0.7,
	  you can specify which
	  variables are copied into the private dictionary by putting
	  extra square brackets after the arguments with the list of
	  variables to be copied separated by commas.
	  If you do this, then variables are
	  copied into the private dictionary at time of the function
	  definition, and the private dictionary is not touched afterwards.
	  For example
<programlisting>function f() = (
  k := 5;
  function r(x) [k] = (x+k);
  k := 10;
  r
)
</programlisting>
	  will return a function that when called will add 5 to its
	  argument.  The local copy of <varname>k</varname> was created
	  when the function was defined.
	</para>
	<para>
	  When you want the function to not have any private dictionary
	  when put empty square brackets after the argument list.  Then
	  no private dictionary will be created at all.  Doing this is
	  good to increase efficiency when a private dictionary is not
	  needed or when you want the function to lookup all variables
	  as it sees them when called.  For example suppose you want
	  the function returned from <function>f</function> to see
	  the value of <varname>k</varname> from the toplevel despite
	  there being a local variable of the same name during definition.
	  So the code
<programlisting>function f() = (
  k := 5;
  function r(x) [] = (x+k);
  r
);
k := 10;
g = f();
g(10)
</programlisting>
	  will return 20 and not 15, which would happen if
	  <varname>k</varname> with a value of 5 was added to the private
	  dictionary.
	</para>
    </sect1>

    <sect1 id="genius-gel-true-local-variables">
      <title>Variables locales verdaderas</title>
      <para>
	When passing functions into other functions, the normal scoping of
	variables might be undesired.  For example:
<programlisting>k := 10;
function r(x) = (x+k);
function f(g,x) = (
  k := 5;
  g(x)
);
f(r,1)
</programlisting>
	you probably want the function <function>r</function>
	when passed as <function>g</function> into <function>f</function>
	to see <varname>k</varname> as 10 rather than 5, so that
	the code returns 11 and not 6.  However, as written, the function
	when executed will see the <varname>k</varname> that is
	equal to 5.  There are two ways to solve this.  One would be
	to have <function>r</function> get <varname>k</varname> in a
	private dictionary using the square bracket notation section
	<link linkend="genius-gel-returning-functions">Returning
	Functions</link>.
      </para>
      <para>
	But there is another solution.  Since version 1.0.7 there are
	true local variables.  These are variables that are visible only
	from the current context and not from any called functions.
	We could define <varname>k</varname> as a local variable in the
	function <function>f</function>.  To do this add a
	<command>local</command> statement as the first statement in the
	function (it must always be the first statement in the function).
	You can also make any arguments be local variables as well.
	That is,
<programlisting>function f(g,x) = (
  local g,x,k;
  k := 5;
  g(x)
);
</programlisting>
	Then the code will work as expected and prints out 11.
	Note that the <command>local</command> statement initializes
	all the refereced variables (except for function arguments) to
	a <constant>null</constant>.
      </para>
      <para>Si todas las variables se crean localmente, puede pasar un asterisco en lugar de una lista de variables. En este caso las variables no se inicializarán hasta que se fijen, desde luego. Entonces, la siguiente definición de <function>f</function> también funcionará:</para>
      <para>Es bueno que todas las funciones que toman otras funciones como argumentos utilicen variables locales. De esta manera las funciones que pasan no ven los detalles de la implementación y luego no se confunden.</para>
    </sect1>

    <sect1 id="genius-gel-startup-procedure">
      <title>Procedimiento de inicio de GEL</title>
      <para>Primero, el programa busca el archivo de la biblioteca instalada (la versión compilada <filename>lib.cgel</filename>) en la carpeta instalada; luego, busca en la carpeta actual y finalmente trata de cargar algún archivo no compilado llamado <filename>~/.geniusinit</filename>.</para>
      <para>Si alguna vez cambia el lugar donde está instalada la biblioteca, primero deberá compilarla con el comando <command>genius --compile loader.gel &gt; lib.cgel</command></para>
    </sect1>

    <sect1 id="genius-gel-loading-programs">
      <title>Cargar programas</title>
      <para>
Sometimes you have a larger program that you wrote into a file and want to read in that file. In these situations, you have two options. You can keep the functions you use most inside the <filename>~/.geniusinit</filename> file. Or if you want to load up a file in a middle of a session (or from within another file), you can type <command>load &lt;list of filenames&gt;</command> at the prompt. This has to be done on the top level and not inside any function or whatnot, and it cannot be part of any expression. It also has a slightly different syntax than the rest of genius, more similiar to a shell. You can enter the file in quotes. If you use the '' quotes, you will get exactly the string that you typed, if you use the "" quotes, special characters will be unescaped as they are for strings. Example:
<programlisting>load programa1.gel programa2.gel
load "Nombre raro de archivo con ESPACIOS.gel"
</programlisting>
There are also <command>cd</command>, <command>pwd</command> and <command>ls</command> commands built in. <command>cd</command> will take one argument, <command>ls</command> will take an argument that is like the glob in the unix shell (i.e., you can use wildcards). <command>pwd</command> takes no arguments. For example:
<programlisting>cd «carpeta_con_programas_gel»
ls *.gel
</programlisting>
      </para>
    </sect1>

  </chapter>

  <!-- ============= Matrices ================================= -->
  <chapter id="genius-gel-matrices">
    <title>Matrices en GEL</title>

    <para>Genius tiene soporte para vectores y matrices y una biblioteca dimensionable para manipulación de matrices y funciones de álgebra lineal.</para>

    <sect1 id="genius-gel-matrix-support">
      <title>Introducir matrices</title>
      <para>
To enter matrixes, you can use one of the following two syntaxes. You can either enter
the matrix on one line, separating values by commas and rows by semicolons.  Or you
can enter each row on one line, separating
values by commas.
You can also just combine the two methods.
So to enter a 3x3 matrix
of numbers 1-9 you could do
<programlisting>[1,2,3;4,5,6;7,8,9]
</programlisting>
or
<programlisting>[1, 2, 3
 4, 5, 6
 7, 8, 9]
</programlisting>
Do not use both ';' and return at once on the same line though.
      </para>

      <para>
You can also use the matrix expansion functionality to enter matricies.
For example you can do:
<programlisting>a = [ 1, 2, 3
      4, 5, 6
      7, 8, 9]
b = [ a,  10
      11, 12]
</programlisting>
and you should get
<programlisting>[1,   2,  3, 10
 4,   5,  6, 10
 7,   8,  9, 10
 11, 11, 11, 12]
</programlisting>
similiarly you can build matricies out of vectors and other stuff like that.
      </para>

      <para>Otra cosa es que se los puntos no especificados se inicialicen a 0, por lo que <programlisting>[1, 2, 3
 4, 5
 6]
</programlisting> será <programlisting>
[1, 2, 3
 4, 5, 0
 6, 0, 0]
</programlisting></para>

      <para>
	When matrices are evaluated, they are evaluated and traversed row-wise.  This is just
	like the <literal>M@(j)</literal> operator which traverses the matrix row-wise.
      </para>

      <note>
        <para>
Be careful about using returns for expressions inside the
<literal>[ ]</literal> brackets, as they have a slightly different meaning
there.  You will start a new row.
        </para>
      </note>

    </sect1>

    <sect1 id="genius-gel-matrix-transpose">
      <title>Conjugada de la traspuesta y operador de trasposición</title>
      <para>
You can conjugate transpose a matrix by using the <literal>'</literal> operator.  That is
the entry in the
<varname>i</varname>th column and the <varname>j</varname>th row will be
the complex conjugate of the entry in the
<varname>j</varname>th column and the <varname>i</varname>th row of the original matrix.
 For example:
<programlisting>[1,2,3]*[4,5,6]'
</programlisting>
We transpose the second vector to make matrix multiplication possible.
If you just want to transpose a matrix without conjugating it, you would
use the <literal>.'</literal> operator.  For example:
<programlisting>[1,2,3]*[4,5,6i].'
</programlisting>
      </para>
	<para>
	  Note that normal transpose, that is the <literal>.'</literal> operator, is much faster
	  and will not create a new copy of the matrix in memory.  The conjugate transpose does
	  create a new copy unfortunately.
	  It is recommended to always use the <literal>.'</literal> operator when working with real
	  matrices and vectors.
	</para>
    </sect1>

    <sect1 id="genius-gel-matrix-linalg">
      <title>Álgebra lineal</title>
      <para>Genius implementa varias rutinas útiles para manipular álgebra lineal y matrices. Consulte las secciones <link linkend="genius-gel-function-list-linear-algebra">álgebra lineal</link> y <link linkend="genius-gel-function-list-matrix">manipulación de matrices</link> de la lista de funciones GEL.</para>
      <para>Las rutinas de álgebra lineal implementadas en GEL no ofrecen actualmente un paquete numérico bien probado, por lo que no se deberían utilizar para cálculos numéricos críticos. Por otro lado, Genius implementa muy bien muchas operaciones de álgebra lineal con coeficientes racionales y enteros. Éstas son intrínsecamente exactas y, de hecho, dan resultados mucho mejores que las rutinas comunes de doble precisión para álgebra lineal.</para>
      <para>Por ejemplo, no tiene sentido calcular el rango y el espacio nulo de una matriz en coma flotante, ya que para todos los fines prácticos, se debe tener en cuenta que la matriz puede tener algunos errores pequeños. Es posible que se obtenga un resultado diferente al esperado. El problema es que con una perturbación pequeña cualquier matriz es de rango completo e invertible. Sin embargo, si la matriz se compone de números racionales, entonces el rango y el espacio nulo serán siempre exactos.</para>
      <para>En general, cuando Genius calcula la base de un espacio vectorial determinado (por ejemplo con la función <function>NullSpace</function>), se dará la base como una matriz cuyas columnas son los vectores de la base. Es decir, cuando Genius habla de un subespacio lineal se refiere a una matriz cuyo espacio de columna es el subespacio lineal indicado.</para>
      <para>Cabe señalar que Genius puede recordar ciertas propiedades de una matriz. Por ejemplo, se recordará si una matriz está en su forma reducida por filas. Si se hacen muchas llamadas a funciones que utilizan internamente la forma reducida por filas de una matriz, se puede reducir por filas la matriz previamente una sola vez. Las llamadas sucesivas a la función <function>rref</function> se harán muy rápido.</para>
    </sect1>

  </chapter>

  <!-- ============= Polynomials ============================== -->
  <chapter id="genius-gel-polynomials">
    <title>Polinomios en GEL</title>

    <para>Actualmente, Genius puede manipular polinomios de una variable escritos como vectores y realizar algunas operaciones básicas con ellos. Se prevé ampliar este soporte adicional.</para>

    <sect1 id="genius-gel-polynomials-using">
      <title>Usar polinomios</title>
      <para>Actualmente, los polinomios de una variable son vectores horizontales con valores como nodos. La potencia del término es la posición en el vector, con la primera posición siendo 0. Por lo tanto, <programlisting>[1,2,3]
</programlisting> se traduce en un polinomio como <programlisting>1 + 2*x + 3*x^2
</programlisting></para>
      <para>Se pueden sumar, restar y multiplicar polinomios utilizando las funciones <link linkend="gel-function-AddPoly"><function>AddPoly</function></link>, <link linkend="gel-function-SubtractPoly"><function>SubtractPoly</function></link> y <link linkend="gel-function-MultiplyPoly"><function>MultiplyPoly</function></link> respectivamente. Se puede imprimir un polinomio utilizando la función <link linkend="gel-function-PolyToString"><function>PolyToString</function></link>. Por ejemplo, <programlisting>PolyToString([1,2,3],"y")
</programlisting> devuelve <programlisting>3*y^2 + 2*y + 1
</programlisting> También se puede obtener una representación funcional del polinomio de manera que puede evaluarse. Esto se realiza utilizando <link linkend="gel-function-PolyToFunction"><function>PolyToFunction</function></link>, que devuelve una función anónima. <programlisting>f = PolyToFunction([0,1,1])
f(2)
</programlisting></para>
      <para>
	It is also possible to find roots of polynomials of degrees 1 through 4 by using the
function
<link linkend="gel-function-PolynomialRoots"><function>PolynomialRoots</function></link>,
which calls the appropriate formula function.  Higher degree polynomials must be converted to
functions and solved
numerically using a function such as
<link linkend="gel-function-FindRootBisection"><function>FindRootBisection</function></link>,
<link linkend="gel-function-FindRootFalsePosition"><function>FindRootFalsePosition</function></link>,
<link linkend="gel-function-FindRootMullersMethod"><function>FindRootMullersMethod</function></link>, or
<link linkend="gel-function-FindRootSecant"><function>FindRootSecant</function></link>.
      </para>
      <para>Consulte la <xref linkend="genius-gel-function-list-polynomials"/> en la lista de funciones el resto de funciones que actúan sobre polinomios.</para>
    </sect1>

  </chapter>

  <!-- ============= Set Theory ============================== -->
  <chapter id="genius-gel-settheory">
    <title>Teoría de conjuntos en GEL</title>

    <para>
      Genius has some basic set theoretic functionality built in.  Currently a set is
      just a vector (or a matrix).  Every distinct object is treated as a different element.
    </para>

    <sect1 id="genius-gel-sets-using">
      <title>Usar conjuntos</title>
      <para>
	Just like vectors, objects
      in sets can include numbers, strings, <constant>null</constant>, matrices and vectors.  It is
      planned in the future to have a dedicated type for sets, rather than using vectors.
      Note that floating point numbers are distinct from integers, even if they appear the same.
      That is, Genius will treat <constant>0</constant> and <constant>0.0</constant>
      as two distinct elements.  The <constant>null</constant> is treated as an empty set.
    </para>
      <para>
	To build a set out of a vector, use the 
	<link linkend="gel-function-MakeSet"><function>MakeSet</function></link> function.
	Currently, it will just return a new vector where every element is unique.
<screen><prompt>genius&gt; </prompt><userinput>MakeSet([1,2,2,3])</userinput>
= [1, 2, 3]
</screen>
</para>

	<para>
	Similarly there are functions 
	<link linkend="gel-function-Union"><function>Union</function></link>,
	<link linkend="gel-function-Intersection"><function>Intersection</function></link>,
	<link linkend="gel-function-SetMinus"><function>SetMinus</function></link>, which
	are rather self explanatory.  For example:
<screen><prompt>genius&gt; </prompt><userinput>Union([1,2,3], [1,2,4])</userinput>
= [1, 2, 4, 3]
</screen>
	Note that no order is guaranteed for the return values.  If you wish to sort the vector you
should use the
	<link linkend="gel-function-SortVector"><function>SortVector</function></link> function.
	</para>

	<para>
	  For testing membership, there are functions
	<link linkend="gel-function-IsIn"><function>IsIn</function></link> and
	<link linkend="gel-function-IsSubset"><function>IsSubset</function></link>,
	which return a boolean value.  For example:
<screen><prompt>genius&gt; </prompt><userinput>IsIn (1, [0,1,2])</userinput>
= true
</screen>
	The input <userinput>IsIn(x,X)</userinput> is of course equivalent to
	<userinput>IsSubset([x],X)</userinput>.  Note that since the empty set is a subset
	of every set, <userinput>IsSubset(null,X)</userinput> is always true.
	</para>

    </sect1>

  </chapter>

  <!-- ============= GEL function list ======================== -->
  <chapter id="genius-gel-function-list">
    <title>Lista de funciones GEL</title>

    
    <para>Para obtener ayuda sobre una función específica desde la consola, escriba: <programlisting>help NombreFuncion
</programlisting></para>

    <sect1 id="genius-gel-function-list-commands">
      <title>Comandos</title>
      <variablelist>
        <varlistentry id="gel-command-help">
         <term>help</term>
         <listitem>
          <synopsis>help</synopsis>
          <synopsis>ayuda NombreFunción</synopsis>
          <para>Imprimir ayuda (o ayuda en una función/comando).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-command-load">
         <term>load</term>
         <listitem>
          <synopsis>load «archivo.gel»</synopsis>
          <para>Cargar un archivo en el intérprete. El archivo se ejecutará como si se hubiera escrito en la línea de comandos.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-command-cd">
         <term>cd</term>
         <listitem>
          <synopsis>cd /carpeta/nombre</synopsis>
          <para>Cambiar la carpeta de trabajo a <filename>/carpeta/nombre</filename>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-command-pwd">
         <term>pwd</term>
         <listitem>
          <synopsis>pwd</synopsis>
          <para>Imprimir la carpeta de trabajo actual.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-command-ls">
         <term>ls</term>
         <listitem>
          <synopsis>ls</synopsis>
          <para>Listar archivos en la carpeta actual.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-command-plugin">
         <term>plugin</term>
         <listitem>
          <synopsis>plugin nombre_del_complemento</synopsis>
          <para>Cargar un complemento. El complemento debe estar instalado en el sistema en la carpeta adecuada.</para>
         </listitem>
        </varlistentry>
      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-basic">
      <title>Básico</title>
      <variablelist>
        <varlistentry id="gel-function-AskButtons">
         <term>AskButtons</term>
         <listitem>
          <synopsis>AskButtons (consulta)</synopsis>
          <synopsis>AskButtons (consulta, botón1, ...)</synopsis>
	  <para>Asks a question and presents a list of buttons to the user (or
a menu of options in text mode).  Returns the 1-based index of the button
pressed.  That is, returns 1 if the first button was pressed, 2 if the second
button was pressed, and so on.  If the user closes the window (or simply hits
enter in text mode), then <constant>null</constant> is returned.  The execution
of the program is blocked until the user responds.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-AskString">
         <term>AskString</term>
         <listitem>
          <synopsis>AskString (consulta)</synopsis>
          <synopsis>AskString (consulta, predeterminado)</synopsis>
          <para>Asks a question and lets the user enter a string which
it then returns.  If the user cancels or closes the window, then
<constant>null</constant> is returned.  The execution of the program
is blocked until the user responds.  If <varname>default</varname> is given, then it is pre-typed in for the user to just press enter on.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Compose">
         <term>Compose</term>
         <listitem>
          <synopsis>Compose (f,g)</synopsis>
          <para>Componer dos funciones y devolver una función, que es la composición de <function>f</function> y <function>g</function>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ComposePower">
         <term>ComposePower</term>
         <listitem>
          <synopsis>ComposePower (f,n,x)</synopsis>
          <para>Compone y ejecuta una funcion con ella misma <varname>n</varname> veces, pasando <varname>x</varname> como argumento. Devolviendo <varname>x</varname> si <varname>n</varname> es cero. Por ejemplo: <screen><prompt>genius&gt;</prompt> <userinput>function f(x) = x^2 ;</userinput>
<prompt>genius&gt;</prompt> <userinput>ComposePower (f,3,7)</userinput>
= 5764801
<prompt>genius&gt;</prompt> <userinput>f(f(f(7)))</userinput>
= 5764801
</screen></para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Evaluate">
         <term>Evaluate</term>
         <listitem>
          <synopsis>Evaluate (cadena)</synopsis>
          <para>Analiza y evalúa una cadena.</para>
         </listitem>
        </varlistentry>


        <varlistentry id="gel-function-GetCurrentModulo">
         <term>GetCurrentModulo</term>
         <listitem>
          <synopsis>GetCurrentModulo</synopsis>
          <para>Get current modulo from the context outside the function.  That is, if outside of
the function was executed in modulo (using <literal>mod</literal>) then this returns what
this modulo was.  Normally the body of the function called is not executed in modular arithmetic,
and this builtin function makes it possible to make GEL functions aware of modular arithmetic.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Identity">
         <term>Identity</term>
         <listitem>
          <synopsis>Identity (x)</synopsis>
          <para>Función identidad, devuelve su argumento.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IntegerFromBoolean">
         <term>IntegerFromBoolean</term>
         <listitem>
          <synopsis>IntegerFromBoolean (bval)</synopsis>
	  <para>
	    Make integer (0 for <constant>false</constant> or 1 for
	    <constant>true</constant>) from a boolean value.
	    <varname>bval</varname> can also be a number in which case a
	    non-zero value will be interpreted as <constant>true</constant> and
	    zero will be interpreted as <constant>false</constant>.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsBoolean">
         <term>IsBoolean</term>
         <listitem>
          <synopsis>IsBoolean (arg)</synopsis>
          <para>Comprobar si el argumento es un booleano (y no un número).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsDefined">
         <term>IsDefined</term>
         <listitem>
          <synopsis>IsDefined (id)</synopsis>
          <para>Check if an id is defined.  You should pass a string or
	   and identifier.  If you pass a matrix, each entry will be
	   evaluated separately and the matrix should contain strings
	   or identifiers.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsFunction">
         <term>IsFunction</term>
         <listitem>
          <synopsis>IsFunction (arg)</synopsis>
          <para>Comprobar si el argumento es una función.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsFunctionOrIdentifier">
         <term>IsFunctionOrIdentifier</term>
         <listitem>
          <synopsis>IsFunctionOrIdentifier (arg)</synopsis>
          <para>Comprobar si el argumento es una función o un identificador.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsFunctionRef">
         <term>IsFunctionRef</term>
         <listitem>
          <synopsis>IsFunctionRef (arg)</synopsis>
          <para>Comprobar si el argumento es una referencia a la función. Esto incluye las referencias a variables.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsMatrix">
         <term>IsMatrix</term>
         <listitem>
          <synopsis>IsMatrix (arg)</synopsis>
          <para>Check if argument is a matrix.  Even though <constant>null</constant> is
sometimes considered an empty matrix, the function <function>IsMatrix</function> does
not consider <constant>null</constant> a matrix.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsNull">
         <term>IsNull</term>
         <listitem>
          <synopsis>IsNull (arg)</synopsis>
	  <para>Comprobar si el argumento es <constant>null</constant>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsString">
         <term>IsString</term>
         <listitem>
          <synopsis>IsString (arg)</synopsis>
          <para>Comprobar si el argumento es una cadena de texto.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsValue">
         <term>IsValue</term>
         <listitem>
          <synopsis>IsValue (arg)</synopsis>
          <para>Comprobar si el argumento es un número.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Parse">
         <term>Parse</term>
         <listitem>
          <synopsis>Parse (cadena)</synopsis>
          <para>Parses but does not evaluate a string.  Note that certain
	    pre-computation is done during the parsing stage.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SetFunctionFlags">
         <term>SetFunctionFlags</term>
         <listitem>
          <synopsis>SetFunctionFlags (id,opciones...)</synopsis>
          <para>Set flags for a function, currently <literal>"PropagateMod"</literal> and <literal>"NoModuloArguments"</literal>.
If <literal>"PropagateMod"</literal> is set, then the body of the function is evaluated in modular arithmetic when the function
is called inside a block that was evaluated using modular arithmetic (using <literal>mod</literal>).  If
<literal>"NoModuloArguments"</literal>, then the arguments of the function are never evaluated using modular arithmetic.
 </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SetHelp">
         <term>SetHelp</term>
         <listitem>
          <synopsis>SetHelp (id,categoria,desc)</synopsis>
          <para>Establece la categoría y la línea de descripción de la ayuda para una función.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SetHelpAlias">
         <term>SetHelpAlias</term>
         <listitem>
          <synopsis>SetHelpAlias (id,alias)</synopsis>
          <para>Establece un alias de ayuda.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-chdir">
         <term>chdir</term>
         <listitem>
          <synopsis>chdir (carpeta)</synopsis>
          <para>Cambia la carpeta actual, igual que <command>cd</command>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-CurrentTime">
         <term>CurrentTime</term>
         <listitem>
          <synopsis>CurrentTime</synopsis>
          <para>Returns the current UNIX time with microsecond precision as a floating point number.  That is, returns the number of seconds since January 1st 1970.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-display">
         <term>display</term>
         <listitem>
          <synopsis>display (cadena,expresión)</synopsis>
          <para>Muestra una cadena y una expresión separadas por dos puntos.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-error">
         <term>error</term>
         <listitem>
          <synopsis>error (cadena)</synopsis>
          <para>Imprime un error en el flujo de error (en la consola).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-exit">
         <term>exit</term>
         <listitem>
          <synopsis>exit</synopsis>
          <para>Aliases: <function>quit</function></para>
          <para>Sale el programa.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-false">
         <term>false</term>
         <listitem>
          <synopsis>false</synopsis>
          <para>Alias: <function>False</function><function>FALSE</function></para>
	  <para>El valor booleano <constant>false</constant>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-manual">
         <term>manual</term>
         <listitem>
          <synopsis>manual</synopsis>
          <para>Muestra el manual de usuario.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-print">
         <term>print</term>
         <listitem>
          <synopsis>print (cadena)</synopsis>
          <para>Prints an expression and then print a newline.  The argument <varname>str</varname> can be any expression.  It is
made into a string before being printed.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-printn">
         <term>printn</term>
         <listitem>
          <synopsis>printn (cad)</synopsis>
          <para>Prints an expression without a trailing newline.  The argument <varname>str</varname> can be any expression.  It is
made into a string before being printed.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-protect">
         <term>protect</term>
         <listitem>
          <synopsis>protect (id)</synopsis>
          <para>Puede proteger una variable de ser modificada. Esto se usa en las funciones de GEL internas para evitar que se sobreescriban accidentalmente.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ProtectAll">
         <term>ProtectAll</term>
         <listitem>
          <synopsis>ProtectAll ()</synopsis>
          <para>Protect all currently defined variables, parameters and
functions from being modified.  This is used on the internal GEL functions to
avoid them being accidentally overridden.  Normally <application>Genius Mathematics Tool</application> considers
unprotected variables as user defined.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-set">
         <term>set</term>
         <listitem>
          <synopsis>set (id,val)</synopsis>
          <para>Set a global variable.  The <varname>id</varname>
            can be either a string or a quoted identifier as follows.
	    For example:
	    <programlisting>set(`x,1)
	    </programlisting>
	    will set the global variable <varname>x</varname> to the value 1.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-string">
         <term>string</term>
         <listitem>
          <synopsis>string (s)</synopsis>
          <para>Crear una cadena. Esto creará una cadena desde cualquier argumento.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-true">
         <term>true</term>
         <listitem>
          <synopsis>true</synopsis>
          <para>Alias: <function>True</function><function>TRUE</function></para>
	  <para>El valor booleano <constant>true</constant>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-undefine">
         <term>undefine</term>
         <listitem>
          <synopsis>undefine (id)</synopsis>
          <para>Alias: <function>Undefine</function></para>
          <para>Undefine a variable.  This includes locals and globals,
	    every value on all context levels is wiped.  This function
	    should really not be used on local variables.  A vector of
	    identifiers can also be passed to undefine several variables.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-UndefineAll">
         <term>UndefineAll</term>
         <listitem>
          <synopsis>UndefineAll ()</synopsis>
	  <para>Undefine all unprotected global variables
	    (including functions and parameters).  Normally <application>Genius Mathematics Tool</application>
	    considers protected variables as system defined functions
	    and variables.  Note that <function>UndefineAll</function>
	    only removes the global definition of symbols not local ones,
	    so that it may be run from inside other functions safely.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-unprotect">
         <term>unprotect</term>
         <listitem>
          <synopsis>unprotect (id)</synopsis>
          <para>Desproteger una variable de ser modificada.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-UserVariables">
         <term>UserVariables</term>
         <listitem>
          <synopsis>UserVariables ()</synopsis>
          <para>Devolver un vector con todos los nombres de variables globales definidas por el usuario (sin proteger).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-wait">
         <term>wait</term>
         <listitem>
          <synopsis>wait (secs)</synopsis>
          <para>Esperar un número específico de segundos. <varname>secs</varname> no puede ser negativo. Cero es aceptable y no pasa nada en este caso, excepto si los posibles eventos de interfaz del usuario se procesan.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-version">
         <term>version</term>
         <listitem>
          <synopsis>version</synopsis>
          <para>Returns the version of Genius as a horizontal 3-vector with
	  major version first, then minor version and finally the patch level.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-warranty">
         <term>warranty</term>
         <listitem>
          <synopsis>warranty</synopsis>
          <para>Da la información de garantía.</para>
         </listitem>
        </varlistentry>
      </variablelist>

    </sect1>

    <sect1 id="genius-gel-function-parameters">
      <title>Parámetros</title>
      <variablelist>
        <varlistentry id="gel-function-ChopTolerance">
         <term>ChopTolerance</term>
         <listitem>
          <synopsis>ChopTolerance = número</synopsis>
          <para>Tolerancia de la función <function>Chop</function></para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ContinuousNumberOfTries">
         <term>ContinuousNumberOfTries</term>
         <listitem>
          <synopsis>ContinuousNumberOfTries = número</synopsis>
          <para>Iteraciones para tratar de obtener el límite de continuidad y sus límites.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ContinuousSFS">
         <term>ContinuousSFS</term>
         <listitem>
          <synopsis>ContinuousSFS = número</synopsis>
          <para>Número de pasos sucesivos dentro de la tolerancia para el cálculo de la continuidad.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ContinuousTolerance">
         <term>ContinuousTolerance</term>
         <listitem>
          <synopsis>ContinuousTolerance = número</synopsis>
          <para>Tolerancia para la continuidad de las funciones y para el cálculo del límite.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DerivativeNumberOfTries">
         <term>DerivativeNumberOfTries</term>
         <listitem>
          <synopsis>DerivativeNumberOfTries = número</synopsis>
          <para>Número de iteraciones para tratar de obtener el límite para la derivada.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DerivativeSFS">
         <term>DerivativeSFS</term>
         <listitem>
          <synopsis>DerivativeSFS = número</synopsis>
          <para>Número de pasos sucesivos dentro de la tolerancia para el cálculo de la derivada.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DerivativeTolerance">
         <term>DerivativeTolerance</term>
         <listitem>
          <synopsis>DerivativeTolerance = número</synopsis>
          <para>Tolerancia para calcular las derivadas de las funciones.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ErrorFunctionTolerance">
         <term>ErrorFunctionTolerance</term>
         <listitem>
          <synopsis>ErrorFunctionTolerance = número</synopsis>
          <para>Tolerancia de <function>ErrorFunction</function>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FloatPrecision">
         <term>FloatPrecision</term>
         <listitem>
          <synopsis>FloatPrecision = número</synopsis>
          <para>Precisión en coma flotante.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FullExpressions">
         <term>FullExpressions</term>
         <listitem>
          <synopsis>FullExpressions = booleano</synopsis>
          <para>Imprimir expresiones completas, incluso si son de más de una línea.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-GaussDistributionTolerance">
         <term>GaussDistributionTolerance</term>
         <listitem>
          <synopsis>GaussDistributionTolerance = número</synopsis>
          <para>Tolerancia de la función <function>GaussDistribution</function></para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IntegerOutputBase">
         <term>IntegerOutputBase</term>
         <listitem>
          <synopsis>IntegerOutputBase = número</synopsis>
          <para>Base de salida de enteros.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsPrimeMillerRabinReps">
         <term>IsPrimeMillerRabinReps</term>
         <listitem>
          <synopsis>IsPrimeMillerRabinReps = número</synopsis>
          <para>Número de tests de Miller-Rabin adicionales que ejecutar sobre un número antes de declararlo primo en <function>IsPrime</function>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LinePlotDrawLegends">
         <term>LinePlotDrawLegends</term>
         <listitem>
          <synopsis>LinePlotDrawLegends = true</synopsis>
          <para>Tells genius to draw the legends for <link linkend="genius-gel-function-list-plotting">line plotting
	  functions</link> such as <link linkend="gel-function-LinePlot"><function>LinePlot</function></link>.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LinePlotVariableNames">
         <term>LinePlotVariableNames</term>
         <listitem>
          <synopsis>LinePlotVariableNames = ["x","y","z","t"]</synopsis>
          <para>Tells genius which variable names are used as default names  for <link linkend="genius-gel-function-list-plotting">line plotting
	  functions</link> such as <link linkend="gel-function-LinePlot"><function>LinePlot</function></link> and friends.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LinePlotWindow">
         <term>LinePlotWindow</term>
         <listitem>
          <synopsis>LinePlotWindow = [x1,x2,y1,y2]</synopsis>
          <para>Sets the limits for <link linkend="genius-gel-function-list-plotting">line plotting
	  functions</link> such as <link linkend="gel-function-LinePlot"><function>LinePlot</function></link>.
          </para>
         </listitem>
        </varlistentry>


        <varlistentry id="gel-function-MaxDigits">
         <term>MaxDigits</term>
         <listitem>
          <synopsis>MaxDigits = número</synopsis>
          <para>Máximo de cifras que mostrar.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MaxErrors">
         <term>MaxErrors</term>
         <listitem>
          <synopsis>MaxErrors = número</synopsis>
          <para>Máximo de errores que mostrar.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MixedFractions">
         <term>MixedFractions</term>
         <listitem>
          <synopsis>MixedFractions = booleano</synopsis>
          <para>Si es cierto, las fracciones mixtas se imprimen.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalIntegralFunction">
         <term>NumericalIntegralFunction</term>
         <listitem>
          <synopsis>NumericalIntegralFunction = función</synopsis>
          <para>La función usada para la integración en<function>NumericalIntegral</function>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalIntegralSteps">
         <term>NumericalIntegralSteps</term>
         <listitem>
          <synopsis>NumericalIntegralSteps = número</synopsis>
          <para>Pasos que realizar en <function>NumericalIntegral</function>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-OutputChopExponent">
         <term>OutputChopExponent</term>
         <listitem>
          <synopsis>OutputChopExponent = número</synopsis>
	  <para>When another number in the object being printed (a matrix or a
value) is greater than
10<superscript>-OutputChopWhenExponent</superscript>, and
the number being printed is less than 
10<superscript>-OutputChopExponent</superscript>, then
display <computeroutput>0.0</computeroutput> instead of the number.
</para>
<para>
Output is never chopped if <function>OutputChopExponent</function> is zero.
It must be a non-negative integer.
</para>
<para>
If you want output always chopped according to
<function>OutputChopExponent</function>, then set
<function>OutputChopWhenExponent</function>, to something
greater than or equal to
<function>OutputChopExponent</function>.
</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-OutputChopWhenExponent">
         <term>OutputChopWhenExponent</term>
         <listitem>
          <synopsis>OutputChopWhenExponent = número</synopsis>
	  <para>Cuando recortar la salida. Consulte <link linkend="gel-function-OutputChopExponent"><function>OutputChopExponent</function></link>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-OutputStyle">
         <term>OutputStyle</term>
         <listitem>
          <synopsis>OutputStyle = cadena</synopsis>
          <para>Estilo de salida, puede ser <literal>normal</literal>, <literal>latex</literal>, <literal>mathml</literal> o <literal>troff</literal>.</para>
	  <para>
	    This affects mostly how matrices and fractions are printed out and
	    is useful for pasting into documents.  For example you can set this
	    to the latex by:
	    <programlisting>OutputStyle = "latex"
</programlisting>
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ResultsAsFloats">
         <term>ResultsAsFloats</term>
         <listitem>
          <synopsis>ResultsAsFloats = booleano</synopsis>
          <para>Convertir todos los resultados a flotantes antes de imprimir.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ScientificNotation">
         <term>ScientificNotation</term>
         <listitem>
          <synopsis>ScientificNotation = booleano</synopsis>
          <para>Usar notación científica.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SlopefieldTicks">
         <term>SlopefieldTicks</term>
         <listitem>
          <synopsis>SlopefieldTicks = [vertical,horizontal]</synopsis>
          <para>Sets the number of vertical and horizontal ticks in a
slopefield plot.  (See <link linkend="gel-function-SlopefieldPlot"><function>SlopefieldPlot</function></link>).
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SumProductNumberOfTries">
         <term>SumProductNumberOfTries</term>
         <listitem>
          <synopsis>SumProductNumberOfTries = número</synopsis>
          <para>How many iterations to try for <function>InfiniteSum</function> and <function>InfiniteProduct</function>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SumProductSFS">
         <term>SumProductSFS</term>
         <listitem>
          <synopsis>SumProductSFS = número</synopsis>
          <para>How many successive steps to be within tolerance for <function>InfiniteSum</function> and <function>InfiniteProduct</function>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SumProductTolerance">
         <term>SumProductTolerance</term>
         <listitem>
          <synopsis>SumProductTolerance = número</synopsis>
          <para>Tolerancia de <function>InfiniteSum</function> y de <function>InfiniteProduct</function>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SurfacePlotVariableNames">
         <term>SurfacePlotVariableNames</term>
         <listitem>
          <synopsis>SurfacePlotVariableNames = ["x","y","z"]</synopsis>
          <para>Tells genius which variable names are used as default names for <link linkend="genius-gel-function-list-plotting">surface plotting
	  functions</link> using <link linkend="gel-function-SurfacePlot"><function>SurfacePlot</function></link>.
          Note that the <varname>z</varname> does not refer to the dependent (vertical) axis, but to the indepent complex variable
          <userinput>z=x+iy</userinput>.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SurfacePlotWindow">
         <term>SurfacePlotWindow</term>
         <listitem>
          <synopsis>SurfacePlotWindow = [x1,x2,y1,y2,z1,z2]</synopsis>
          <para>Establece los límites de la superficie de dibujado (consulte <link linkend="gel-function-SurfacePlot"><function>SurfacePlot</function></link>).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-VectorfieldNormalized">
         <term>VectorfieldNormalized</term>
         <listitem>
          <synopsis>VectorfieldNormalized = true</synopsis>
          <para>Should the vectorfield plotting have normalized arrow length.  If true, vector fields will only show direction
	   and not magnitude.  (See <link linkend="gel-function-VectorfieldPlot"><function>VectorfieldPlot</function></link>).
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-VectorfieldTicks">
         <term>VectorfieldTicks</term>
         <listitem>
          <synopsis>VectorfieldTicks = [vertical,horizontal]</synopsis>
          <para>Sets the number of vertical and horizontal ticks in a
vectorfield plot.  (See <link linkend="gel-function-VectorfieldPlot"><function>VectorfieldPlot</function></link>).
          </para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-constants">
      <title>Constantes</title>
      <variablelist>
        <varlistentry id="gel-function-CatalanConstant">
         <term>CatalanConstant</term>
         <listitem>
          <synopsis>CatalanConstant</synopsis>
          <para>
	    Catalan's Constant, approximately 0.915...  It is defined to be the series where terms are <userinput>(-1^k)/((2*k+1)^2)</userinput>, where <varname>k</varname> ranges from 0 to infinity.
	  </para>
          <para>Consulte la <ulink url="http://mathworld.wolfram.com/CatalansConstant.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-EulerConstant">
         <term>EulerConstant</term>
         <listitem>
          <synopsis>EulerConstant</synopsis>
          <para>Alias: <function>gamma</function></para>
          <para>Constante gamma de Euler. También llamada constante de Euler-Mascheroni,</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Euler-Mascheroni_constant">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/MascheroniConstant.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/Euler-MascheroniConstant.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-GoldenRatio">
         <term>GoldenRatio</term>
         <listitem>
          <synopsis>GoldenRatio</synopsis>
          <para>El número áureo.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Golden_ratio">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/GoldenRatio.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/GoldenRatio.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Gravity">
         <term>Gravedad</term>
         <listitem>
          <synopsis>Gravedad</synopsis>
          <para>Aceleración en caída libre a nivel del mar.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Standard_gravity">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-e">
         <term>e</term>
         <listitem>
          <synopsis>e</synopsis>
          <para>La base del logaritmo natural. <userinput>e^x</userinput> es la función exponencial <link linkend="gel-function-exp"><function>exp</function></link>. Su valor es aproximadamente 2.71828182846...</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/E_(mathematical_constant)">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/E.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/e.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-pi">
         <term>pi</term>
         <listitem>
          <synopsis>pi</synopsis>
          <para>El número pi, que es la relación de la circunferencia de un círculo con su diámetro. Esto es aproximadamente 3,14159265359...</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Pi">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/Pi.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/Pi.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-numeric">
      <title>Numérico</title>
      <variablelist>
        <varlistentry id="gel-function-AbsoluteValue">
         <term>AbsoluteValue</term>
         <listitem>
          <synopsis>AbsoluteValue (x)</synopsis>
          <para>Alias: <function>abs</function></para>
          <para>Valor absoluto de un número y, si <varname>x</varname> es un valor complejo, el módulo de <varname>x</varname>. Es decir, es la distancia entre <varname>x</varname> y el origen.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Absolute_value">Wikipedia</ulink>, <ulink url="http://planetmath.org/encyclopedia/AbsoluteValue.html">Planetmath (valor absoluto)</ulink>, <ulink url="http://planetmath.org/encyclopedia/ModulusOfComplexNumber.html">Planetmath (módulo)</ulink>, <ulink url="http://mathworld.wolfram.com/AbsoluteValue.html">Mathworld (valor absoluto)</ulink> o <ulink url="http://mathworld.wolfram.com/ComplexModulus.html">Mathworld (módulo complejo)</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Chop">
         <term>Chop</term>
         <listitem>
          <synopsis>Chop (x)</synopsis>
          <para>Reemplazar números muy pequeños por cero.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ComplexConjugate">
         <term>ComplexConjugate</term>
         <listitem>
          <synopsis>ComplexConjugate (z)</synopsis>
          <para>Alias: <function>conj</function><function>Conj</function></para>
          <para>Calcula el conjugado complejo del número complejo <varname>z</varname>. Si <varname>z</varname> es un vector o una matriz, se conjugan todos sus elementos.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Complex_conjugate">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Denominator">
         <term>Denominator</term>
         <listitem>
          <synopsis>Denominator (x)</synopsis>
          <para>Obtener el denominador de un número racional.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Denominator">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FractionalPart">
         <term>FractionalPart</term>
         <listitem>
          <synopsis>FractionalPart (x)</synopsis>
          <para>Devolver la parte fraccional de un número.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Fractional_part">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Im">
         <term>Im</term>
         <listitem>
          <synopsis>Im (z)</synopsis>
          <para>Alias: <function>ImaginaryPart</function></para>
          <para>Obtener la parte imaginaria de un número complejo.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Imaginary_part">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IntegerQuotient">
         <term>IntegerQuotient</term>
         <listitem>
          <synopsis>IntegerQuotient (m,n)</synopsis>
          <para>División sin resto.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsComplex">
         <term>IsComplex</term>
         <listitem>
          <synopsis>IsComplex (num)</synopsis>
          <para>Comprobar si el argumento es un número complejo (no real).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsComplexRational">
         <term>IsComplexRational</term>
         <listitem>
          <synopsis>IsComplexRational (num)</synopsis>
	  <para>Comprobar si el argumento es, posiblemente, un número racional complejo. Esto es, si tanto la parte real como la imaginaria se dan como números racionales. Por supuesto, racional significa simplemente que «no se almacena como un número en coma flotante».</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsFloat">
         <term>IsFloat</term>
         <listitem>
          <synopsis>IsFloat (num)</synopsis>
          <para>Comprobar si el argumento es un número en coma flotante (no complejo).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsGaussInteger">
         <term>IsGaussInteger</term>
         <listitem>
          <synopsis>IsGaussInteger (num)</synopsis>
          <para>Alias: <function>IsComplexInteger</function></para>
          <para>Comprobar si el argumento es un posible entero complejo.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsInteger">
         <term>IsInteger</term>
         <listitem>
          <synopsis>IsInteger (num)</synopsis>
          <para>Comprobar si el argumento es un entero (no complejo).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsNonNegativeInteger">
         <term>IsNonNegativeInteger</term>
         <listitem>
          <synopsis>IsNonNegativeInteger (num)</synopsis>
          <para>Comprobar si el argumento es un entero real no negativo.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsPositiveInteger">
         <term>IsPositiveInteger</term>
         <listitem>
          <synopsis>IsPositiveInteger (num)</synopsis>
          <para>Alias: <function>IsNaturalNumber</function></para>
          <para>Comprueba si el argumento es un entero real positivo. Tenga en cuenta que se acepta el convenio de que 0 no es un número natural.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsRational">
         <term>IsRational</term>
         <listitem>
          <synopsis>IsRational (num)</synopsis>
          <para>Comprobar si el argumento es un número racional (no complejo). Por supuesto, racional significa «no almacenado como un número en coma flotante».</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsReal">
         <term>IsReal</term>
         <listitem>
          <synopsis>IsReal (num)</synopsis>
          <para>Comprobar si el argumento es un número real</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Numerator">
         <term>Numerator</term>
         <listitem>
          <synopsis>Numerator (x)</synopsis>
          <para>Obtener el numerador de un número racional.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Numerator">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Re">
         <term>Re</term>
         <listitem>
          <synopsis>Re (z)</synopsis>
          <para>Alias: <function>RealPart</function></para>
          <para>Obtener la parte real de un número complejo.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Real_part">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Sign">
         <term>Sign</term>
         <listitem>
          <synopsis>Sign (x)</synopsis>
          <para>Alias: <function>sign</function></para>
          <para>Devolver el signo de un número. Devuelve <literal>-1</literal> si es negativo, <literal>0</literal> si es cero y <literal>1</literal> si es positivo. Si <varname>x</varname> es un valor complejo <function>Sign</function> devuelve su dirección o 0.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ceil">
         <term>ceil</term>
         <listitem>
          <synopsis>ceil (x)</synopsis>
          <para>Alias: <function>Ceiling</function></para>
	  <para>Get the lowest integer more than or equal to <varname>n</varname>. Examples:
          <screen><prompt>genius&gt;</prompt> <userinput>ceil(1.1)</userinput>
= 2
<prompt>genius&gt;</prompt> <userinput>ceil(-1.1)</userinput>
= -1
</screen>
           </para>
	   <para>Note that you should be careful and notice that floating point
		   numbers are stored an binary and so may not be what you
		   expect.  For example <userinput>ceil(420/4.2)</userinput>
		   returns 101 instead of the expected 100.  This is because
		   4.2 is actually very slightly less than 4.2.  Use rational
		   representation <userinput>42/10</userinput> if you want
		   exact arithmetic.
           </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-exp">
         <term>exp</term>
         <listitem>
          <synopsis>exp (x)</synopsis>
          <para>La función exponencial. Esto es la función <userinput>e^x</userinput> donde <varname>e</varname> es la <link linkend="gel-function-e">base del logaritmo natural</link>.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Exponential_function">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/LogarithmFunction.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/ExponentialFunction.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-float">
         <term>float</term>
         <listitem>
          <synopsis>float (x)</synopsis>
          <para>Convertir un número en un valor en coma flotante. Esto devuelve la representación en coma flotante del número <varname>x</varname>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-floor">
         <term>floor</term>
         <listitem>
          <synopsis>floor (x)</synopsis>
          <para>Alias: <function>Floor</function></para>
          <para>Obtener el entero más alto menor o igual que <varname>n</varname>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ln">
         <term>ln</term>
         <listitem>
          <synopsis>ln (x)</synopsis>
          <para>El logaritmo natural, logaritmo en base <varname>e</varname>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-log">
         <term>log</term>
         <listitem>
          <synopsis>log (x)</synopsis>
          <synopsis>log (x,b)</synopsis>
          <para>Logaritmo de <varname>x</varname> en base <varname>b</varname> (se llama <function>DiscreteLog</function> en modo módulo), si no se indica la base, se utiliza <varname>e</varname>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-log10">
         <term>log10</term>
         <listitem>
          <synopsis>log10 (x)</synopsis>
          <para>Logaritmo de <varname>x</varname> en base 10.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-log2">
         <term>log2</term>
         <listitem>
          <synopsis>log2 (x)</synopsis>
          <para>Alias: <function>lg</function></para>
          <para>Logaritmo de <varname>x</varname> en base 2.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-max">
         <term>max</term>
         <listitem>
          <synopsis>max (a,args...)</synopsis>
          <para>Alias: <function>Max</function><function>Maximum</function></para>
          <para>Devuelve el máximo de los argumentos o las matrices.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-min">
         <term>min</term>
         <listitem>
          <synopsis>min (a,args...)</synopsis>
          <para>Alias: <function>Min</function><function>Minimum</function></para>
          <para>Devuelve el mínimo de los argumentos o las matrices.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-rand">
         <term>rand</term>
         <listitem>
          <synopsis>rand (tamaño...)</synopsis>
          <para>Generar valores en coma flotante aleatorios en el rango <literal>[0,1)</literal>. Si se indica «tamaño», entonces devuelve una matriz (si se especifican dos números) o un vector (si se especifica un número).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-randint">
         <term>randint</term>
         <listitem>
          <synopsis>randint (máx,tamaño...)</synopsis>
          <para>Generar número enteros aleatorios en el rango <literal>[0,máx)</literal>. Si se indica «tamaño», entonces devuelve una matriz (si se especifican dos números) o un vector (si se especifica un número). Por ejemplo, <screen><prompt>genius&gt;</prompt> <userinput>randint(4)</userinput>
= 3
<prompt>genius&gt;</prompt> <userinput>randint(4,2)</userinput>
=
[0      1]
<prompt>genius&gt;</prompt> <userinput>randint(4,2,3)</userinput>
=
[2      2       1
 0      0       3]
</screen></para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-round">
         <term>round</term>
         <listitem>
          <synopsis>round (x)</synopsis>
          <para>Alias: <function>Round</function></para>
          <para>Redondear un número.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-sqrt">
         <term>sqrt</term>
         <listitem>
          <synopsis>sqrt (x)</synopsis>
          <para>Alias: <function>SquareRoot</function></para>
          <para>La raíz cuadrada. Cuando se opera con «módulo», algunos enteros devolverán un valor <constant>null</constant> o un vector de raíces cuadradas. Ejemplos: <screen><prompt>genius&gt;</prompt> <userinput>sqrt(2)</userinput>
= 1.41421356237
<prompt>genius&gt;</prompt> <userinput>sqrt(-1)</userinput>
= 1i
<prompt>genius&gt;</prompt> <userinput>sqrt(4) mod 7</userinput>
=
[2      5]
<prompt>genius&gt;</prompt> <userinput>2*2 mod 7</userinput>
= 4
</screen></para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/SquareRoot.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-trunc">
         <term>trunc</term>
         <listitem>
          <synopsis>trunc (x)</synopsis>
          <para>Alias: <function>Truncate</function><function>IntegerPart</function></para>
          <para>Truncar el número a un entero (devolver la parte entera)</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-trigonometry">
      <title>Trigonometría</title>
      <variablelist>
        <varlistentry id="gel-function-acos">
         <term>acos</term>
         <listitem>
          <synopsis>acos (x)</synopsis>
          <para>Alias: <function>arccos</function></para>
          <para>La función arccos (inversa del cos).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-acosh">
         <term>acosh</term>
         <listitem>
          <synopsis>acosh (x)</synopsis>
          <para>Alias: <function>arccosh</function></para>
          <para>La función arccosh (inversa del cosh).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-acot">
         <term>acot</term>
         <listitem>
          <synopsis>acot (x)</synopsis>
          <para>Alias: <function>arccot</function></para>
          <para>La función arccot (inversa de la cot)</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-acoth">
         <term>acoth</term>
         <listitem>
          <synopsis>acoth (x)</synopsis>
          <para>Alias: <function>arccoth</function></para>
          <para>La función arccoth (inversa de la coth).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-acsc">
         <term>acsc</term>
         <listitem>
          <synopsis>acsc (x)</synopsis>
          <para>Alias: <function>arccsc</function></para>
          <para>La inversa de la función cosecante.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-acsch">
         <term>acsch</term>
         <listitem>
          <synopsis>acsch (x)</synopsis>
          <para>Alias: <function>arccsch</function></para>
          <para>La inversa de la función cosecante hiperbólica.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-asec">
         <term>asec</term>
         <listitem>
          <synopsis>asec (x)</synopsis>
          <para>Alias: <function>arcsec</function></para>
          <para>La inversa de la función secante.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-asech">
         <term>asech</term>
         <listitem>
          <synopsis>asech (x)</synopsis>
          <para>Alias: <function>arcsech</function></para>
          <para>La inversa de la función secante hiperbólica.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-asin">
         <term>asin</term>
         <listitem>
          <synopsis>asin (x)</synopsis>
          <para>Alias: <function>arcsin</function></para>
          <para>La función arcsen (inversa del sen).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-asinh">
         <term>asinh</term>
         <listitem>
          <synopsis>asinh (x)</synopsis>
          <para>Alias: <function>arcsinh</function></para>
          <para>La función arcsenh (inversa del senh).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-atan">
         <term>atan</term>
         <listitem>
          <synopsis>atan (x)</synopsis>
          <para>Alias: <function>arctan</function></para>
          <para>Calcula la función «arctan» (inversa de «tan»).</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Arctangent">Wikipedia</ulink> o <ulink url="http://mathworld.wolfram.com/InverseTangent.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-atanh">
         <term>atanh</term>
         <listitem>
          <synopsis>atanh (x)</synopsis>
          <para>Alias: <function>arctanh</function></para>
          <para>La función arctanh (inversa de la tanh).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-atan2">
         <term>atan2</term>
         <listitem>
          <synopsis>atan2 (y, x)</synopsis>
          <para>Alias: <function>arctan2</function></para>
          <para>Calcula la función «arctan2». Si <userinput>x&gt;0</userinput>, entonces devuelve <userinput>atan(y/x)</userinput>. Si <userinput>x&lt;0</userinput>, entonces devuelve <userinput>sign(y) * (pi - atan(|y/x|)</userinput>. Cuando <userinput>x=0</userinput>, devuelve <userinput>sign(y) *
	  pi/2</userinput>. <userinput>atan2(0,0)</userinput> devuelve 0 en lugar de fallar.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Atan2">Wikipedia</ulink> o <ulink url="http://mathworld.wolfram.com/InverseTangent.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-cos">
         <term>cos</term>
         <listitem>
          <synopsis>cos (x)</synopsis>
          <para>Calcula la función coseno.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/DefinitionsInTrigonometry.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-cosh">
         <term>cosh</term>
         <listitem>
          <synopsis>cosh (x)</synopsis>
          <para>Calcula la función coseno hiperbólico.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/HyperbolicFunctions.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-cot">
         <term>cot</term>
         <listitem>
          <synopsis>cot (x)</synopsis>
          <para>La función cotangente.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/DefinitionsInTrigonometry.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-coth">
         <term>coth</term>
         <listitem>
          <synopsis>coth (x)</synopsis>
          <para>La función cotangente hiperbólica.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/HyperbolicFunctions.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-csc">
         <term>csc</term>
         <listitem>
          <synopsis>csc (x)</synopsis>
          <para>La función cosecante.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/DefinitionsInTrigonometry.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-csch">
         <term>csch</term>
         <listitem>
          <synopsis>csch (x)</synopsis>
          <para>La función cosecante hiperbólica.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/HyperbolicFunctions.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-sec">
         <term>sec</term>
         <listitem>
          <synopsis>sec (x)</synopsis>
          <para>La función secante.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/DefinitionsInTrigonometry.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-sech">
         <term>sech</term>
         <listitem>
          <synopsis>sech (x)</synopsis>
          <para>La función secante hiperbólica.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/HyperbolicFunctions.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-sin">
         <term>sin</term>
         <listitem>
          <synopsis>sin (x)</synopsis>
          <para>Calcula la función seno.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/DefinitionsInTrigonometry.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-sinh">
         <term>sinh</term>
         <listitem>
          <synopsis>sinh (x)</synopsis>
          <para>Calcula la función seno hiperbólico.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/HyperbolicFunctions.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-tan">
         <term>tan</term>
         <listitem>
          <synopsis>tan (x)</synopsis>
          <para>Calcula la función tangente.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/DefinitionsInTrigonometry.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-tanh">
         <term>tanh</term>
         <listitem>
          <synopsis>tanh (x)</synopsis>
          <para>La función tangente hiperbólica.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/HyperbolicFunctions.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-number-theory">
      <title>Teoría de números</title>
      <variablelist>
        <varlistentry id="gel-function-AreRelativelyPrime">
         <term>AreRelativelyPrime</term>
         <listitem>
          <synopsis>AreRelativelyPrime (a,b)</synopsis>
          <para>¿Son los números reales <varname>a</varname> and <varname>b</varname> primos entre sí? Devuelve <constant>true</constant> o <constant>false</constant>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/RelativelyPrime.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/RelativelyPrime.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-BernoulliNumber">
         <term>BernoulliNumber</term>
         <listitem>
          <synopsis>BernoulliNumber (n)</synopsis>
          <para>Devolver el <varname>n</varname>-ésimo número de Bernoulli.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Bernoulli_number">Wikipedia</ulink> o <ulink url="http://mathworld.wolfram.com/BernoulliNumber.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ChineseRemainder">
         <term>ChineseRemainder</term>
         <listitem>
          <synopsis>ChineseRemainder (a,m)</synopsis>
          <para>Alias: <function>CRT</function></para>
	  <para>Encontrar la <varname>x</varname> que resuelve el sistema dado por el vector <varname>a</varname> y el módulo de los elementos de <varname>m</varname>, utilizando el «teorema chino del resto».</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Chinese_remainder_theorem">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/ChineseRemainderTheorem.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/ChineseRemainderTheorem.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-CombineFactorizations">
         <term>CombineFactorizations</term>
         <listitem>
          <synopsis>CombineFactorizations (a,b)</synopsis>
	  <para>Dadas dos factorizaciones, dar la factorización del producto.</para>
	  <para>Consulte la sección<link linkend="gel-function-Factorize">factorizar</link>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ConvertFromBase">
         <term>ConvertFromBase</term>
         <listitem>
          <synopsis>ConvertFromBase (v,b)</synopsis>
          <para>Convertir un vector de valores mostrando potencias de b a un número.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ConvertToBase">
         <term>ConvertToBase</term>
         <listitem>
          <synopsis>ConvertToBase (n,b)</synopsis>
          <para>Convertir un número en un vector de potencias para elementos en base <varname>b</varname>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DiscreteLog">
         <term>DiscreteLog</term>
         <listitem>
          <synopsis>DiscreteLog (n,b,q)</synopsis>
          <para>Encontrar el logaritmo discreto de <varname>n</varname> en base <varname>b</varname> en F<subscript>q</subscript>, el campo finito de orden <varname>q</varname>, donde <varname>q</varname> es primo, utilizando el algoritmo de Silver-Pohlig-Hellman.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Discrete_logarithm">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/DiscreteLogarithm.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/DiscreteLogarithm.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Divides">
         <term>Divides</term>
         <listitem>
          <synopsis>Divides (m,n)</synopsis>
          <para>Comprueba la divisibilidad (si <varname>m</varname> divide a <varname>n</varname>).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-EulerPhi">
         <term>EulerPhi</term>
         <listitem>
          <synopsis>EulerPhi (n)</synopsis>
          <para>Calcular la función phi de Euler para <varname>n</varname>, que es el número de enteros entre 1 y <varname>n</varname> primo relativo con <varname>n</varname>.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Euler_phi">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/EulerPhifunction.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/TotientFunction.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ExactDivision">
         <term>ExactDivision</term>
         <listitem>
          <synopsis>ExactDivision (n,d)</synopsis>
          <para>
	    Return <userinput>n/d</userinput> but only if <varname>d</varname>
	    divides <varname>n</varname>.  If <varname>d</varname>
	    does not divide <varname>n</varname> then this function returns
	    garbage.  This is a lot faster for very large numbers
	    than the operation <userinput>n/d</userinput>, but of course only
	    useful if you know that the division is exact.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Factorize">
         <term>Factorize</term>
         <listitem>
          <synopsis>Factorize (n)</synopsis>
          <para>
	    Return factorization of a number as a matrix.  The first
	    row is the primes in the factorization (including 1) and the
	    second row are the powers.  So for example:
	    <screen><prompt>genius&gt;</prompt> <userinput>Factorize(11*11*13)</userinput>
=
[1      11      13
 1      2       1]</screen>
	  </para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Factorization">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Factors">
         <term>Factors</term>
         <listitem>
          <synopsis>Factors (n)</synopsis>
          <para>
	    Return all factors of <varname>n</varname> in a vector.  This
	    includes all the non-prime factors as well.  It includes 1 and the
	    number itself.  So for example to print all the perfect numbers
	    (those that are sums of their factors) up to the number 1000 you
	    could do (this is of course very inefficient)
	    <programlisting>for n=1 to 1000 do (
    if MatrixSum (Factors(n)) == 2*n then
        print(n)
)
</programlisting>
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FermatFactorization">
         <term>FermatFactorization</term>
         <listitem>
          <synopsis>FermatFactorization (n,tries)</synopsis>
          <para>
	    Attempt fermat factorization of <varname>n</varname> into
	    <userinput>(t-s)*(t+s)</userinput>, returns <varname>t</varname>
	    and <varname>s</varname> as a vector if possible, <constant>null</constant> otherwise.
	    <varname>tries</varname> specifies the number of tries before
	    giving up.
	  </para>
          <para>Es una buena factorización si su número es el producto de dos factores que están muy cerca.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Fermat_factorization">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FindPrimitiveElementMod">
         <term>FindPrimitiveElementMod</term>
         <listitem>
          <synopsis>FindPrimitiveElementMod (q)</synopsis>
          <para>Encontrar el primer elemento primitivo en F<subscript>q</subscript>, en el grupo de orden finito<varname>q</varname>. Por supuesto, <varname>q</varname> debe de ser primo.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FindRandomPrimitiveElementMod">
         <term>FindRandomPrimitiveElementMod</term>
         <listitem>
          <synopsis>FindRandomPrimitiveElementMod (q)</synopsis>
          <para>Encontrar un elemento primitivo aleatorio en F<subscript>q</subscript>, en el grupo de orden finito <varname>q</varname> (q debe de ser primo)</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IndexCalculus">
         <term>IndexCalculus</term>
         <listitem>
          <synopsis>IndexCalculus (n,b,q,S)</synopsis>
          <para>Compute discrete log base <varname>b</varname> of n in F<subscript>q</subscript>, the finite
group of order <varname>q</varname> (<varname>q</varname> a prime), using the
factor base <varname>S</varname>.  <varname>S</varname> should be a column of
primes possibly with second column precalculated by
<function>IndexCalculusPrecalculation</function>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IndexCalculusPrecalculation">
         <term>IndexCalculusPrecalculation</term>
         <listitem>
          <synopsis>IndexCalculusPrecalculation (b,q,S)</synopsis>
	  <para>Run the precalculation step of
<function>IndexCalculus</function> for logarithms base <varname>b</varname> in
F<subscript>q</subscript>, the finite group of order <varname>q</varname>
(<varname>q</varname> a prime), for the factor base <varname>S</varname> (where
<varname>S</varname> is a column vector of primes).  The logs will be
precalculated and returned in the second column.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsEven">
         <term>IsEven</term>
         <listitem>
          <synopsis>IsEven (n)</synopsis>
          <para>Comprueba si un entero es par.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsMersennePrimeExponent">
         <term>IsMersennePrimeExponent</term>
         <listitem>
          <synopsis>IsMersennePrimeExponent (p)</synopsis>
          <para>
	    Tests if a positive integer <varname>p</varname> is a
	    Mersenne prime exponent.  That is if 
            2<superscript>p</superscript>-1 is a prime.  It does this
	    by looking it up in a table of known values which is relatively
	    short.
	    See also
	    <link linkend="gel-function-MersennePrimeExponents">MersennePrimeExponents</link>
	    and
	    <link linkend="gel-function-LucasLehmer">LucasLehmer</link>.
	  </para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Mersenne_prime">Wikipedia</ulink>, <ulink url="http://planetmath.org/encyclopedia/MersenneNumbers.html">Planetmath</ulink>, <ulink url="http://mathworld.wolfram.com/MersennePrime.html">Mathworld</ulink> o <ulink url="http://www.mersenne.org/">GIMPS</ulink>para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsNthPower">
         <term>IsNthPower</term>
         <listitem>
          <synopsis>IsNthPower (m,n)</synopsis>
          <para>Comprueba si un número racional <varname>m</varname> es una potencia <varname>n</varname>-ésima perfecta. Consulte <link linkend="gel-function-IsPerfectPower">IsPerfectPower</link> y <link linkend="gel-function-IsPerfectSquare">IsPerfectSquare</link>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsOdd">
         <term>IsOdd</term>
         <listitem>
          <synopsis>IsOdd (n)</synopsis>
          <para>Comprueba su un entero es impar.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsPerfectPower">
         <term>IsPerfectPower</term>
         <listitem>
          <synopsis>IsPerfectPower (n)</synopsis>
          <para>Comprobar si un entero es una potencia perfecta, a<superscript>b</superscript>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsPerfectSquare">
         <term>IsPerfectSquare</term>
         <listitem>
          <synopsis>IsPerfectSquare (n)</synopsis>
          <para>
	    Check an integer for being a perfect square of an integer.  The number must
	    be a real integer.  Negative integers are of course never perfect
	    squares of real integers.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsPrime">
         <term>IsPrime</term>
         <listitem>
          <synopsis>IsPrime (n)</synopsis>
          <para>
	    Tests primality of integers, for numbers less than 2.5e10 the
	    answer is deterministic (if Riemann hypothesis is true).  For
	    numbers larger, the probability of a false positive
	    depends on
	    <link linkend="gel-function-IsPrimeMillerRabinReps">
	    <function>IsPrimeMillerRabinReps</function></link>.  That
	    is the probability of false positive is 1/4 to the power
	    <function>IsPrimeMillerRabinReps</function>.  The default
	    value of 22 yields a probability of about 5.7e-14.
	  </para>
          <para>
	    If <constant>false</constant> is returned, you can be sure that
	    the number is a composite.  If you want to be absolutely sure
	    that you have a prime you can use 
	    <link linkend="gel-function-MillerRabinTestSure">
	    <function>MillerRabinTestSure</function></link> but it may take
	    a lot longer.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/PrimeNumber.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/PrimeNumber.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsPrimitiveMod">
         <term>IsPrimitiveMod</term>
         <listitem>
          <synopsis>IsPrimitiveMod (g,q)</synopsis>
          <para>Check if <varname>g</varname> is primitive in F<subscript>q</subscript>, the finite
group of order <varname>q</varname>, where <varname>q</varname> is a prime.  If <varname>q</varname> is not prime results are bogus.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsPrimitiveModWithPrimeFactors">
         <term>IsPrimitiveModWithPrimeFactors</term>
         <listitem>
          <synopsis>IsPrimitiveModWithPrimeFactors (g,q,f)</synopsis>
          <para>Check if <varname>g</varname> is primitive in F<subscript>q</subscript>, the finite
group of order <varname>q</varname>, where <varname>q</varname> is a prime and
<varname>f</varname> is a vector of prime factors of <varname>q</varname>-1.
If <varname>q</varname> is not prime results are bogus.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsPseudoprime">
         <term>IsPseudoprime</term>
         <listitem>
          <synopsis>IsPseudoprime (n,b)</synopsis>
          <para>If <varname>n</varname> is a pseudoprime base <varname>b</varname> but not a prime,
that is if <userinput>b^(n-1) == 1 mod n</userinput>.  This calles the <function>PseudoprimeTest</function></para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsStrongPseudoprime">
         <term>IsStrongPseudoprime</term>
         <listitem>
          <synopsis>IsStrongPseudoprime (n,b)</synopsis>
          <para>Test if <varname>n</varname> is a strong pseudoprime to base <varname>b</varname> but not a prime.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Jacobi">
         <term>Jacobi</term>
         <listitem>
          <synopsis>Jacobi (a,b)</synopsis>
          <para>Alias: <function>JacobiSymbol</function></para>
          <para>Calcular el símbolo de Jacobi (a/b) (b debe ser impar).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-JacobiKronecker">
         <term>JacobiKronecker</term>
         <listitem>
          <synopsis>JacobiKronecker (a,b)</synopsis>
          <para>Alias: <function>JacobiKroneckerSymbol</function></para>
          <para>Calcular el símbolo de Jacobi (a/b) con extensión de Kronecker (a/2)=(2/a) cuando sea impar, o (a/2)=0 cuando sea par.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LeastAbsoluteResidue">
         <term>LeastAbsoluteResidue</term>
         <listitem>
          <synopsis>LeastAbsoluteResidue (a,n)</synopsis>
          <para>Return the residue of <varname>a</varname> mod <varname>n</varname> with the least absolute value (in the interval -n/2 to n/2).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Legendre">
         <term>Legendre</term>
         <listitem>
          <synopsis>Legendre (a,p)</synopsis>
          <para>Alias: <function>LegendreSymbol</function></para>
          <para>Calcular el símbolo de Legendre (a/p).</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/LegendreSymbol.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/LegendreSymbol.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LucasLehmer">
         <term>LucasLehmer</term>
         <listitem>
          <synopsis>LucasLehmer (p)</synopsis>
          <para>Test if 2<superscript>p</superscript>-1 is a Mersenne prime using the Lucas-Lehmer test.
	    See also
	    <link linkend="gel-function-MersennePrimeExponents">MersennePrimeExponents</link>
	    and
	    <link linkend="gel-function-IsMersennePrimeExponent">IsMersennePrimeExponent</link>.
          </para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Lucas%E2%80%93Lehmer_primality_test">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/LucasLhemer.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/Lucas-LehmerTest.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LucasNumber">
         <term>LucasNumber</term>
         <listitem>
          <synopsis>LucasNumber (n)</synopsis>
          <para>Devuelve el <varname>n</varname>-ésimo número de Lucas.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Lucas_number">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/LucasNumbers.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/LucasNumber.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MaximalPrimePowerFactors">
         <term>MaximalPrimePowerFactors</term>
         <listitem>
          <synopsis>MaximalPrimePowerFactors (n)</synopsis>
          <para>Devuelve todos los factores primos de un número.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MersennePrimeExponents">
         <term>MersennePrimeExponents</term>
         <listitem>
          <synopsis>MersennePrimeExponents</synopsis>
          <para>
	    A vector of known Mersenne prime exponents, that is
	    a list of positive integers
	    <varname>p</varname> such that
            2<superscript>p</superscript>-1 is a prime.
	    See also
	    <link linkend="gel-function-IsMersennePrimeExponent">IsMersennePrimeExponent</link>
	    and
	    <link linkend="gel-function-LucasLehmer">LucasLehmer</link>.
	  </para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Mersenne_prime">Wikipedia</ulink>, <ulink url="http://planetmath.org/encyclopedia/MersenneNumbers.html">Planetmath</ulink>, <ulink url="http://mathworld.wolfram.com/MersennePrime.html">Mathworld</ulink> o <ulink url="http://www.mersenne.org/">GIMPS</ulink>para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MillerRabinTest">
         <term>MillerRabinTest</term>
         <listitem>
          <synopsis>MillerRabinTest (n,reps)</synopsis>
          <para>
	    Use the Miller-Rabin primality test on <varname>n</varname>,
	    <varname>reps</varname> number of times.  The probability of false
	    positive is <userinput>(1/4)^reps</userinput>.  It is probably
	    usually better to use
	    <link linkend="gel-function-IsPrime">
	    <function>IsPrime</function></link> since that is faster and
	    better on smaller integers.
	  </para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/MillerRabinPrimeTest.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MillerRabinTestSure">
         <term>MillerRabinTestSure</term>
         <listitem>
          <synopsis>MillerRabinTestSure (n)</synopsis>
          <para>
	    Use the Miller-Rabin primality test on <varname>n</varname> with
	    enough bases that assuming the Generalized Reimann Hypothesis the
	    result is deterministic.
	  </para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/MillerRabinPrimeTest.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ModInvert">
         <term>ModInvert</term>
         <listitem>
          <synopsis>ModInvert (n,m)</synopsis>
          <para>Devuelve el inverso de n módulo m.</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/ModularInverse.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MoebiusMu">
         <term>MoebiusMu</term>
         <listitem>
          <synopsis>MoebiusMu (n)</synopsis>
          <para>
	    Return the Moebius mu function evaluated in <varname>n</varname>.
	    That is, it returns 0 if <varname>n</varname> is not a product
	    of distinct primes and <userinput>(-1)^k</userinput> if it is
	    a product of <varname>k</varname> distinct primes.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/MoebiusFunction.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/MoebiusFunction.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NextPrime">
         <term>NextPrime</term>
         <listitem>
          <synopsis>NextPrime (n)</synopsis>
          <para>
	    Returns the least prime greater than <varname>n</varname>.
	    Negatives of primes are considered prime and so to get the
	    previous prime you can use <userinput>-NextPrime(-n)</userinput>.
	  </para>
          <para>
	    This function uses the GMP's <function>mpz_nextprime</function>
	    which in turn uses the probabilistic Miller-Rabin test
	    (See also <link linkend="gel-function-MillerRabinTest">MillerRabinTest</link>).
	    The probability
	    of false positive is not tunable, but is low enough
	    for all practical purposes.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/PrimeNumber.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/PrimeNumber.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PadicValuation">
         <term>PadicValuation</term>
         <listitem>
          <synopsis>PadicValuation (n,p)</synopsis>
          <para>Returns the p-adic valuation (number of trailing zeros in base <varname>p</varname>).</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/PAdicValuation.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PowerMod">
         <term>PowerMod</term>
         <listitem>
          <synopsis>PowerMod (a,b,m)</synopsis>
          <para>
	    Compute <userinput>a^b mod m</userinput>.  The
	    <varname>b</varname>'s power of <varname>a</varname> modulo
	    <varname>m</varname>.  It is not neccessary to use this function
	    as it is automatically used in modulo mode.  Hence
	    <userinput>a^b mod m</userinput> is just as fast.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Prime">
         <term>Prime</term>
         <listitem>
          <synopsis>Prime (n)</synopsis>
          <para>Alias: <function>prime</function></para>
          <para>Devuelve el <varname>n</varname>-ésimo primo (hasta un límite).</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/PrimeNumber.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/PrimeNumber.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PrimeFactors">
         <term>PrimeFactors</term>
         <listitem>
          <synopsis>PrimeFactors (n)</synopsis>
          <para>Devuelve todos los factores primos de un número como un vector.</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/PrimeFactor.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PseudoprimeTest">
         <term>PseudoprimeTest</term>
         <listitem>
          <synopsis>PseudoprimeTest (n,b)</synopsis>
	  <para>Pseudoprime test, returns <constant>true</constant> if and only if
		<userinput>b^(n-1) == 1  mod n</userinput></para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/Pseudoprime.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/Pseudoprime.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RemoveFactor">
         <term>RemoveFactor</term>
         <listitem>
          <synopsis>RemoveFactor (n,m)</synopsis>
          <para>Removes all instances of the factor <varname>m</varname> from the number <varname>n</varname>.  That is divides by the largest power of <varname>m</varname>, that divides <varname>n</varname>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/Divisibility.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/Factor.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SilverPohligHellmanWithFactorization">
         <term>SilverPohligHellmanWithFactorization</term>
         <listitem>
          <synopsis>SilverPohligHellmanWithFactorization (n,b,q,f)</synopsis>
          <para>Find discrete log of <varname>n</varname> base <varname>b</varname> in F<subscript>q</subscript>, the finite group of order <varname>q</varname>, where <varname>q</varname> is a prime using the Silver-Pohlig-Hellman algorithm, given <varname>f</varname> being the factorization of <varname>q</varname>-1.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SqrtModPrime">
         <term>SqrtModPrime</term>
         <listitem>
          <synopsis>SqrtModPrime (n,p)</synopsis>
          <para>Find square root of <varname>n</varname> modulo <varname>p</varname> (where <varname>p</varname> is a prime).  Null is returned if not a quadratic residue.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/QuadraticResidue.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/QuadraticResidue.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-StrongPseudoprimeTest">
         <term>StrongPseudoprimeTest</term>
         <listitem>
          <synopsis>StrongPseudoprimeTest (n,b)</synopsis>
          <para>Run the strong pseudoprime test base <varname>b</varname> on <varname>n</varname>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/StrongPseudoprime.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/StrongPseudoprime.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-gcd">
         <term>gcd</term>
         <listitem>
          <synopsis>gcd (a,args...)</synopsis>
          <para>Alias: <function>GCD</function></para>
          <para>
	    Greatest common divisor of integers.  You can enter as many
	    integers in the argument list, or you can give a vector or a matrix
	    of integers.  If you give more than one matrix of the same
	    size then GCD is done element by element.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/GreatestCommonDivisor.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/GreatestCommonDivisor.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-lcm">
         <term>lcm</term>
         <listitem>
          <synopsis>lcm (a,args...)</synopsis>
          <para>Alias: <function>LCM</function></para>
          <para>
	    Least common multiplier of integers.  You can enter as many
	    integers in the argument list, or you can give a vector or a matrix
	    of integers.  If you give more than one matrix of the same size
	    then LCM is done element by element.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/LeastCommonMultiple.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/LeastCommonMultiple.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-matrix">
      <title>Manipulación de matrices</title>
      <variablelist>
        <varlistentry id="gel-function-ApplyOverMatrix">
         <term>ApplyOverMatrix</term>
         <listitem>
          <synopsis>ApplyOverMatrix (a,func)</synopsis>
          <para>Aplicar una función sobre todos los elementos de una matriz y devolver una matriz con los resultados.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ApplyOverMatrix2">
         <term>ApplyOverMatrix2</term>
         <listitem>
          <synopsis>ApplyOverMatrix2 (a,b,func)</synopsis>
          <para>Aplicar una función sobre todos los elementos de dos matrices (o un valor y una matriz) y devolver una matriz con los resultados.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ColumnsOf">
         <term>ColumnsOf</term>
         <listitem>
          <synopsis>ColumnsOf (M)</synopsis>
          <para>Obtiene las columnas de una matriz como un vector horizontal.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ComplementSubmatrix">
         <term>ComplementSubmatrix</term>
         <listitem>
          <synopsis>ComplementSubmatrix (m,r,c)</synopsis>
          <para>Eliminar filas y columnas de una matriz.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-CompoundMatrix">
         <term>CompoundMatrix</term>
         <listitem>
          <synopsis>CompoundMatrix (k,A)</synopsis>
          <para>Calcular la k-ésima matriz compuesta de A.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-CountZeroColumns">
         <term>CountZeroColumns</term>
         <listitem>
          <synopsis>CountZeroColumns (M)</synopsis>
          <para>
	   Count the number of zero columns in a matrix.  For example
	   Once you column reduce a matrix you can use this to find
	   the nullity.  See <link linkend="gel-function-cref"><function>cref</function></link>
	   and <link linkend="gel-function-Nullity"><function>Nullity</function></link>.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DeleteColumn">
         <term>DeleteColumn</term>
         <listitem>
          <synopsis>DeleteColumn (M,col)</synopsis>
          <para>Elimina una columna de una matriz.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DeleteRow">
         <term>DeleteRow</term>
         <listitem>
          <synopsis>DeleteRow (M,row)</synopsis>
          <para>Elimina una fila de una matriz.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DiagonalOf">
         <term>DiagonalOf</term>
         <listitem>
          <synopsis>DiagonalOf (M)</synopsis>
          <para>Obtiene las entradas diagonales de una matriz como un vector columna.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Diagonal_of_a_matrix#Matrices">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DotProduct">
         <term>DotProduct</term>
         <listitem>
          <synopsis>DotProduct (u,v)</synopsis>
	  <para>Get the dot product of two vectors.  The vectors must be of the
same size.  No conjugates are taken so this is a bilinear form even if working over the complex numbers.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/DotProduct.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ExpandMatrix">
         <term>ExpandMatrix</term>
         <listitem>
          <synopsis>ExpandMatrix (M)</synopsis>
          <para>
	    Expands a matrix just like we do on unquoted matrix input.
	    That is we expand any internal matrices as blocks.  This is
	    a way to construct matrices out of smaller ones and this is
	    normally done automatically on input unless the matrix is quoted.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-HermitianProduct">
         <term>HermitianProduct</term>
         <listitem>
          <synopsis>HermitianProduct (u,v)</synopsis>
          <para>Alias: <function>InnerProduct</function></para>
          <para>Get the Hermitian product of two vectors.  The vectors must be of the same size.  This is a sesquilinear form using the identity matrix.</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/HermitianInnerProduct.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-I">
         <term>I</term>
         <listitem>
          <synopsis>I (n)</synopsis>
          <para>Alias: <function>eye</function></para>
	  <para>Devuelve una matriz identidad del tamaño dado, es decir, de <varname>n</varname> por <varname>n</varname>. Si <varname>n</varname> es cero, devuelve <constant>null</constant>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/IdentityMatrix.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IndexComplement">
         <term>IndexComplement</term>
         <listitem>
          <synopsis>IndexComplement (vec,msize)</synopsis>
          <para>Return the index complement of a vector of indexes.  Everything is one based.  For example for vector <userinput>[2,3]</userinput> and size
<userinput>5</userinput>, we return <userinput>[1,4,5]</userinput>.  If
<varname>msize</varname> is 0, we always return <constant>null</constant>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsDiagonal">
         <term>IsDiagonal</term>
         <listitem>
          <synopsis>IsDiagonal (M)</synopsis>
          <para>Es una matriz diagonal.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Diagonal_matrix">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/DiagonalMatrix.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsIdentity">
         <term>IsIdentity</term>
         <listitem>
          <synopsis>IsIdentity (x)</synopsis>
          <para>Check if a matrix is the identity matrix.  Automatically returns <constant>false</constant>
	    if the matrix is not square.  Also works on numbers, in which
	    case it is equivalent to <userinput>x==1</userinput>.  When <varname>x</varname> is
	    <constant>null</constant> (we could think of that as a 0 by 0 matrix),
	    no error is generated and <constant>false</constant> is returned.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsLowerTriangular">
         <term>IsLowerTriangular</term>
         <listitem>
          <synopsis>IsLowerTriangular (M)</synopsis>
          <para>Is a matrix lower triangular. That is, are all the entries above the diagonal zero.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsMatrixInteger">
         <term>IsMatrixInteger</term>
         <listitem>
          <synopsis>IsMatrixInteger (M)</synopsis>
          <para>Comprobar si una matriz es una matriz de enteros (no compleja).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsMatrixNonnegative">
         <term>IsMatrixNonnegative</term>
         <listitem>
          <synopsis>IsMatrixNonnegative (M)</synopsis>
          <para>Check if a matrix is non-negative, that is if each element is non-negative.
	  Do not confuse positive matrices with positive semi-definite matrices.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Positive_matrix">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsMatrixPositive">
         <term>IsMatrixPositive</term>
         <listitem>
          <synopsis>IsMatrixPositive (M)</synopsis>
	  <para>Check if a matrix is positive, that is if each element is
positive (and hence real).  In particular, no element is 0.  Do not confuse
positive matrices with positive definite matrices.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Positive_matrix">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsMatrixRational">
         <term>IsMatrixRational</term>
         <listitem>
          <synopsis>IsMatrixRational (M)</synopsis>
          <para>Comprobar si el argumento es una matriz de números racionales (no complejos)</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsMatrixReal">
         <term>IsMatrixReal</term>
         <listitem>
          <synopsis>IsMatrixReal (M)</synopsis>
          <para>Check if a matrix is a matrix of real (non-complex) numbers.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsMatrixSquare">
         <term>IsMatrixSquare</term>
         <listitem>
          <synopsis>IsMatrixSquare (M)</synopsis>
          <para>
	    Check if a matrix is square, that is its width is equal to
	    its height.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsUpperTriangular">
         <term>IsUpperTriangular</term>
         <listitem>
          <synopsis>IsUpperTriangular (M)</synopsis>
          <para>Is a matrix upper triangular?  That is, a matrix is upper triangular if all all the entries below the diagonal are zero.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsValueOnly">
         <term>IsValueOnly</term>
         <listitem>
          <synopsis>IsValueOnly (M)</synopsis>
          <para>Check if a matrix is a matrix of numbers only.  Many internal
functions make this check.  Values can be any number including complex numbers.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsVector">
         <term>IsVector</term>
         <listitem>
          <synopsis>IsVector (v)</synopsis>
          <para>
	    Is argument a horizontal or a vertical vector.  Genius does
	    not distinguish between a matrix and a vector and a vector
	    is just a 1 by <varname>n</varname> or <varname>n</varname> by 1 matrix.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsZero">
         <term>IsZero</term>
         <listitem>
          <synopsis>IsZero (x)</synopsis>
          <para>Check if a matrix is composed of all zeros.  Also works on numbers, in which
	    case it is equivalent to <userinput>x==0</userinput>.  When <varname>x</varname> is
	    <constant>null</constant> (we could think of that as a 0 by 0 matrix),
	    no error is generated and <constant>true</constant> is returned as the condition is
	    vacuous.
	    </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LowerTriangular">
         <term>LowerTriangular</term>
         <listitem>
          <synopsis>LowerTriangular (M)</synopsis>
          <para>Returns a copy of the matrix <varname>M</varname> with all the entries above the diagonal set to zero.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MakeDiagonal">
         <term>MakeDiagonal</term>
         <listitem>
          <synopsis>MakeDiagonal (v,arg...)</synopsis>
          <para>Alias: <function>diag</function></para>
          <para>Hacer una matriz diagonal de un vector.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Diagonal_matrix">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/DiagonalMatrix.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MakeVector">
         <term>MakeVector</term>
         <listitem>
          <synopsis>MakeVector (A)</synopsis>
          <para>Make column vector out of matrix by putting columns above
		  each other.  Returns <constant>null</constant> when given <constant>null</constant>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MatrixProduct">
         <term>MatrixProduct</term>
         <listitem>
          <synopsis>MatrixProduct (A)</synopsis>
          <para>
	    Calculate the product of all elements in a matrix or vector.
	    That is we multiply all the elements and return a number that
	    is the product of all the elements.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MatrixSum">
         <term>MatrixSum</term>
         <listitem>
          <synopsis>MatrixSum (A)</synopsis>
          <para>
	    Calculate the sum of all elements in a matrix or vector.  That is
	    we add all the elements and return a number that is the
	    sum of all the elements.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MatrixSumSquares">
         <term>MatrixSumSquares</term>
         <listitem>
          <synopsis>MatrixSumSquares (A)</synopsis>
          <para>Calculate the sum of squares of all elements in a matrix
	    or vector.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-OuterProduct">
         <term>OuterProduct</term>
         <listitem>
          <synopsis>OuterProduct (u,v)</synopsis>
          <para>Get the outer product of two vectors.  That is, suppose that
<varname>u</varname> and <varname>v</varname> are vertical vectors, then
the outer product is <userinput>v * u.'</userinput>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ReverseVector">
         <term>ReverseVector</term>
         <listitem>
          <synopsis>ReverseVector (v)</synopsis>
	  <para>Invierte el orden de los elementos de un vector (devuelve <constant>null</constant> si se le pasa <constant>null</constant>).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RowSum">
         <term>RowSum</term>
         <listitem>
          <synopsis>RowSum (m)</synopsis>
          <para>Calculate sum of each row in a matrix and return a vertical
vector with the result.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RowSumSquares">
         <term>RowSumSquares</term>
         <listitem>
          <synopsis>RowSumSquares (m)</synopsis>
          <para>Calcular la suma de los cuadrados de cada fila de una matriz.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RowsOf">
         <term>RowsOf</term>
         <listitem>
          <synopsis>RowsOf (M)</synopsis>
	  <para>Gets the rows of a matrix as a vertical vector.  Each element
of the vector is a horizontal vector which is the corresponding row of
<varname>M</varname>.  This function is useful if you wish to loop over the
rows of a matrix.  For example, as <userinput>for r in RowsOf(M) do
something(r)</userinput>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SetMatrixSize">
         <term>SetMatrixSize</term>
         <listitem>
          <synopsis>SetMatrixSize (M,filas,columnas)</synopsis>
          <para>Make new matrix of given size from old one.  That is, a new
	  matrix will be returned to which the old one is copied.  Entries that
	  don't fit are clipped and extra space is filled with zeros.
	  if <varname>rows</varname> or <varname>columns</varname> are zero
	  then <constant>null</constant> is returned.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ShuffleVector">
         <term>ShuffleVector</term>
         <listitem>
          <synopsis>ShuffleVector (v)</synopsis>
	  <para>Mezcla los elementos de un vector (devuelve <constant>null</constant> si se le pasa <constant>null</constant>).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SortVector">
         <term>SortVector</term>
         <listitem>
          <synopsis>SortVector (v)</synopsis>
          <para>Ordenar los elementos del vector en orden ascendente.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-StripZeroColumns">
         <term>StripZeroColumns</term>
         <listitem>
          <synopsis>StripZeroColumns (M)</synopsis>
          <para>Quita todas las columnas de ceros de <varname>M</varname>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-StripZeroRows">
         <term>StripZeroRows</term>
         <listitem>
          <synopsis>StripZeroRows (M)</synopsis>
          <para>Quita todas las filas de ceros de <varname>M</varname>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Submatrix">
         <term>Submatrix</term>
         <listitem>
          <synopsis>Submatrix (m,r,c)</synopsis>
          <para>Return column(s) and row(s) from a matrix.  This is
just equivalent to <userinput>m@(r,c)</userinput>.  <varname>r</varname>
and <varname>c</varname> should be vectors of rows and columns (or single numbers if only one row or column is needed).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SwapRows">
         <term>SwapRows</term>
         <listitem>
          <synopsis>SwapRows (m,fila1,fila2)</synopsis>
          <para>Intercambiar dos columnas de una matriz.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-UpperTriangular">
         <term>UpperTriangular</term>
         <listitem>
          <synopsis>UpperTriangular (M)</synopsis>
          <para>Returns a copy of the matrix <varname>M</varname> with all the entries below the diagonal set to zero.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-columns">
         <term>columns</term>
         <listitem>
          <synopsis>columns (M)</synopsis>
          <para>Obtener el número de columnas de una matriz.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-elements">
         <term>elements</term>
         <listitem>
          <synopsis>elements (M)</synopsis>
          <para>Get the total number of elements of a matrix.  This is the
number of columns times the number of rows.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ones">
         <term>ones</term>
         <listitem>
          <synopsis>ones (filas,columnas...)</synopsis>
	  <para>Make an matrix of all ones (or a row vector if only one argument is given).  Returns <constant>null</constant> if either rows or columns are zero.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-rows">
         <term>rows</term>
         <listitem>
          <synopsis>rows (M)</synopsis>
          <para>Obtener el número de filas de una matriz.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-zeros">
         <term>zeros</term>
         <listitem>
          <synopsis>zeros (filas,columnas...)</synopsis>
	  <para>Make a matrix of all zeros (or a row vector if only one argument is given).  Returns <constant>null</constant> if either rows or columns are zero.</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-linear-algebra">
      <title>Álgebra lineal</title>
      <variablelist>
        <varlistentry id="gel-function-AuxiliaryUnitMatrix">
         <term>AuxiliaryUnitMatrix</term>
         <listitem>
          <synopsis>AuxiliaryUnitMatrix (n)</synopsis>
          <para>Get the auxiliary unit matrix of size <varname>n</varname>.  This is a square matrix matrix with that is all zero except the
superdiagonal being all ones.  It is the Jordan block matrix of one zero eigenvalue.</para>
          <para>
	    See
	    <ulink url="http://planetmath.org/encyclopedia/JordanCanonicalFormTheorem.html">Planetmath</ulink> or
	    <ulink url="http://mathworld.wolfram.com/JordanBlock.html">Mathworld</ulink> for more information on Jordan Cannonical Form.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-BilinearForm">
         <term>BilinearForm</term>
         <listitem>
          <synopsis>BilinearForm (v,A,w)</synopsis>
          <para>Evaluar (v,w) con respecto a la forma bilineal dada por la matriz A.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-BilinearFormFunction">
         <term>BilinearFormFunction</term>
         <listitem>
          <synopsis>BilinearFormFunction (A)</synopsis>
          <para>Devolver una función que evalúa dos vectores con respecto a la forma bilineal dada por A.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-CharacteristicPolynomial">
         <term>CharacteristicPolynomial</term>
         <listitem>
          <synopsis>CharacteristicPolynomial (M)</synopsis>
          <para>Alias: <function>CharPoly</function></para>
	  <para>Get the characteristic polynomial as a vector.  That is, return
the coefficients of the polynomial starting with the constant term.  This is
the polynomial defined by <userinput>det(M-xI)</userinput>.  The roots of this
polynomial are the eigenvalues of <varname>M</varname>.
See also <link linkend="gel-function-CharacteristicPolynomialFunction">CharacteristicPolynomialFunction</link>.
</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/CharacteristicEquation.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-CharacteristicPolynomialFunction">
         <term>CharacteristicPolynomialFunction</term>
         <listitem>
          <synopsis>CharacteristicPolynomialFunction (M)</synopsis>
	  <para>Get the characteristic polynomial as a function.  This is
the polynomial defined by <userinput>det(M-xI)</userinput>.  The roots of this
polynomial are the eigenvalues of <varname>M</varname>.
See also <link linkend="gel-function-CharacteristicPolynomial">CharacteristicPolynomial</link>.
</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/CharacteristicEquation.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ColumnSpace">
         <term>ColumnSpace</term>
         <listitem>
          <synopsis>ColumnSpace (M)</synopsis>
	  <para>Get a basis matrix for the columnspace of a matrix.  That is,
return a matrix whose columns are the basis for the column space of
<varname>M</varname>.  That is the space spanned by the columns of
<varname>M</varname>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-CommutationMatrix">
         <term>CommutationMatrix</term>
         <listitem>
          <synopsis>CommutationMatrix (m, n)</synopsis>
	  <para>Devolver la matriz de conmutación K(m,n) que es la única matriz m*n por m*n tal que K(m,n) * MakeVector(A) = MakeVector(A.') para todas las matrices A m por n.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-CompanionMatrix">
         <term>CompanionMatrix</term>
         <listitem>
          <synopsis>CompanionMatrix (p)</synopsis>
          <para>Matriz acompañante de un polinomio (como vector).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ConjugateTranspose">
         <term>ConjugateTranspose</term>
         <listitem>
          <synopsis>ConjugateTranspose (M)</synopsis>
          <para>Conjugate transpose of a matrix (adjoint).  This is the
	  same as the <userinput>'</userinput> operator.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/ConjugateTranspose.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Convolution">
         <term>Convolution</term>
         <listitem>
          <synopsis>Convolution (a,b)</synopsis>
          <para>Alias: <function>convol</function></para>
          <para>Calcular la convolución de dos vectores horizontales.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ConvolutionVector">
         <term>ConvolutionVector</term>
         <listitem>
          <synopsis>ConvolutionVector (a,b)</synopsis>
          <para>Calculate convolution of two horizontal vectors.  Return
result as a vector and not added together.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-CrossProduct">
         <term>CrossProduct</term>
         <listitem>
          <synopsis>CrossProduct (v,w)</synopsis>
	  <para>CrossProduct of two vectors in R<superscript>3</superscript> as
		  a column vector.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DeterminantalDivisorsInteger">
         <term>DeterminantalDivisorsInteger</term>
         <listitem>
          <synopsis>DeterminantalDivisorsInteger (M)</synopsis>
          <para>Get the determinantal divisors of an integer matrix (not its characteristic).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DirectSum">
         <term>DirectSum</term>
         <listitem>
          <synopsis>DirectSum (M,N...)</synopsis>
          <para>Suma directa de matrices.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DirectSumMatrixVector">
         <term>DirectSumMatrixVector</term>
         <listitem>
          <synopsis>DirectSumMatrixVector (v)</synopsis>
          <para>Suma directa de un vector de matrices.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Eigenvalues">
         <term>Eigenvalues</term>
         <listitem>
          <synopsis>Eigenvalues (M)</synopsis>
          <para>Alias: <function>eig</function></para>
          <para>Get the eigenvalues of a square matrix.
	    Currently only works for matrices of size up to 4 by 4, or for
	    triangular matrices (for which the eigenvalues are on the
            diagonal).
	  </para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Eigenvalue">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/Eigenvalue.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/Eigenvalue.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Eigenvectors">
         <term>Eigenvectors</term>
         <listitem>
          <synopsis>Eigenvectors (M)</synopsis>
          <synopsis>Eigenvectors (M, &amp;eigenvalues)</synopsis>
          <synopsis>Eigenvectors (M, &amp;eigenvalues, &amp;multiplicities)</synopsis>
	  <para>Obtener los autovectores de una matriz cuadrada. Opcionalmente, obtener los autovalores y su multiplicidad algebraica. Actualmente funciona sólo para matrices de hasta 2x2.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Eigenvector">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/Eigenvector.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/Eigenvector.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-GramSchmidt">
         <term>GramSchmidt</term>
         <listitem>
          <synopsis>GramSchmidt (v,B...)</synopsis>
	  <para>Apply the Gram-Schmidt process (to the columns) with respect to
inner product given by <varname>B</varname>.  If <varname>B</varname> is not
given then the standard Hermitian product is used.  <varname>B</varname> can
either be a sesquilinear function of two arguments or it can be a matrix giving
a sesquilinear form.  The vectors will be made orthonormal with respect to
<varname>B</varname>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/GramSchmidtOrthogonalization.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-HankelMatrix">
         <term>HankelMatrix</term>
         <listitem>
          <synopsis>HankelMatrix (c,r)</synopsis>
          <para>Hankel matrix.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-HilbertMatrix">
         <term>HilbertMatrix</term>
         <listitem>
          <synopsis>HilbertMatrix (n)</synopsis>
          <para>Matriz de Hilbert de orden <varname>n</varname>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/HilbertMatrix.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Image">
         <term>Image</term>
         <listitem>
          <synopsis>Image (T)</synopsis>
          <para>Obtener la imagen (espacio columna) de una transformación lineal.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-InfNorm">
         <term>InfNorm</term>
         <listitem>
          <synopsis>InfNorm (v)</synopsis>
          <para>Get the Inf Norm of a vector, sometimes called the sup norm or the max norm.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-InvariantFactorsInteger">
         <term>InvariantFactorsInteger</term>
         <listitem>
          <synopsis>InvariantFactorsInteger (M)</synopsis>
          <para>Get the invariant factors of a square integer matrix (not its characteristic).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-InverseHilbertMatrix">
         <term>InverseHilbertMatrix</term>
         <listitem>
          <synopsis>InverseHilbertMatrix (n)</synopsis>
          <para>Inverse Hilbert matrix of order <varname>n</varname>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/HilbertMatrix.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsHermitian">
         <term>IsHermitian</term>
         <listitem>
          <synopsis>IsHermitian (M)</synopsis>
          <para>Is a matrix Hermitian.  That is, is it equal to its conjugate transpose.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/HermitianMatrix.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsInSubspace">
         <term>IsInSubspace</term>
         <listitem>
          <synopsis>IsInSubspace (v,W)</synopsis>
          <para>Comprueba si un vector está en un subespacio.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsInvertible">
         <term>IsInvertible</term>
         <listitem>
          <synopsis>IsInvertible (n)</synopsis>
          <para>Is a matrix (or number) invertible (Integer matrix is invertible iff it's invertible over the integers).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsInvertibleField">
         <term>IsInvertibleField</term>
         <listitem>
          <synopsis>IsInvertibleField (n)</synopsis>
          <para>Is a matrix (or number) invertible over a field.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsNormal">
         <term>IsNormal</term>
         <listitem>
          <synopsis>IsNormal (M)</synopsis>
          <para>Is <varname>M</varname> a normal matrix.  That is,
	  does <userinput>M*M' == M'*M</userinput>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/NormalMatrix.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/NormalMatrix.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsPositiveDefinite">
         <term>IsPositiveDefinite</term>
         <listitem>
          <synopsis>IsPositiveDefinite (M)</synopsis>
          <para>Is <varname>M</varname> a Hermitian positive definite matrix.  That is if
<userinput>HermitianProduct(M*v,v)</userinput> is always strictly positive for
any vector <varname>v</varname>.
<varname>M</varname> must be square and Hermitian to be positive definite.
The check that is performed is that every principal submatrix has a non-negative
determinant.
(See <link linkend="gel-function-HermitianProduct">HermitianProduct</link>)</para>
	  <para>
	    Note that some authors (for example Mathworld) do not require that
	    <varname>M</varname> be Hermitian, and then the condition is
	    on the real part of the inner product, but we do not take this
	    view.  If you wish to perform this check, just check the
	    Hermitian part of the matrix <varname>M</varname> as follows:
	    <userinput>IsPositiveDefinite(M+M')</userinput>.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/PositiveDefinite.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/PositiveDefiniteMatrix.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsPositiveSemidefinite">
         <term>IsPositiveSemidefinite</term>
         <listitem>
          <synopsis>IsPositiveSemidefinite (M)</synopsis>
          <para>Is <varname>M</varname> a Hermitian positive semidefinite matrix.  That is if
<userinput>HermitianProduct(M*v,v)</userinput> is always non-negative for
any vector <varname>v</varname>.
<varname>M</varname> must be square and Hermitian to be positive semidefinite.
The check that is performed is that every principal submatrix has a non-negative
determinant.
(See <link linkend="gel-function-HermitianProduct">HermitianProduct</link>)</para>
	  <para>
	    Note that some authors do not require that
	    <varname>M</varname> be Hermitian, and then the condition is
	    on the real part of the inner product, but we do not take this
	    view.  If you wish to perform this check, just check the
	    Hermitian part of the matrix <varname>M</varname> as follows:
	    <userinput>IsPositiveSemidefinite(M+M')</userinput>.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/PositiveSemidefinite.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/PositiveSemidefiniteMatrix.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsSkewHermitian">
         <term>IsSkewHermitian</term>
         <listitem>
          <synopsis>IsSkewHermitian (M)</synopsis>
          <para>Es matriz antihermítica. Esto es, la transposición conjugada es igual al negativo de la matriz.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/SkewHermitianMatrix.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsUnitary">
         <term>IsUnitary</term>
         <listitem>
          <synopsis>IsUnitary (M)</synopsis>
          <para>Is a matrix unitary?  That is, does
	  <userinput>M'*M</userinput> and <userinput>M*M'</userinput>
	  equal the identity.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/UnitaryTransformation.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/UnitaryMatrix.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-JordanBlock">
         <term>JordanBlock</term>
         <listitem>
          <synopsis>JordanBlock (n,lambda)</synopsis>
          <para>Alias: <function>J</function></para>
          <para>Get the Jordan block corresponding to the eigenvalue
	  <varname>lambda</varname> with multiplicity <varname>n</varname>.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/JordanCanonicalFormTheorem.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/JordanBlock.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Kernel">
         <term>Kernel</term>
         <listitem>
          <synopsis>Kernel (T)</synopsis>
          <para>Obtener el núcleo (espacio nulo) de una trasformación lineal.</para>
	  <para>
	  (See <link linkend="gel-function-NullSpace">NullSpace</link>)
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LUDecomposition">
         <term>LUDecomposition</term>
         <listitem>
          <synopsis>LUDecomposition (A, L, U)</synopsis>
          <para>
	    Get the LU decomposition of <varname>A</varname>
	    and store the result in the <varname>L</varname> and
	    <varname>U</varname> which should be references.  It returns <constant>true</constant>
	    if successful.
	    For example suppose that A is a square matrix, then after running:
	    <screen><prompt>genius&gt;</prompt> <userinput>LUDecomposition(A,&amp;L,&amp;U)</userinput>
</screen>
	    You will have the lower matrix stored in a variable called
	    <varname>L</varname> and the upper matrix in a variable called
	    <varname>U</varname>.
	  </para>
	  <para>
	    This is the LU decomposition of a matrix aka Crout and/or Cholesky
	    reduction.
	    (ISBN 0-201-11577-8 pp.99-103)
	    The upper triangular matrix features a diagonal
	    of values 1 (one).  This is not Doolittle's Method which features
	    the 1's diagonal on the lower matrix. 
	  </para>
	  <para>
	    Not all matrices have LU decompositions, for example
	    <userinput>[0,1;1,0]</userinput> does not and this function returns
	    <constant>false</constant> in this case and sets <varname>L</varname>
	    and <varname>U</varname> to <constant>null</constant>.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/LUDecomposition.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/LUDecomposition.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Minor">
         <term>Minor</term>
         <listitem>
          <synopsis>Minor (M,i,j)</synopsis>
          <para>Obtener el menor <varname>i</varname>-<varname>j</varname> de una matriz.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/Minor.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NonPivotColumns">
         <term>NonPivotColumns</term>
         <listitem>
          <synopsis>NonPivotColumns (M)</synopsis>
          <para>Return the columns that are not the pivot columns of a matrix.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Norm">
         <term>Norm</term>
         <listitem>
          <synopsis>Norm (v,p...)</synopsis>
          <para>Alias: <function>norm</function></para>
          <para>Get the p Norm (or 2 Norm if no p is supplied) of a vector.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NullSpace">
         <term>NullSpace</term>
         <listitem>
          <synopsis>NullSpace (T)</synopsis>
          <para>Get the nullspace of a matrix.  That is the kernel of the
	  linear mapping that the matrix represents.  This is returned
	  as a matrix whose column space is the nullspace of
	  <varname>T</varname>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/Nullspace.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Nullity">
         <term>Nullity</term>
         <listitem>
          <synopsis>Nullity (M)</synopsis>
          <para>Alias: <function>nullity</function></para>
          <para>Get the nullity of a matrix.  That is, return the dimension of
the nullspace; the dimension of the kernel of <varname>M</varname>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/Nullity.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-OrthogonalComplement">
         <term>OrthogonalComplement</term>
         <listitem>
          <synopsis>OrthogonalComplement (M)</synopsis>
          <para>Obtener el complemento ortogonal del espacio de columnas.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PivotColumns">
         <term>PivotColumns</term>
         <listitem>
          <synopsis>PivotColumns (M)</synopsis>
          <para>Return pivot columns of a matrix, that is columns which have a leading 1 in row reduced form.  Also returns the row where they occur.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Projection">
         <term>Projection</term>
         <listitem>
          <synopsis>Projection (v,W,B...)</synopsis>
	  <para>Projection of vector <varname>v</varname> onto subspace
<varname>W</varname> with respect to inner product given by
<varname>B</varname>.  If <varname>B</varname> is not given then the standard
Hermitian product is used.  <varname>B</varname> can either be a sesquilinear
function of two arguments or it can be a matrix giving a sesquilinear form.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-QRDecomposition">
         <term>QRDecomposition</term>
         <listitem>
          <synopsis>QRDecomposition (A, Q)</synopsis>
          <para>
	    Get the QR decomposition of a square matrix <varname>A</varname>,
	    returns the upper triangular matrix <varname>R</varname>
	    and sets <varname>Q</varname> to the orthogonal (unitary) matrix.
	    <varname>Q</varname> should be a reference or <constant>null</constant> if you don't
	    want any return.
	    For example:
	    <screen><prompt>genius&gt;</prompt> <userinput>R = QRDecomposition(A,&amp;Q)</userinput>
</screen>
	    You will have the upper triangular matrix stored in
	    a variable called
	    <varname>R</varname> and the orthogonal (unitary) matrix stored in
	    <varname>Q</varname>.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/QRDecomposition.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/QRDecomposition.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RayleighQuotient">
         <term>RayleighQuotient</term>
         <listitem>
          <synopsis>RayleighQuotient (A,x)</synopsis>
          <para>Return the Rayleigh quotient (also called the Rayleigh-Ritz quotient or ratio) of a matrix and a vector.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/RayleighQuotient.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RayleighQuotientIteration">
         <term>RayleighQuotientIteration</term>
         <listitem>
          <synopsis>RayleighQuotientIteration (A,x,epsilon,maxiter,vecref)</synopsis>
          <para>Find eigenvalues of <varname>A</varname> using the Rayleigh
	        quotient iteration method.  <varname>x</varname> is a guess
		at a eigenvector and could be random.  It should have 
	        nonzero imaginary part if it will have any chance at finding
	        complex eigenvalues.  The code will run at most
		<varname>maxiter</varname> iterations and return <constant>null</constant>
		if we cannot get within an error of <varname>epsilon</varname>.
		<varname>vecref</varname> should either be <constant>null</constant> or a reference
		to a variable where the eigenvector should be stored.
		</para>
          <para>
	    See
	    <ulink url="http://planetmath.org/encyclopedia/RayleighQuotient.html">Planetmath</ulink> for more information on Rayleigh quotient.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Rank">
         <term>Rank</term>
         <listitem>
          <synopsis>Rank (M)</synopsis>
          <para>Alias: <function>rank</function></para>
          <para>Obtener el rango de una matriz.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/SylvestersLaw.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RosserMatrix">
         <term>RosserMatrix</term>
         <listitem>
          <synopsis>RosserMatrix ()</synopsis>
          <para>Rosser matrix, a classic symmetric eigenvalue test problem.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Rotation2D">
         <term>Rotation2D</term>
         <listitem>
          <synopsis>Rotation2D (ángulo)</synopsis>
          <para>Alias: <function>RotationMatrix</function></para>
          <para>Return the matrix corresponding to rotation around origin in R<superscript>2</superscript>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Rotation3DX">
         <term>Rotation3DX</term>
         <listitem>
          <synopsis>Rotation3DX (ángulo)</synopsis>
          <para>Return the matrix corresponding to rotation around origin in R<superscript>3</superscript> about the x-axis.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Rotation3DY">
         <term>Rotation3DY</term>
         <listitem>
          <synopsis>Rotation3DY (ángulo)</synopsis>
          <para>Return the matrix corresponding to rotation around origin in R<superscript>3</superscript> about the y-axis.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Rotation3DZ">
         <term>Rotation3DZ</term>
         <listitem>
          <synopsis>Rotation3DZ (ángulo)</synopsis>
          <para>Return the matrix corresponding to rotation around origin in R<superscript>3</superscript> about the z-axis.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RowSpace">
         <term>RowSpace</term>
         <listitem>
          <synopsis>RowSpace (M)</synopsis>
          <para>Obtener una matriz base para el espacio de filas de una matriz.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SesquilinearForm">
         <term>SesquilinearForm</term>
         <listitem>
          <synopsis>SesquilinearForm (v,A,w)</synopsis>
          <para>Evaluar (v,w) con respecto a la forma sesquilineal dada por la matriz A.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SesquilinearFormFunction">
         <term>SesquilinearFormFunction</term>
         <listitem>
          <synopsis>SesquilinearFormFunction (A)</synopsis>
          <para>Devolver una función que evalúa dos vectores con respecto a la forma sesquilineal dada por A.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SmithNormalFormField">
         <term>SmithNormalFormField</term>
         <listitem>
          <synopsis>SmithNormalFormField (A)</synopsis>
          <para>Forma normal de Smith para campos (terminará con unos en la diagonal).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SmithNormalFormInteger">
         <term>SmithNormalFormInteger</term>
         <listitem>
          <synopsis>SmithNormalFormInteger (M)</synopsis>
          <para>Forma normal de Smith para matrices cuadradas enteras (no su característica).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SolveLinearSystem">
         <term>SolveLinearSystem</term>
         <listitem>
          <synopsis>SolveLinearSystem (M,V,args...)</synopsis>
	  <para>Resuelve el sistema lineal Mx=V, devuelve la solución V si hay una única solución y <constant>null</constant> en cualquier otro caso. Opcionalmente, se pueden usar dos parámetros de referencia para obtener M y V reducidos.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ToeplitzMatrix">
         <term>ToeplitzMatrix</term>
         <listitem>
          <synopsis>ToeplitzMatrix (c, r...)</synopsis>
	  <para>Return the Toeplitz matrix constructed given the first column c
and (optionally) the first row r.  If only the column c is given then it is
conjugated and the nonconjugated version is used for the first row to give a
Hermitian matrix (if the first element is real of course).</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/ToeplitzMatrix.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Trace">
         <term>Trace</term>
         <listitem>
          <synopsis>Trace (M)</synopsis>
          <para>Alias: <function>trace</function></para>
          <para>Calcular la traza de una matriz. Esto es la suma de sus elementos diagonales.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/Trace.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Transpose">
         <term>Transpose</term>
         <listitem>
          <synopsis>Transpose (M)</synopsis>
          <para>Traspuesta de una matriz. Es lo mismo que el operador  <userinput>.'</userinput>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/Transpose.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-VandermondeMatrix">
         <term>VandermondeMatrix</term>
         <listitem>
          <synopsis>VandermondeMatrix (v)</synopsis>
          <para>Alias: <function>vander</function></para>
          <para>Devuelve la matriz de Vandermonde.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-VectorAngle">
         <term>VectorAngle</term>
         <listitem>
          <synopsis>VectorAngle (v,w,B...)</synopsis>
          <para>The angle of two vectors with respect to inner product given by
<varname>B</varname>.  If <varname>B</varname> is not given then the standard
Hermitian product is used.  <varname>B</varname> can either be a sesquilinear
function of two arguments or it can be a matrix giving a sesquilinear form.
</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-VectorSpaceDirectSum">
         <term>VectorSpaceDirectSum</term>
         <listitem>
          <synopsis>VectorSpaceDirectSum (M,N)</synopsis>
          <para>The direct sum of the vector spaces M and N.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-VectorSubspaceIntersection">
         <term>VectorSubspaceIntersection</term>
         <listitem>
          <synopsis>VectorSubspaceIntersection (M,N)</synopsis>
          <para>Intersección de subespacios dados por M y N.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-VectorSubspaceSum">
         <term>VectorSubspaceSum</term>
         <listitem>
          <synopsis>VectorSubspaceSum (M,N)</synopsis>
          <para>La suma de los espacios vectoriales M y N, esto es {w | w=m+n, m en M, n en N}.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-adj">
         <term>adj</term>
         <listitem>
          <synopsis>adj (m)</synopsis>
          <para>Alias: <function>Adjugate</function></para>
          <para>Get the classical adjoint (adjugate) of a matrix.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-cref">
         <term>cref</term>
         <listitem>
          <synopsis>cref (M)</synopsis>
          <para>Alias: <function>CREF</function><function>ColumnReducedEchelonForm</function></para>
          <para>Compute the Column Reduced Echelon Form.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-det">
         <term>det</term>
         <listitem>
          <synopsis>det (M)</synopsis>
          <para>Alias: <function>Determinant</function></para>
          <para>Obtener el determinante de una matriz.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Determinant">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/Determinant2.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ref">
         <term>ref</term>
         <listitem>
          <synopsis>ref (M)</synopsis>
          <para>Alias: <function>REF</function><function>RowEchelonForm</function></para>
	  <para>Get the row echelon form of a matrix.  That is, apply gaussian
elimination but not backaddition to <varname>M</varname>.  The pivot rows are
divided to make all pivots 1.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Row_echelon_form">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/RowEchelonForm.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-rref">
         <term>rref</term>
         <listitem>
          <synopsis>rref (M)</synopsis>
          <para>Alias: <function>RREF</function><function>ReducedRowEchelonForm</function></para>
          <para>Get the reduced row echelon form of a matrix.  That is, apply gaussian elimination together with backaddition to <varname>M</varname>.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Reduced_row_echelon_form">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/ReducedRowEchelonForm.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-combinatorics">
      <title>Combinatoria</title>
      <variablelist>
        <varlistentry id="gel-function-Catalan">
         <term>Catalan</term>
         <listitem>
          <synopsis>Catalan (n)</synopsis>
          <para>Get <varname>n</varname>'th catalan number.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/CatalanNumbers.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Combinations">
         <term>Combinations</term>
         <listitem>
          <synopsis>Combinations (k,n)</synopsis>
          <para>Get all combinations of k numbers from 1 to n as a vector of vectors.
	  (See also <link linkend="gel-function-NextCombination">NextCombination</link>)
</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DoubleFactorial">
         <term>DoubleFactorial</term>
         <listitem>
          <synopsis>DoubleFactorial (n)</synopsis>
          <para>Doble factorial: <userinput>n(n-2)(n-4)...</userinput></para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/DoubleFactorial.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Factorial">
         <term>Factorial</term>
         <listitem>
          <synopsis>Factorial (n)</synopsis>
          <para>Factorial: <userinput>n(n-1)(n-2)...</userinput></para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/Factorial.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FallingFactorial">
         <term>FallingFactorial</term>
         <listitem>
          <synopsis>FallingFactorial (n,k)</synopsis>
          <para>Falling factorial: <userinput>(n)_k = n(n-1)...(n-(k-1))</userinput></para>
          <para>Consulte la <ulink url="http://planetmath.org/encyclopedia/FallingFactorial.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Fibonacci">
         <term>Fibonacci</term>
         <listitem>
          <synopsis>Fibonacci (x)</synopsis>
          <para>Alias: <function>fib</function></para>
          <para>
	    Calculate <varname>n</varname>th Fibonacci number.  That
	    is the number defined recursively by
	    <userinput>Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2)</userinput>
	    and 
	    <userinput>Fibonacci(1) = Fibonacci(2) = 1</userinput>.
	  </para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Fibonacci_number">Wikipedia</ulink> o <ulink url="http://planetmath.org/encyclopedia/FibonacciSequence.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/FibonacciNumber.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FrobeniusNumber">
         <term>FrobeniusNumber</term>
         <listitem>
          <synopsis>FrobeniusNumber (v,arg...)</synopsis>
          <para>
	    Calculate the Frobenius number.  That is calculate smallest
	    number that cannot be given as a non-negative integer linear
	    combination of a given vector of non-negative integers.
	    The vector can be given as separate numbers or a single vector.
	    All the numbers given should have GCD of 1.
	  </para>
          <para>Consulte la <ulink url="http://mathworld.wolfram.com/FrobeniusNumber.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-GaloisMatrix">
         <term>GaloisMatrix</term>
         <listitem>
          <synopsis>GaloisMatrix (regla_de_combinación)</synopsis>
          <para>Matriz de Galois dada una regla de combinación lineal (a_1*x_+...+a_n*x_n=x_(n+1)).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-GreedyAlgorithm">
         <term>GreedyAlgorithm</term>
         <listitem>
          <synopsis>FrobeniusNumber (n,v)</synopsis>
          <para>
	    Find the vector <varname>c</varname> of non-negative integers
	    such that taking the dot product with <varname>v</varname> is
	    equal to n.  If not possible returns <constant>null</constant>.  <varname>v</varname>
	    should be given sorted in increasing order and should consist
	    of non-negative integers.
	  </para>
          <para>Consulte la <ulink url="http://mathworld.wolfram.com/GreedyAlgorithm.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-HarmonicNumber">
         <term>HarmonicNumber</term>
         <listitem>
          <synopsis>HarmonicNumber (n,r)</synopsis>
          <para>Alias: <function>HarmonicH</function></para>
          <para>Harmonic Number, the <varname>n</varname>'th harmonic number of order <varname>r</varname>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Hofstadter">
         <term>Hofstadter</term>
         <listitem>
          <synopsis>Hofstadter (n)</synopsis>
          <para>Función q(n) de Hofstadter definida por q(1)=1, q(2)=1, q(n)=q(n-q(n-1))+q(n-q(n-2)).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LinearRecursiveSequence">
         <term>LinearRecursiveSequence</term>
         <listitem>
          <synopsis>LinearRecursiveSequence (seed_values,combining_rule,n)</synopsis>
          <para>Calcular la secuencia lineal recursiva usando el escalamiento de Galois.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Multinomial">
         <term>Multinomial</term>
         <listitem>
          <synopsis>Multinomial (v,arg...)</synopsis>
          <para>Calculate multinomial coefficients.  Takes a vector of
	    <varname>k</varname>
	    non-negative integers and computes the multinomial coefficient.
	    This corresponds to the coefficient in the homogeneous polynomial
	    in <varname>k</varname> variables with the corresponding powers.
	  </para>
	  <para>
	    The formula for <userinput>Multinomial(a,b,c)</userinput>
	    can be written as:
<programlisting>(a+b+c)! / (a!b!c!)
</programlisting>
	    In other words, if we would have only two elements, then
<userinput>Multinomial(a,b)</userinput> is the same thing as
<userinput>Binomial(a+b,a)</userinput> or
<userinput>Binomial(a+b,b)</userinput>.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/MultinomialTheorem.html">Planetmath</ulink>, <ulink url="http://mathworld.wolfram.com/MultinomialCoefficient.html">Mathworld</ulink>, o la <ulink url="http://en.wikipedia.org/wiki/Multinomial_theorem">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NextCombination">
         <term>NextCombination</term>
         <listitem>
          <synopsis>NextCombination (v,n)</synopsis>
	  <para>Get combination that would come after v in call to
combinations, first combination should be <userinput>[1:k]</userinput>.  This
function is useful if you have many combinations to go through and you don't
want to waste memory to store them all.
	  </para>
	  <para>Por ejemplo, con Combination normalmente escribiría un bucle como sigue: <screen><userinput>for n in Combinations (4,6) do (
  AlgunaFuncion (n)
);</userinput>
</screen> Pero con NextCombination escribiría algo como lo siguiente: <screen><userinput>n:=[1:4];
do (
  AlgunaFuncion (n)
) while not IsNull(n:=NextCombination(n,6));</userinput>
</screen> Consulte también <link linkend="gel-function-Combinations">Combination</link>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Pascal">
         <term>Pascal</term>
         <listitem>
          <synopsis>Pascal (i)</synopsis>
          <para>Get the Pascal's triangle as a matrix.  This will return
	  an <varname>i</varname>+1 by <varname>i</varname>+1 lower diagonal
	  matrix which is the Pascal's triangle after <varname>i</varname>
	  iterations.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/PascalsTriangle.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Permutations">
         <term>Permutations</term>
         <listitem>
          <synopsis>Permutations (k,n)</synopsis>
          <para>Get all permutations of <varname>k</varname> numbers from 1 to <varname>n</varname> as a vector of vectors.</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/Permutation.html">Mathworld</ulink> o la <ulink url="http://en.wikipedia.org/wiki/Permutation">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RisingFactorial">
         <term>RisingFactorial</term>
         <listitem>
          <synopsis>RisingFactorial (n,k)</synopsis>
          <para>Alias: <function>Pochhammer</function></para>
          <para>(Puchhammer) factorial creciente: (n)_k = n(n+1)...(n+(k-1)).</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/RisingFactorial.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-StirlingNumberFirst">
         <term>StirlingNumberFirst</term>
         <listitem>
          <synopsis>StirlingNumberFirst (n,m)</synopsis>
          <para>Alias: <function>StirlingS1</function></para>
          <para>Número de Stirling de primera clase.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/StirlingNumbersOfTheFirstKind.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/StirlingNumberoftheFirstKind.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-StirlingNumberSecond">
         <term>StirlingNumberSecond</term>
         <listitem>
          <synopsis>StirlingNumberSecond (n,m)</synopsis>
          <para>Alias: <function>StirlingS2</function></para>
          <para>Número de Stirling de segunda clase.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/StirlingNumbersSecondKind.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/StirlingNumberoftheSecondKind.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Subfactorial">
         <term>Subfactorial</term>
         <listitem>
          <synopsis>Subfactorial (n)</synopsis>
          <para>Subfactorial: n! times sum_{k=1}^n (-1)^k/k!.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Triangular">
         <term>Triangular</term>
         <listitem>
          <synopsis>Triangular (nth)</synopsis>
          <para>Calculate the <varname>n</varname>'th triangular number.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/TriangularNumbers.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-nCr">
         <term>nCr</term>
         <listitem>
          <synopsis>nCr (n,r)</synopsis>
          <para>Alias: <function>Binomial</function></para>
          <para>Calculate combinations, that is, the binomial coefficient.
	        <varname>n</varname> can be any real number.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/Choose.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-nPr">
         <term>nPr</term>
         <listitem>
          <synopsis>nPr (n,r)</synopsis>
          <para>Calculate the number of permutations of size
	   <varname>r</varname>of numbers from 1 to <varname>n</varname>.</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/Permutation.html">Mathworld</ulink> o la <ulink url="http://en.wikipedia.org/wiki/Permutation">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-calculus">
      <title>Cálculo</title>
      <variablelist>
        <varlistentry id="gel-function-CompositeSimpsonsRule">
         <term>CompositeSimpsonsRule</term>
         <listitem>
          <synopsis>CompositeSimpsonsRule (f,a,b,n)</synopsis>
          <para>Integrar f usando la Regla Compuesta de Simpson en el intervalo [a,b] con n subintervalos y un error de max(f'''')*h^4*(b-a)/180, n debe ser entero.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/SimpsonsRule.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-CompositeSimpsonsRuleTolerance">
         <term>CompositeSimpsonsRuleTolerance</term>
         <listitem>
          <synopsis>CompositeSimpsonsRuleTolerance (f,a,b,FourthDerivativeBound,Tolerance)</synopsis>
          <para>Integración de F por la Regla compuesta de Simpson en el intervalo [a,b] con el número de pasos calculado por la cuarta derivada y la tolerancia deseada.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/SimpsonsRule.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Derivative">
         <term>Derivative</term>
         <listitem>
          <synopsis>Derivative (f,x0)</synopsis>
          <para>Intentar calcular la derivada, primero simbólicamente y después numéricamente.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-EvenPeriodicExtension">
         <term>EvenPeriodicExtension</term>
         <listitem>
          <synopsis>EvenPeriodicExtension (f,L)</synopsis>
	  <para>Return a function which is even periodic extension of
<function>f</function> with half period <varname>L</varname>.  That
is a function defined on the interval <userinput>[0,L]</userinput>
extended to be even on <userinput>[-L,L]</userinput> and then
extended to be periodic with period <userinput>2*L</userinput>.</para>
	  <para>
	    See also
	    <link linkend="gel-function-OddPeriodicExtension">OddPeriodicExtension</link>
	    and
	    <link linkend="gel-function-PeriodicExtension">PeriodicExtension</link>.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FourierSeriesFunction">
         <term>FourierSeriesFunction</term>
         <listitem>
          <synopsis>FourierSeriesFunction (a,b,L)</synopsis>
	  <para>Return a function which is a Fourier series with the
coefficients given by the vectors <varname>a</varname> (sines) and
<varname>b</varname> (cosines).  Note that <userinput>a@(1)</userinput> is
the constant coefficient!  That is, <userinput>a@(n)</userinput> refers to
the term <userinput>cos(x*(n-1)*pi/L)</userinput>, while
<userinput>b@(n)</userinput> refers to the term
<userinput>sin(x*n*pi/L)</userinput>.  Either <varname>a</varname>
or <varname>b</varname> can be <constant>null</constant>.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Fourier_series">Wikipedia</ulink> o <ulink url="http://mathworld.wolfram.com/FourierSeries.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-InfiniteProduct">
         <term>InfiniteProduct</term>
         <listitem>
          <synopsis>InfiniteProduct (func,inicio,inc)</synopsis>
          <para>Intenta calcular un producto infinito para una función de un sólo parámetro.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-InfiniteProduct2">
         <term>InfiniteProduct2</term>
         <listitem>
          <synopsis>InfiniteProduct2 (func,arg,inicio,inc)</synopsis>
          <para>Intenta calcular un producto infinito para una función de dos parámetros con func(arg,n)</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-InfiniteSum">
         <term>InfiniteSum</term>
         <listitem>
          <synopsis>InfiniteSum (func,inicio,inc)</synopsis>
          <para>Intentar calcular una suma infinita para una función de un sólo parámetro.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-InfiniteSum2">
         <term>InfiniteSum2</term>
         <listitem>
          <synopsis>InfiniteSum2 (func,arg,inicio,inc)</synopsis>
          <para>Intenta calcular una suma infinita para una función de dos parámetros con func(arg,n).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsContinuous">
         <term>IsContinuous</term>
         <listitem>
          <synopsis>IsContinuous (f,x0)</synopsis>
          <para>Comprueba si una función real es continua en x0 calculando el límite en ese punto.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsDifferentiable">
         <term>IsDifferentiable</term>
         <listitem>
          <synopsis>IsDifferentiable (f,x0)</synopsis>
          <para>Comprobar la diferenciabilidad aproximando los límites izquierdo y derecho y comparándolos.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LeftLimit">
         <term>LeftLimit</term>
         <listitem>
          <synopsis>LeftLimit (f,x0)</synopsis>
          <para>Calcular el límite por la izquierda de una función real en x0.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Limit">
         <term>Limit</term>
         <listitem>
          <synopsis>Limit (f,x0)</synopsis>
          <para>Calcular el límite de una función real en x0. Intenta calcular tanto el límite por la derecha como por la izquierda.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MidpointRule">
         <term>MidpointRule</term>
         <listitem>
          <synopsis>MidpointRule (f,a,b,n)</synopsis>
          <para>Integración por la regla del punto medio.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalDerivative">
         <term>NumericalDerivative</term>
         <listitem>
          <synopsis>NumericalDerivative (f,x0)</synopsis>
          <para>Alias: <function>NDerivative</function></para>
          <para>Intentar calcular la derivada numérica.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalFourierSeriesCoefficients">
         <term>NumericalFourierSeriesCoefficients</term>
         <listitem>
          <synopsis>NumericalFourierSeriesCoefficients (f,L,N)</synopsis>
	  <para>Return a vector of vectors <userinput>[a,b]</userinput>
where <varname>a</varname> are the cosine coefficients and
<varname>b</varname> are the sine coefficients of
the Fourier series of
<function>f</function> with half-period <varname>L</varname> (that is defined
on <userinput>[-L,L]</userinput> and extended periodically) with coefficients
up to <varname>N</varname>th harmonic computed numerically.  The coefficients are
computed by numerical integration using
<function>NumericalIntegral</function>.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Fourier_series">Wikipedia</ulink> o <ulink url="http://mathworld.wolfram.com/FourierSeries.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalFourierSeriesFunction">
         <term>NumericalFourierSeriesFunction</term>
         <listitem>
          <synopsis>NumericalFourierSeriesFunction (f,L,N)</synopsis>
	  <para>Return a function which is the Fourier series of
<function>f</function> with half-period <varname>L</varname> (that is defined
on <userinput>[-L,L]</userinput> and extended periodically) with coefficients
up to <varname>N</varname>th harmonic computed numerically.  This is the
trigonometric real series composed of sines and cosines.  The coefficients are
computed by numerical integration using
<function>NumericalIntegral</function>.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Fourier_series">Wikipedia</ulink> o <ulink url="http://mathworld.wolfram.com/FourierSeries.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalFourierCosineSeriesCoefficients">
         <term>NumericalFourierCosineSeriesCoefficients</term>
         <listitem>
          <synopsis>NumericalFourierCosineSeriesCoefficients (f,L,N)</synopsis>
	  <para>Return a vector of coefficients of the
the cosine Fourier series of
<function>f</function> with half-period <varname>L</varname>.  That is,
we take <function>f</function> defined on <userinput>[0,L]</userinput>
take the even periodic extension and compute the Fourier series, which
only has cosine terms.  The series is computed up to the 
<varname>N</varname>th harmonic.  The coefficients are
computed by numerical integration using
<function>NumericalIntegral</function>.
Note that <userinput>a@(1)</userinput> is
the constant coefficient!  That is, <userinput>a@(n)</userinput> refers to
the term <userinput>cos(x*(n-1)*pi/L)</userinput>.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Fourier_series">Wikipedia</ulink> o <ulink url="http://mathworld.wolfram.com/FourierCosineSeries.html">Mathworld</ulink> para obtener más información.</para>
	  </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalFourierCosineSeriesFunction">
         <term>NumericalFourierCosineSeriesFunction</term>
         <listitem>
          <synopsis>NumericalFourierCosineSeriesFunction (f,L,N)</synopsis>
	  <para>Return a function which is the cosine Fourier series of
<function>f</function> with half-period <varname>L</varname>.  That is,
we take <function>f</function> defined on <userinput>[0,L]</userinput>
take the even periodic extension and compute the Fourier series, which
only has cosine terms.  The series is computed up to the 
<varname>N</varname>th harmonic.  The coefficients are
computed by numerical integration using
<function>NumericalIntegral</function>.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Fourier_series">Wikipedia</ulink> o <ulink url="http://mathworld.wolfram.com/FourierCosineSeries.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalFourierSineSeriesCoefficients">
         <term>NumericalFourierSineSeriesCoefficients</term>
         <listitem>
          <synopsis>NumericalFourierSineSeriesCoefficients (f,L,N)</synopsis>
	  <para>Return a vector of coefficients of the
the sine Fourier series of
<function>f</function> with half-period <varname>L</varname>.  That is,
we take <function>f</function> defined on <userinput>[0,L]</userinput>
take the odd periodic extension and compute the Fourier series, which
only has sine terms.  The series is computed up to the 
<varname>N</varname>th harmonic.  The coefficients are
computed by numerical integration using
<function>NumericalIntegral</function>.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Fourier_series">Wikipedia</ulink> o <ulink url="http://mathworld.wolfram.com/FourierSineSeries.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalFourierSineSeriesFunction">
         <term>NumericalFourierSineSeriesFunction</term>
         <listitem>
          <synopsis>NumericalFourierSineSeriesFunction (f,L,N)</synopsis>
	  <para>Return a function which is the sine Fourier series of
<function>f</function> with half-period <varname>L</varname>.  That is,
we take <function>f</function> defined on <userinput>[0,L]</userinput>
take the odd periodic extension and compute the Fourier series, which
only has sine terms.  The series is computed up to the 
<varname>N</varname>th harmonic.  The coefficients are
computed by numerical integration using
<function>NumericalIntegral</function>.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Fourier_series">Wikipedia</ulink> o <ulink url="http://mathworld.wolfram.com/FourierSineSeries.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalIntegral">
         <term>NumericalIntegral</term>
         <listitem>
          <synopsis>NumericalIntegral (f,a,b)</synopsis>
          <para>Integración por el conjunto de reglas en NumericalIntegralFunction de f desde «a» a «b» usando NumericalIntegralSteps pasos.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalLeftDerivative">
         <term>NumericalLeftDerivative</term>
         <listitem>
          <synopsis>NumericalLeftDerivative (f,x0)</synopsis>
          <para>Intentar calcular la derivada numérica por la izquierda.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalLimitAtInfinity">
         <term>NumericalLimitAtInfinity</term>
         <listitem>
          <synopsis>NumericalLimitAtInfinity (_f,step_fun,tolerance,successive_for_success,N)</synopsis>
          <para>Intentar calcular el límite de f(step_fun(i)), para i desde 1 hasta N.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NumericalRightDerivative">
         <term>NumericalRightDerivative</term>
         <listitem>
          <synopsis>NumericalRightDerivative (f,x0)</synopsis>
          <para>Intentar calcular la derivada numérica por la derecha.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-OddPeriodicExtension">
         <term>OddPeriodicExtension</term>
         <listitem>
          <synopsis>OddPeriodicExtension (f,L)</synopsis>
	  <para>Return a function which is odd periodic extension of
<function>f</function> with half period <varname>L</varname>.  That
is a function defined on the interval <userinput>[0,L]</userinput>
extended to be odd on <userinput>[-L,L]</userinput> and then
extended to be periodic with period <userinput>2*L</userinput>.</para>
	  <para>Consulte también <link linkend="gel-function-EvenPeriodicExtension">EvenPeriodicExtension</link> y <link linkend="gel-function-PeriodicExtension">PeriodicExtension</link>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-OneSidedFivePointFormula">
         <term>OneSidedFivePointFormula</term>
         <listitem>
          <synopsis>OneSidedFivePointFormula (f,x0,h)</synopsis>
          <para>Calcular la derivada de un lado usando una fórmula de 5 puntos.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-OneSidedThreePointFormula">
         <term>OneSidedThreePointFormula</term>
         <listitem>
          <synopsis>OneSidedThreePointFormula (f,x0,h)</synopsis>
          <para>Calcular la derivada de un lado usando una fórmula de tres puntos.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PeriodicExtension">
         <term>PeriodicExtension</term>
         <listitem>
          <synopsis>PeriodicExtension (f,a,b)</synopsis>
	  <para>Return a function which is the periodic extension of
<function>f</function> defined on the interval <userinput>[a,b]</userinput>
and has period <userinput>b-a</userinput>.</para>
	  <para>Consulte también <link linkend="gel-function-OddPeriodicExtension">OddPeriodicExtension</link> y <link linkend="gel-function-EvenPeriodicExtension">EvenPeriodicExtension</link>.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RightLimit">
         <term>RightLimit</term>
         <listitem>
          <synopsis>RightLimit (f,x0)</synopsis>
          <para>Calcular el límite por la derecha de una función real en x0.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-TwoSidedFivePointFormula">
         <term>TwoSidedFivePointFormula</term>
         <listitem>
          <synopsis>TwoSidedFivePointFormula (f,x0,h)</synopsis>
          <para>Calcular la derivada de dos lados usando una fórmula de cinco puntos.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-TwoSidedThreePointFormula">
         <term>TwoSidedThreePointFormula</term>
         <listitem>
          <synopsis>TwoSidedThreePointFormula (f,x0,h)</synopsis>
          <para>Calcular la derivada de dos lados usando una fórmula de tres puntos.</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-functions">
      <title>Funciones</title>
      <variablelist>
        <varlistentry id="gel-function-Argument">
         <term>Argument</term>
         <listitem>
          <synopsis>Argument (z)</synopsis>
          <para>Alias: <function>Arg</function><function>arg</function></para>
          <para>argumento (ángulo) de un número complejo.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DirichletKernel">
         <term>DirichletKernel</term>
         <listitem>
          <synopsis>DirichletKernel (n,t)</synopsis>
          <para>Núcleo de Dirichlet de orden n.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DiscreteDelta">
         <term>DiscreteDelta</term>
         <listitem>
          <synopsis>DiscreteDelta (v)</synopsis>
          <para>Devuelve 1 si todos los elementos son cero.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-ErrorFunction">
         <term>ErrorFunction</term>
         <listitem>
          <synopsis>ErrorFunction (x)</synopsis>
          <para>Alias: <function>erf</function></para>
          <para>La función de error, 2/sqrt(pi) * int_0^x e^(-t^2) dt.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/ErrorFunction.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FejerKernel">
         <term>FejerKernel</term>
         <listitem>
          <synopsis>FejerKernel (n,t)</synopsis>
          <para>Fejer kernel of order <varname>n</varname> evaluated at
	        <varname>t</varname></para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/FejerKernel.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-GammaFunction">
         <term>GammaFunction</term>
         <listitem>
          <synopsis>GammaFunction (x)</synopsis>
          <para>Alias: <function>Gamma</function></para>
          <para>La función «Gamma». Actualmente sólo implementada para valores reales.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/GammaFunction.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-KroneckerDelta">
         <term>KroneckerDelta</term>
         <listitem>
          <synopsis>KroneckerDelta (v)</synopsis>
          <para>Devuelve 1 si todos los elementos son iguales.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MinimizeFunction">
         <term>MinimizeFunction</term>
         <listitem>
          <synopsis>MinimizeFunction (func,x,incr)</synopsis>
          <para>Buscar el primer valor donde f(x)=0.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MoebiusDiskMapping">
         <term>MoebiusDiskMapping</term>
         <listitem>
          <synopsis>MoebiusDiskMapping (a,z)</synopsis>
          <para>Mapa de Moebius del disco a sí mismo mapeando a 0.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/MobiusTransformation.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MoebiusMapping">
         <term>MoebiusMapping</term>
         <listitem>
          <synopsis>MoebiusMapping (z,z2,z3,z4)</synopsis>
          <para>Mapa de Moebius usando el radio cruzado z2,z3,z4 a 1,0 e infinito respectivamente.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/MobiusTransformation.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MoebiusMappingInftyToInfty">
         <term>MoebiusMappingInftyToInfty</term>
         <listitem>
          <synopsis>MoebiusMappingInftyToInfty (z,z2,z3)</synopsis>
          <para>Mapa de Moebius usando el radio cruzado tomando infinito a infinito y z2,z3 a 1 y 0 respectivamente.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/MobiusTransformation.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MoebiusMappingInftyToOne">
         <term>MoebiusMappingInftyToOne</term>
         <listitem>
          <synopsis>MoebiusMappingInftyToOne (z,z3,z4)</synopsis>
          <para>Mapa de Moebius usando la relación cruzada tomando de infinito a 1 y z3,z4 a 0 e infinito respectivamente.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/MobiusTransformation.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MoebiusMappingInftyToZero">
         <term>MoebiusMappingInftyToZero</term>
         <listitem>
          <synopsis>MoebiusMappingInftyToZero (z,z2,z4)</synopsis>
          <para>Mapa de Moebius usando la relación cruzada tomando de infinito a 0 y z2,z4 a 1 e infinito respectivamente.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/MobiusTransformation.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PoissonKernel">
         <term>PoissonKernel</term>
         <listitem>
          <synopsis>PoissonKernel (r,sigma)</synopsis>
          <para>El núcleo de Poisson en D(0,1) (no normalizado a 1, esto es, su integral es 2pi).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PoissonKernelRadius">
         <term>PoissonKernelRadius</term>
         <listitem>
          <synopsis>PoissonKernelRadius (r,sigma)</synopsis>
          <para>El núcleo de Poisson en D(0,R) (no normalizado a 1).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RiemannZeta">
         <term>RiemannZeta</term>
         <listitem>
          <synopsis>RiemannZeta (x)</synopsis>
          <para>Alias: <function>zeta</function></para>
          <para>La función «zeta de Riemann». Actualmente sólo implementada para valores reales.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/RiemannZetaFunction.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-UnitStep">
         <term>UnitStep</term>
         <listitem>
          <synopsis>UnitStep (x)</synopsis>
          <para>La función escalón unitario es 0 para x&lt;0, 1 si no. Es la integral de la función delta de Dirac. También llamada función de Heaviside.</para>
          <para>Consulte la <ulink url="http://en.wikipedia.org/wiki/Unit_step">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-cis">
         <term>cis</term>
         <listitem>
          <synopsis>cis (x)</synopsis>
          <para>La función <function>cis</function> es la misma que <userinput>cos(x)+1i*sin(x)</userinput></para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-deg2rad">
         <term>deg2rad</term>
         <listitem>
          <synopsis>deg2rad (x)</synopsis>
          <para>Convertir grados a radianes.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-rad2deg">
         <term>rad2deg</term>
         <listitem>
          <synopsis>rad2deg (x)</synopsis>
          <para>Convertir radianes a grados.</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-equation-solving">
      <title>Resolución de ecuaciones</title>
      <variablelist>

        <varlistentry id="gel-function-CubicFormula">
         <term>CubicFormula</term>
         <listitem>
          <synopsis>CubicFormula (p)</synopsis>
          <para>
	    Compute roots of a cubic (degree 3) polynomial using the
	    cubic formula.  The polynomial should be given as a
	    vector of coefficients.  That is
	    <userinput>4*x^3 + 2*x + 1</userinput> corresponds to the vector
            <userinput>[1,2,0,4]</userinput>.
	    Returns a column vector of the three solutions.  The first solution is always
	    the real one as a cubic always has one real solution.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/CubicFormula.html">Planetmath</ulink>, <ulink url="http://mathworld.wolfram.com/CubicFormula.html">Mathworld</ulink>, o <ulink url="http://en.wikipedia.org/wiki/Cubic_equation">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-EulersMethod">
         <term>EulersMethod</term>
         <listitem>
          <synopsis>EulersMethod (f,x0,y0,x1,n)</synopsis>
          <para>
	    Use classical Euler's method to numerically solve y'=f(x,y) for
	    initial <varname>x0</varname>, <varname>y0</varname> going to
	    <varname>x1</varname> with <varname>n</varname> increments,
	    returns <varname>y</varname> at <varname>x1</varname>.
	  </para>
	  <para>
	    Systems can be solved by just having <varname>y</varname> be a
	    (column) vector everywhere.  That is, <varname>y0</varname> can
	    be a vector in which case <varname>f</varname> should take a number
	    <varname>x</varname> and a vector of the same size for the second
	    argument and should return a vector of the same size.
	  </para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/EulerForwardMethod.html">Mathworld</ulink>, o la <ulink url="http://en.wikipedia.org/wiki/Eulers_method">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-EulersMethodFull">
         <term>EulersMethodFull</term>
         <listitem>
          <synopsis>EulersMethodFull (f,x0,y0,x1,n)</synopsis>
          <para>
	    Use classical Euler's method to numerically solve y'=f(x,y) for
	    initial <varname>x0</varname>, <varname>y0</varname> going to
	    <varname>x1</varname> with <varname>n</varname> increments,
	    returns a 2 by <userinput>n+1</userinput> matrix with the
	    <varname>x</varname> and <varname>y</varname> values.  Suitable
	    for plugging into 
	    <link linkend="gel-function-LinePlotDrawLine">LinePlotDrawLine</link>.
	  </para>
	  <para>
	    Systems can be solved by just having <varname>y</varname> be a
	    (column) vector everywhere.  That is, <varname>y0</varname> can
	    be a vector in which case <varname>f</varname> should take a number
	    <varname>x</varname> and a vector of the same size for the second
	    argument and should return a vector of the same size.
	  </para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/EulerForwardMethod.html">Mathworld</ulink>, o la <ulink url="http://en.wikipedia.org/wiki/Eulers_method">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FindRootBisection">
         <term>FindRootBisection</term>
         <listitem>
          <synopsis>FindRootBisection (f,a,b,TOL,N)</synopsis>
          <para>Find root of a function using the bisection method.
	    <varname>TOL</varname> is the desired tolerance and
<varname>N</varname> is the limit on the number of iterations to run, 0 means no limit.  The function returns a vector <userinput>[success,value,iteration]</userinput>, where <varname>success</varname> is a boolean indicating success, <varname>value</varname> is the last value computed, and <varname>iteration</varname> is the number of iterations done.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FindRootFalsePosition">
         <term>FindRootFalsePosition</term>
         <listitem>
          <synopsis>FindRootFalsePosition (f,a,b,TOL,N)</synopsis>
          <para>Find root of a function using the method of false position.
	    <varname>TOL</varname> is the desired tolerance and
<varname>N</varname> is the limit on the number of iterations to run, 0 means no limit.  The function returns a vector <userinput>[success,value,iteration]</userinput>, where <varname>success</varname> is a boolean indicating success, <varname>value</varname> is the last value computed, and <varname>iteration</varname> is the number of iterations done.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FindRootMullersMethod">
         <term>FindRootMullersMethod</term>
         <listitem>
          <synopsis>FindRootMullersMethod (f,x1,x2,x3,TOL,N)</synopsis>
          <para>Find root of a function using the Muller's method.
	    <varname>TOL</varname> is the desired tolerance and
<varname>N</varname> is the limit on the number of iterations to run, 0 means no limit.  The function returns a vector <userinput>[success,value,iteration]</userinput>, where <varname>success</varname> is a boolean indicating success, <varname>value</varname> is the last value computed, and <varname>iteration</varname> is the number of iterations done.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-FindRootSecant">
         <term>FindRootSecant</term>
         <listitem>
          <synopsis>FindRootSecant (f,a,b,TOL,N)</synopsis>
          <para>Find root of a function using the secant method.
	    <varname>TOL</varname> is the desired tolerance and
<varname>N</varname> is the limit on the number of iterations to run, 0 means no limit.  The function returns a vector <userinput>[success,value,iteration]</userinput>, where <varname>success</varname> is a boolean indicating success, <varname>value</varname> is the last value computed, and <varname>iteration</varname> is the number of iterations done.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PolynomialRoots">
         <term>PolynomialRoots</term>
         <listitem>
          <synopsis>PolynomialRoots (p)</synopsis>
          <para>
	    Compute roots of a polynomial (degrees 1 through 4)
	    using one of the formulas for such polynomials.
	    The polynomial should be given as a
	    vector of coefficients.  That is
	    <userinput>4*x^3 + 2*x + 1</userinput> corresponds to the vector
            <userinput>[1,2,0,4]</userinput>.
	    Returns a column vector of the solutions.
	  </para>
	  <para>
	    The function calls
	    <link linkend="gel-function-QuadraticFormula">QuadraticFormula</link>,
	    <link linkend="gel-function-CubicFormula">CubicFormula</link>, and
	    <link linkend="gel-function-QuarticFormula">QuarticFormula</link>.
	  </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-QuadraticFormula">
         <term>QuadraticFormula</term>
         <listitem>
          <synopsis>QuadraticFormula (p)</synopsis>
          <para>
	    Compute roots of a quadratic (degree 2) polynomial using the
	    quadratic formula.  The polynomial should be given as a
	    vector of coefficients.  That is
	    <userinput>3*x^2 + 2*x + 1</userinput> corresponds to the vector
            <userinput>[1,2,3]</userinput>.
	    Returns a column vector of the two solutions.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/QuadraticFormula.html">Planetmath</ulink> o <ulink url="http://mathworld.wolfram.com/QuadraticFormula.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-QuarticFormula">
         <term>QuarticFormula</term>
         <listitem>
          <synopsis>QuarticFormula (p)</synopsis>
          <para>
	    Compute roots of a quartic (degree 4) polynomial using the
	    quartic formula.  The polynomial should be given as a
	    vector of coefficients.  That is
	    <userinput>5*x^4 + 2*x + 1</userinput> corresponds to the vector
            <userinput>[1,2,0,0,5]</userinput>.
	    Returns a column vector of the four solutions.
	  </para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/QuarticFormula.html">Planetmath</ulink>, <ulink url="http://mathworld.wolfram.com/QuarticEquation.html">Mathworld</ulink>, o la <ulink url="http://en.wikipedia.org/wiki/Quartic_equation">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RungeKutta">
         <term>RungeKutta</term>
         <listitem>
          <synopsis>RungeKutta (f,x0,y0,x1,n)</synopsis>
          <para>
	    Use classical non-adaptive fourth order Runge-Kutta method to
	    numerically solve
	    y'=f(x,y) for initial <varname>x0</varname>, <varname>y0</varname>
	    going to <varname>x1</varname> with <varname>n</varname>
	    increments, returns <varname>y</varname> at <varname>x1</varname>.
	  </para>
	  <para>
	    Systems can be solved by just having <varname>y</varname> be a
	    (column) vector everywhere.  That is, <varname>y0</varname> can
	    be a vector in which case <varname>f</varname> should take a number
	    <varname>x</varname> and a vector of the same size for the second
	    argument and should return a vector of the same size.
	  </para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/Runge-KuttaMethod.html">Mathworld</ulink>, o la <ulink url="http://en.wikipedia.org/wiki/Runge-Kutta_methods">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RungeKuttaFull">
         <term>RungeKuttaFull</term>
         <listitem>
          <synopsis>RungeKuttaFull (f,x0,y0,x1,n)</synopsis>
          <para>
	    Use classical non-adaptive fourth order Runge-Kutta method to
	    numerically solve
	    y'=f(x,y) for initial <varname>x0</varname>, <varname>y0</varname>
	    going to <varname>x1</varname> with <varname>n</varname>
	    increments,
	    returns a 2 by <userinput>n+1</userinput> matrix with the
	    <varname>x</varname> and <varname>y</varname> values.  Suitable
	    for plugging into 
	    <link linkend="gel-function-LinePlotDrawLine">LinePlotDrawLine</link>.
	  </para>
	  <para>
	    Systems can be solved by just having <varname>y</varname> be a
	    (column) vector everywhere.  That is, <varname>y0</varname> can
	    be a vector in which case <varname>f</varname> should take a number
	    <varname>x</varname> and a vector of the same size for the second
	    argument and should return a vector of the same size.
	  </para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/Runge-KuttaMethod.html">Mathworld</ulink>, o la <ulink url="http://en.wikipedia.org/wiki/Runge-Kutta_methods">Wikipedia</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>


      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-statistics">
      <title>Estadísticas</title>
      <variablelist>
        <varlistentry id="gel-function-Average">
         <term>Average</term>
         <listitem>
          <synopsis>Average (m)</synopsis>
          <para>Alias: <function>average</function><function>Mean</function><function>mean</function></para>
          <para>Calcular la media de una matriz entera.</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/ArithmeticMean.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-GaussDistribution">
         <term>GaussDistribution</term>
         <listitem>
          <synopsis>GaussDistribution (x,sigma)</synopsis>
	  <para>Integral of the GaussFunction from 0 to <varname>x</varname> (area under the normal curve).</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/NormalDistribution.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-GaussFunction">
         <term>GaussFunction</term>
         <listitem>
          <synopsis>GaussFunction (x,sigma)</synopsis>
          <para>La función de distribución Gausiana normalizada (la curva normal).</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/NormalDistribution.html">Mathworld</ulink> para obtener más información.</para>

         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Median">
         <term>Median</term>
         <listitem>
          <synopsis>Median (m)</synopsis>
          <para>Alias: <function>median</function></para>
          <para>Calcula la mediana de una matriz entera.</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/StatisticalMedian.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PopulationStandardDeviation">
         <term>PopulationStandardDeviation</term>
         <listitem>
          <synopsis>PopulationStandardDeviation (m)</synopsis>
          <para>Alias: <function>stdevp</function></para>
          <para>Calcula la desviación de población típica de una matriz completa.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RowAverage">
         <term>RowAverage</term>
         <listitem>
          <synopsis>RowAverage (m)</synopsis>
          <para>Alias: <function>RowMean</function></para>
          <para>Calcular la media de cada columna de una matriz.</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/ArithmeticMean.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RowMedian">
         <term>RowMedian</term>
         <listitem>
          <synopsis>RowMedian (m)</synopsis>
          <para>Calculate median of each row in a matrix and return a column
	  vector of the medians.</para>
          <para>Consulte <ulink url="http://mathworld.wolfram.com/StatisticalMedian.html">Mathworld</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RowPopulationStandardDeviation">
         <term>RowPopulationStandardDeviation</term>
         <listitem>
          <synopsis>RowPopulationStandardDeviation (m)</synopsis>
          <para>Alias: <function>rowstdevp</function></para>
          <para>Calcular la desviación típica de las columnas de una matriz y devuelve una matriz columna.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-RowStandardDeviation">
         <term>RowStandardDeviation</term>
         <listitem>
          <synopsis>RowStandardDeviation (m)</synopsis>
          <para>Alias: <function>rowstdev</function></para>
          <para>Calcular la desviación estándar de las filas de una matriz y devuelve una matriz columna.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-StandardDeviation">
         <term>StandardDeviation</term>
         <listitem>
          <synopsis>StandardDeviation (m)</synopsis>
          <para>Alias: <function>stdev</function></para>
          <para>Calcular la desviación estándar de una matriz entera.</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-polynomials">
      <title>Polinomios</title>
      <variablelist>
        <varlistentry id="gel-function-AddPoly">
         <term>AddPoly</term>
         <listitem>
          <synopsis>AddPoly (p1,p2)</synopsis>
          <para>Suma dos polinomios (vectores).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-DividePoly">
         <term>DividePoly</term>
         <listitem>
          <synopsis>DividePoly (p,q,&amp;r)</synopsis>
          <para>Divide two polynomials (as vectors) using long division.
	   Returns the quotient
	   of the two polynomials.  The optional argument <varname>r</varname>
	   is used to return the remainder.  The remainder will have lower
	   degree than <varname>q</varname>.</para>
          <para>Consulte <ulink url="http://planetmath.org/encyclopedia/PolynomialLongDivision.html">Planetmath</ulink> para obtener más información.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsPoly">
         <term>IsPoly</term>
         <listitem>
          <synopsis>IsPoly (p)</synopsis>
          <para>Comprobar si un vector se puede usar como un polinomio.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MultiplyPoly">
         <term>MultiplyPoly</term>
         <listitem>
          <synopsis>MultiplyPoly (p1,p2)</synopsis>
          <para>Multiplica dos polinomios (como vectores).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-NewtonsMethodPoly">
         <term>NewtonsMethodPoly</term>
         <listitem>
          <synopsis>NewtonsMethodPoly (poly,guess,epsilon,maxn)</synopsis>
	  <para>Ejecuta el método de Newton sobre un polinomio para tratar de encontrar una raíz, devuelve un resultado cuando encuentra dos valores sucesivos que estén dentro de los límites que marca <literal>épsilon</literal> o después de <literal>maxn</literal> iteraciones (en cuyo caso devuelve <literal>null</literal>).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Poly2ndDerivative">
         <term>Poly2ndDerivative</term>
         <listitem>
          <synopsis>Poly2ndDerivative (p)</synopsis>
          <para>Tomar la derivada segunda (como vector) polinómico.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PolyDerivative">
         <term>PolyDerivative</term>
         <listitem>
          <synopsis>PolyDerivative (p)</synopsis>
          <para>Tomar la derivada (como vector) polinómico.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PolyToFunction">
         <term>PolyToFunction</term>
         <listitem>
          <synopsis>PolyToFunction (p)</synopsis>
          <para>Extraer una función de un polinomio (como vector).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-PolyToString">
         <term>PolyToString</term>
         <listitem>
          <synopsis>PolyToString (p,var...)</synopsis>
          <para>Extraer una cadena de un polinomio (como vector).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SubtractPoly">
         <term>SubtractPoly</term>
         <listitem>
          <synopsis>SubtractPoly (p1,p2)</synopsis>
          <para>Restar dos polinomios (como vectores).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-TrimPoly">
         <term>TrimPoly</term>
         <listitem>
          <synopsis>TrimPoly (p)</synopsis>
          <para>Eliminar ceros de un polinomio (como vector).</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-set-theory">
      <title>Teoría de conjuntos</title>
      <variablelist>
        <varlistentry id="gel-function-Intersection">
         <term>Intersection</term>
         <listitem>
          <synopsis>Intersection (X,Y)</synopsis>
          <para>Devuelve la intersección de X e Y (X e Y son vectores que se tratan como conjuntos).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsIn">
         <term>IsIn</term>
         <listitem>
          <synopsis>IsIn (x,X)</synopsis>
	  <para>Devuelve <constant>true</constant> si <literal>X</literal> es un subconjunto de <literal>Y</literal> (<literal>X</literal> e <literal>Y</literal> son vectores que se tratan como conjuntos).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-IsSubset">
         <term>IsSubset</term>
         <listitem>
          <synopsis>IsSubset (X, Y)</synopsis>
	  <para>Devuelve <constant>true</constant> si <literal>X</literal> es un subconjunto de <literal>Y</literal> (<literal>X</literal> e <literal>Y</literal> son vectores que se tratan como conjuntos).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MakeSet">
         <term>MakeSet</term>
         <listitem>
          <synopsis>MakeSet (X)</synopsis>
          <para>Devuelve un vector donde cada elemento de X aparece una sola vez.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SetMinus">
         <term>SetMinus</term>
         <listitem>
          <synopsis>SetMinus (X,Y)</synopsis>
          <para>Returns a set theoretic difference X-Y (X and Y are vectors pretending to be sets).</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-Union">
         <term>Union</term>
         <listitem>
          <synopsis>Union (X,Y)</synopsis>
          <para>Devuelve la unión de X e Y (X e Y son vectores que se tratan como conjuntos).</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-commutative-algebra">
      <title>Commutative Algebra</title>
      <variablelist>
        <varlistentry id="gel-function-MacaulayBound">
         <term>MacaulayBound</term>
         <listitem>
          <synopsis>MacaulayBound (c,d)</synopsis>
          <para>For a Hilbert function that is c for degree d, given the Macaulay bound for the Hilbert function of degree d+1 (The c^&lt;d&gt; operator from Green's proof).</para>
         </listitem>
        </varlistentry>
	
        <varlistentry id="gel-function-MacaulayLowerOperator">
         <term>MacaulayLowerOperator</term>
         <listitem>
          <synopsis>MacaulayLowerOperator (c,d)</synopsis>
          <para>The c_&lt;d&gt; operator from Green's proof of Macaulay's Theorem.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-MacaulayRep">
         <term>MacaulayRep</term>
         <listitem>
          <synopsis>MacaulayRep (c,d)</synopsis>
          <para>Return the dth Macaulay representation of a positive integer c.</para>
         </listitem>
        </varlistentry>
      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-miscellaneous">
      <title>Miscelánea</title>
      <variablelist>
        <varlistentry id="gel-function-ASCIIToString">
         <term>ASCIIToString</term>
         <listitem>
          <synopsis>ASCIIToString (vec)</synopsis>
          <para>Convertir un vector de valores ASCII en una cadena.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-AlphabetToString">
         <term>AlphabetToString</term>
         <listitem>
          <synopsis>AlphabetToString (vec,alfabeto)</synopsis>
          <para>Convierte un vector de valores alfabéticos basados en 0 (posiciones en la cadena alfabeto) a una cadena.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-StringToASCII">
         <term>StringToASCII</term>
         <listitem>
          <synopsis>StringToASCII (cad)</synopsis>
          <para>Convertir una cadena a un vector de valores ASCII.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-StringToAlphabet">
         <term>StringToAlphabet</term>
         <listitem>
          <synopsis>StringToAlphabet (str,alfabeto)</synopsis>
          <para>Convertir una cadena en un vector de valores alfabéticos basados en 0 (posiciones en la cadena alfabeto), -1 para las letras desconocidas.</para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-symbolic">
      <title>Operaciones simbólicas</title>
      <variablelist>
        <varlistentry id="gel-function-SymbolicDerivative">
         <term>SymbolicDerivative</term>
         <listitem>
          <synopsis>SymbolicDerivative (f)</synopsis>
          <para>Intentar diferenciar simbólicamente la función «f», donde «f» es una función de una variable.</para>
          <para>Ejemplos: <screen><prompt>genius&gt;</prompt> <userinput>SymbolicDerivative(sin)</userinput>
= (`(x)=cos(x))
<prompt>genius&gt;</prompt> <userinput>SymbolicDerivative(`(x)=7*x^2)</userinput>
= (`(x)=(7*(2*x)))
</screen></para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SymbolicDerivativeTry">
         <term>SymbolicDerivativeTry</term>
         <listitem>
          <synopsis>SymbolicDerivativeTry (f)</synopsis>
	  <para>Attempt to symbolically differentiate the function f, where f is a function of one variable, returns <constant>null</constant> if unsuccessful but is silent.
	  (See <link linkend="gel-function-SymbolicDerivative"><function>SymbolicDerivative</function></link>)
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SymbolicNthDerivative">
         <term>SymbolicNthDerivative</term>
         <listitem>
          <synopsis>SymbolicNthDerivative (f,n)</synopsis>
          <para>Attempt to symbolically differentiate a function n times.
	  (See <link linkend="gel-function-SymbolicDerivative"><function>SymbolicDerivative</function></link>)
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SymbolicNthDerivativeTry">
         <term>SymbolicNthDerivativeTry</term>
         <listitem>
          <synopsis>SymbolicNthDerivativeTry (f,n)</synopsis>
	  <para>Attempt to symbolically differentiate a function n times quietly and return <constant>null</constant> on failure
	  (See <link linkend="gel-function-SymbolicNthDerivative"><function>SymbolicNthDerivative</function></link>)
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SymbolicTaylorApproximationFunction">
         <term>SymbolicTaylorApproximationFunction</term>
         <listitem>
          <synopsis>SymbolicTaylorApproximationFunction (f,x0,n)</synopsis>
	  <para>Attempt to construct the taylor approximation function around x0 to the nth degree.
	  (See <link linkend="gel-function-SymbolicDerivative"><function>SymbolicDerivative</function></link>)
          </para>
         </listitem>
        </varlistentry>
      </variablelist>
    </sect1>

    <sect1 id="genius-gel-function-list-plotting">
      <title>Dibujar</title>
      <variablelist>
        <varlistentry id="gel-function-LinePlot">
         <term>LinePlot</term>
         <listitem>
          <synopsis>LinePlot (func1,func2,func3,...)</synopsis>
          <synopsis>LinePlot (func1,func2,func3,x1,x2,y1,y2)</synopsis>
          <para>
	    Plot a function (or several functions) with a line.
	    First up to 10 arguments are functions, then optionally
            you can specify the limits of the plotting window as
	    <varname>x1</varname>, <varname>x2</varname>,
	    <varname>y1</varname>, <varname>y2</varname>.  If limits are not
	    specified, then the currently set limits apply
	    (See <link linkend="gel-function-LinePlotWindow"><function>LinePlotWindow</function></link>)
          </para>
          <para>El parámetro <link linkend="gel-function-LinePlotDrawLegends"><function>LinePlotDrawLegends</function></link> controla el dibujado de la leyenda.</para>
          <para>Ejemplos: <screen><prompt>genius&gt;</prompt> <userinput>LinePlot(sin,cos)</userinput>
<prompt>genius&gt;</prompt> <userinput>LinePlot(`(x)=x^2,-1,1,0,1)</userinput>
</screen></para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LinePlotClear">
         <term>LinePlotClear</term>
         <listitem>
          <synopsis>LinePlotClear ()</synopsis>
          <para>Muestra la ventana de dibujo lineal y limpia las funciones y otras líneas que se hubiesen dibujado.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LinePlotDrawLine">
         <term>LinePlotDrawLine</term>
         <listitem>
          <synopsis>LinePlotDrawLine (x1,y1,x2,y2,...)</synopsis>
          <synopsis>LinePlotDrawLine (v,...)</synopsis>
          <para>
	    Draw a line from <varname>x1</varname>,<varname>y1</varname> to
	    <varname>x2</varname>,<varname>y2</varname>.
	    <varname>x1</varname>,<varname>y1</varname>,
	    <varname>x2</varname>,<varname>y2</varname> can be replaced by an
	    <varname>n</varname> by 2 matrix for a longer line.
          </para>
          <para>
	    Extra parameters can be added to specify line color, thickness,
	    arrows, and the plotting window.
	    You can do this by adding a string <userinput>"color"</userinput>, 
	    <userinput>"thickness"</userinput>,
	    <userinput>"window"</userinput>, or
	    <userinput>"arrow"</userinput>, and after it either
	    the color string, the thicknes as an integer, the window
	    as 4-vector, and for arrow either 
	    <userinput>"origin"</userinput>,
	    <userinput>"end"</userinput>,
	    <userinput>"both"</userinput>, or
	    <userinput>"none"</userinput>.  For 
	    <userinput>"window"</userinput> we can specify 
	    <userinput>"fit"</userinput> rather than a vector in which case,
	    the x range will be set precisely and the y range will be set with
	    five percent borders around the line.  Finally, the legend
	    can be specified by adding
	    <userinput>"legend"</userinput> and the string with the legend.
          </para>
	  <para>Ejemplos: <screen><prompt>genius&gt;</prompt> <userinput>LinePlotDrawLine(0,0,1,1,"color","blue","thickness",3)</userinput>
<prompt>genius&gt;</prompt> <userinput>LinePlotDrawLine([0,0;1,-1;-1,-1])</userinput>
<prompt>genius&gt;</prompt> <userinput>LinePlotDrawLine([0,0;1,1],"arrow","end")</userinput>
<prompt>genius&gt;</prompt> <userinput>LinePlotDrawLine(EulersMethodFull(`(x,y)=y,0,3,100),"color","blue","legend","The Solution")</userinput>
</screen></para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LinePlotParametric">
         <term>LinePlotParametric</term>
         <listitem>
          <synopsis>LinePlotParametric (xfunc,yfunc,...)</synopsis>
          <synopsis>LinePlotParametric (xfunc,yfunc,t1,t2,tinc)</synopsis>
          <synopsis>LinePlotParametric (xfunc,yfunc,t1,t2,tinc,x1,x2,y1,y2)</synopsis>
          <para>
	    Plot a parametric function with a line.  First come the functions
for <varname>x</varname> and <varname>y</varname> then optionally the <varname>t</varname> limits as <userinput>t1,t2,tinc</userinput>, then optionally the
limits as <userinput>x1,x2,y1,y2</userinput>.
          </para>
	  <para>
	    If limits are not
	    specified, then the currently set limits apply
	    (See <link linkend="gel-function-LinePlotWindow"><function>LinePlotWindow</function></link>).
          </para>
          <para>El parámetro <link linkend="gel-function-LinePlotDrawLegends"><function>LinePlotDrawLegends</function></link> controla el dibujado de la leyenda.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-LinePlotCParametric">
         <term>LinePlotCParametric</term>
         <listitem>
          <synopsis>LinePlotCParametric (func,...)</synopsis>
          <synopsis>LinePlotCParametric (func,t1,t2,tinc)</synopsis>
          <synopsis>LinePlotCParametric (func,t1,t2,tinc,x1,x2,y1,y2)</synopsis>
          <para>
	    Plot a parametric complex valued function with a line.  First comes
the function that returns <computeroutput>x+iy</computeroutput>,
then optionally the <varname>t</varname> limits as <userinput>t1,t2,tinc</userinput>, then
optionally the limits as <userinput>x1,x2,y1,y2</userinput>.
          </para>
	  <para>
	    If limits are not
	    specified, then the currently set limits apply
	    (See <link linkend="gel-function-LinePlotWindow"><function>LinePlotWindow</function></link>).
          </para>
          <para>El parámetro <link linkend="gel-function-LinePlotDrawLegends"><function>LinePlotDrawLegends</function></link> controla el dibujado de la leyenda.</para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SlopefieldClearSolutions">
         <term>SlopefieldClearSolutions</term>
         <listitem>
          <synopsis>SlopefieldClearSolutions ()</synopsis>
          <para>
	    Clears the solutions drawn by the
	    <link linkend="gel-function-SlopefieldDrawSolution"><function>SlopefieldDrawSolution</function></link>
	    function.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SlopefieldDrawSolution">
         <term>SlopefieldDrawSolution</term>
         <listitem>
          <synopsis>SlopefieldDrawSolution (x, y, dx)</synopsis>
          <para>
	    When a slope field plot is active, draw a solution with
	    the specified initial condition.  The standard
	    Runge-Kutta method is used with increment <varname>dx</varname>.
	    Solutions stay on the graph until a different plot is shown or until
	    you call 
	    <link linkend="gel-function-SlopefieldClearSolutions"><function>SlopefieldClearSolutions</function></link>.
	    You can also use the graphical interface to draw solutions and specify
	    initial conditions with the mouse.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SlopefieldPlot">
         <term>SlopefieldPlot</term>
         <listitem>
          <synopsis>SlopefieldPlot (func)</synopsis>
          <synopsis>SlopefieldPlot (func,x1,x2,y1,y2)</synopsis>
          <para>
	    Plot a slope field.  The function <varname>func</varname>
	    should take two real numbers <varname>x</varname>
	    and <varname>y</varname>, or a single complex
	    number.
            Optionally you can specify the limits of the plotting window as
	    <varname>x1</varname>, <varname>x2</varname>,
	    <varname>y1</varname>, <varname>y2</varname>.  If limits are not
	    specified, then the currently set limits apply
	    (See <link linkend="gel-function-LinePlotWindow"><function>LinePlotWindow</function></link>).
          </para>
          <para>El parámetro <link linkend="gel-function-LinePlotDrawLegends"><function>LinePlotDrawLegends</function></link> controla el dibujado de la leyenda.</para>
          <para>Ejemplos: <screen><prompt>genius&gt;</prompt> <userinput>Slopefield(`(x,y)=sin(x-y),-5,5,-5,5)</userinput>
</screen></para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-SurfacePlot">
         <term>SurfacePlot</term>
         <listitem>
          <synopsis>SurfacePlot (func)</synopsis>
          <synopsis>SurfacePlot (func,x1,x2,y1,y2,z1,z2)</synopsis>
          <para>
	    Plot a surface function which takes either two arguments or a complex number.  First comes the function then optionally limits as <varname>x1</varname>, <varname>x2</varname>,
	    <varname>y1</varname>, <varname>y2</varname>,
	    <varname>z1</varname>, <varname>z2</varname>.  If limits are not
	    specified, then the currently set limits apply
	    (See <link linkend="gel-function-SurfacePlotWindow"><function>SurfacePlotWindow</function></link>).
	    Genius can only plot a single surface function at this time.
          </para>
          <para>Ejemplos: <screen><prompt>genius&gt;</prompt> <userinput>SurfacePlot(|sin|,-1,1,-1,1,0,1.5)</userinput>
<prompt>genius&gt;</prompt> <userinput>SurfacePlot(`(x,y)=x^2+y,-1,1,-1,1,-2,2)</userinput>
<prompt>genius&gt;</prompt> <userinput>SurfacePlot(`(z)=|z|^2,-1,1,-1,1,0,2)</userinput>
</screen></para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-VectorfieldClearSolutions">
         <term>VectorfieldClearSolutions</term>
         <listitem>
          <synopsis>VectorfieldClearSolutions ()</synopsis>
          <para>
	    Clears the solutions drawn by the
	    <link linkend="gel-function-VectorfieldDrawSolution"><function>VectorfieldDrawSolution</function></link>
	    function.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-VectorfieldDrawSolution">
         <term>VectorfieldDrawSolution</term>
         <listitem>
          <synopsis>VectorfieldDrawSolution (x, y, dt, tlen)</synopsis>
          <para>
	    When a vector field plot is active, draw a solution with
	    the specified initial condition.  The standard
	    Runge-Kutta method is used with increment <varname>dt</varname>
	    for an interval of length <varname>tlen</varname>.
	    Solutions stay on the graph until a different plot is shown or until
	    you call 
	    <link linkend="gel-function-VectorfieldClearSolutions"><function>VectorfieldClearSolutions</function></link>.
	    You can also use the graphical interface to draw solutions and specify
	    initial conditions with the mouse.
          </para>
         </listitem>
        </varlistentry>

        <varlistentry id="gel-function-VectorfieldPlot">
         <term>VectorfieldPlot</term>
         <listitem>
          <synopsis>VectorfieldPlot (funcx, funcy)</synopsis>
          <synopsis>VectorfieldPlot (funcx, funcy, x1, x2, y1, y2)</synopsis>
          <para>
	    Plot a two dimensional vector field.  The function
	    <varname>funcx</varname>
	    should be the dx/dt of the vectorfield and the function
	    <varname>funcy</varname> should be the dy/dt of the vectorfield.
	    The functions
	    should take two real numbers <varname>x</varname>
	    and <varname>y</varname>, or a single complex
	    number.  When the parameter
	    <link linkend="gel-function-VectorfieldNormalized"><function>VectorfieldNormalized</function></link>
	    is <constant>true</constant>, then the magnitude of the vectors is normalized.  That is, only
	    the direction and not the magnitude is shown.
	  </para>
	  <para>
            Optionally you can specify the limits of the plotting window as
	    <varname>x1</varname>, <varname>x2</varname>,
	    <varname>y1</varname>, <varname>y2</varname>.  If limits are not
	    specified, then the currently set limits apply
	    (See <link linkend="gel-function-LinePlotWindow"><function>LinePlotWindow</function></link>).
          </para>
          <para>El parámetro <link linkend="gel-function-LinePlotDrawLegends"><function>LinePlotDrawLegends</function></link> controla el dibujado de la leyenda.</para>
          <para>Ejemplos: <screen><prompt>genius&gt;</prompt> <userinput>VectorfieldPlot(`(x,y)=x^2-y, `(x,y)=y^2-x, -1, 1, -1, 1)</userinput>
</screen></para>
         </listitem>
        </varlistentry>

      </variablelist>
    </sect1>


  </chapter>

  <!-- ============= GEL examples ============================= -->
  <chapter id="genius-gel-example-programs">
    <title>Programas de ejemplo en GEL</title>

    <para>
Here is a function that calculates factorials:
<programlisting><![CDATA[function f(x) = if x <= 1 then 1 else (f(x-1)*x)
]]></programlisting>
    </para>
    <para>
With indentation it becomes:
<programlisting><![CDATA[function f(x) = (
  if x <= 1 then
    1
  else
    (f(x-1)*x)
)
]]></programlisting>
    </para>
    <para>
This is a direct port of the factorial function from the <application>bc</application> manpage. The syntax seems similar to <application>bc</application>, but different in that in GEL, the last expression is the one that is returned. Using the <literal>return</literal> function instead, it would be:
<programlisting><![CDATA[function f(x) = (
  if (x <= 1) then return (1);
  return (f(x-1) * x)
)
]]></programlisting>
    </para>

    <para>
By far the easiest way to define a factorial function would be using
the product loop as follows.  This is not only the shortest and fastest,
but also probably the most readable version.
<programlisting>function f(x) = prod k=1 to x do k
</programlisting>
    </para>

    <para>
Here is a larger example, this basically redefines the internal
<function>ref</function> function to calculate the row echelon form of a
matrix.  The function <function>ref</function> is built in and much faster,
but this example demonstrates some of the more complex features of GEL.
<programlisting><![CDATA[# Calculate the row-echelon form of a matrix
function MyOwnREF(m) = (
  if not IsMatrix(m) or not IsValueOnly(m) then
    (error("ref: argument not a value only matrix");bailout);
  s := min(rows(m), columns(m));
  i := 1;
  d := 1;
  while d <= s and i <= columns(m) do (

    # This just makes the anchor element non-zero if at
    # all possible
    if m@(d,i) == 0 then (
      j := d+1;
      while j <= rows(m) do (
        if m@(j,i) == 0 then
          (j=j+1;continue);
        a := m@(j,);
        m@(j,) := m@(d,);
        m@(d,) := a;
        j := j+1;
        break
      )
    );
    if m@(d,i) == 0 then
      (i:=i+1;continue);
    
    # Here comes the actual zeroing of all but the anchor
    # element rows
    j := d+1;
    while j <= rows(m)) do (
      if m@(j,i) != 0 then (
        m@(j,) := m@(j,)-(m@(j,i)/m@(d,i))*m@(d,)
      );
      j := j+1
    );
    m@(d,) := m@(d,) * (1/m@(d,i));
    d := d+1;
    i := i+1
  );
  m
)
]]></programlisting>
    </para>

  </chapter>

  <!-- ============= Customization ============================ -->
  <chapter id="genius-prefs"> 
    <title>Configuración</title> 

    <para>
      To configure <application>Genius Mathematics Tool</application>, choose
      <menuchoice><guimenu>Settings</guimenu>
      <guimenuitem>Preferences</guimenuitem></menuchoice>.
      There are several basic parameters provided by the calculator in addition
      to the ones provided by the standard library.  These control how the
      calculator behaves.
    </para>

    <note>
      <title>Changing Settings with GEL</title>
      <para>
	Many of the settings in Genius are simply global variables, and can
	be evaluated and assigned to in the same way as normal variables. See
	<xref linkend="genius-gel-variables"/> about evaluating and assigning
	to variables, and <xref linkend="genius-gel-function-parameters"/> for
	a list of settings that can be modified in this way.
      </para>
      <para>
As an example, you can set the maximum number of digits in a result to 12 by typing:
<programlisting>MaxDigits = 12
</programlisting>
      </para>
    </note>

    <sect1 id="genius-prefs-output"> 
      <title>Salida</title> 
      <variablelist> 
	<varlistentry>
	  <term> 
	    <guilabel>Número máximo de cifras que mostrar</guilabel>
      </term> 
	  <listitem>
        <para>The maximum digits in a result (<function>MaxDigits</function>)</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term> 
	    <guilabel>Resultados como números de coma flotante</guilabel>
      </term> 
	  <listitem>
        <para>If the results should be always printed as floats (<function>ResultsAsFloats</function>)</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term> 
	    <guilabel>Números de coma flotante en notación científica</guilabel>
      </term> 
	  <listitem>
        <para>If floats should be in scientific notation (<function>ScientificNotation</function>)</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term> 
	    <guilabel>Imprimir siempre expresiones completas</guilabel>
      </term> 
	  <listitem>
        <para>Should we print out full expressions for non-numeric return values (longer than a line) (<function>FullExpressions</function>)</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term> 
	    <guilabel>Usar fracciones mixtas</guilabel>
      </term> 
	  <listitem>
        <para>If fractions should be printed as mixed fractions such as "1 1/3" rather than "4/3". (<function>MixedFractions</function>)</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term> 
	    <guilabel>Mostrar 0.0 cuando el número en coma flotante es menor que 10^-x (0=no truncar nunca)</guilabel>
      </term> 
	  <listitem>
	  <para>How to chop output.  But only when other numbers nearby are large.
	   See the documentation of the paramter
          <link linkend="gel-function-OutputChopExponent"><function>OutputChopExponent</function></link>. </para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term> 
            <guilabel>Sólo truncar los números cuando otro número es mayor que 10^-x</guilabel>
      </term> 
	  <listitem>
	  <para>When to chop output.  This is set by the paramter <function>OutputChopWhenExponent</function>.
	   See the documentation of the paramter
          <link linkend="gel-function-OutputChopExponent"><function>OutputChopExponent</function></link>. </para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term> 
	    <guilabel>Recordar los ajustes de salida entre sesiones</guilabel>
      </term> 
	  <listitem>
        <para>Should the output settings in the <guilabel>Number/Expression output options</guilabel> frame
	      be remembered for next session.  Does not apply to the <guilabel>Error/Info output options</guilabel> frame.</para>
	      <para>
		 If unchecked,
	   either the default or any previously saved settings are used each time Genius starts
	   up.  Note that
	   settings are saved at the end of the session, so if you wish to change the defaults
	   check this box, restart <application>Genius Mathematics Tool</application> and then uncheck it again.
	      </para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term> 
	    <guilabel>Mostrar los errores en una ventana de diálogo</guilabel>
      </term> 
	  <listitem>
        <para>If set the errors will be displayed in a separate dialog, if
	unset the errors will be printed on the console.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term> 
	    <guilabel>Mostrar los mensajes de información en un diálogo</guilabel>
      </term> 
	  <listitem>
	<para>If set the information messages will be displayed in a separate
	dialog, if unset the information messages will be printed on the
	console.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term> 
	    <guilabel>Máximo de errores que mostrar</guilabel>
      </term> 
	  <listitem>
        <para>
	  The maximum number of errors to return on one evaluation
	  (<function>MaxErrors</function>).  If you set this to 0 then
	  all errors are always returned.  Usually if some loop causes
	  many errors, then it is unlikely that you will be able to make
	  sense out of more than a few of these, so seeing a long list
	  of errors is usually not helpful.
	  </para>
	  </listitem>
	</varlistentry>
      </variablelist> 

      <para>
	In addition to these preferences, there are some preferences that can
	only be changed by setting them in the workspace console.  For others
	that may affect the output see <xref linkend="genius-gel-function-parameters"/>.
      </para>

      <variablelist> 
	<varlistentry>
	  <term> 
	    <function>IntegerOutputBase</function>
      </term> 
	  <listitem>
        <para>La base que se usará para mostrar enteros</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term> 
	    <function>OutputStyle</function>
      </term> 
	  <listitem>
	<para>A string, can be <literal>"normal"</literal>,
<literal>"latex"</literal>, <literal>"mathml"</literal> or
<literal>"troff"</literal> and it will effect how matrices (and perhaps other
stuff) is printed, useful for pasting into documents.  Normal style is the
default human readable printing style of <application>Genius Mathematics Tool</application>.  The other styles are for
typsetting in LaTeX, MathML (XML), or in Troff.</para>
	  </listitem>
	</varlistentry>
      </variablelist> 
   </sect1> 

    <sect1 id="genius-prefs-precision"> 
      <title>Precisión</title> 
      <variablelist> 
	<varlistentry>
	  <term> 
	    <guilabel>Precisión en coma flotante</guilabel>
      </term> 
	  <listitem>
        <para>
	  The floating point precision in bits
	  (<function>FloatPrecision</function>).
	  Note that changing this only affects newly computed quantities.
	  Old values stored in variables are obviously still in the old
	  precision and if you want to have them more precise you will have
	  to recompute them.  Exceptions to this are the system constants
	  such as <function>pi</function> or
	  <function>e</function>.
	  </para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term> 
	    <guilabel>Recordar los ajustes de precisión entre sesiones</guilabel>
      </term> 
	  <listitem>
        <para>
	   Should the precision setting be remembered for the next session.  If unchecked,
	   either the default or any previously saved setting is used each time Genius starts
	   up.  Note that
	   settings are saved at the end of the session, so if you wish to change the default
	   check this box, restart genius and then uncheck it again.
	  </para>
	  </listitem>
	</varlistentry>
      </variablelist> 
    </sect1> 

    <sect1 id="genius-prefs-terminal"> 
      <title>Terminal</title> 

      <para>«Terminal» se refiere a la consola en el área de trabajo.</para>

      <variablelist> 
	<varlistentry>
	  <term> 
	    <guilabel>Líneas de desplazamiento hacia atrás</guilabel>
      </term> 
	  <listitem>
        <para>Líneas de desfile hacia atrás en la terminal.</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term> 
	    <guilabel>Tipografía</guilabel>
      </term> 
	  <listitem>
        <para>La tipografía que usar en la terminal.</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term> 
	    <guilabel>Negro sobre blanco</guilabel>
      </term> 
	  <listitem>
        <para>Si usar blanco sobre negro en la terminal.</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term> 
	    <guilabel>Cursor parpadeante</guilabel>
      </term> 
	  <listitem>
        <para>Cuando la terminal tenga el foco, el cursor parpadeará en ella. Puede que a veces resulte molesto y genere tráfico innecesario si ejecuta Genius remotamente.</para>
	  </listitem>
	</varlistentry>
      </variablelist> 
    </sect1> 

    <sect1 id="genius-prefs-memory"> 
      <title>Memoria</title> 
      <variablelist> 
	<varlistentry>
	  <term> 
	    <guilabel>Número máximo de nodos que asignar</guilabel>
      </term> 
	  <listitem>
        <para>Internamente, todos los datos se ponen en pequeños nodos en la memoria. Esto da un límite máximo de nodos reservados para el procesado. Esto evita que se quede sin memoria si comete algún error que haga consumir al programa más memoria de lo normal, como podría ser una recursión sin fin. Esto podría ralentizar su máquina y complicar incluso la interrupción del programa.</para>
        <para>Una vez se ha alcanzado el límite, la <application>herramienta matemática Genius</application> preguntará si desea interrumpir el proceso o si desea continuar. Si decide continuar, no se aplicará ningún límite y será posible que su máquina se quede sin memoria. El límite se aplicará en la siguiente ocasión que ejecuté un programa o una expresión en la consola sin importar la respuesta a la pregunta.</para>
        <para>Establecer el límite a cero significa que no hay límite en la cantidad de memoria que usa Genius.</para>
	  </listitem>
	</varlistentry>

      </variablelist> 
    </sect1> 

  </chapter>

<!-- ============= About ====================================== -->
  <chapter id="genius-about"> 
    <title>Acerca de la <application>herramienta matemática Genius</application></title> 

    <para>Jiří (George) Lebl (<email>jirka@5z.com</email>) ha desarrollado la <application>Herramienta matemática Genius</application>. La historia de la <application>herramienta matemática Genius</application> se remonta a 1997. Fue el primer programa calculadora de Gnome, sin embargo evolucionó a algo más que una calculadora de escritorio. Para más información acerca de la <application>herramienta matemática Genius</application>, por favor, visite la <ulink url="http://www.jirka.org/genius.html" type="http">página web de Genius</ulink>.</para>
    <para>Para informar de un error o hacer una sugerencia sobre esta aplicación o sobre este manual, siga las explicaciones en este <ulink url="ghelp:gnome-feedback" type="help">documento</ulink>.</para>

    <para>Este programa se distribuye bajo los términos de la Licencia Pública General GNU (GPL) tal y como fue publicada por la Free Software Foundation, en la versión 2 ó (a su elección) cualquier versión posterior. Una copia de esta licencia puede encontrarse en <ulink url="ghelp:gpl" type="help">este enlace</ulink>, o en el archivo COPYING incluido con el código fuente de este programa.</para>

    <para>Jiří Lebl was during various parts of the development
      partially supported for the work by NSF grant DMS 0900885, 
      the University of Illinois at Urbana-Champaign,
      the University of California at San Diego and
      the University of Wisconsin-Madison.  The software has
      been used for both teaching and research.</para>

  </chapter>

</book>
