home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / progs / pari / pari_137 / src / es.c < prev    next >
C/C++ Source or Header  |  1992-05-20  |  41KB  |  1,527 lines

  1. /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
  2. /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
  3. /*@                                                               @*/
  4. /*@             PROGRAMMES D'ENTREES-SORTIES DES GEN              @*/
  5. /*@                                                               @*/
  6. /*@                      copyright Babe Cool                      @*/
  7. /*@                                                               @*/
  8. /*@                                                               @*/
  9. /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
  10. /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
  11.  
  12. /*******************************************************************/
  13. /*******************************************************************/
  14. /*                                                                 */
  15. /*                 LISTE DES TYPES GENERIQUES                      */
  16. /*                 ~~~~~~~~~~~~~~~~~~~~~~~~~~                      */
  17. /*                                                                 */
  18. /*  1  :entier long     [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  19. /*  2  :reel            [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  20. /*  3  :entier modulo   [ code ] [ mod  ] [ entier modulo ]        */
  21. /*  4  :fraction        [ code ] [ num. ] [ den. ]                 */
  22. /*  5  :nfraction       [ code ] [ num. ] [ den. ]                 */
  23. /*  6  :complexe        [ code ] [ reel ] [ imag ]                 */
  24. /*  7  :p-adique        [ cod1 ] [ cod2 ] [ p ] [ p^r ] [ entier]  */
  25. /*  8  :quadrat         [ cod1 ] [ mod  ] [ reel ] [ imag ]        */
  26. /*  9  :poly mod        [ code ] [ mod  ] [ polynome  mod ]        */
  27. /* --------------------------------------------------------------- */
  28. /*  10 :polynome        [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  29. /*  11 :serie           [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  30. /*  13 :fr.rat          [ code ] [ num. ] [ den. ]                 */
  31. /*  14 :n.fr.rat        [ code ] [ num. ] [ den. ]                 */
  32. /*  16 :forme quadrat   [ code ] [  a   ] [  b   ] [  c   ]        */
  33. /*  17 :vecteur ligne   [ code ] [  x1  ] ... [  xl  ]             */
  34. /*  18 :vecteur colonne [ code ] [  x1  ] ... [  xl  ]             */
  35. /*  19 :matrice         [ code ] [ col1 ] ... [ coll ]             */
  36. /*                                                                 */
  37. /*******************************************************************/
  38. /*******************************************************************/
  39.  
  40. # include       "genpari.h"
  41. static void monome(),texnome();
  42.  
  43. /********************************************************************/
  44. /********************************************************************/
  45. /**                                                                **/
  46. /**                     FILTRAGE D'ENTREE                          **/
  47. /**                                                                **/
  48. /********************************************************************/
  49. /********************************************************************/
  50.  
  51. void filtre(s)
  52.      char *s;
  53. {
  54.   char c, *s1 = s;
  55.   int outer = 1;
  56.   
  57.   while(c = *s++)
  58.     {
  59.       if (outer)
  60.     if (isspace(c)) continue; else *s1++ = isupper(c) ? tolower(c) : c;
  61.       else
  62.     *s1++ = c;
  63.       if (c == '"') outer = !outer;
  64.     }
  65.   *s1 = 0;
  66. }
  67.  
  68. /********************************************************************/
  69. /********************************************************************/
  70. /**                                                                **/
  71. /**             UTILITAIRES GENERAUX D'IMPRESSION                  **/
  72. /**                                                                **/
  73. /********************************************************************/
  74. /********************************************************************/
  75.  
  76. void pariputc(c)
  77.      char c;
  78. {
  79.   putc(c, outfile);
  80.   if (logfile) putc(c, logfile);
  81. }
  82.  
  83. void pariputs(s)
  84.      char *s;
  85. {
  86.   fputs(s, outfile);
  87.   if (logfile) fputs(s, logfile);
  88. }
  89.  
  90. static void blancs(nb)
  91.      long nb;
  92. {
  93.   while(nb-->0) pariputc(' ');
  94. }
  95.  
  96. static void zeros(nb)
  97.      long nb;
  98. {
  99.   while(nb-->0) pariputc('0');
  100. }
  101.  
  102. static long coinit(grandmot)
  103.      long grandmot;
  104. {
  105.   char cha[10], *p = cha + 9;
  106.   *p = 0;
  107.   do {*--p = grandmot%10 + '0'; grandmot /= 10;} while (grandmot);
  108.   pariputs(p);
  109.   return cha - p + 9;
  110. }
  111.  
  112. static void comilieu(grandmot)
  113.      
  114.      long    grandmot;
  115.      
  116. {
  117.   char cha[10], *p = cha + 9;
  118.   
  119.   for(*p = 0; p > cha; grandmot /= 10) *--p = grandmot%10 + '0';
  120.   pariputs(cha);
  121. }
  122.  
  123. static void cofin(grandmot,decim)
  124.      long    grandmot,decim;
  125.      
  126. {
  127.   char cha[10], *p = cha + 9;
  128.   for(; p > cha; grandmot /= 10) *--p = grandmot%10 + '0';
  129.   cha[decim] = 0;
  130.   pariputs(cha);
  131. }
  132.  
  133. static long nbdch(l)
  134.      long l;
  135.      
  136. {
  137.   if (l<10) return 1;
  138.   if (l<100) return 2;
  139.   if (l<1000) return 3;
  140.   if (l<10000) return 4;
  141.   if (l<100000) return 5;
  142.   if (l<1000000) return 6;
  143.   if (l<10000000) return 7;
  144.   if (l<100000000) return 8;
  145.   if (l<1000000000) return 9;
  146.   return 10; /* ne doit pas se produire */
  147. }
  148.  
  149. /********************************************************************/
  150. /********************************************************************/
  151. /**                                                                **/
  152. /**                     ECRIRE UN NOMBRE                           **/
  153. /**                                                                **/
  154. /********************************************************************/
  155. /********************************************************************/
  156.  
  157.  
  158. void ecrire(x,format,dec,chmp)
  159.      
  160.      long    dec,chmp;
  161.      char    format;
  162.      GEN     x;
  163.      
  164. {
  165.   int     typy,sgn,i;
  166.   GEN     enti,frac,modifie,p1,dix;
  167.   long    avmacourant,d ,longueur,e,f,ex;
  168.   long    nbch,*res,*re,decmax,deceff,arrondi[3];
  169.   char    thestring[20];
  170.   
  171.   typy=typ(x);
  172.   sgn=signe(x);
  173.   
  174.   if (typy==1)
  175.     /* ecriture d'un entier */
  176.     {
  177.       if (! sgn) pariputc('0');
  178.       else
  179.     {
  180.       re=res=(long *)convi(x);
  181.       nbch=nbdch(*--re);
  182.       while (*--re!= -1) nbch+=9;
  183.       if (sgn!=1) nbch++;
  184.       blancs(chmp-nbch);
  185.       if (sgn!=1) pariputc('-');
  186.       coinit(*--res);
  187.       while (*--res!= -1) comilieu(*res);
  188.     }
  189.     }
  190.   else
  191.     /* ecriture d'un reel */
  192.     switch (format)
  193.       {
  194.       case 'f':
  195.         if (! sgn)
  196.           /*  reel 0 */
  197.       {
  198.         pariputs("0.");
  199.         longueur=1+(-expo(x))/32;
  200.         if (longueur<0) longueur=0;
  201.         if (dec<0) dec=K*longueur;
  202.         zeros(dec);
  203.       }
  204.         else
  205.           /* reel non nul */
  206.       {
  207.         if (sgn!=1) pariputc('-');
  208.         
  209.         /*  on arrondit si il y a lieu */
  210.         avmacourant=avma;
  211.         for (i=0;i<=2;i++) arrondi[i]=x[i];
  212.         setlg(arrondi,3);
  213.         if (dec>0)
  214.           {
  215.         arrondi[1]=arrondi[1]-(32.0/K)*dec-2;
  216.         modifie=mpadd(x,arrondi);
  217.           }
  218.         else  modifie=x;
  219.         
  220.         /* partie entiere */
  221.         enti=gcvtoi(modifie,&e);
  222.         res=(long *)convi(enti);
  223.         d=coinit(*(--res));
  224.         while (*(--res)!= -1)
  225.           {
  226.         d=d+9;comilieu(*res);
  227.           }
  228.         if(e>0) pariputc('*');
  229.         else
  230.           {
  231.         pariputc('.');
  232.         /* partie fractionnaire */
  233.         frac=subri(modifie,enti);
  234.         if(!signe (frac))
  235.           {
  236.             if (dec<0) dec= -expo(frac)*L2SL10+1;
  237.             dec=dec-d;
  238.             if (dec>0) zeros(dec);
  239.           }
  240.         else
  241.           {
  242.             if(!signe(enti))
  243.               {
  244.             d=0;
  245.             do
  246.               {
  247.                 p1=mulsr(1000000000,frac);
  248.                 if(f=(expo(p1)<0))
  249.                   {
  250.                 zeros(9);frac=p1;
  251.                   }
  252.               }
  253.             while(f);
  254.             do
  255.               {
  256.                 p1=mulsr(10,frac);
  257.                 if(f=(expo(p1)<0))
  258.                   {
  259.                 zeros(1);frac=p1;
  260.                   }
  261.               }
  262.             while(f);
  263.               }
  264.             res=(long *)confrac(frac);
  265.             decmax= *res+++d;
  266.             if (dec<0) dec=decmax;
  267.             deceff=dec-decmax;
  268.             dec=dec-d;
  269.             while (dec>8)
  270.               {
  271.             if (dec>deceff) comilieu(*res++);
  272.             else zeros(9);
  273.             dec=dec-9;
  274.               }
  275.             if (dec>0)
  276.               {
  277.             if (dec>deceff) cofin(*res,dec);
  278.             else zeros(dec);
  279.               }
  280.           }
  281.           }
  282.         avma=avmacourant;
  283.       }
  284.         break;
  285.       case 'e':
  286.         /* impression d'un reel en format exponentiel */
  287.         ex=expo(x);ex=(ex>=0)?ex*L2SL10:-(-ex*L2SL10)-1;
  288.         if (! sgn) {sprintf(thestring, " 0.E%ld",ex+1); pariputs(thestring);}
  289.         else
  290.       {
  291.         avmacourant=avma;
  292.         dix=stoi(10);
  293.         p1=(ex>0)?gdiv(x,gpuigs(dix,ex)):gmul(x,gpuigs(dix,-ex));
  294.         if(gcmp(p1,dix)>=0)
  295.           {p1=gdivgs(p1,10);ex++;}
  296.         ecrire(p1,'f',dec,chmp);
  297.         sprintf(thestring, " E%ld",ex); pariputs(thestring);avma=avmacourant;
  298.       }     
  299.         break;
  300.       case 'g':
  301.         /* impression d'un reel en format 'f',sauf s'il est trop petit */
  302.         if(expo(x)>= -32) ecrire(x,'f',dec,chmp);
  303.         else ecrire(x,'e',dec,chmp);
  304.         break;
  305.       default: err(formater);
  306.       }
  307. }
  308.  
  309. /********************************************************************/
  310. /********************************************************************/
  311. /**                                                                **/
  312. /**                      SORTIE HEXADECIMALE                       **/
  313. /**                                                                **/
  314. /********************************************************************/
  315. /********************************************************************/
  316.  
  317. static void voir2(x,nb,bl)
  318.      
  319.      long    nb,bl;
  320.      GEN     x;
  321.      
  322. {
  323.   long    tx=typ(x),i,j,e,dx,nb2,lx=lg(x);
  324.   char    thestring[20];
  325.   
  326.   bl+=2;
  327.   sprintf(thestring, "[&=%08x] ",x); pariputs(thestring);
  328.   if (nb<0)  nb2=lg(x);else nb2=nb;
  329.   switch(tx)
  330.     {
  331.     case 1 : nb2=lgef(x);
  332.     case 2 : for(i=0;i<nb2;i++) {sprintf(thestring, "%08x  ",x[i]); pariputs(thestring);}
  333.       pariputc('\n');
  334.       break;
  335.     case 3 :
  336.     case 9 : for(i=0;i<3;i++) {sprintf(thestring, "%08x  ",x[i]); pariputs(thestring);}
  337.       pariputc('\n');
  338.       blancs(bl);pariputs("mod = ");voir2(x[1],lgef(x[1]),bl);
  339.       blancs(bl);
  340.       if(tx==3) pariputs("int = ");
  341.       else pariputs("pol = ");voir2(x[2],lgef(x[2]),bl);
  342.       break;
  343.     case 4 :
  344.     case 5 :
  345.     case 13:
  346.     case 14: for(i=0;i<3;i++) {sprintf(thestring, "%08x  ",x[i]); pariputs(thestring);}
  347.       pariputc('\n');
  348.       blancs(bl);pariputs("num = ");voir2(x[1],lgef(x[1]),bl);
  349.       blancs(bl);pariputs("den = ");voir2(x[2],lgef(x[2]),bl);
  350.       break;
  351.     case 6 : for(i=0;i<3;i++) {sprintf(thestring, "%08x  ",x[i]); pariputs(thestring);}
  352.       pariputc('\n');
  353.       blancs(bl);pariputs("real = ");voir2(x[1],nb,bl);
  354.       blancs(bl);pariputs("imag = ");voir2(x[2],nb,bl);
  355.       break;
  356.     case 7 : for(i=0;i<5;i++) {sprintf(thestring, "%08x  ",x[i]); pariputs(thestring);}
  357.       pariputc('\n');
  358.       blancs(bl);pariputs("  p : ");voir2(x[2] ,lgef(x[2]),bl);
  359.       blancs(bl);pariputs("p^l : ");voir2(x[3] ,lgef(x[3]),bl);
  360.       blancs(bl);pariputs("  I : ");voir2(x[4] ,lgef(x[3]),bl);
  361.       break;
  362.     case 8 : for(i=0;i<4;i++) {sprintf(thestring, "%08x  ",x[i]); pariputs(thestring);}
  363.       pariputc('\n');
  364.       blancs(bl);pariputs("polynomial=");voir2(x[1],nb,bl);
  365.       blancs(bl);pariputs("real = ");voir2(x[2],nb,bl);
  366.       blancs(bl);pariputs("imag = ");voir2(x[3],nb,bl);
  367.       break;
  368.     case 10: for(i=0;i<lgef(x);i++) {sprintf(thestring, "%08x  ",x[i]); pariputs(thestring);}
  369.       pariputc('\n');
  370.       for(i=2;i<lgef(x);i++)
  371.         {
  372.       blancs(bl);
  373.       sprintf(thestring, "coef of degree %d = ",i-2);
  374.       pariputs(thestring);voir2(x[i],nb, bl);
  375.     }
  376.       break;
  377.     case 11: for(i=0;i<lx;i++) {sprintf(thestring, "%08x  ",x[i]); pariputs(thestring);}
  378.       pariputc('\n');
  379.       e=valp(x);
  380.       if(signe(x))
  381.         for(i=2;i<lx;i++)
  382.           {
  383.         blancs(bl);
  384.         sprintf(thestring, "coef of degree %d = ",e+i-2);
  385.         pariputs(thestring);voir2(x[i],nb, bl);
  386.       }
  387.       break;
  388.     case 15:
  389.     case 16:
  390.     case 17:
  391.     case 18: for(i=0;i<lx;i++) {sprintf(thestring, "%08x  ",x[i]); pariputs(thestring);}
  392.       pariputc('\n');
  393.       for(i=1;i<lx;i++)
  394.         {
  395.       blancs(bl);
  396.       sprintf(thestring, "%d-th component = ",i);
  397.       pariputs(thestring);
  398.       voir2(x[i],nb,bl);
  399.     }
  400.       break;
  401.     case 19: for(i=0;i<lx;i++) {sprintf(thestring, "%08x  ",x[i]); pariputs(thestring);}
  402.       pariputc('\n');
  403.       if(lx>1)
  404.     {
  405.       dx=lg(x[1]);
  406.       for (i=1;i<dx;i++)
  407.         for (j=1;j<lx;j++)
  408.           {
  409.         blancs(bl);
  410.         sprintf(thestring, "mat(%d,%d) = ",i,j);
  411.         pariputs(thestring) ;
  412.         voir2(coeff(x,i,j) ,nb, bl);
  413.           }
  414.     }
  415.     }
  416. }
  417.  
  418. void voir(x,nb)
  419.      GEN x;
  420.      long nb;
  421. {
  422.   voir2(x,nb,0);
  423.   pariputc('\n');
  424. }
  425.  
  426. /********************************************************************/
  427. /********************************************************************/
  428. /**                                                                **/
  429. /**                         SORTIE FORMATEE                        **/
  430. /**                                                                **/
  431. /********************************************************************/
  432. /********************************************************************/
  433.  
  434. static void printvar(v)
  435.      long v;
  436. {
  437.   pariputs(varentries[v]->name);
  438. }
  439.  
  440. static void sori(g,fo,dd,chmp)
  441.      
  442.      GEN     g;
  443.      char    fo;
  444.      long    dd,chmp;
  445. {
  446.   long  typy,sig,v,i,j,i0,e,l,l1,l2,n;
  447.   long  a,b,dx,lx,av;
  448.   char  thestring[50];
  449.   GEN   p,a1,b1;
  450.   
  451.   typy=typ(g);if((typy==4)||(typy==5)) sig=gsigne(g);
  452.   if ((typy>3)&&(typy<18))  chmp=0;
  453.   if (gcmp0(g)&&(typy<17))
  454.     {
  455.       switch(typy)
  456.     {
  457.     case 2 : ecrire(g,fo,dd,chmp);break;
  458.     case 3 :
  459.     case 9 : pariputs("(0 mod ");sori(g[1],fo,-1,chmp);
  460.       pariputc(')');break;
  461.     case 7 :
  462.       pariputs(" 0+O(");ecrire(g[2],fo,dd,chmp);
  463.       sprintf(thestring, "^%d",valp(g));
  464.       pariputs(thestring);
  465.       pariputc(')');break;
  466.     case 11: pariputs(" 0+O(");printvar(ordvar[varn(g)]);
  467.       sprintf(thestring, "^%d)\n",valp(g)); pariputs(thestring);break;
  468.     default: blancs(chmp-1);pariputc('0');
  469.     }
  470.       /*    if (typy>9) pariputc('\n');*/
  471.     }
  472.   else  if (gcmp1(g))
  473.     {
  474.       switch(typy)
  475.     {
  476.     case 2 : ecrire(g,fo,dd,chmp);break;
  477.     case 3 :
  478.     case 9 : pariputs("(1 mod ");sori(g[1],fo,-1,chmp);
  479.       pariputc(')');break;
  480.     case 7 : pariputs("1+O(");ecrire(g[2],fo,dd,chmp);
  481.       sprintf(thestring, "^%d",precp(g)); pariputs(thestring);pariputc(')');break;
  482.     case 11: pariputs("1+O(");printvar(ordvar[varn(g)]);
  483.       sprintf(thestring, "^%d)\n",lg(g)-2); pariputs(thestring);break;
  484.     default: blancs(chmp-1);pariputc('1');
  485.     }
  486.       /*    if (typy>9) pariputc('\n'); */
  487.     }
  488.   else
  489.     if (((typy==4)||(typy==5))&&gcmp1(g[2])) ecrire(g[1],fo,dd,chmp);
  490.     else
  491.       {
  492.     if ((typy>2)&&(typy<15))
  493.       {
  494.         if (((typy==4) || (typy==5))&&(sig<0)) pariputc('-');
  495.         if ((typy!=13)&&(typy!=14)) pariputc('(');
  496.       }
  497.     switch(typy)
  498.       {
  499.       case 1 :
  500.       case 2 : ecrire(g,fo,dd,chmp);break;
  501.       case 3 :
  502.         if (signe(g[2])<0)
  503.           {
  504.         l=avma;sori(addii(g[2],g[1]),fo,-1,chmp);
  505.         avma=l;
  506.           }
  507.         else sori(g[2],fo,dd,chmp);
  508.         pariputs(" mod ");
  509.         sori(g[1],fo,dd,chmp);
  510.         break;
  511.         
  512.       case 9 :
  513.         sori(g[2],fo,dd,chmp);
  514.         pariputs(" mod ");
  515.         sori(g[1],fo,dd,chmp);
  516.         break;
  517.         
  518.       case 4 :
  519.       case 5 :
  520.         a=g[1];
  521.         if (sig<0)
  522.           {setsigne(a,1);ecrire(a,fo,dd,chmp);setsigne(a,-1);}
  523.         else ecrire(a,fo ,dd,chmp);
  524.         if (!gcmp1(g[2]))
  525.           {pariputs(" /");ecrire(g[2],fo,dd,chmp);}
  526.         break;
  527.         
  528.       case 6 :
  529.         a=g[1];b=g[2];
  530.         if (!gcmp0(a)) sori(a,fo,dd,chmp);
  531.         if((signe(b)>0)&&!gcmp0(a)) pariputc('+');
  532.         else pariputc(' ');
  533.         if (!gcmp0(b))
  534.           {
  535.         if (gcmp1(b)) pariputs(" i");
  536.         else
  537.           {
  538.             if(gcmp_1(b)) pariputs("-i");
  539.             else {sori(b,fo,dd,chmp);pariputs(" i");}
  540.           }
  541.           }
  542.         break;
  543.         
  544.       case 7 :                          /*  ecrire un p-adique  */
  545.         e=valp(g);l=precp(g);
  546.         av=avma;
  547.         a1=gcopy(g[4]);p=(GEN)g[2];
  548.         for (i=0;i<l;i++)
  549.           {
  550.         a1=dvmdii(a1,p,&b1);
  551.         if (signe(b1))
  552.           {
  553.             if (!(e+i) || (!gcmp1(b1)))
  554.               {
  555.             ecrire(b1,fo,dd,chmp);
  556.             if((e+i)) pariputc('*');else pariputc(' ');
  557.               }
  558.             if (e+i==1) {ecrire(p,fo,dd,chmp);pariputc(' ');}
  559.             else if (e+i) {ecrire(p,fo,dd,chmp);sprintf(thestring, "^%d ",e+i); pariputs(thestring);}
  560.             pariputc('+');
  561.           }
  562.           }
  563.         pariputs(" O(");
  564.         if (!(e+l)) pariputs(" 1");
  565.         else {ecrire(p,fo,dd,chmp);if((e+l)!=1) sprintf(thestring, "^%d",e+l); pariputs(thestring);}
  566.         pariputc(')');
  567.         avma=av;
  568.         break;
  569.         
  570.       case  8 :
  571.         a=g[2];b=g[3];
  572.         if (!gcmp0(a)) sori(a,fo,dd,chmp);
  573.         if((signe(b)>0)&&!gcmp0(a)) pariputs(" +");
  574.         else pariputc(' ');
  575.         if (!gcmp0(b))
  576.           {
  577.         if (gcmp1(b)) pariputs(" w");
  578.         else
  579.           {
  580.             if(gcmp_1(b)) pariputs("-w");
  581.             else {sori(b,fo,dd,chmp);pariputs(" w");}
  582.           }
  583.           }
  584.         break;
  585.         
  586.       case 10 :                                 /* sortir un polynome */
  587.         i0=gval(g,varn(g))+2;l=lgef(g)-1;v=ordvar[varn(g)];
  588.         for (i=l;i>=i0;i--)
  589.           {
  590.         a=g[i];
  591.         if (!gcmp0(a))
  592.           {
  593.             if ((i==l)&&gcmp_1(a) &&
  594.             (l>2)&&(typ(a)!=3)&&(typ(a)!=9)) pariputc('-');
  595.             if ((!gcmp1(a)&&!gcmp_1(a)) || (i==2) || (typ(a)==3)
  596.             || (typ(a)==9)) sori(a,fo,dd,chmp);
  597.             if (i==3) {pariputc(' ');printvar(v);pariputc(' ');}
  598.             if (i>3) {pariputc(' ');printvar(v);sprintf(thestring, "^%d ",i-2); pariputs(thestring);}
  599.           }
  600.         if (i>i0)
  601.           {
  602.             b=g[i-1];if(!gcmp0(b))
  603.               {
  604.             if ((i>3)&&gcmp_1(b)&&(typ(b)!=3)&&(typ(b)!=9)) 
  605.               pariputc('-');
  606.             else if (((signe(b)>0)||(typ(b)==3)||(typ(b)>5)))
  607.               pariputc('+');
  608.               }
  609.           }
  610.           }
  611.         break;
  612.         
  613.       case 11 :                                 /* serie    */
  614.         e=valp(g)-2;l=lg(g);v=ordvar[varn(g)];
  615.         for (i=2;i<l;i++)
  616.           {
  617.         a=g[i];
  618.         if (!gcmp0(a))
  619.           {
  620.             if (!(e+i) || (!gcmp1(a)&&!gcmp_1(a)) || (typ(a)==3)
  621.             || (typ(a)==9))
  622.               {
  623.             sori(a,fo,dd,chmp);
  624.             if(!(e+i)) pariputc(' ');
  625.               }
  626.             else if (gcmp_1(a)) pariputc('-');
  627.             if (e+i==1) {pariputc(' ');printvar(v);pariputc(' ');}
  628.             if (e+i>1) {pariputc(' ');printvar(v);sprintf(thestring, "^%d ",e+i); pariputs(thestring);}
  629.             if (e+i<0) {pariputc(' ');printvar(v);sprintf(thestring, "^(%d); pariputs(thestring) ",e+i);}
  630.           }
  631.         b=g[i+1];
  632.         if ((i<l-1)&&((typ(b)==3) || (typ(b)>5) ||(signe(b)>0)))
  633.           pariputc('+');
  634.           }
  635.         if (!(e+l)) pariputs("+ O(1)");
  636.         else if (e+l==1){pariputs("+ O(");printvar(v);pariputc(')');}
  637.         else {pariputs("+ O(");printvar(v);sprintf(thestring, "^%d)",e+l); pariputs(thestring);}
  638.         break;
  639.         
  640.       case 13 :
  641.         
  642.       case 14 :  pariputs("\n\n");
  643.         l1=lg(g[1]);l2=lg(g[2]);
  644.         l=(l1>l2) ? l1-2 : l2-2;
  645.         sori(g[1],fo,dd,chmp);pariputc('\n');
  646.         for (n=1;n<l;n++)
  647.           pariputs("----------");pariputc('\n');
  648.         sori(g[2],fo,dd,chmp);
  649.         break;
  650.         
  651.       case 15: pariputc('{');sori(g[1],fo,dd,chmp);pariputc(','); 
  652.         sori(g[2],fo,dd,chmp);pariputc(',');sori(g[3],fo,dd,chmp); 
  653.         pariputc(',');sori(g[4],fo,dd,chmp);pariputs("}\n"); 
  654.         break; 
  655.         
  656.       case 16: pariputc('{');sori(g[1],fo,dd,chmp);pariputc(',');
  657.         sori(g[2],fo,dd,chmp);pariputc(',');sori(g[3],fo,dd,chmp);
  658.         pariputs("}\n");
  659.         break;
  660.         
  661.       case 17 :                                    /* vecteur ligne  */
  662.         pariputc('[');
  663.         for (i=1;i<lg(g);i++)
  664.           {
  665.         sori(g[i],fo,dd,chmp);
  666.         if (i<lg(g)-1) pariputc(',');
  667.           }
  668.         pariputs("]\n");
  669.         break;
  670.         
  671.       case 18 :                                   /* vecteur colonne */
  672.         if(lg(g)==1) pariputs("||\n");
  673.         else
  674.           for (i=1;i<lg(g);i++)
  675.         {
  676.           pariputc('|');
  677.           sori(g[i],fo,dd,chmp);
  678.           pariputs("|\n");
  679.         }
  680.         break;
  681.         
  682.       case 19 :
  683.         pariputc('\n');lx=lg(g);dx=(lx>1)?lg(g[1]):2;
  684.         for (i=1;i<dx;i++)
  685.           {
  686.         pariputc('|');
  687.         for (j=1;j<lx;j++)
  688.           {
  689.             sori(coeff(g,i,j),fo,dd,chmp);
  690.             pariputc(' ');
  691.           }
  692.         if(i<dx-1) pariputs("|\n\n");else pariputs("|\n");
  693.           }
  694.         pariputc('\n');break;
  695.         
  696.       default: sprintf(thestring, "%08x  ",*g); pariputs(thestring);
  697.       }
  698.     if ((typy>2)&&(typy<13)) pariputc(')');
  699.       }                             /* fin du else */
  700. }
  701.  
  702. void sor(g,fo,dd,chmp)
  703.      
  704.      GEN     g;
  705.      char    fo;
  706.      long    dd,chmp;
  707. {
  708.   long av=avma;
  709.   if(varchanged) sori(changevar(g,polvar), fo, dd, chmp);
  710.   else sori(g, fo, dd, chmp);
  711.   avma = av;
  712. }
  713.  
  714. void etatpile(n)
  715.      
  716.      unsigned n;
  717.      
  718. {
  719.   long  nu,i,l,m;
  720.   GEN adr,adr1;
  721.   double r;
  722.   char thestring[80];
  723.   
  724.   nu=(top-avma)/4;
  725.   l=(top-bot)/4;
  726.   r=100.0*nu/l;
  727.   sprintf(thestring, "\n Top : %lx   Bottom : %lx   Current stack : %lx\n",top,bot,avma); pariputs(thestring);
  728.   sprintf(thestring, " Used :                         %d  long words  (%d K)\n",nu,nu/256); pariputs(thestring);
  729.   sprintf(thestring, " Available :                    %d  long words  (%d K)\n",(l-nu),(l-nu)/256); pariputs(thestring);
  730.   sprintf(thestring, " Occupation of the PARI stack : %0.2lf percent\n",r); pariputs(thestring);
  731.   for(m = i = l = 0; i < MAXBLOC; i++)
  732.     if (blocliste[i]) {m++; l += taille(blocliste[i]) + 2;}
  733.   sprintf(thestring, " %d objects on heap occupy %d long words\n\n", m, l); pariputs(thestring);
  734.   
  735.   if (n)
  736.     {
  737.       if (n>nu) n=nu;
  738.       adr=(GEN)avma;adr1=adr+n;
  739.       while (adr<adr1)
  740.     {
  741.       sprintf(thestring, "  %08x  :  ",adr); pariputs(thestring);
  742.       l=lg(adr);m=(adr==polvar) ? MAXVAR+1 : 0;
  743.       for (i=0;(i<l)&&(adr<adr1);i++,adr++)
  744.         {sprintf(thestring, "%08x  ",*adr); pariputs(thestring);}
  745.       pariputc('\n');if(m) adr=polvar+m;
  746.     }
  747.       pariputc('\n');
  748.     }
  749. }
  750.  
  751. /********************************************************************/
  752. /********************************************************************/
  753. /**                                                                **/
  754. /**                          SORTIE BRUTE                          **/
  755. /**                                                                **/
  756. /********************************************************************/
  757. /********************************************************************/
  758.  
  759. static long isnull(g)
  760.      GEN g;
  761. {
  762.   long i;
  763.   switch (typ(g))
  764.     {
  765.     case 1: return !signe(g);
  766.     case 6: return isnull(g[1])&&isnull(g[2]);
  767.     case 8: return isnull(g[2])&&isnull(g[3]);
  768.     case 4:
  769.     case 5:
  770.     case 13:
  771.     case 14: return isnull(g[1]);
  772.     case 10: for (i=lgef(g)-1;i>1;i--) if (!isnull(g[i])) return 0;
  773.       return 1;
  774.     default: return 0;
  775.     }
  776. }
  777.  
  778. static long isone(g) /* renvoie 1 ou-1 si g est 1 ou-1,0 sinon */
  779.      GEN g;
  780. {
  781.   long i,sig;
  782.   switch (typ(g))
  783.     {
  784.     case 1: if(!signe(g)) return 0;
  785.     else return (g[2]==1)&&(lgef(g)==3) ? signe(g) : 0;
  786.     case 6: return isnull(g[2]) * isone(g[1]);
  787.     case 8: return isnull(g[3]) * isone(g[2]);
  788.     case 4:
  789.     case 5:
  790.     case 13:
  791.     case 14: return isone(g[1])*isone(g[2]);
  792.     case 10: if(!signe(g)) return 0;
  793.       if (!(sig=isone(g[2]))) return 0;
  794.       for (i=lgef(g)-1;i>2;i--) if (!isnull(g[i])) return 0;
  795.       return sig;
  796.     default: return 0;
  797.     }
  798. }
  799.  
  800. static long isfactor(g) /* si g est un monome,renvoie son signe,0 sinon */
  801.      GEN g;
  802. {
  803.   long i,deja=0,sig=1;
  804.   switch(typ(g))
  805.     {
  806.     case 1:
  807.     case 2: return signe(g)<0 ?-1 : 1;
  808.     case 4:
  809.     case 5:
  810.     case 13:
  811.     case 14: return isfactor(g[1]);
  812.     case 6: if (isnull(g[1])) return isfactor(g[2]);
  813.       return isnull(g[2]) ? isfactor(g[1]) : 0;
  814.     case 7: return !signe(g[4]);
  815.     case 8: if (isnull(g[2])) return isfactor(g[3]);
  816.       return isnull(g[3]) ? isfactor(g[2]) : 0;
  817.     case 10:
  818.       for (i=lgef(g)-1;i>1;i--)
  819.         if (!isnull(g[i]))
  820.       {
  821.         if (deja) return 0;
  822.         sig=isfactor(g[i]);
  823.         deja=1;
  824.       }
  825.       return sig ? sig : 1;
  826.     case 11: if(!signe(g)) return 1;
  827.       for (i=lg(g)-1;i>1;i--) if (!isnull(g[i])) return 0;
  828.     default: return 1;
  829.     }
  830. }
  831.  
  832. static long isdenom(g) /* renvoie 1 si g est un truc... */
  833.      GEN g;
  834. {
  835.   long i,deja=0;
  836.   switch(typ(g))
  837.     {
  838.     case 4:
  839.     case 5:
  840.     case 13:
  841.     case 14: return 0;
  842.     case 6: return isnull(g[2]);
  843.     case 7: return !signe(g[4]);
  844.     case 8: return isnull(g[3]);
  845.     case 10:
  846.       for (i=lgef(g)-1;i>1;i--)
  847.         if (!isnull(g[i]))
  848.       {
  849.         if (deja) return 0;
  850.         if (i==2) return isdenom(g[2]);
  851.         if (!isone(g[i])) return 0;
  852.         deja=1;
  853.       }
  854.       return 1;
  855.     case 11: if(!signe(g)) return 1;
  856.       for (i=lg(g)-1;i>1;i--) if (!isnull(g[i])) return 0;
  857.     default: return 1;
  858.     }
  859. }
  860.  
  861. #define putsigne(x) pariputs(x>0 ? " + " : " - ")
  862.  
  863. static void monome(v,deg)
  864.      long v,deg;
  865. {
  866.   char thestring[20];
  867.   if (deg)
  868.     {
  869.       printvar(v);
  870.       if (deg!=1) {sprintf(thestring, "^%d",deg); pariputs(thestring);}
  871.     }
  872.   else pariputc('1');
  873. }
  874.  
  875. static void bruti(g,format,dec,sanssigne)
  876.      GEN g;
  877.      char format;
  878.      long dec,sanssigne;
  879. {
  880.   long e,l,sig,i,j,r,v,av=avma;
  881.   GEN a1,b1,p;
  882.   char thestring[20];
  883.   
  884.   if (isnull(g)) pariputc('0');
  885.   else if (sig=isone(g)) {if (!sanssigne&&(sig<0)) pariputc('-');pariputc('1');}
  886.   else switch(typ(g))
  887.     {
  888.     case 1:
  889.     case 2: if (sanssigne&&(signe(g)<0)) g=gabs(g);
  890.       ecrire(g,format,dec,0);break;
  891.     case 3:
  892.     case 9: pariputs("mod(");bruti(g[2],format,dec,0);pariputs(", ");
  893.       bruti(g[1],format,dec,0);pariputc(')');break;
  894.     case 4:
  895.     case 5:
  896.     case 13:
  897.     case 14:
  898.       if (!(sig=isfactor(g[1]))) pariputc('(');
  899.       bruti(g[1],format,dec,sanssigne);
  900.       if (!sig) pariputc(')');
  901.       pariputc('/');
  902.       if (!(sig=isdenom(g[2]))) pariputc('(');
  903.       bruti(g[2],format,dec,0);
  904.       if (!sig) pariputc(')');
  905.       break;
  906.     case 6:
  907.     case 8:
  908.       r=(typ(g)==8);
  909.       if (isnull(g[r+1])) 
  910.         if (sig=isone(g[r+2])) {if (!sanssigne&&(sig<0)) pariputc('-');pariputc(r ? 'w' : 'i');}
  911.         else
  912.       {
  913.         if (!(sig=isfactor(g[r+2]))) pariputc('(');
  914.         bruti(g[r+2],format,dec,sanssigne);
  915.         if (!sig) pariputc(')');
  916.         pariputc('*');
  917.         pariputc(r ? 'w' : 'i');
  918.       }
  919.       else
  920.     {
  921.       bruti(g[r+1],format,dec,sanssigne);
  922.       if (!isnull(g[r+2]))
  923.         if (sig=isone(g[r+2])) {putsigne(sig);pariputc(r ? 'w' : 'i');}
  924.         else
  925.           {
  926.         if (sig=isfactor(g[r+2])) putsigne(sig);
  927.         else pariputs(" + (");
  928.         bruti(g[r+2],format,dec,1);
  929.         if (!sig) pariputc(')');
  930.         pariputc('*');
  931.         pariputc(r ? 'w' : 'i');
  932.           }
  933.     }
  934.       break;
  935.     case 10:
  936.       v=ordvar[varn(g)];for (i=lgef(g)-1;isnull(g[i]);i--);
  937.       if (sig=isone(g[i])) {if (!sanssigne&&(sig<0)) pariputc('-');monome(v,i-2);}
  938.       else
  939.     {
  940.       if (isfactor(g[i])) bruti(g[i],format,dec,sanssigne);
  941.       else
  942.         {
  943.           pariputc('(');
  944.           bruti(g[i], format, dec, 0);
  945.           pariputc(')');
  946.         }
  947.       if (i>2) {pariputc('*');monome(v,i-2);}
  948.     }
  949.       for(;--i>1;) if (!isnull(g[i]))
  950.         if (sig=isone(g[i])) {putsigne(sig);monome(v,i-2);}
  951.         else
  952.       {
  953.         if (sig=isfactor(g[i])) putsigne(sig);else pariputs(" + (");
  954.         bruti(g[i],format,dec,sig);
  955.         if (!sig) pariputc(')');
  956.         if (i>2) {pariputc('*');monome(v,i-2);}
  957.       }
  958.       break;
  959.     case 7:
  960.       e=valp(g);l=precp(g);
  961.       a1=(GEN)g[4];p=(GEN)g[2];
  962.       for (i=0;i<l;i++)
  963.     {
  964.       a1=dvmdii(a1,p,&b1);
  965.       if (signe(b1))
  966.         {
  967.           if (!(e+i) || !gcmp1(b1))
  968.         {
  969.           ecrire(b1,format,0,0);
  970.           if (e+i) pariputc('*');
  971.         }
  972.           if (e+i)
  973.         {
  974.           ecrire(p,format,0,0);
  975.           if ((e+i)!=1) {sprintf(thestring, "^%d ",e+i); pariputs(thestring);}
  976.         }
  977.           pariputs(" + ");
  978.         }
  979.     }
  980.       pariputs("O(");
  981.       ecrire(p,format,0,0);if ((e+l)!=1) {sprintf(thestring, "^%d",e+l); pariputs(thestring);}
  982.       pariputc(')');
  983.       break;
  984.     case 11:
  985.       e=valp(g)-2;v=ordvar[varn(g)];
  986.       if (signe(g))
  987.     {
  988.       l=lg(g);
  989.       if (sig=isone(g[2])) {if (sig<0) pariputc('-');monome(v,2+e);}
  990.       else
  991.         {
  992.           if (!(sig=isfactor(g[2]))) pariputc('(');
  993.           bruti(g[2],format,dec,sanssigne);
  994.           if (!sig) pariputc(')');
  995.           if (valp(g)) {pariputc('*');monome(v,valp(g));}
  996.         }
  997.       for(i=3;i<l;i++) if (!isnull(g[i]))
  998.         if (sig=isone(g[i])) {putsigne(sig);monome(v,i+e);}
  999.         else
  1000.           {
  1001.         if (sig=isfactor(g[i])) putsigne(sig);else pariputs(" + (");
  1002.         bruti(g[i],format,dec,sig);
  1003.         if (!sig) pariputc(')');
  1004.         if ((i+e)!=0) {pariputc('*');monome(v,i+e);}
  1005.           }
  1006.       pariputs(" + ");
  1007.     }
  1008.       else  l=2;
  1009.       pariputs("O(");
  1010.       printvar(v);if ((e+l)!=1) {sprintf(thestring, "^%d",e+l); pariputs(thestring);}
  1011.       pariputc(')');
  1012.       break;
  1013.     case 15: pariputs("qfr(");bruti(g[1],format,dec,0);pariputs(", ");
  1014.       bruti(g[2],format,dec,0);pariputs(", ");bruti(g[3],format,dec,0);
  1015.       pariputs(", ");bruti(g[4],format,dec,0);
  1016.       pariputc(')');
  1017.       break;
  1018.     case 16: pariputs("qfi(");bruti(g[1],format,dec,0);pariputs(", "); 
  1019.       bruti(g[2],format,dec,0);pariputs(", ");bruti(g[3],format,dec,0); 
  1020.       pariputc(')'); 
  1021.       break;
  1022.       
  1023.     case 17:
  1024.     case 18:
  1025.       pariputc('[');
  1026.       for(i=1;i<lg(g);i++)
  1027.     {
  1028.       bruti(g[i],format,dec,0);
  1029.       if (i<lg(g)-1) pariputs(", ");
  1030.     }
  1031.       pariputc(']');
  1032.       if (typ(g)==18) pariputc('~');
  1033.       break;
  1034.     case 19:
  1035.       pariputc('[');
  1036.       if (lg(g)>1) for(i=1;i<lg(g[1]);i++)
  1037.     {
  1038.       for(j=1;j<lg(g);j++)
  1039.         {
  1040.           bruti(((long *)g[j])[i],format,dec,0);
  1041.           if (j<lg(g)-1) pariputs(", ");
  1042.         }
  1043.       if (i<lg(g[1])-1) pariputs("; ");
  1044.     }
  1045.       pariputc(']');break;
  1046.     default: sprintf(thestring, "%08x  ",*g); pariputs(thestring);
  1047.     }
  1048.   avma=av;
  1049. }
  1050.  
  1051. void brute(g,format,dec)
  1052.      GEN g;
  1053.      char format;
  1054.      long dec;
  1055. {
  1056.   long av=avma;
  1057.   if(varchanged) bruti(changevar(g,polvar),format,dec,0);
  1058.   else bruti(g,format,dec,0);
  1059.   avma=av;
  1060. }
  1061.  
  1062. static void matbruti(g,format,dec,sanssigne)
  1063.      GEN g;
  1064.      char format;
  1065.      long dec,sanssigne;
  1066.  
  1067. /* for this function the only difference with bruti is in type 19 */
  1068.  
  1069. {
  1070.   long e,l,sig,i,j,r,v,av=avma,lx,dx;
  1071.   GEN a1,b1,p;
  1072.   char thestring[20];
  1073.   
  1074.   if (isnull(g)) pariputc('0');
  1075.   else if (sig=isone(g)) {if (!sanssigne&&(sig<0)) pariputc('-');pariputc('1');}
  1076.   else switch(typ(g))
  1077.     {
  1078.     case 1:
  1079.     case 2: if (sanssigne&&(signe(g)<0)) g=gabs(g);
  1080.       ecrire(g,format,dec,0);break;
  1081.     case 3:
  1082.     case 9: pariputs("mod(");bruti(g[2],format,dec,0);pariputs(", ");
  1083.       bruti(g[1],format,dec,0);pariputc(')');break;
  1084.     case 4:
  1085.     case 5:
  1086.     case 13:
  1087.     case 14:
  1088.       if (!(sig=isfactor(g[1]))) pariputc('(');
  1089.       bruti(g[1],format,dec,sanssigne);
  1090.       if (!sig) pariputc(')');
  1091.       pariputc('/');
  1092.       if (!(sig=isdenom(g[2]))) pariputc('(');
  1093.       bruti(g[2],format,dec,0);
  1094.       if (!sig) pariputc(')');
  1095.       break;
  1096.     case 6:
  1097.     case 8:
  1098.       r=(typ(g)==8);
  1099.       if (isnull(g[r+1])) 
  1100.         if (sig=isone(g[r+2])) {if (!sanssigne&&(sig<0)) pariputc('-');pariputc(r ? 'w' : 'i');}
  1101.         else
  1102.       {
  1103.         if (!(sig=isfactor(g[r+2]))) pariputc('(');
  1104.         bruti(g[r+2],format,dec,sanssigne);
  1105.         if (!sig) pariputc(')');
  1106.         pariputc('*');
  1107.         pariputc(r ? 'w' : 'i');
  1108.       }
  1109.       else
  1110.     {
  1111.       bruti(g[r+1],format,dec,sanssigne);
  1112.       if (!isnull(g[r+2]))
  1113.         if (sig=isone(g[r+2])) {putsigne(sig);pariputc(r ? 'w' : 'i');}
  1114.         else
  1115.           {
  1116.         if (sig=isfactor(g[r+2])) putsigne(sig);
  1117.         else pariputs(" + (");
  1118.         bruti(g[r+2],format,dec,1);
  1119.         if (!sig) pariputc(')');
  1120.         pariputc('*');
  1121.         pariputc(r ? 'w' : 'i');
  1122.           }
  1123.     }
  1124.       break;
  1125.     case 10:
  1126.       v=ordvar[varn(g)];for (i=lgef(g)-1;isnull(g[i]);i--);
  1127.       if (sig=isone(g[i])) {if (!sanssigne&&(sig<0)) pariputc('-');monome(v,i-2);}
  1128.       else
  1129.     {
  1130.       if (isfactor(g[i])) bruti(g[i],format,dec,sanssigne);
  1131.       else
  1132.         {
  1133.           pariputc('(');
  1134.           bruti(g[i], format, dec, 0);
  1135.           pariputc(')');
  1136.         }
  1137.       if (i>2) {pariputc('*');monome(v,i-2);}
  1138.     }
  1139.       for(;--i>1;) if (!isnull(g[i]))
  1140.         if (sig=isone(g[i])) {putsigne(sig);monome(v,i-2);}
  1141.         else
  1142.       {
  1143.         if (sig=isfactor(g[i])) putsigne(sig);else pariputs(" + (");
  1144.         bruti(g[i],format,dec,sig);
  1145.         if (!sig) pariputc(')');
  1146.         if (i>2) {pariputc('*');monome(v,i-2);}
  1147.       }
  1148.       break;
  1149.     case 7:
  1150.       e=valp(g);l=precp(g);
  1151.       a1=(GEN)g[4];p=(GEN)g[2];
  1152.       for (i=0;i<l;i++)
  1153.     {
  1154.       a1=dvmdii(a1,p,&b1);
  1155.       if (signe(b1))
  1156.         {
  1157.           if (!(e+i) || !gcmp1(b1))
  1158.         {
  1159.           ecrire(b1,format,0,0);
  1160.           if (e+i) pariputc('*');
  1161.         }
  1162.           if (e+i)
  1163.         {
  1164.           ecrire(p,format,0,0);
  1165.           if ((e+i)!=1) {sprintf(thestring, "^%d ",e+i); pariputs(thestring);}
  1166.         }
  1167.           pariputs(" + ");
  1168.         }
  1169.     }
  1170.       pariputs("O(");
  1171.       ecrire(p,format,0,0);if ((e+l)!=1) {sprintf(thestring, "^%d",e+l); pariputs(thestring);}
  1172.       pariputc(')');
  1173.       break;
  1174.     case 11:
  1175.       e=valp(g)-2;v=ordvar[varn(g)];
  1176.       if (signe(g))
  1177.     {
  1178.       l=lg(g);
  1179.       if (sig=isone(g[2])) {if (sig<0) pariputc('-');monome(v,2+e);}
  1180.       else
  1181.         {
  1182.           if (!(sig=isfactor(g[2]))) pariputc('(');
  1183.           bruti(g[2],format,dec,sanssigne);
  1184.           if (!sig) pariputc(')');
  1185.           if (valp(g)) {pariputc('*');monome(v,valp(g));}
  1186.         }
  1187.       for(i=3;i<l;i++) if (!isnull(g[i]))
  1188.         if (sig=isone(g[i])) {putsigne(sig);monome(v,i+e);}
  1189.         else
  1190.           {
  1191.         if (sig=isfactor(g[i])) putsigne(sig);else pariputs(" + (");
  1192.         bruti(g[i],format,dec,sig);
  1193.         if (!sig) pariputc(')');
  1194.         if ((i+e)!=0) {pariputc('*');monome(v,i+e);}
  1195.           }
  1196.       pariputs(" + ");
  1197.     }
  1198.       else  l=2;
  1199.       pariputs("O(");
  1200.       printvar(v);if ((e+l)!=1) {sprintf(thestring, "^%d",e+l); pariputs(thestring);}
  1201.       pariputc(')');
  1202.       break;
  1203.     case 15: pariputs("qfr(");bruti(g[1],format,dec,0);pariputs(", ");
  1204.       bruti(g[2],format,dec,0);pariputs(", ");bruti(g[3],format,dec,0);
  1205.       pariputs(", ");bruti(g[4],format,dec,0);
  1206.       pariputc(')');
  1207.       break;
  1208.     case 16: pariputs("qfi(");bruti(g[1],format,dec,0);pariputs(", "); 
  1209.       bruti(g[2],format,dec,0);pariputs(", ");bruti(g[3],format,dec,0); 
  1210.       pariputc(')'); 
  1211.       break;
  1212.       
  1213.     case 17:
  1214.     case 18:
  1215.       pariputc('[');
  1216.       for(i=1;i<lg(g);i++)
  1217.     {
  1218.       bruti(g[i],format,dec,0);
  1219.       if (i<lg(g)-1) pariputs(", ");
  1220.     }
  1221.       pariputc(']');
  1222.       if (typ(g)==18) pariputc('~');
  1223.       break;
  1224.     case 19:
  1225.       pariputc('\n');lx=lg(g);dx=(lx>1)?lg(g[1]):2;
  1226.       for (i=1;i<dx;i++)
  1227.     {
  1228.       pariputc('|');
  1229.       for (j=1;j<lx;j++)
  1230.         {
  1231.           bruti(((long *)g[j])[i],format,dec,0);
  1232.           pariputc(' ');
  1233.         }
  1234.       if(i<dx-1) pariputs("|\n\n");else pariputs("|\n");
  1235.     }
  1236.       pariputc('\n');break;
  1237.     default: sprintf(thestring, "%08x  ",*g); pariputs(thestring);
  1238.     }
  1239.   avma=av;
  1240. }
  1241.  
  1242. void matbrute(g,format,dec)
  1243.      GEN g;
  1244.      char format;
  1245.      long dec;
  1246. {
  1247.   long av=avma;
  1248.   if(varchanged) matbruti(changevar(g,polvar),format,dec,0);
  1249.   else matbruti(g,format,dec,0);
  1250.   avma=av;
  1251. }
  1252.  
  1253.  
  1254. /********************************************************************/
  1255. /********************************************************************/
  1256. /**                                                                **/
  1257. /**                          FORMATTAGE TeX                        **/
  1258. /**                                                                **/
  1259. /********************************************************************/
  1260. /********************************************************************/
  1261.  
  1262. static void texnome(v,deg)
  1263.      long v,deg;
  1264. {
  1265.   char    thestring[20];
  1266.   if (deg)
  1267.     {
  1268.       printvar(v);
  1269.       if (deg!=1) {sprintf(thestring, "^{%d}",deg); pariputs(thestring);}
  1270.     }
  1271.   else pariputc('1');
  1272. }
  1273.  
  1274. static void texi(g,format,dec,sanssigne)
  1275.      GEN g;
  1276.      char format;
  1277.      long dec,sanssigne;
  1278. {
  1279.   long e,l,sig,i,j,r,v,av=avma;
  1280.   GEN a1,b1,p;
  1281.   char thestring[20];
  1282.   
  1283.   pariputc('{');
  1284.   if (isnull(g)) pariputc('0');
  1285.   else if (sig=isone(g)) {if (!sanssigne&&(sig<0)) pariputc('-');pariputc('1');}
  1286.   else switch(typ(g))
  1287.     {
  1288.     case 1:
  1289.     case 2:
  1290.       if (sanssigne&&(signe(g)<0)) g=gabs(g);
  1291.       ecrire(g,format,dec,0);break;
  1292.     case 3:
  1293.     case 9:
  1294.       texi(g[2],format,dec,0);pariputs("mod");
  1295.       texi(g[1],format,dec,0);break;
  1296.     case 4:
  1297.     case 5:
  1298.     case 13:
  1299.     case 14:
  1300.       texi(g[1],format,dec,sanssigne);
  1301.       pariputs("\\over");
  1302.       texi(g[2],format,dec,0);
  1303.       break;
  1304.     case 6:
  1305.     case 8:
  1306.       r=(typ(g)==8);
  1307.       if (isnull(g[r+1])) 
  1308.         if (sig=isone(g[r+2])) {if (!sanssigne&&(sig<0)) pariputc('-');pariputc(r ? 'w' : 'i');}
  1309.         else
  1310.       { 
  1311.         if (!(sig=isfactor(g[r+2]))) pariputc('('); 
  1312.         texi(g[r+2],format,dec,sanssigne); 
  1313.         if (!sig) pariputc(')'); 
  1314.         pariputc(r ? 'w' : 'i'); 
  1315.       }
  1316.       else
  1317.     { 
  1318.       texi(g[r+1],format,dec,sanssigne); 
  1319.       if (!isnull(g[r+2])) 
  1320.         if (sig=isone(g[r+2])) {putsigne(sig);pariputc(r ? 'w' : 'i');} 
  1321.         else 
  1322.           { 
  1323.         if (sig=isfactor(g[r+2])) putsigne(sig); 
  1324.         else pariputs("+("); 
  1325.         texi(g[r+2],format,dec,1); 
  1326.         if (!sig) pariputc(')'); 
  1327.         pariputc(r ? 'w' : 'i'); 
  1328.           } 
  1329.     }
  1330.       break;
  1331.     case 10:
  1332.       v=ordvar[varn(g)];for (i=lgef(g)-1;isnull(g[i]);i--);
  1333.       if (sig=isone(g[i])) {if (!sanssigne&&(sig<0)) pariputc('-');texnome(v,i-2);}
  1334.       else
  1335.     { 
  1336. /*      if (!(sig=isfactor(g[i]))) pariputc('('); 
  1337.       texi(g[i],format,dec,sanssigne); 
  1338.       if (!sig) pariputc(')'); 
  1339.       if (i>2) texnome(v,i-2);  */
  1340.       if (isfactor(g[i])) texi(g[i],format,dec,sanssigne); 
  1341.       else
  1342.         {
  1343.           pariputc('('); 
  1344.           texi(g[i],format,dec,0); 
  1345.           pariputc(')');
  1346.         }
  1347.       if (i>2) texnome(v,i-2); 
  1348.     }
  1349.       for(;--i>1;) if (!isnull(g[i]))
  1350.         if (sig=isone(g[i])) {putsigne(sig);texnome(v,i-2);}
  1351.         else
  1352.       { 
  1353.         if (sig=isfactor(g[i])) putsigne(sig);else pariputs("+("); 
  1354.         texi(g[i],format,dec,sig); 
  1355.         if (!sig) pariputc(')'); 
  1356.         if (i>2) texnome(v,i-2); 
  1357.       }
  1358.       break;
  1359.     case 7:
  1360.       e=valp(g);l=precp(g);
  1361.       a1=(GEN)g[4];p=(GEN)g[2];
  1362.       for (i=0;i<l;i++)
  1363.     { 
  1364.       a1=dvmdii(a1,p,&b1); 
  1365.       if (signe(b1)) 
  1366.         { 
  1367.           if (!(e+i) || !gcmp1(b1)) 
  1368.         { 
  1369.           ecrire(b1,format,0,0); 
  1370.           if (e+i) pariputs("\\cdot"); 
  1371.         } 
  1372.           if (e+i) 
  1373.         { 
  1374.           ecrire(p,format,0,0); 
  1375.           if ((e+i)!=1) {sprintf(thestring, "^{%d}",e+i); pariputs(thestring);} 
  1376.         } 
  1377.           pariputc('+'); 
  1378.         } 
  1379.     }
  1380.       pariputs("O(");
  1381.       ecrire(p,format,0,0);if ((e+l)!=1) {sprintf(thestring, "^{%d}",e+l); pariputs(thestring);}
  1382.       pariputc(')');
  1383.       break;
  1384.     case 11:
  1385.       e=valp(g)-2;v=ordvar[varn(g)];
  1386.       if (signe(g))
  1387.     { 
  1388.       l=lg(g); 
  1389.       if (sig=isone(g[2])) {if (sig<0) pariputc('-');texnome(v,2+e);} 
  1390.       else 
  1391.         { 
  1392.           if (!(sig=isfactor(g[2]))) pariputc('('); 
  1393.           texi(g[2],format,dec,sanssigne); 
  1394.           if (!sig) pariputc(')'); 
  1395.           if (valp(g)) texnome(v,valp(g)); 
  1396.         } 
  1397.       for(i=3;i<l;i++) if (!isnull(g[i])) 
  1398.         if (sig=isone(g[i])) {putsigne(sig);texnome(v,i+e);} 
  1399.         else 
  1400.           { 
  1401.         if (sig=isfactor(g[i])) putsigne(sig);else pariputs(" + ("); 
  1402.         texi(g[i],format,dec,sig); 
  1403.         if (!sig) pariputc(')'); 
  1404.         if (i+e) texnome(v,i+e); 
  1405.           } 
  1406.       pariputc('+'); 
  1407.     }
  1408.       else  l=2;
  1409.       pariputs("O(");
  1410.       printvar(v);if ((e+l)!=1) {sprintf(thestring, "^{%d}",e+l); pariputs(thestring);}
  1411.       pariputc(')');
  1412.       break;
  1413.     case 15: pariputs("qfr(");texi(g[1],format,dec,0);pariputs(", ");
  1414.       texi(g[2],format,dec,0);pariputs(", ");texi(g[3],format,dec,0);
  1415.       pariputs(", ");texi(g[4],format,dec,0);
  1416.       pariputc(')');
  1417.       break;
  1418.     case 16: pariputs("qfi(");texi(g[1],format,dec,0);pariputs(", "); 
  1419.       texi(g[2],format,dec,0);pariputs(", ");texi(g[3],format,dec,0); 
  1420.       pariputc(')'); 
  1421.       break; 
  1422.       
  1423.     case 17:
  1424.       pariputs("\\pmatrix{");
  1425.       for(i=1;i<lg(g);i++)
  1426.     {
  1427.       texi(g[i],format,dec,0);
  1428.       if (i<lg(g)-1) pariputc('&');
  1429.     }
  1430.       pariputs("\\cr}");
  1431.       break;
  1432.     case 18:
  1433.       pariputs("\\pmatrix{");
  1434.       for(i=1;i<lg(g);i++)
  1435.     {
  1436.       texi(g[i],format,dec,0);
  1437.       pariputs("\\cr");
  1438.     }
  1439.       pariputc('}');
  1440.       break;
  1441.     case 19:
  1442.       pariputs("\\pmatrix{");
  1443.       if (lg(g)>1) for(i=1;i<lg(g[1]);i++)
  1444.     {
  1445.       for(j=1;j<lg(g);j++)
  1446.         {
  1447.           texi(((long *)g[j])[i],format,dec,0);
  1448.           if (j<lg(g)-1) pariputc('&');
  1449.         }
  1450.       pariputs("\\cr");
  1451.     }
  1452.       pariputc('}');
  1453.     }
  1454.   avma=av;
  1455.   pariputc('}');
  1456. }
  1457.  
  1458. void texe(g,format,dec)
  1459.      GEN g;
  1460.      char format;
  1461.      long dec;
  1462. {
  1463.   long av=avma;
  1464.   if(varchanged) texi(changevar(g,polvar),format,dec,0);
  1465.   else texi(g,format,dec,0);
  1466.   avma=av;
  1467. }
  1468.  
  1469. /********************************************************************/
  1470. /********************************************************************/
  1471. /**                                                                **/
  1472. /**                GESTION DES FICHIERS IN, OUT ET LOG             **/
  1473. /**                                                                **/
  1474. /********************************************************************/
  1475. /********************************************************************/
  1476.  
  1477. void switchin(name)
  1478.      char *name;
  1479. {
  1480.   static FILE *stack[MAXFILES];
  1481.   static  long depth = 0;
  1482.   if (name)
  1483.     {
  1484.       if (depth >= MAXFILES) err(includer1);
  1485.       stack[depth++] = infile;
  1486.       if(infile = fopen(name, "r")) return;
  1487.       infile = stack[--depth];
  1488.       err(inputer1);
  1489.     }
  1490.   if(!depth) exit(0);
  1491.   fclose(infile);
  1492.   infile = stack[--depth];
  1493. }
  1494.  
  1495. void switchout(name)
  1496.      char *name;
  1497. {
  1498.   if (name)
  1499.     {
  1500.       FILE *glou = fopen(name, "a");
  1501.       if (!glou) err(outputer1);
  1502.       outfile = glou;
  1503.     }
  1504.   else
  1505.     {
  1506.       fclose(outfile);
  1507.       outfile = stdout;
  1508.     }
  1509. }
  1510.  
  1511. void fliplog()
  1512. {
  1513.   if (logfile)
  1514.     {
  1515.       fclose(logfile);
  1516.       logfile = NULL;
  1517.       pariputs("    logging off\n");
  1518.     }
  1519.   else
  1520.     {
  1521.       logfile = fopen("pari.log", "w");
  1522.       if (!logfile) err(outloger1);
  1523.       pariputs("    logging on\n");
  1524.     }
  1525. }
  1526.  
  1527.