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