[BACK]Return to appb.tex CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / pari / doc

Annotation of OpenXM_contrib/pari/doc/appb.tex, Revision 1.1.1.1

1.1       maekawa     1: \appendix{A Sample program and Makefile}
                      2:
                      3: We assume that you have installed the PARI library and include files as
                      4: explained in Appendix A or in the installation guide. If you chose
                      5: differently any of the directory names, change them accordingly in the
                      6: Makefiles.
                      7:
                      8: If the program example that we have given is in the file \kbd{matexp.c} (say
                      9: as the first of several matrix transcendental functions), then a sample
                     10: Makefile might look as follows. Note that the actual file
                     11: {\tt examples/Makefile} is much more elaborate and you should have a look at
                     12: it if you intend to use {\tt install()} on custom made functions, see
                     13: \secref{se:install}.
                     14:
                     15: \bprog
                     16: CC = cc
                     17: INCDIR = \includedir
                     18: LIBDIR = \libdir
                     19: CFLAGS = -O -I\$(INCDIR) -L\$(LIBDIR)
                     20: \h
                     21: all:\qquad matexp
                     22: \h
                     23: matexp:\qquad  matexp.c
                     24: \q\q \$(CC) \$(CFLAGS) -o matexp matexp.c -lpari -lm
                     25: \eprog
                     26:
                     27: \noindent We then give the listing of the program \kbd{examples/matexp.c}
                     28: seen in detail in \secref{se:prog}, with the slight modifications explained
                     29: at the end of that section.
                     30: %
                     31: \bprog
                     32: \#include <pari.h>
                     33: \h
                     34: GEN
                     35: matexp(GEN x, long prec)
                     36: \obr
                     37: \q  long lx=lg(x),i,k,n, ltop = avma;
                     38: \q  GEN y,r,s,p1,p2;
                     39: \h
                     40: \q /* {\rm check that x is a square matrix} */
                     41: \q if (typ(x) != t\_MAT) err(typeer,"matexp");
                     42: \q if (lx == 1) return cgetg(1, t\_MAT);
                     43: \q if (lx != lg(x[1])) err(talker,"not a square matrix");
                     44: \h
                     45: \q /* {\rm convert x to real or complex of real and compute its L2 norm} */
                     46: \q s = gzero; r = cgetr(prec+1); gaffsg(1,r); x = gmul(r,x);
                     47: \q for (i=1; i<lx; i++)
                     48: \q\q s = gadd(s, gnorml2((GEN)x[i]));
                     49: \q if (typ(s) == t\_REAL) setlg(s,3);
                     50: \q s = gsqrt(s,3); /* {\rm we do not need much precision on s} */
                     51: \h
                     52: \q /* {\rm if $\kbd{s}<1$ we are happy} */
                     53: \q k = expo(s);
                     54: \q if (k < 0) \obr\ n = 0; p1 = x; \cbr
                     55: \q else \obr\ n = k+1; p1 = gmul2n(x,-n); setexpo(s,-1); \cbr
                     56: \h
                     57: \q /* {\rm initializations before the loop} */
                     58: \q y = gscalmat(r,lx-1); /* {\rm creates scalar matrix with r on diagonal} */
                     59: \q p2 = p1; r = s; k = 1;
                     60: \q y = gadd(y,p2);
                     61: \h
                     62: \q /* {\rm now the main loop} */
                     63: \q while (expo(r) >= -BITS\_IN\_LONG*(prec-1))
                     64: \q\obr
                     65: \q\q k++; p2 = gdivgs(gmul(p2,p1),k);
                     66: \q\q r = gdivgs(gmul(s,r),k); y = gadd(y,p2);
                     67: \q\cbr
                     68: \h
                     69: \q /* {\rm now square back \kbd{n} times if necessary} */
                     70: \q for (i=0; i<n; i++) y = gsqr(y);
                     71: \q return gerepileupto(ltop,y);
                     72: \cbr
                     73: \h
                     74: int
                     75: main()
                     76: \obr
                     77: \q long d, prec = 3;
                     78: \q GEN x;
                     79: \h
                     80: \q /* {\rm take a stack of $10^6$ bytes, no prime table} */
                     81: \q pari\_init(1000000,2);
                     82: \q printf("precision of the computation in decimal digits:\bs n");
                     83: \q d = itos(lisGEN(stdin));
                     84: \q if (d > 0) prec = (long)(d*pariK1+3);
                     85: \h
                     86: \q printf("input your matrix in GP format:\bs n");
                     87: \q x = matexp(lisGEN(stdin), prec);
                     88: \h
                     89: \q sor(x, 'g', d, 0);
                     90: \q exit(0);
                     91: \cbr
                     92: \eprog\vfill\eject

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>