1\input texinfo   @c -*-texinfo-*-
2@c %**start of header
3@setfilename giac_es.info
4@settitle Giac API
5@comment Carleos 20020729 for Debian packaging added:
6@dircategory Math
7@direntry
8* Giac en castellano: (giac_es).         Programa de calculo simbolico por Bernard Parisse
9@end direntry
10@documentlanguage es
11@documentencoding ISO-8859-1
12@c %**end of header
13
14@setchapternewpage odd
15
16@titlepage
17@sp 10
18@comment The title is printed in a large font.
19@center @titlefont{Giac/Xcas}
20
21@c The following two commands start the copyright page.
22@page
23@vskip 0pt plus 1filll
24Copyright @copyright{} 2001 B. Parisse, Institut Fourier
25Spanish Translation by J.Manrique Lopez, ETSIG
26Last revision 02/07/2002
27@end titlepage
28
29@node Top, Instalaci�n, , (dir)
30@comment node-name, next,previous, up
31
32Giac es una librer�a en C++ con tipos para manipulaciones algebraicas.
33Xcas es una GUI (Interface Gr�fica) unida a Giac que permite las funcionalidades
34de un Sistema de Algebra Computerizada (CAS).
35
36@menu
37* Instalaci�n::      C�mo instalar giac/cas/xcas
38* Xcas::             Describe la interface de usuario de xcas
39* Giac::             C�mo programar en C++ usando giac
40* Ejemplos::         Algunos ejemplos de script para xcas y programacion en C++ usando giac
41* Indice de conceptos:: Indice
42@end menu
43
44@node Instalaci�n, Xcas, Top, Top
45@chapter Instalando giac
46@menu
47* Binarios::         Instalando s�lo los binarios de xcas
48* Requerimientos::   librer�as y programas que necesitas
49* Opciones::         librer�as opcionales que mejoran el funcionamiento de giac
50* Configuraci�n::    Opciones para el script de configuraci�n del shell
51* Compilaci�n::      Compilaci�n de giac
52* Problemas::        Algunos trucos si tienes problemas
53@end menu
54
55@node Binarios, Requerimientos, Instalaci�n, Instalaci�n
56@section Instalando los binarios
57Si quieres usar @code{xcas/giac} como cualquier otro CAS y tu Sistema Operativo es
58Intel x86 GNU/Linux o Intel StrongARM GNU/Linux o Windows 9x, entonces
59no te tienes que preocupar de la compilaci�n. En vez de ello, puedes instalar
60binarios precompilados:
61@itemize
62@item x86 GNU/Linux como usuario normal:
63@uref{ftp://fourier.ujf-grenoble.fr/pub/hp48/xcas_user.tgz}
64
65Descomprime el archivo con
66@command{tar xvfz xcas_user.tgz}
67
68despu�s
69@command{cd xcas}
70
71y
72@command{./xcas}
73@item x86 GNU/Linux si tienes acceso como root:
74@uref{ftp://fourier.ujf-grenoble.fr/pub/hp48/xcas_root.tgz}
75Descomprime el archivo desde el directorio @code{/}
76@item ARM GNU/Linux:
77@uref{ftp://fourier.ujf-grenoble.fr/pub/hp48/xcas_ipaq.tgz}
78@item Windows 9x:
79@uref{ftp://fourier.ujf-grenoble.fr/pub/hp48/xcas.zip}
80
81Ejecuta @code{xcas} desde el directorio donde descomprimiste @code{xcas}.
82@end itemize
83
84@node Requerimientos, Opciones, Binarios, Instalaci�n
85@section Requerimientos
86Necesitas un compilador de C++ que entienda la norma C++ ANSI 3. Por
87ejemplo @code{gcc} versi�n 2.95 o superior, funcionar�. Adem�s, debes
88comprobar que tienes instalada la librer�a GMP GNU Math Precision.
89Si no est� instalada, debes compilar e instalar la fuente:
90est� disponible en cualquier mirror ftp de GNU, mira en
91@uref{http://www.gnu.org} para mas detalles. Si est�s usando GNU/Linux,
92la librer�a GMP es muy probable que est� instalada, pero las cabeceras
93puede que no, busca un paquete llamado algo as� como @code{gmp-devel}.
94
95@node Opciones, Configuraci�n, Requerimientos, Instalaci�n
96@section Opciones
97@enumerate
98@item Si quieres funciones num�ricas deber�as instalar la Gnu Scientific
99Library, disponible en @uref{http://sources.redhat.com/gsl}
100@item Si quieres usar NTL para algunas operaciones polin�micas (actualmente
101factorizaci�n), consigue la versi�n >= 5.2 en @uref{http://www.shoup.net}. Adem�s
102comprueba que configuraste con permiso namespace(esto no est� por defecto)
103y GMP permitido (no est� por defecto, pero tampoco es obligatorio)
104Si no est�s seguro de tu instalaci�n vete al directorio del NTL y teclea
105@smallexample
106 make clean
107 ./configure NTL_GMP_LIP=on NTL_STD_CXX=on
108 make
109 make install
110@end smallexample
111@item Si quieres funciones aritm�ticas avanzadas, consigue PARI en
112@uref{http://www.parigp-home.de}.
113Si te planteas usar PARI SIN NTL entonces DEBES HACER LOS
114SIGUIENTES CAMBIOS en el directorio fuente de PARI:
115@itemize
116@item Archivo @code{src/basemath/polarit2.c}: quita la palabra
117@code{static} de la declaraci�n:
118@smallexample
119  static GEN
120  combine_factors(...)
121@end smallexample
122@item Archivo @code{src/headers/paridecl.h}: A�ade la l�nea
123
124@code{GEN     combine_factors(GEN a, GEN famod, GEN p, long klim, long hint);}
125
126en la secci�n @code{* polarit2.c}
127@item Recompila (@command{make all}) y reinstala PARI (@code{make install})
128y comprueba que la librer�a @code{libpari.a} ha sido actualizada o copiala explicitamente
129desde el directorio @code{O<your_os>}
130@item Cambia en @code{/usr/local/include/pari/pariinl.h} @code{labs}
131por @code{std::abs} si no podr�as tener errores con el compilador.
132@end itemize
133Comprueba en el directorio src, el fichero pari.cc que la memoria reservada
134a la pila de PARI se ajusta a tus necesidades (por defecto son 10MB de RAM) o modifica:
135@code{  long pari_mem_size=10000000;}
136
137@item Si quieres tener GUI (Interface Gr�fica de Usuario), comprueba que tienes FLTK 1.0 (o FLNX)
138instalado (disponible en @uref{http://www.fltk.org}). Adem�s puedes obtener
139modificaciones del FLTK 1.0.11 desde
140@uref{http://www-fourier.ujf-grenoble.fr/~parisse/fltkpar.tgz}
141esto a�ade auto-selecci�n de parentesis.
142ATENCION: Actualmente @code{xcas} no funciona con FLTK 1.1.
143Para el editor de matrices / hoja de c�lculo, necesitar�s adem�s FLVW
144@uref{http://flvw.sourceforge.net/}
145
146
147@item TeXmacs ofrece interface para giac. Puedes obtener TeXmacs en
148 @uref{http://www.texmacs.org}.
149Despu�s de instalar giac, ejecuta texmacs y usa Insert->Session->giac.
150
151@end enumerate
152
153@node Configuraci�n, Compilaci�n, Opciones, Instalaci�n
154@section Opciones de configuraci�n
155El script del shell @code{./configure } reconoce las siguientes opciones:
156@enumerate
157@item --enable-debug
158  Permite imprimir vectores y a�ade codigo de depuraci�n
159@item --enable-fltk
160  Soporte para GUI
161@item --enable-gsl
162  Usa la librer�a Gnu Scientific Library para coma flotante (p.e. funciones especiales ..)
163@item --enable-sscl
164  Permite la inclusi�n de c�digo para algoritmos semi-cl�sicos (producto Moyal, ...)
165  No disponible a�n
166@item --enable-ntl
167  Permite la inclusi�n de c�digo NTL
168@item --enable-pari
169  Permite la inclusi�n de c�digo PARI
170@end enumerate
171
172Estas opciones pueden ser desactivadas usando @code{--disable-option-name} en lugar de
173@code{--enable-option-name}. Por defecto @code{configure} usar� estas opciones
174si las librer�as est�n disponibles en tu sistema.
175
176Para binarios de gran velocidad, antes de ejecutar @code{configure} haz (con bash
177como shell)
178
179@command{$ export CXXFLAGS="-O3 -fexpensive-optimizations -malign-loops=2 -malign-jumps=2 -malign-functions=2"}
180
181o (con tcsh como shell)
182
183@command{$ setenv CXXFLAGS "-O3 -fexpensive-optimizations -malign-loops=2 -malign-jumps=2 -malign-functions=2"}
184
185
186
187@node Compilaci�n, Problemas, Configuraci�n, Instalaci�n
188@section Compilaci�n
189Como con cualquier software GNU autoconfigurable, puedes teclear:
190
191@command{ ./configure }
192
193[a�ade opciones necesarias: prueba @command{./configure -help} para obtener mas informaci�n]
194
195@command{ make }
196
197@command{ make check }
198
199[pasa a ser root si es necesario]
200
201@command{ make install }
202
203Trucos:
204@itemize
205@item Si tienes permiso de escritura en @code{/usr/local/},
206FLTK y GSL instalados y no quieres capacidad de depuraci�n, puedes teclear
207
208@command{ ./inst}
209
210@item Si tienes FLTK y GSL instalados y quieres capacidad de depuraci�n, teclea
211
212@command{ ./setup}
213
214[hazte root]
215
216@command{ make install}
217
218@item Si no quieres optimizaci�n, cambia la variable de entorno
219@env{CXXFLAGS} a @code{-g} antes de ejecutar configure, con tcsh
220@command{ setenv CXXFLAGS -g}, con bash @command{export CXXFLAGS=-g}.
221
222@item Si quieres construir xcas para el procesador ARM con la distribuci�n
223de Linux Familiar (p.e. para un iPaq @uref{http://www.handhelds.org})
224asumiendo que tienes instalado skiff toolchain y FLTK. Comprueba
225que  @code{config.h} define HAVE_LIBFLTK y no define
226HAVE_LIBGSL y HAVE_LIBGSLCBLAS a menos que tengas estas librer�as tambi�n, entonces
227
228@command{ make -f Makefile.ipaq}
229
230N�tese que nunca he conseguido construirlo con optimizaci�n para el iPaq.
231
232@item Si quieres el cas s�lo en l�nea de comandos, ejecuta
233
234 @command{ ./configure --disable-gui}
235
236 @command{ make }
237
238@item Windows
239
240Puedes compilar la versi�n librer�a de giac bajo Unix.
241O asumiendo que tengas las herramientas cygwin, gmp y FLTK instaladas (mira en
242@uref{http://sources.redhat.com/cygwin} para cygwin, ejecuta cygwin,
243vete al directorio @code{src} y ejecuta
244
245@command{ make -f Makefile.win}
246
247Despu�s de esto, puedes ejecutar @code{xcas.exe} de forma independiente,
248@code{/usr/bin/cygwin1.dll} proporcionada ha sido copiada en el path (p.e. en el mismo
249directorio que @code{xcas.exe})
250@end itemize
251
252
253@node Problemas, , Compilaci�n, Instalaci�n
254@section Problemas
255@itemize
256@item Si compruebas giac despu�s de la compilaci�n con @code{make check},
257por favor nota que la respuesta asume que PARI y NTL no est�n permitidos (enabled).
258Si no obtendr�s algunos errores porque la factorizaci�n no
259devolver� los factores en el mismo orden.
260@item Optimizaci�n requiere mucha memoria para compilar. Si est�s bajo
261de memoria edita @code{src/Makefile} y si es necesario cambia la l�nea :
262
263@code{CXXFLAGS = -g -O2}
264por :
265
266@code{CXXFLAGS = -g}
267@item Ha sido imposible compilar FLTK con gcc 3. Instala  2.95 o 2.96
268o reconfigura sin soporte FLTK o compila solo la versi�n de l�nea de comandos
269de giac
270@item Si tienes un error como
271
272@command{autoheader: Symbol 'CONSTANT_DEBUG_SUPPORT' is not covered by ...}
273
274ejecuta
275
276@command{autoheader --localdir=.}
277@item Si obtienes un error compilando @code{modpoly.cc}, es casi seguro
278porque compilaste sin NTL namespaces. Recomp�lalo (vease secci�n)
279@item Si obtienes un error de uni�n sobre combine_factors no encontrados en
280@code{modfactor.o} ser� porque no modificaste PARI correctamente u
281olvidaste reinstalar las librer�as de PARI (vease secci�n)
282@item La compilaci�n con Cygwin de Giac con PARI 2.1.1 requiere que hagas
283algun trabajo manual. No he podido compilar la versi�n din�mica de la librer�a PARI.
284Por lo tanto tuve que hacer la instalaci�n a mano
285@smallexample
286cp libpari.a /usr/local/lib
287mkdir /usr/local/include/pari
288cp src/headers/*.h /usr/local/include/pari
289cp Ocygwin/*.h /usr/local/include/pari
290@end smallexample
291Entonces obtuve un error compilando @code{pari.cc} que desapareci�n comentando
292la l�nea causante en la cabecera @code{/usr/local/include/pari/paricom.h}
293Despu�s de esto todo fu� correctamente.
294@end itemize
295
296@node Xcas, Giac, Instalaci�n, Top
297@chapter Usando xcas, una interface de usuario con giac
298@code{xcas} es una interface de usuario con giac que es similar a una calculadora.
299Una interface de l�nea de comandos llamada @code{cas} tambi�n est� disponible.
300
301@menu
302* Interface::
303* CAS::
304* Geometr�a::
305* Scripting::
306@end menu
307
308@node Interface, CAS, ,Xcas
309@section La interface
310Puedes usar, pero no lo necesitas, un teclado puesto que esta interface
311est� dise�ada para ser usada tambi�n en PDA. Usa el bot�n verde cambio para obtener
312los botones del teclado.
313
314La ventana est� compuesta de izquierda a derecha y de arriba a abajo por:
315@enumerate
316@item La barra principal de men�s
317@item El historial o ventana gr�fica
318@item La barra de herramientas del historial y el menu de Edici�n/dibujo
319@item la l�nea de comandos
320@item La barra de men�s por teclas (como en las calculadoras gr�ficas HP4x)
321@item Ayuda en l�nea
322@item Botones tipo calculadora a la derecha
323@end enumerate
324
325La interface se asemeja a las avanzadas calculadoras gr�ficas (TI89, TI92,
326HP49G en modo algebraico): escribes un comando en la l�nea de comandos
327con la ayuda del teclado y/o los botones, ayuda en l�nea y men�s.
328Entonces pulsando Enter se evaluar� tu expresi�n y devolver� el
329resultado al �rea del historial. Si un comando devuelve un objeto gr�fico
330la ventana historial ser� reemplazada por la ventana gr�fica. Puedes
331cambiar de ventana historial a gr�fica usando el bot�n @code{Geo}
332en la barra de men�s por teclas.
333
334La ayuda en l�nea da una breve descripci�n de todos los comandos del CAS
335con ejemplos que pueden ser pegados en la l�nea de comandos. Est� disponible
336por defecto en @code{xcas} o con el comando @code{aide} desde shell.
337
338Imprimir requiere una instalaci�n operativa de @code{LaTeX} con @code{pstricks}.
339
340@node CAS, Geometr�a, Interface, Xcas
341@section Comandos del sistema de �lgebra computerizado
342Una lista de comandos del CAS.
343@menu
344* Men� matem�ticas::
345* Aritm�tica::
346* Men� del CAS::
347* Algebra lineal::
348@end menu
349
350@node Men� matem�ticas, Aritm�tica, , CAS
351@subsection Comandos matem�ticos b�sicos
352
353@node Aritm�tica, Men� del CAS, Men� matem�ticas, CAS
354@subsection Aritm�tica de enteros y polin�mios
355Los comandos  @code{gcd}y @code{lcm} se aplican a ambos tipos de argumentos:
356devuelven el m�ximo com�n divisor o el m�nimo com�n m�ltiplo.
357Otros comandos aritm�ticos deben comenzar con la letra @code{i} si quieres usarlos
358con enteros, si no los argumentos ser�n considerados como polin�mios constantes.
359@menu
360* Aritm�tica de enteros::
361* Aritm�tica de polin�mios::
362@end menu
363
364@node Aritm�tica de enteros, Aritm�tica de polin�mios, , Aritm�tica
365@subsubsection Fucniones artim�ticas de enteros
366@menu
367* Divisi�n::      Divisi�n eucl�dea
368* Mcd::             Mcd, Mcm, Mcd extendido, restos chinos
369* Primalidad::     Test de primalidad, factorizaci�n, caracter�stica de Euler
370* Otros enteros:: Jacobi, s�mbolo de Legendre ...
371@end menu
372
373@node Divisi�n, Mcd, , Aritm�tica de enteros
374@subsubsection Divisi�n eucl�dea entera
375Dados dos enteros  @code{a} y  @code{b}, la divisi�n eucl�dea entera
376est� definida por la igualdad :
377@example
378a=b*q+r
379@end example
380donde normalmente  @code{r} se coge entre  0 y @code{b-1}, o
381en la representaci�n sim�trica , entre @code{-b/2} y @code{b/2}.
382Las funciones  @code{iquo(a,b)} y  @code{irem(a,b)} devuelven respectivamente
383@code{q} y @code{r}, o @code{iquorem(a,b)} devueltas ambas como un vector.
384La funci�n @code{smod(a,b)} devolver� @code{r} usando el convenio de resto
385sim�trico.
386
387@node Mcd, Primalidad, Divisi�n, Aritm�tica de enteros
388@subsubsection Mcd de enteros
389la funci�n @code{gcd(a,b)} devuelve el m�ximo com�n divisor (Mcd)
390@code{d} de dos enteros @code{a} y  @code{b}. Si necesitas dos enteros
391@code{u} y @code{v} tales que:
392@example
393a*u+b*v=d
394@end example
395puedes usar en su lugar @code{egcd(a,b)} , devolver�  @code{[u,v,d]}.
396
397El comando  @code{ichinrem([a,n],[b,m])} donde @code{n} y @code{m}
398son primos devolver� un vector @code{[c,n*m]} tal que
399@code{c=a (mod n)} y  @code{c=b (mod m)}.
400
401@node Primalidad, Otros enteros, Mcd, Aritm�tica de enteros
402@subsubsection Primalidad y factorizaci�n
403La funci�n @code{is_prime(a)} devolver� 0 si @code{a} no es primo.
404Devolver� 2 si @code{a} es seguro primo, y 1 si @code{a}
405es pseudo-primo. Si has compilado @code{xcas} con soporte PARI,
406obtendr�s un certificado de primo en su lugar (v�ase documentaci�n de PARI
407para m�s informaci�n).
408
409Los comandos  @code{nextprime(a)} y  @code{prevprime(a)} devolver�n
410el siguiente o anterior (pseudo-)primo, de un entero @code{a} dado.
411
412La funci�n @code{ifactor(a)} devuelve la factorizaci�n de @code{a}.
413Es una buena idea compilar con soporte PARI si tienes planeado factorizar
414enteros relativamente grandes (con factores primos de mas de 20 d�gitos).
415
416@node Otros enteros, , Primalidad, Aritm�tica de enteros
417@subsubsection Otras funciones enteras (Legendre, Jacobi, ...)
418Funciones de enteras adicionales provistas por  @code{xcas} son
419@itemize
420@item @code{jacobi(a,b)}
421y  @code{legendre(a,b)}, v�ase la documentaci�n de  GMP para m�s detalles.
422@item @code{pa2b2(p)} devuelve  @code{[a,b]} tal que @code{p=a*a+b*b}
423si @code{p=1 (mod 4)} es primo.
424@end itemize
425
426@node Aritm�tica de polin�mios, , Aritm�tica de enteros, Aritm�tica
427@subsubsection Funciones aritm�ticas de polin�mios
428Los polin�mios tienen dos representaciones: representaci�n simb�lica o
429por un vector de coeficientes. En la representaci�n simb�lica puedes
430a�adir el nombre de la variable como par�metro adicional a las funciones
431que uses, si no la variable por defecto ser� la usada. Para la representaci�n
432por vector, es recomendable usar el delimitador correcto @code{poly1[}
433en lugar de @code{[} con  lo que las operaciones habituales (suma,..)
434se comportar�n correctamente (no como si fuesen vectores o matrices).
435@enumerate
436@item @code{quo(a,b)} @code{rem(a,b)} y @code{quorem(a,b)}
437devuelven respectivamente los polin�mios @code{q}, @code{r} y  @code{[q,r]}
438tales que  @code{a=b*q+r} y @code{degree(r)<degree(b)}
439@item @code{gcd(a,b)} devuelve el m�ximo com�n divisor de dos polin�mios
440@item @code{egcd(a,b)} es el algor�tmo Mcd ecl�deo extendido, al igual que para
441enteros devuelve una lista de 3 polin�momios  @code{u,v,d} tales que  @code{au+bv=d}.
442@item @code{chinrem} devuelve el resto chino para polin�mios escritos como listas.
443Los 2 argumentos son dos listas hechas de polin�mios m�dulo otro polinomio
444 (donde los polin�mios m�dulo son primos entre ellos).
445La respuesta es el polin�mio m�dulo producto de los polin�mios m�dulo
446que reduce a los originales polin�mios m�dulo los originales polin�mios m�dulo
447@item @code{cyclotomic} toma un entero n como argumento y devuelve el polin�mio
448ciclot�mico n-�simo.
449@end enumerate
450
451@node Men� del CAS, Algebra lineal, Aritm�tica, CAS
452@subsection Algebra, calculo, ...
453@menu
454* Reescribiendo::
455* Diferenciales e integrales::
456* Limites y series::
457* Resolviendo ecuaciones::
458* Otras funciones del cas::
459@end menu
460
461@node Reescribiendo, Diferenciales e integrales, , Men� del CAS
462@subsubsection Reescribiendo expresiones
463El comando @code{normal} reescribe una fracci�n racional como una relaci�n
464entre dos polin�mios coprimos. Si una expresi�n no es racional, primero es
465racionalizada sustituyendo las expresiones transcendentales (p.e.
466@code{sin(x)} ) por un identificador temporal. Expresiones algebraicas
467(p.e. @code{sqrt(x)}) tambi�n son  normalizadas.
468
469El comando @code{factor} factoriza polin�mios. Como antes, expresiones
470no polin�micas son racionalizadas primero. Puedes elegir la variable
471b�sica respecto a la cual el polin�mio ser� factorizado a�adiendola como
472segundo argumento a  @code{factor}.
473
474La funci�n @code{texpand} es usada para expandir expresiones
475transcendentales como @code{exp(x+y)=exp(x)*exp(y)} o reglas similares
476para funciones  trigonom�tricas. La funci�n  @code{tlin} realiza
477la operaci�n inversa para funciones trigonom�tricas , tal y como la funci�n
478@code{lin} lo hace para las exponenciales.
479
480La funci�n  @code{halftan} reescribe expresiones trigonom�tricas
481en t�rminos de la tangente del �ngulo mitad. La funci�n  @code{hyp2exp}
482reescribe funciones hiperb�licas en t�rminos exponenciales.
483
484@node Diferenciales e integrales, Limites y series, Reescribiendo, Men� del CAS
485@subsubsection Derivaci�n, integraci�n
486La instrucci�n para diferenciaci�n es @code{diff(expression,variable)}.
487La antiderivada indefinida se obtiene usando
488@code{integrate(expression,variable)}. Si necesitas integraci�n definida
489entre los l�mites @code{a} y @code{b}, escoge
490@code{integrate(expression,variable,a,b)} para integraci�n exacta
491o @code{romberg(expression,variable,a,b)} para integraci�n num�rica.
492
493Un ejemplo de integraci�n definida son los coeficientes de Fourier de funciones
494peri�dicas. Son obtenidos usando @code{fourier_an} y @code{fourier_bn}
495para coeficientes trigonom�tricos o usando @code{fourier_cn} para
496coeficientes exponenciales complejos.
497
498Algunas antiderivadas discretas pueden ser obtenidas usando
499@code{sum(variable,expression)} .
500
501@node Limites y series, Resolviendo ecuaciones, Diferenciales e integrales, Men� del CAS
502@subsubsection L�mites, desarrollos en serie.
503Para un l�mite la sint�sis es
504@code{limit(expression,variable,limitpoint[,direction])}.
505Para un desarrollo en serie
506@code{series(expression,variable,limitpoint,order[,direction])}.
507La implementaci�n en @code{giac} de @code{limit} y @code{series} est�
508basada en el algor�tmo mrv.
509
510@node Resolviendo ecuaciones, Otras funciones del cas, Limites y series, Men� del CAS
511@subsection Resolviendo ecuaciones
512Usando @code{solve(expression,variable)} se busca la soluci�n exacta
513de ecuaciones polin�micas. Usa @code{newton} para soulciones
514num�ricas (de un mayor rango de ecuaciones).
515
516@node Otras funciones del cas, , Resolviendo ecuaciones, Men� del CAS
517
518@node Algebra lineal , , Men� del CAS, CAS
519@subsection Algebra lineal
520Las operacions aritm�ticas sobre matrices y vectorse se hacen usando los operadores
521habituales. El producto escalar de 2 vectores se obtiene usando el operador  @code{*}.
522
523La eliminaci�n Gaussiana sobre una matriz  (Gauss-Bareiss) se desarrolla
524usando  @code{rref(m)}. El n�cleo de una aplicaci�n lineal de matriz m
525se obtiene con  @code{ker(m)}. Un sistema de ecuaciones lineales (escrito
526simb�licamente como un vector) puede ser resuelto con
527@code{linsolve([equations],[variables])}.
528
529El determinante de una  matriz puede ser obtenido usando dos algor�tmos,
530o bien  Gauss-Bareiss usando  @code{det(m)}, o calculando los menores
531@code{det_minor(m)}. Realmente, un �ltimo m�todo est� disponible usando
532el c�lculo de los coeficientes constantes del polin�mio caracter�stico usando
533el algor�tmo Fadeev-Leverrier.
534
535El polin�mio caracter�stico de una matriz puede ser calculado por el algor�tmo de
536Fadeev-Leverrier usando  @code{pcar(m)}. Para matrices con los coeficientes en
537un campo finito, @code{pcar_hessenberg(m)} es una mejor opci�n  (complejidad
538@code{O(n^3)} donde @code{n} es el tama�o de la matriz).
539
540Los valores propios y los vectores propios son calculados usando respectivamente
541@code{egvl(m)} y @code{egv(m)}. La forma normal de Jordan se obtiene usando
542@code{jordan(m)}.
543
544La formas cuadr�ticas  (escritas simb�licamente) pueden ser reducidas a sumas
545y diferencias de cuadrados usando  @code{gauss(expression,[variables])}.
546
547Hay alg�n soporte para isometr�as: @code{mkisom} puede ser usado para
548hacer una isometr�a  desde sus propios elementos y @code{isom(m)} devuelve
549los elementos propios de una isometr�a.
550
551@node Geometr�a, Scripting, CAS, Xcas
552@section Geometr�a
553Como cualquier otro objeto, puedes crear objetos geom�tricos usando la
554l�nea de comandos. Adicionalmente, si la ventana gr�fica est� activa (clicka
555en el bot�n  @code{Geo} si es  necesario), puedes crear puntos y
556segmentos con el rat�n (o el l�piz apuntador) o mover un objeto geom�trico.
557Para crear un punto,simplemente clicka. Para crear una l�nea, pulsa cualquier bot�n
558del rat�n, mueve el rat�n y suelta el bot�n en el segundo punto.
559Para mover un objeto, primero selecci�nalo clickando cerca de �l. La l�nea de comandos
560deber� mostrar el nombre del objeto. Puedes moverlo pulsando el rat�n
561cerca del objeto y movi�ndolo. Suelta el bot�n del rat�n en la posici�n
562final. Puedes cancelar un movimiento soltando el rat�n fuera de la ventana
563gr�fica. Como en cualquier paquete de geometr�a din�mica. todos los objetos dependientes
564de un objeto, se mover�n cuando muevas dicho objeto.
565
566Para imprimir el gr�fico actual, puedes usar la instrucci�n @code{graph2tex()}
567o bien, sin argumentos (entonces el c�digo @code{LaTeX} ser� insertado en su lugar
568en el historial) o con una cadena de texto conteniendo el nombre
569del fichero donde se guardar� una versi�n aislada del gr�fico, por ejemplo
570@code{graph2tex("figure.tex")} crear� un fichero llamado @code{figure.tex}
571que podr�s compilar con @code{latex figure.tex}.
572
573@node Scripting, , Geometr�a, Xcas
574@section El lenguaje script de xcas
575Xcas y el programa cas proveen un lenguaje interpretado similar a
576otros populares lenguajes de programaci�n de CAS. Este lenguaje scrip est�
577disponible en 3 formas: sint�xis similar a C (por defecto) o en modo compatibilidad
578para programas simples de Maple o Mupad. Describiremos s�lo la sint�xis similar a C.
579Las instrucciones deben acabar con punto y coma @code{;}. Los grupos de
580instrucciones pueden ser combinados usando llaves, como en C.
581
582@menu
583* Modo del lenguaje::
584* Datos::
585* Bucles y condicionales::
586* Funciones::
587@end menu
588
589@node Modo del lenguaje, Datos, , Scripting
590@section Selecci�n del modo del lenguage
591El comando @code{maple_mode(0)} o @code{maple_mode(1)} o
592@code{maple_mode(2)} puede ser usado para cambiar la forma del lenguaje
593respectivamente entre modo similar-C a similar-Maple o similar-Mupad. N�tese que este
594comando tiene efecto s�lo cuando la sesi�n actual del interprete finaliza
595lo que significa cuando el siguiente comando sea procesado en modo interactivo o
596al finalizar el fichero de proceso por lotes actual, por lo tanto no deber�as comenzar un script
597con este comando. En modo de proceso por lotes puedes cambiar el modo activando la
598variable de entorno @code{MAPLE_MODE}, por ejemplo con
599tcsh: @command{setenv MAPLE_MODE 1}
600o con bash @command{export MAPLE_MODE=1}
601cambiar� a lenguaje similar a Maple. O puedes ejecutar @code{maplec} o
602@code{mupadc} en vez de @code{cas}. Adicionalmente puedes introducir
603el comando @code{maple_mode(1)} en el @code{.xcasrc} de tu directorio ra�z
604para cambiar el comportamiento por defecto. O dentro de @code{xcas} puedes ejecutar
605el comando @code{Import} del men� @code{File} y seleccionar la forma.
606El comando @code{Export} puede ser usado para traducir el nivel actual
607del historial dentro de @code{xcas} a un fichero, o el comando @code{View as}
608del men� @code{Edit} para traducirlo a la ventana de salida de la ayuda.
609
610@node Datos, Bucles y condicionales, Modo del lenguaje, Scripting
611@section Datos
612El lenguaje acepta variables locales y globales, variables no son tecleadas.
613Las variables globales no necesitan ser declaradas, las locales deben ser declaradas
614al principio de una funci�n por la palabra clave @code{local} seguido de
615los nombres de las variables locales separados por comas @code{,} con punto y coma
616final @code{;}
617
618El signo de asiganci�n es @code{:=} como en CAS populares y distinto a C.
619Otras operaciones (p.e. @{+ - * /@}) y llamadas a funciones son hechos como en C
620o como en una sesi�n interactiva.
621Como en C, para comprobar igualdad se usa @code{==}. El signo de igual simple @code{=}
622se usa para devolver una ecuaci�n (esta ecuaci�n ser� comprobada como un test
623s�lo en algunas situaciones donde una ecuaci�n no es esperada).
624Las otras cl�usulas de test son @code{!=} para distinto, @code{< <= > >=} para
625comparaciones de valores relaes. Puedes combinar tests con  @code{&&} o @code{and},
626y @code{||} o @code{or}. La negaci�n booleana es @code{!} o @code{not}.
627
628@node Bucles y condicionales, Funciones, Datos, Scripting
629La palabra clave para bucles es como en C
630
631@command{for (inicializacion;mientras_condition;incremento)@{ bloque_bucle @}}
632
633Puedes romper un bucle dentro de la iteraci�n con @code{break;}.
634Puedes saltar immediatamente a la siguiente iteraci�n con @code{continue;}.
635
636Las palabras clave para condicionales son como en C
637
638@command{if (condicion) @{ bloque_si_cierto @} [ else @{ bloque_si_falso @} ]}
639
640Adicionalmente, la selecci�n m�ltiple es traducida como en C
641
642@command{swith (variable)@{ case (valor_1): ... break; default: ... ; @} }
643
644@node Funciones, , Bucles y condicionales, Scripting
645Las funciones son declaradas e implementadas juntas de esta manera
646
647@command{nombre_funcion(parametros):=@{ definicion @}}
648
649Los par�metros son como variables locales con una inicializaci�n adicional
650de los valores de los par�metros dentro de la funci�n.
651
652El @code{return(valor_retorno)} debe ser usado pra devolver el valor
653de la funci�n.
654
655No es posible pasar argumentos por referencia, s�lo por valor.
656
657Una vez que una funci�n es definida, un fichero llamado @code{nombre_funcion.cas}
658es generado en el directorio actual. Una buena idea es agrupar
659definiciones de funciones correspondientes con el mismo tema en un fichero
660llamado con una extensi�n @code{.cc} (de esta manera la identaci�n similar a C
661ocurre autom�ticamente cuando editas el fichero con tu editor favorito) y
662"compila" este fichero con
663@command{cas ccnombrefichero.cc}
664o dentro de @code{xcas} con el comando @code{Run file} del men� @code{Files}.
665
666Una vez que una funci�n est� definida, si modificas el correspondiente fichero @code{.cas},
667no afectar� a la definici�n de la funci�n correspondiente durante la
668sesi�n actual.
669
670@node Giac, Ejemplos, Xcas, Top
671En este cap�tulo primero describiremos el tipo de dato gen�rico de giac,
672la clase @code{gen}. Despu�s describiremos los tipos de datos m�s importantes
673que @code{gen} cubre (polin�mios, vectores, objetos simb�licos
674y funciones unarias de gen). En este punto, el lector deber�a ser
675capaz de programar usando @code{giac}, por lo tanto describimos como integrar
676c�digo a @code{giac} por inclusi�n en la librer�a o como una librer�a
677ejecutable separada (llamada m�dulo). el �ltimo punto describe
678como puedes a�adir nuevos objetos matem�ticos, p.e. quaternas,
679dentro del tipo @code{gen}.
680
681@menu
682* C++::                             Por qu� escogimos C++
683* Gen::                             La clase gen�rica usada en todo giac
684* Polin�mios::                      Polin�mios.
685* Vectores y matrices::             Vectores y matrices.
686* Simb�licos::                      Simb�licos.
687* Funciones unarias::               Funciones que toman un gen y devuelven un gen
688* Haciendo una funcion libreria:: A�ade funcionalidades a giac
689* Haciendo modulos::                A�ade funciones cargables din�micamente a giac
690* Datos definidos por usuario::  Define your own data inside giac
691@end menu
692
693@node C++, Gen, , Giac
694Giac usa el lenguaje C++ porque es m�s f�cil escribir operaciones
695algebraicas usando operadores habituales, por ejemplo @code{a+b*x} es m�s f�cil
696de entender y modificar que @code{add(a,mul(b,x))}, pero no es necesario
697que aprendas programaci�n orientada a objetos. De hecho, es m�s una
698librer�a de C usando caracter�sticas de C++ que facilitan la programaci�n easier (como las
699secuencias I/O y la librer�a de plantillas estandard). De todos modos necesitar�s
700un compilador de C++ reciente, p.e. @code{gcc} versi�n 2.95 o posterior.
701
702
703@node Gen, Polin�mios, C++, Giac
704@chapter La clase gen
705@cindex gen
706
707@code{gen} es la clase usada para representar objetos matem�ticos
708(@code{#include <giac/gen.h>}). Es una uni�n en C, hecha bien de obejtos ``directos''
709como @code{int} o @code{double}
710o de punteros al mont�n de objetos afectados que est�n referenciados.
711La reserva de memoria la realiza la propia librer�a (salvo
712tipos de objetos definidos por el usuario). Puedes comprobar
713el tipo actual de una variable de tipo @code{gen}, p.e. @code{gen e;},
714usando su campo @code{type} (p.e. @code{if (e.type==...)}). Este
715campo @code{type} de un @code{gen} es un @code{int}.
716
717El @code{gen} podr�a ser~:
718@enumerate
719@item un entero inmediato (@code{e.type==_INT_})
720@item un real (double) (@code{e.type==_REAL})
721@item un entero de precision arbitraria (@code{e.type==_ZINT})
722@item un n�mero complejo (@code{e.type==_CINT}), un puntero a
723dos objetos de tipo @code{gen} la parte real y la parte imaginaria
724@item un nombre global (@code{e.type==_IDNT}), con un puntero a un
725tipo @code{identificateur}
726@item un objeto simb�lico (@code{e.type==_SYMB}), con un puntero a
727tipo @code{symbolic}
728@item un objeto vector (de hecho es una lista) (@code{e.type==_VECT}),
729con un puntero a un tipo @code{vecteur}
730@item un objeto funci�n (@code{e.type==_FUNC}),
731con un puntero a un tipo @code{unary_function_ptr}
732@end enumerate
733
734Otros tipos est�n disponibles (p.e. un puntero a un objeto @code{gen_user}
735que puedes derivar para hacer tus propias clases, o n�meros de coma flotante
736con precision arbitraria que ser�n implementados m�s tarde), para una descripci�n
737completa mira en @code{giac/gen.h} (si tienes instalado @code{giac}
738la ruta a los ficheros incluidos es @code{/usr/local/include/giac} a menos que
739invalide la que est� por defecto, si no lo instalas, la ruta es la ruta al
740directorio @code{src} de la distribuci�n del c�digo fuente).
741
742Si quieres acceder al tipo subyacente, despues de comprobar que el tipo
743es correcto, puedes hacer lo siguiente:
744@enumerate
745@item para un entero inmediato: @code{int i=e.val;}
746@item para un real (double): @code{double d=e._DOUBLE_val;}
747@item para enteros de precisi�n arbitraria: @code{mpz_t * m=e._ZINTptr;}
748@item para n�meros complejos: @code{gen realpart=*e._CINTptr; }
749@item para identificadores: @code{identificateur i=*e._IDNTptr; }
750@item para simb�licos: @code{symbolic s=*e._SYMBptr;}
751@item para compuestos: @code{vecteur v=*e._VECTptr;}
752@item para objetos funci�n: @code{unary_function_ptr u=*e._FUNCptr}
753@end enumerate
754
755Adem�s del @code{type} principal, cada @code{gen} tiene @code{subtype} (subtipo).
756Este subtipo se usa algunas veces para seleccionar diferentes comportamientos, p.e.
757a�adiendo una constante a un vector podr�a a�adir la constante a todos los t�rminos
758para algunos obejtos geom�tricos representados usando vectores, s�lo a los t�rminos
759de la diagonal de la matriz cuadrada, o al �ltimo t�rmino de polin�mios densos.
760Mira en @code{giac/dispatch.h} la descripci�n de los subtipos.
761
762@node Polin�mios, Vectores y matrices, Gen, Giac
763@cindex Polin�mios
764@section Polin�mios
765Polin�mios est�n disponibles como:
766@itemize
767@item polin�mios multivariables escasos @code{polynome}, los
768ficheros de cabecera son @code{gausspol.h} y @code{poly.h}
769@item polin�mios univariables densos: @code{poly1} o alias @code{modpoly}
770usado para polin�mios univariables modulares. El tipo usado es el mismo
771que para vectores y matrices.
772Los ficheros de cabecera son @code{giac/polygauss.h} y @code{giac/modpoly.h}.
773@end itemize
774
775Un @code{gen} puede ser un polin�mio si su campo @code{type} es
776respectivamente @code{_POLY} (escaso) o @code{_VECT} (denso).
777Las funciones de conversi�n a y de la representaci�n simb�lica
778respecto a nombres globales son declaradas en @code{giac/sym2poly.cc}.
779
780@node Vectores y matrices, Simb�licos, Polin�mios, Giac
781@cindex Vectores
782@cindex Matrices
783@section Vectores y matrices
784El tipo usado para vectores y matrices es el mismo, es un
785@code{std::vector<gen>} (a menos que lo tengas configurado con
786@code{--enable-debug}). El fichero cabecera es @code{giac/vecteur.h}.
787Un @code{gen} puede ser un vector si su campo @code{type} es
788@code{_VECT}.
789
790@node Simb�licos, Funciones unarias, Vectores y matrices, Giac
791@cindex Simb�licos
792@section Simb�licos
793Los objetos simb�licos son �rboles. El @code{sommet} es una @code{unary_function_ptr}
794(una clase apuntando a una funci�n). El @code{feuille} es tambi�n
795un @code{gen} at�mico (para un funci�n con un argumento) o un compuesto
796(@code{feuille.type==_VECT}) para una funci�n con m�s de un argumento
797(estas funciones aparecen por lo tanto como una funci�n con un argumento el cual
798es la lista de todos sus argumentos).
799
800@node Funciones unarias, Haciendo una funcion libreria, Simb�licos, Giac
801@cindex Funciones unarias
802@section Funciones unarias
803En la librer�a giac, cada funci�n es vista como un funci�n que coge un
804argumento y devuelve un argumento. Si una funci�n debiese tener m�s de un
805argumento, metemos estos argumentos en un vector.
806
807Los ficheros @code{usual.cc/.h} dan ejemplos de declaraciones p.ej. para
808funciones exponenciales y trigonom�tricas. Las funciones unarias tienen
809los siguientes miembros~:
810@itemize
811@item una funci�n que coge un @code{gen} y devuelve un @code{gen}
812que hace todo el trabajo
813@item derivadas parciales de esa funci�n si existen
814@item un desarrollo en serie especial de Taylor si es necesario (vease p.ej. @code{taylor_asin}).
815�ste es siempre el caso si tu funci�n est� definida en infinito.
816Notese que esta funci�n
817es ejecutada al inicio as� que puedes incluir c�digo en ella por
818ejemplo para a�adir tu funci�n al paso de preproceso simb�lico del
819algor�tmo @code{limit/series} .
820@item una cadena de texto identificadora para imprimir. Si quieres que el int�rprete
821reconozca tu funci�n, debes a�adir una l�nea en @code{input_lexer.ll}
822(mira por ejemplo @code{"sin"}) o debes registrarla (mira m�s abajo).
823@item dos funciones especial de impresi�n si la impresi�n normal (impresi�n normal
824significa imprimir el nombre de la funci�n seguido por el argumento(s) entre par�ntesis)
825no es la forma correcta de imprimirla. Un puntero nulo significa que se usa impresi�n
826normal.
827@end itemize
828Una vez que la @code{unaria_funcion_unaria} est� definida, debes construtir
829un @code{unaria_funcion_ptr} para poder usar lo simb�licos internos.
830
831Podr�as dar un argumento opcional para especificar un comportamiento para la evaluaci�n
832de argumentos (citando). En este caso, podr�as dar un segundo argumento opcional
833para registrar tu funci�n din�micamente en la lista de nombre de funciones
834reconozidas por el int�rprete. Aseg�rate de unir el fichero objeto de forma
835que la inicializaci�n occurre despues de inicializarse @code{input_lexer.ll},
836esto significa que debes poner tu fichero objeto antes de @code{input_lexer.o}
837cuando unas (mira por ejemplo la posici�n de @code{moyal.o} en
838el fichero @code{Makefile.am} , @code{moyal}
839es un ejemplo de registro din�mico).
840
841Tienes, por supuesto, la opci�n de declarar el nombre de la funci�n
842est�ticamente en el fichero @code{input_lexer.ll}.
843
844Siempre debes declarar una funci�n est�ticamente si no sigue
845la sint�xis est�ndar para una funci�n.
846
847@node Haciendo una funcion libreria, Haciendo modulos, Funciones unarias, Giac
848Aqu� est� un ejemplo de una funci�n unible din�micamente llamada
849@code{example} que requiere 2 argumentos y devuelve la suma dividida
850por el producto si los argumentos son enteros o se devuelve a si misma en otro caso.
851La cabecera en C++ de @code{example.h} ser�a algo as�
852@example
853#ifndef __EXAMPLE_H
854#define __EXAMPLE_H
855#include <giac/gen.h>
856#include <giac/unary.h>
857
858#ifndef NO_NAMESPACE_GIAC
859namespace giac @{
860#endif // ndef NO_NAMESPACE_GIAC
861
862  gen example(const gen & a,const gen & b);
863  gen _example(const gen & args);
864  extern unary_function_ptr at_example ;
865
866#ifndef NO_NAMESPACE_GIAC
867@} // namespace giac
868#endif // ndef NO_NAMESPACE_GIAC
869#endif // __EXAMPLE_H
870@end example
871
872El c�digo en C++ ser�a algo como:
873@example
874using namespace std;
875#include <giac/giac.h>
876#include "example.h"
877
878#ifndef NO_NAMESPACE_GIAC
879namespace giac @{
880#endif // ndef NO_NAMESPACE_GIAC
881
882  gen example(const gen & a,const gen & b)@{
883    if (is_integer(a) && is_integer(b))
884      return (a+b)/(a*b);
885    return symbolic(at_example,makevecteur(a,b));
886  @}
887
888  gen _example(const gen & args)@{
889    if ( (args.type!=_VECT) || (args._VECTptr->size()!=2) )
890      setsizeerr(); // type checking : args must be a vector of size 2
891    vecteur & v=*args._VECTptr;
892    return example(v[0],v[1]);
893  @}
894  const string _example_s("example");
895  unary_function_unary __example(&_example,_example_s);
896  unary_function_ptr at_example (&__example,0,true);
897
898#ifndef NO_NAMESPACE_GIAC
899@}
900#endif // ndef NO_NAMESPACE_GIAC
901@end example
902
903Comp�lalo con
904@example
905c++ -g -c example.cc
906@end example
907
908Para probar tu c�digo, podr�as escribir el siguiente @code{test.cc} programa
909@example
910#include "example.h"
911
912using namespace std;
913using namespace giac;
914
915int main()@{
916  gen args;
917  cout << "Enter argument of example function";
918  cin >> args;
919  cout << "Result: " << _example(args) << endl;
920@}
921@end example
922Comp�lalo con el comando
923@example
924c++ -g example.o test.cc -lgiac -lgmp
925@end example
926Podr�as necesitar unirlo a otras librer�as p.ej.
927@code{-lreadline -lhistory -lcurses} dependiendo de tu instalaci�n.
928Entonces ejecuta @code{a.out}. En este punto probar�as con p.ej. @code{[1,2]}.
929
930Puedes depurar tu programa como siempre, p.ej. con
931@code{gdb a.out}, es recomendable crear un fichero @code{.gdbinit}
932en el directorio actual de forma que puedas usar el comando @code{v}
933para imprimir datos de giac, el fichero @code{.gdbinit} podr�a contener :
934@example
935echo Defining v as print command for giac types\n
936define v
937print ($arg0).dbgprint()
938end
939@end example
940
941Cuando tu funci�n est� comprobada, puedes a�adirla a la librer�a. Edita
942el fichero @code{Makefile.am} del subdirectorio @code{src}
943de @code{giac} : simplemente a�ade @code{example.cc} antes de @code{input_lexer.cc}
944en la l�nea @code{libgiac_la_SOURCES} y a�ade @code{example.h} en la l�nea
945@code{giacinclude_HEADERS} .
946
947Para reconstruir la librer�a vete al directorio @code{giac} y escribe
948@code{automake; make}
949
950Si quieres compartir tu funci�n(es) con otras personas, debes
951ponerle licencia GPL (porque estar� unida a c�digo GPL).
952A�ade la cabecera GPL a los ficheros, y env�alos al e-mail de contribuciones de @code{giac},
953actualmente @code{mailto:parisse@@fourier.ujf-grenoble.fr}
954@example
955/*
956 *  Copyright (C) 2002 Your name
957 *
958 *  This program is free software; you can redistribute it and/or modify
959 *  it under the terms of the GNU General Public License as published by
960 *  the Free Software Foundation; either version 2 of the License, or
961 *  (at your option) any later version.
962 *
963 *  This program is distributed in the hope that it will be useful,
964 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
965 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
966 *  GNU General Public License for more details.
967 *
968 *  You should have received a copy of the GNU General Public License
969 *  along with this program; if not, write to the Free Software
970 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
971 */
972@end example
973
974@node Haciendo modulos, Datos definidos por usuario,  Haciendo una funcion libreria, Giac
975Otra forma de compartir tu c�digo podr�a ser construir una librer�a din�mica
976que puede ser cargada en tiempo de ejecuci�n usando las facilidades de @code{<dlfcns.h>}.
977ATENCION: los m�dulos no funcionan con binarios est�ticos. Aseg�rate
978de tener binarios din�micos (situaci�n por defecto cuando compilas giac,
979pero el paquete @code{xcas} distribuido como binario est� construido est�tico para
980evitar librer�as incompatibles).
981
982Definamos una funci�n llamada  @code{mydll} en el fichero @code{mydll.cc} como
983este :
984@example
985#include <giac/giac.h>
986
987#ifndef NO_NAMESPACE_GIAC
988namespace giac @{
989#endif // ndef NO_NAMESPACE_GIAC
990
991  const string _mydll_s("mydll");
992  gen _mydll(const gen & args)@{
993    return sin(ln(args));
994  @}
995  unary_function_unary __mydll(&giac::_mydll,_mydll_s);
996  unary_function_ptr at_mydll (&__mydll,0,true); // auto-register
997
998#ifndef NO_NAMESPACE_GIAC
999@} // namespace giac
1000#endif // ndef NO_NAMESPACE_GIAC
1001@end example
1002
1003Comp�lalo como esto
1004@example
1005c++ -fPIC -DPIC -g -c mydll.cc -o mydll.lo
1006cc -shared  mydll.lo  -lc  -Wl,-soname -Wl,libmydll.so.0 -o libmydll.so.0.0.0
1007rm -f libmydll.so.0 && ln -s libmydll.so.0.0.0 libmydll.so.0
1008rm -f libmydll.so && ln -s libmydll.so.0.0.0 libmydll.so
1009@end example
1010
1011La librer�a es cargable en tiempo de ejecuci�n de una sesei�n usando el comando
1012@code{insmod("libmydll.so")} asumiendo que est� guardada en un directorio disponible
1013desde @code{LD_LIBRARY_PATH} o en @code{/etc/ld.so.conf} si no
1014debes poner la ruta al fichero librer�a (comenzando con @code{./} si
1015est� en el directorio actual).
1016
1017Una forma de comprobar tu c�digo es a�adir la l�nea siguiente en tu
1018fichero @code{~/.xcasrc}  :
1019@example
1020insmod("ruta_a_libmydll/libmydll.so");
1021@end example
1022donde cambias  @code{ruta_a_libmydll.so} por la ruta real a
1023@code{libmydll.so} por ejemplo @code{/home/joe} si tu nombre de conexi�n (login) es
1024@code{joe} y @code{mydll} est� en tu directorio home.
1025Entonces si est�s usando como editor @code{emacs} , pon como primera l�nea del
1026fichero @code{mydll.cc}
1027@example
1028// -*- mode:C++ ; compile-command: "g++ -I.. -fPIC -DPIC -g -c mydll.cc -o mydll.lo && ln -sf mydll.lo mydll.o && gcc -shared mydll.lo -lc  -Wl,-soname -Wl,libmydll.so.0 -o libmydll.so.0.0.0 && ln -sf libmydll.so.0.0.0 libmydll.so.0 && ln -sf libmydll.so.0.0.0 libmydll.so" -*-
1029@end example
1030Ahora puedes compilarlo con @code{Compile} del men� @code{Tools}
1031y el c�digo resultante es cargado automaticamente cuando comienzas una nueva
1032sesi�n con @code{xcas} o @code{cas} que hace que comprobar sea m�s ligero.
1033
1034@node Datos definidos por usuario, , Haciendo modulos, Giac
1035@cindex  Datos definidos por usuarios
1036@section  Datos definidos por usuario
1037La clase @code{gen_user} puede ser derivada de forma que puedes incluir
1038tus propios datos en @code{gen}. Mira la declaraci�n de @code{gen_user}
1039en el fichero @code{gen.h} y en el ejemplo de las quaternas
1040en los ficheros @code{quater.h} y @code{quater.cc}.
1041
1042@node Ejemplos, Indice de conceptos, Giac, Top
1043@chapter Algunso ejemplos de programas en C++ usando giac
1044
1045@menu
1046* Primer ejemplo::
1047@end menu
1048
1049@node Primer ejemplo, , , Ejemplos
1050@chapter Un primer ejemplo
1051Teclea el texto siguiente con tu editor favorito
1052
1053@smallexample
1054#include <giac/giac.h>
1055using namespace std;
1056using namespace giac;
1057
1058int main()@{
1059  gen e(string("x^2-1"));
1060  cout << factor(e) << endl;
1061@}
1062@end smallexample
1063
1064gu�rdalo como p.ej. @code{tryit.cc} y comp�lalo con
1065
1066@command{c++ -g tryit.cc -lgiac -lgmp}
1067
1068Si obitenes s�mbolos sin resolver, entonces puede que @code{readline} est� activada
1069y debas compilarlo como
1070
1071@command{c++ -g tryit.cc -lgiac -lgmp -lreadline -lcurses}
1072
1073Ahora puedes ejecutar @code{a.out} que imprimir� la factorizaci�n de
1074@code{x^2-1}.
1075
1076Tambi�n puedes ejecutar el programa paso a paso usando gdb.
1077Recomendamos que copies el fichero @code{.gdbinit} del directorio @code{src}
1078de la distribuci�n giac, porque permite usar
1079@code{v nombrevar} para imprimir la variable @code{nombrevar} de tipo @code{gen}.
1080
1081Algunas explicaciones del c�digo:
1082@itemize
1083@item la directiva @code{#include <giac/giac.h>}
1084incluye todas las cabeceras de giac (lo que incluye algunas cabeceras
1085de STL como @code{string} o @code{vector}).
1086@item la directiva @code{using namespace}
1087no es obligatoria, si no la usas, necesitas modificar
1088algo del c�digo, p.ej. usa @code{std::string} en vez de @code{string}
1089o @code{giac::gen} en lugar de @code{gen}.
1090@item Variables del tipo @code{gen}
1091pueden ser construidas a partir de cadenas (usando el int�rprete), a partir de algunos tipos de C
1092(como @code{int} o @code{double}), a partir de tipos de STL
1093@code{std::complex<double>} o a partir de secuencias (usando el int�rprete).
1094@item Operaciones como @code{+, -, *} est�n definidas en el tipo @code{gen}
1095pero la divisi�n no est� redefinida para evitar confusi�n entre enteros
1096(usa @code{iquo}) y divisi�n de double (reales) en C (usa @code{rdiv}). Para potencias,
1097usa @code{pow} como de constumbre.
1098@end itemize
1099
1100@node Indice de conceptos,    ,  Ejemplos, Top
1101@comment node-name,    next,  previous, up
1102@unnumbered Concept Index
1103
1104@printindex cp
1105
1106@contents
1107@bye
1108
1109
1110
1111