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