home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / progs / pari / pari_137 / src / gen1.c < prev    next >
Text File  |  1992-05-20  |  45KB  |  1,997 lines

  1. /********************************************************************/
  2. /********************************************************************/
  3. /**                                                                **/
  4. /**                +++++++++++++++++++++++++++++++                 **/
  5. /**                +                             +                 **/
  6. /**                +    OPERATIONS GENERIQUES    +                 **/
  7. /**                +      (premiere partie)      +                 **/
  8. /**                +                             +                 **/
  9. /**                +     copyright Babe Cool     +                 **/
  10. /**                +                             +                 **/
  11. /**                +++++++++++++++++++++++++++++++                 **/
  12. /**                                                                **/
  13. /**                                                                **/
  14. /********************************************************************/
  15. /********************************************************************/
  16.  
  17. # include "genpari.h"
  18.  
  19. /*******************************************************************/
  20. /*******************************************************************/
  21. /*                                                                 */
  22. /*                 LISTE DES TYPES GENERIQUES                      */
  23. /*                 ~~~~~~~~~~~~~~~~~~~~~~~~~~                      */
  24. /*                                                                 */
  25. /*  1  :entier long     [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  26. /*  2  :reel            [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  27. /*  3  :entier modulo   [ code ] [ mod  ] [ entier modulo ]        */
  28. /*  4  :fraction        [ code ] [ num. ] [ den. ]                 */
  29. /*  5  :nfraction       [ code ] [ num. ] [ den. ]                 */
  30. /*  6  :complexe        [ code ] [ reel ] [ imag ]                 */
  31. /*  7  :p-adique        [ cod1 ] [ cod2 ] [ p ] [ p^r ] [ entier]  */
  32. /*  8  :quadrat         [ cod1 ] [ mod  ] [ reel ] [ imag ]        */
  33. /*  9  :poly mod        [ code ] [ mod  ] [ polynome  mod ]        */
  34. /* --------------------------------------------------------------- */
  35. /*  10 :polynome        [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  36. /*  11 :serie           [ cod1 ] [ cod2 ] [ man1 ] ... [ manl ]    */
  37. /*  13 :fr.rat          [ code ] [ num. ] [ den. ]                 */
  38. /*  14 :n.fr.rat        [ code ] [ num. ] [ den. ]                 */
  39. /*  15 :formqre         [ code ] [  a  ] [  b  ] [  c  ] [ del ]   */
  40. /*  16 :formqim         [ code ] [  a   ] [  b   ] [  c   ]        */
  41. /*  17 :vecteur ligne   [ code ] [  x1  ] ... [  xl  ]             */
  42. /*  18 :vecteur colonne [ code ] [  x1  ] ... [  xl  ]             */
  43. /*  19 :matrice         [ code ] [ col1 ] ... [ coll ]             */
  44. /*                                                                 */
  45. /*******************************************************************/
  46. /*******************************************************************/
  47.  
  48. /********************************************************************/
  49. /********************************************************************/
  50. /**                                                                **/
  51. /**                       ADDITION GENERALE                        **/
  52. /**                                                                **/
  53. /********************************************************************/
  54. /********************************************************************/
  55.  
  56. GEN   gadd(x,y)
  57.      
  58.      GEN   x,y;
  59.      
  60. {
  61.   long  lx,ly,tx,ty,i,j,k,lz,e,l,f,tz,vx,vy;
  62.   long  tetpil,l1,a1,a2,r1,r2,d,r,l2,co;
  63.   GEN z,p1,p2,p3,p4,p;
  64.   
  65.   tx=typ(x);ty=typ(y);
  66.  
  67.   if((tx<9)&&(ty<9))
  68.     {
  69.       if(tx>ty) {p1=x;x=y;y=p1;tz=tx;tx=ty;ty=tz;}
  70.     }
  71.   else
  72.     {
  73.       vx=gvar(x);vy=gvar(y);
  74.       if ((vx<vy)||((vx==vy)&&(tx>ty)))
  75.     {
  76.       p1=x;x=y;y=p1;tz=tx;tx=ty;ty=tz;
  77.       tz=vx;vx=vy;vy=tz;
  78.     }
  79.     }
  80.   lx=lg(x);ly=lg(y);
  81.   
  82.   if (ty<10)
  83.     {
  84.       switch(tx)
  85.     {
  86.     case 1 : switch(ty)
  87.       {
  88.       case 1 :
  89.         
  90.       case 2 : z=mpadd(x,y);break;
  91.         
  92.       case 3 : z=cgetg(ly,ty);z[1]=copyifstack(y[1]);
  93.         l=avma;
  94.         p1=addii(x,y[2]);
  95.         tetpil=avma;
  96.         p2=modii(p1,y[1]);
  97.         z[2]=lpile(l,tetpil,p2);
  98.         break;
  99.         
  100.       case 4 :
  101.         
  102.       case 5 : z=cgetg(ly,ty);l=avma;
  103.         p1=mulii(y[2],x);
  104.         tetpil=avma;
  105.         p2=addii(p1,y[1]);
  106.         z[1]=lpile(l,tetpil,p2);
  107.         z[2]=lcopy(y[2]);
  108.         break;
  109.         
  110.       case 6 : z=cgetg(ly,ty);
  111.         z[1]=ladd(x,y[1]);
  112.         z[2]=lcopy(y[2]);
  113.         break;
  114.         
  115.       case 7 : z=gaddpex(x,y);break;
  116.         
  117.       case 8 : z=cgetg(ly,ty);
  118.         z[2]=ladd(x,y[2]);
  119.         z[3]=lcopy(y[3]);
  120.         z[1]=copyifstack(y[1]);
  121.         break;
  122.         
  123.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  124.         z[1]=copyifstack(y[1]);
  125.         break;
  126.         
  127.       default: err(gadder1);
  128.         
  129.       } break;
  130.       
  131.     case 2 : switch(ty)
  132.       {
  133.       case 2 : z=mpadd(x,y);break;
  134.         
  135.       case 3 : err(gadder2);
  136.         
  137.       case 4 :
  138.         
  139.       case 5 :
  140.         if(signe(y[1]))
  141.           {
  142.         if(gcmp0(x))
  143.           {
  144.             lx=(expi(y[1])-expi(y[2])-expo(x))>>5;
  145.             if(lx<0) lx=0;
  146.             lx+=3;z=cgetr(lx);diviiz(y[1],y[2],z);
  147.           }
  148.         else
  149.           {
  150.             l=avma;z=addir(y[1],mulir(y[2],x));tetpil=avma;
  151.             z=gerepile(l,tetpil,divri(z,y[2]));
  152.           }
  153.               }    
  154.         else z=gcopy(x);
  155.         break;
  156.         
  157.       case 6 : z=cgetg(ly,ty);
  158.         z[1]=ladd(x,y[1]);
  159.         z[2]=lcopy(y[2]);
  160.         break;
  161.         
  162.       case 7 : err(gadder2);
  163.           case 8 : if(gcmp0(y)) z=gcopy(x);
  164.       else
  165.         {
  166.           l=avma;e=gexpo(y)-expo(x);
  167.           if(e<0) e=0;
  168.           p1=co8(y,lx+(e>>5));tetpil=avma;
  169.           z=gerepile(l,tetpil,gadd(p1,x));
  170.         }
  171.         break;
  172.         
  173.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  174.         z[1]=copyifstack(y[1]);
  175.         break;
  176.         
  177.       default: err(gadder1);
  178.         
  179.       } break;
  180.       
  181.     case 3 : switch(ty)
  182.       {
  183.       case 3 : z=cgetg(ly,ty);k=x[1];l=y[1];
  184.         if((k==l)||gegal(k,l))
  185.           z[1]=copyifstack(k);
  186.         else z[1]=lmppgcd(k,l);
  187.         l=avma;p1=addii(x[2],y[2]);tetpil=avma;
  188.         z[2]=lpile(l,tetpil,modii(p1,z[1]));
  189.         break;
  190.         
  191.       case 4 :
  192.         
  193.       case 5 : z=cgetg(3,3);
  194.         z[1]=copyifstack(x[1]);
  195.         z[2]=lgeti(lgef(x[1]));
  196.         gaffect(y,z);gaddz(z,x,z);
  197.         break;
  198.         
  199.       case 6 : z=cgetg(ly,ty);z[2]=lcopy(y[2]);z[1]=ladd(x,y[1]);break;
  200.         
  201.       case 7 : l=avma;p1=cgetg(3,3);p1[1]=x[1];p1[2]=lgeti(lgef(x[1]));
  202.         gaffect(y,p1);tetpil=avma;z=gerepile(l,tetpil,gadd(p1,x));
  203.         break;
  204.         
  205.       case 8 : z=cgetg(ly,ty);z[1]=copyifstack(y[1]);z[3]=lcopy(y[3]);
  206.         z[2]=ladd(x,y[2]);break;
  207.         
  208.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  209.         z[1]=copyifstack(y[1]);
  210.         break;
  211.         
  212.       default: err(gadder1);
  213.         
  214.       } break;
  215.       
  216.     case 4 :
  217.       
  218.     case 5 : switch (ty)
  219.       {
  220.       case 4 :
  221.       case 5 : if ((tx+ty)==8) tz=4;else tz=5;
  222.         z=cgetg(ly,tz);l=avma;
  223.         p1=mulii(x[1],y[2]);
  224.         p2=mulii(x[2],y[1]);
  225.         tetpil=avma;
  226.         p3=addii(p1,p2);
  227.         z[1]=lpile(l,tetpil,p3);
  228.         z[2]=lmulii(x[2],y[2]);
  229.         if (tz==4) gredsp(&z);
  230.         break;
  231.       case 6 : z=cgetg(ly,ty);
  232.         z[1]=ladd(y[1],x);
  233.         z[2]=lcopy(y[2]);
  234.         break;
  235.       case 7 : z=gaddpex(x,y);break;
  236.       case 8 : z=cgetg(ly,ty);
  237.         z[2]=ladd(y[2],x);
  238.         z[3]=lcopy(y[3]);
  239.         z[1]=lcopy(y[1]);
  240.         break;
  241.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  242.         z[1]=copyifstack(y[1]);
  243.         break;
  244.         
  245.       default: err(gadder1);
  246.       }
  247.       break;
  248.       
  249.     case 6 : switch(ty)
  250.       {
  251.       case 6 : z=cgetg(ly,ty);
  252.         z[1]=ladd(x[1],y[1]);
  253.         z[2]=ladd(x[2],y[2]);
  254.         break;
  255.       case 7 :
  256.         if(krosg(-1,y[2])== -1)
  257.           {
  258.         z=cgetg(3,6);z[1]=ladd(x[1],y);
  259.         z[2]=lcopy(x[2]);
  260.           }
  261.         else
  262.           {
  263.         l=avma;
  264.         p1=cvtop(x,y[2],signe(y[4])?(valp(y)+precp(y)):valp(y)+1);
  265.         tetpil=avma;z=gerepile(l,tetpil,gadd(p1,y));
  266.           }
  267.         break;
  268.       case 8 : lx=precision(x);if(!lx) err(gadder12);
  269.         if(gcmp0(y)) z=gcopy(x);
  270.         else
  271.           {
  272.         l=avma;e=gexpo(y)-gexpo(x);
  273.         if(e<0) e=0;
  274.         p1=co8(y,lx+(e>>5));tetpil=avma;
  275.         z=gerepile(l,tetpil,gadd(p1,x));
  276.           }
  277.         break;
  278.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  279.         z[1]=copyifstack(y[1]);
  280.         break;
  281.         
  282.       default: err(gadder12);
  283.       }
  284.       break;
  285.       
  286.     case 7 : switch(ty)
  287.       {
  288.       case 7 :
  289.         p=(GEN)(x[2]);
  290.         if(cmpii(p,y[2])) err(gadder15);
  291.         a1=valp(x);a2=valp(y);e=a1;d=a2-a1;
  292.         if(a2<a1)
  293.           {
  294.         p1=x;x=y;y=p1;e=a2;d= -d;
  295.           }
  296.         r1=precp(x);r2=precp(y);
  297.         if(d)
  298.           {
  299.         l=avma;p1=gpuigs(p,d);tetpil=avma;
  300.         z=cgetg(5,7);z[2]=(long)p;r=d+r2;
  301.         if(r1<=r)
  302.           {
  303.             r=r1;z[3]=lcopy(x[3]);
  304.           }
  305.         else z[3]=lmul(p1,y[3]);
  306.         setprecp(z,r);z[4]=lgeti(lgef(z[3]));
  307.         l2=avma;p1=mulii(p1,y[4]);
  308.         modiiz(addii(p1,x[4]),z[3],z[4]);avma=l2;
  309.         setvalp(z,e); z=gerepile(l,tetpil,z);
  310.           }
  311.         else
  312.           {
  313.         z=cgetg(5,7);l=avma;
  314.         p1=addii(x[4],y[4]);
  315.         z[2]=(long)p;
  316.         r=r1;if(r2<r1)
  317.           {r=r2;p2=x;x=y;y=p2;}
  318.         if(gcmp0(p1)||((co=pvaluation(p1,p,&p2))>=r))
  319.           {
  320.             avma=l;setprecp(z,0);z[3]=un;
  321.             setvalp(z,e+r);
  322.             z[4]=lgeti(lgef(x[3]));
  323.             affsi(0,z[4]);
  324.           }
  325.         else
  326.           {
  327.             if(co)
  328.               {
  329.             p1=gpuigs(p,co);tetpil=avma;
  330.             z[3]=ldivii(x[3],p1);
  331.             r-=co;setprecp(z,r);setvalp(z,e+co);
  332.             l2=lgef(z[3]);z[4]=lgeti(l2);
  333.             modiiz(p2,z[3],z[4]);
  334.             gerepile(l,tetpil,1);
  335.               }
  336.             else
  337.               {
  338.             tetpil=avma;z[4]=lgeti(lgef(x[3]));
  339.             modiiz(p1,x[3],z[4]);
  340.             z[4]=lpile(l,tetpil,z[4]);
  341.             z[3]=lcopy(x[3]);
  342.             setprecp(z,r);setvalp(z,e);
  343.               }
  344.           }
  345.           }
  346.         break;
  347.         
  348.       case 8 :
  349.         if(kro8(y,x[2])== -1)
  350.           {
  351.         z=cgetg(4,8);z[1]=copyifstack(y[1]);
  352.         z[2]=ladd(y[2],x);
  353.         z[3]=lcopy(y[3]);
  354.           }
  355.         else
  356.           {
  357.         l=avma;
  358.         p1=cvtop(y,x[2],signe(x[4])?(valp(x)+precp(x)):valp(x)+1);
  359.         tetpil=avma;
  360.         z=gerepile(l,tetpil,gadd(p1,x));
  361.           } break;
  362.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  363.         z[1]=copyifstack(y[1]);
  364.         break;
  365.       default: err(gadder1);
  366.       }
  367.       break;
  368.     case 8 : switch(ty)
  369.       {
  370.       case 8 :k=x[1];l=y[1];
  371.         if ((k!=l)&&(!gegal(k,l))) err(gadder13);
  372.         z=cgetg(ly,ty);z[2]=ladd(x[2],y[2]);z[3]=ladd(x[3],y[3]);
  373.         z[1]=copyifstack(l);break;
  374.       case 9 : z=cgetg(ly,ty);z[2]=ladd(x,y[2]);
  375.         z[1]=copyifstack(y[1]);
  376.         break;
  377.       default: err(gadder1);
  378.       }
  379.       break;
  380.         case 9 : z=cgetg(lx,tx);k=x[1];l=y[1];
  381.       if((k==l)||gegal(k,l))
  382.         z[1]=copyifstack(k);
  383.       else z[1]=lgcd(k,l);
  384.       l=avma;p1=gadd(x[2],y[2]);tetpil=avma;
  385.       z[2]=lpile(l,tetpil,gmod(p1,z[1]));
  386.       break;
  387.         default: if(ty!=9) err(gaddbug1);
  388.       z=cgetg(ly,ty);z[1]=copyifstack(y[1]);
  389.       l=avma;p1=gadd(x,y[2]);tetpil=avma;
  390.       z[2]=lpile(l,tetpil,gmod(p1,z[1]));
  391.       break;
  392.     }
  393.     }
  394.   else /* ici ty>=10 */
  395.     {
  396.       if(((vx>vy)&&((tx<17)||(ty<17)))||((vx==vy)&&(tx<10)))
  397.     {
  398.       switch(ty)
  399.         {
  400.         case 10: e=lgef(y);
  401.           if(e==2)
  402.         {
  403.           if(isexactzero(x)) {z=cgetg(2,ty);z[1]=2;}
  404.           else
  405.             {
  406.               z=cgetg(3,ty);z[2]=lcopy(x);
  407.               z[1]=(gcmp0(x))?3:0x1000003;
  408.             }
  409.           setvarn(z,vy);
  410.         }
  411.           else
  412.         {
  413.           z=cgetg(e,ty);
  414.           z[2]=ladd(x,y[2]);
  415.           if((e==3)&&(gcmp0(z[2])))
  416.             {z[1]=isexactzero(z[2])?2:3;setvarn(z,vy);}
  417.           else
  418.             {
  419.               z[1]=y[1];for(i=3;i<e;i++) z[i]=lcopy(y[i]);
  420.               normalizepol(&z);
  421.             }
  422.         }
  423.           break;
  424.           
  425.         case 11: e=valp(y);
  426.           if (e<3-ly) z=gcopy(y);
  427.           else
  428.         {
  429.           if (e<0)
  430.             {
  431.               z=cgetg(ly,ty);
  432.               z[2-e]=ladd(x,y[2-e]);
  433.               z[1]=y[1];
  434.               for (i=2;i<=1-e;i++)
  435.             z[i]=lcopy(y[i]);
  436.               for (i=3-e;i<ly;i++)
  437.             z[i]=lcopy(y[i]);
  438.             }
  439.           else
  440.             {
  441.               if (e>0)
  442.             {
  443.               if (gcmp0(x)) z=gcopy(y);
  444.               else
  445.                 {
  446.                   if(gcmp0(y)) lz=e+2;else lz=ly+e;
  447.                   z=cgetg(lz,ty);
  448.                   z[1]=0x1008000;z[2]=lcopy(x);
  449.                   setvarn(z,vy);
  450.                   for (i=3;i<=e+1;i++) z[i]=zero;
  451.                   for (i=e+2;i<lz;i++)
  452.                 z[i]=lcopy(y[i-e]);
  453.                 }
  454.             }
  455.               else
  456.             {
  457.               z=cgetg(ly,ty);l=avma;
  458.               p1=(signe(y))?gadd(x,y[2]):x;
  459.               if(isexactzero(p1))
  460.                 {
  461.                   avma=l;
  462.                   if(ly==3)
  463.                 {z[2]=zero;z[1]=0x8001;}
  464.                   else
  465.                 {
  466.                   i=3;
  467.                   while ((i<ly)&&(gcmp0(y[i]))) i++;
  468.                   if (i==ly)
  469.                     {
  470.                       cgiv(z);z=cgetg(3,ty);z[2]=zero;
  471.                       z[1]=0x7ffe +i;
  472.                     }
  473.                   else
  474.                     {
  475.                       cgiv(z);z=cgetg(ly-i+2,ty);
  476.                       setvalp(z,i-2);setsigne(z,1);
  477.                       for (j=2;j<=ly-i+1;j++)
  478.                     z[j]=lcopy(y[j+i-2]);
  479.                     }
  480.                 }
  481.                 }
  482.               else
  483.                 {
  484.                   if(!signe(y)) z[1]=0x8000;
  485.                   else
  486.                 {
  487.                   z[1]=0x1008000;z[2]=(long)p1;
  488.                   for (i=3;i<ly;i++)
  489.                     z[i]=lcopy(y[i]);
  490.                 }
  491.                 }
  492.               setvarn(z,vy);
  493.             }
  494.             }
  495.         }
  496.           break;
  497.           
  498.         case 13: l=avma;z=cgetg(ly,ty);
  499.           z[1]=ladd(gmul(x,y[2]),y[1]);z[2]=y[2];
  500.           tetpil=avma;z=gerepile(l,tetpil,gred(z));
  501.           break;
  502.         case 14: z=cgetg(ly,ty);l=avma;p1=gmul(x,y[2]);tetpil=avma;
  503.           z[1]=lpile(l,tetpil,gadd(p1,y[1]));z[2]=lcopy(y[2]);
  504.           break;
  505.           
  506.         case 15:
  507.         case 16: err(gadder5);
  508.         case 17:
  509.         case 18: if(isexactzero(x)) z=gcopy(y);else err(gadder5);break;
  510.         case 19:
  511.           if(isexactzero(x)) z=gcopy(y);
  512.           else
  513.         {
  514.           if((ly>=2)&&(lg(y[1])==ly))
  515.             {
  516.               l=avma;p1=gscalmat(x,ly-1);tetpil=avma;
  517.               z=gerepile(l,tetpil,gadd(p1,y));
  518.             }
  519.           else err(gadder5);
  520.         }
  521.           break;
  522.         default: err(gadder1);
  523.         }
  524.     }
  525.       else /* ici ty>=10 et tx>=10 et vx=vy */
  526.     {
  527.       if(tx>ty)
  528.         {p1=x;x=y;y=p1;tz=tx;tx=ty;ty=tz;}
  529.       switch(tx)
  530.         {
  531.         case 10: switch (ty)
  532.           {
  533.           case 10:
  534.         lx=lgef(x);ly=lgef(y);
  535.         if (ly>lx)
  536.           {p1=x;x=y;y=p1;k=lx;lx=ly;ly=k;}
  537.         z=cgetg(lx,ty);
  538.         for (i=2;i<ly;i++)
  539.           z[i]=ladd(x[i],y[i]);
  540.         for (i=ly;i<lx;i++)
  541.           z[i]=lcopy(x[i]);
  542.         z[1]=x[1];normalizepol(&z);break;      
  543.           case 11:
  544.         if (gcmp0(x)) z=gcopy(y);
  545.         else
  546.           {
  547.             i=signe(y) ? valp(y)+ly-gval(x,vx) : valp(y)+3-gval(x,vx);
  548.             if(i<3) z=gcopy(y);
  549.             else
  550.               {
  551.             l=avma;p1=greffe(x,i);
  552.             tetpil=avma;
  553.             p2=gadd(p1,y);z=gerepile(l,tetpil,p2);
  554.               }
  555.           }
  556.         break;
  557.         
  558.           case 13: l=avma;z=cgetg(ly,ty);
  559.         z[1]=ladd(gmul(x,y[2]),y[1]);z[2]=y[2];
  560.         tetpil=avma;z=gerepile(l,tetpil,gred(z));
  561.         break;
  562.           case 14: z=cgetg(ly,ty);l=avma;p1=gmul(x,y[2]);tetpil=avma;
  563.         z[1]=lpile(l,tetpil,gadd(p1,y[1]));z[2]=lcopy(y[2]);
  564.         break;
  565.           case 15:
  566.           case 16:
  567.           case 17:
  568.           case 18:
  569.           case 19: err(gadder6);
  570.           default: err(gadder1);
  571.           } break;
  572.           
  573.         case 11: switch(ty)
  574.           {
  575.           case 11: e=valp(y)-valp(x);
  576.         if(e<0)
  577.           {
  578.             e= -e;p1=x;x=y;y=p1;
  579.             lz=lx;lx=ly;ly=lz;
  580.           }
  581.         if(gcmp0(x)) z=gcopy(x);
  582.         else
  583.           {
  584.             if(gcmp0(y)) ly=2;
  585.             lz=e+ly;
  586.             if (lx<lz) lz=lx;
  587.             if(e)
  588.               {
  589.             z=cgetg(lz,ty);
  590.             setvalp(z,valp(x));setsigne(z,1);
  591.             if(e<lz-2)
  592.               {
  593.                 for (i=2;i<=e+1;i++) z[i]=lcopy(x[i]);
  594.                 for(i=e+2;i<lz;i++) z[i]=ladd(x[i],y[i-e]);
  595.               }
  596.             else
  597.               for (i=2;i<lz;i++) z[i]=lcopy(x[i]);
  598.               }
  599.             else
  600.               {
  601.             i=2;l=avma;f=1;
  602.             while(f&&(i<lz))
  603.               {
  604.                 avma=l; p1=gadd(x[i],y[i]);
  605.                 f=isexactzero(p1);i++;
  606.                 /*                f=gcmp0(p1);i++; */
  607.               }
  608.             if(f)
  609.               {
  610.                 avma=l;z=cgetg(lz,ty);z[1]=0x7ffe +lz+valp(y);
  611.               }
  612.             else
  613.               {
  614.                 z=cgetg(lz-i+3,ty);
  615.                 setvalp(z,valp(x)+i-3);
  616.                 setsigne(z,1);z[2]=(long)p1;
  617.                 for(j=i;j<lz;j++)
  618.                   z[j-i+3]=ladd(x[j],y[j]);
  619.               }
  620.               }
  621.             setvarn(z,vx);
  622.           }
  623.         break;
  624.         
  625.           case 15:
  626.           case 16:
  627.           case 17:
  628.           case 18:
  629.           case 19: err(gadder7);
  630.           case 13:
  631.           case 14: if(gcmp0(y)) z=gcopy(x);
  632.           else
  633.         {
  634.           e=gval(y,vy);
  635.           if (gcmp0(x)) lz=valp(x)+3-e;
  636.           else lz=lx+valp(x)-e;
  637.           if(lz<3) z=gcopy(x);
  638.           else
  639.             {
  640.               l=avma;
  641.               if(typ(y[2])<10)
  642.             p3=gdiv(y[1],y[2]);
  643.               else
  644.             {
  645.               p2=greffe(y[2],lz);
  646.               p3=gdiv(y[1],p2);
  647.             }
  648.               tetpil=avma;
  649.               p4=gadd(p3,x);z=gerepile(l,tetpil,p4);
  650.             }
  651.         } break;
  652.         
  653.           default: err(gadder1);
  654.         
  655.           } break;
  656.           
  657.         case 13:
  658.         case 14: if(ty>14) err(gadder10);
  659.         else
  660.           {
  661.         if((tx+ty)==26) tz=13;else tz=14;
  662.         l1=avma;z=cgetg(ly,tz);l=avma;
  663.         p1=gmul(x[1],y[2]);
  664.         p2=gmul(x[2],y[1]);
  665.         tetpil=avma;
  666.         p3=gadd(p1,p2);z[1]=lpile(l,tetpil,p3);
  667.         z[2]=lmul(x[2],y[2]);
  668.         if(tz==13)
  669.           {
  670.             tetpil=avma;p1=gred(z);z=gerepile(l1,tetpil,p1);
  671.           }
  672.           }
  673.           break;
  674.           
  675.         case 15:
  676.         case 16: err(gadder9);
  677.         case 17:
  678.         case 18:
  679.         case 19: if((lx!=ly)||(tx!=ty)) err(gadder11);
  680.         else
  681.           {
  682.         z=cgetg(ly,ty);
  683.         for(i=1;i<ly;i++)
  684.           z[i]=ladd(x[i],y[i]);
  685.           }
  686.           break;
  687.           
  688.         default: err(gadder1);
  689.         }
  690.     }
  691.     }
  692.   return z;
  693. }
  694.  
  695. /********************************************************************/
  696. /********************************************************************/
  697. /**                                                                **/
  698. /**                   SOUSTRACTION GENERALE                        **/
  699. /**                                                                **/
  700. /********************************************************************/
  701. /********************************************************************/
  702.  
  703. GEN   gsub(x,y)
  704.      
  705.      GEN   x,y;
  706.      
  707. {
  708.   long    l,tetpil;
  709.   GEN   z,p1,p2;
  710.   
  711.   l=avma;p1=gneg(y);
  712.   tetpil=avma;
  713.   p2=gadd(x,p1);
  714.   z=gerepile(l,tetpil,p2);
  715.   return z;
  716. }
  717.  
  718. /********************************************************************/
  719. /********************************************************************/
  720. /**                                                                **/
  721. /**                 MULTIPLICATION GENERALE                        **/
  722. /**                                                                **/
  723. /********************************************************************/
  724. /********************************************************************/
  725.  
  726. GEN   gmul(x,y)
  727.      
  728.      GEN   x,y;
  729.      
  730. {
  731.   long  tx,ty,tz,lx,ly,dx,dy,i,j;
  732.   long  k,l,l1,l2,tetpil,vx,vy,vfl;
  733.   GEN   z,p1,p2,p3,p4,p5,yy;
  734.   
  735.   tx=typ(x);ty=typ(y);
  736.   if((tx<9)&&(ty<9))
  737.     {
  738.       if(tx>ty) {p1=x;x=y;y=p1;tz=tx;tx=ty;ty=tz;}
  739.     }
  740.   else
  741.     {
  742.       vx=gvar(x);vy=gvar(y);vfl=0;
  743.       if(ty<17)
  744.     {
  745.       if(tx>=17) vfl=1;
  746.       else {if((vx<vy)||((vx==vy)&&(tx>ty))) vfl=1;}
  747.     } 
  748.       if(vfl)
  749.     {
  750.       p1=x;x=y;y=p1;tz=tx;tx=ty;ty=tz;
  751.       tz=vx;vx=vy;vy=tz;
  752.     }
  753.     }
  754.   lx=lg(x);ly=lg(y);
  755.   
  756.   if (ty<10)
  757.     {
  758.       switch(tx)
  759.     {
  760.     case 1 : switch(ty)
  761.       {
  762.       case 1 :
  763.       case 2 : z=mpmul(x,y);break;
  764.       case 3 : z=cgetg(ly,ty);
  765.         z[1]=copyifstack(y[1]);
  766.         l=avma;
  767.         p1=mulii(x,y[2]);
  768.         tetpil=avma;
  769.         p2=modii(p1,y[1]);
  770.         z[2]=lpile(l,tetpil,p2);
  771.         break;
  772.       case 4 :
  773.       case 5 : z=cgetg(ly,ty);
  774.         z[1]=lmulii(x,y[1]);
  775.         z[2]=lcopy(y[2]);
  776.         if (ty==4) gredsp(&z);
  777.         break;
  778.         
  779.       case 6 : z=cgetg(ly,ty);
  780.         z[1]=lmul(x,y[1]);
  781.         z[2]=lmul(x,y[2]);
  782.         break;
  783.         
  784.       case 7 : if(signe(x))
  785.         {
  786.           l=avma;p1=cgetp(y);gaffect(x,p1); tetpil=avma;
  787.           z=gerepile(l,tetpil,gmul(p1,y));
  788.         }
  789.       else z=gzero;
  790.         break; 
  791.         
  792.       case 8 : z=cgetg(ly,ty);
  793.         z[2]=lmul(x,y[2]);
  794.         z[3]=lmul(x,y[3]);
  795.         z[1]=copyifstack(y[1]);
  796.         break;
  797.         
  798.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  799.         z[1]=copyifstack(y[1]);
  800.         break;
  801.         
  802.       default: err(gmuler1);
  803.       } break;
  804.       
  805.     case 2 : switch(ty)
  806.       {
  807.       case 2 : z=mulrr(x,y);break;
  808.         
  809.       case 3 : err(gmuler2);
  810.         
  811.       case 4 :
  812.         
  813.       case 5 : l=avma;p1=cgetr(lx);
  814.         tetpil=avma;gaffect(y,p1);
  815.         p2=mulrr(p1,x);z=gerepile(l,tetpil,p2);
  816.         break;
  817.         
  818.       case 6 : z=cgetg(ly,ty);
  819.         z[1]=lmul(x,y[1]);
  820.         z[2]=lmul(x,y[2]);
  821.         break;
  822.         
  823.       case 8 : l=avma;p1=co8(y,lx);tetpil=avma;
  824.         z=gerepile(l,tetpil,gmul(p1,x));
  825.         break;
  826.         
  827.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  828.         z[1]=copyifstack(y[1]);
  829.         break;
  830.         
  831.       default: err(gmuler1);
  832.         
  833.       } break;
  834.       
  835.     case 3 : switch(ty)
  836.       {
  837.       case 3 : z=cgetg(ly,ty);k=x[1];l=y[1];
  838.         if((k==l)||gegal(k,l))
  839.           z[1]=copyifstack(k);
  840.         else z[1]=lmppgcd(k,l);
  841.         l=avma;p1=mulii(x[2],y[2]);tetpil=avma;
  842.         z[2]=lpile(l,tetpil,modii(p1,z[1]));
  843.         break;
  844.         
  845.       case 4 :
  846.         
  847.       case 5 : z=cgetg(3,3);
  848.         z[1]=copyifstack(x[1]);
  849.         z[2]=lgeti(lgef(x[1]));
  850.         gaffect(y,z);gmulz(z,x,z);
  851.         break;
  852.         
  853.       case 7 : l=avma;p1=cgetg(3,3);p1[1]=x[1];p1[2]=lgeti(lg(x[1]));
  854.         gaffect(y,p1);tetpil=avma;z=gerepile(l,tetpil,gmul(x,p1));
  855.         break;
  856.         
  857.       case 6 : z=cgetg(ly,ty);z[1]=lmul(x,y[1]);z[2]=lmul(x,y[2]);break;
  858.       case 8 : z=cgetg(ly,ty);z[1]=copyifstack(y[1]);
  859.         z[2]=lmul(x,y[2]);z[3]=lmul(x,y[3]);
  860.         break;
  861.         
  862.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  863.         z[1]=copyifstack(y[1]);
  864.         break;
  865.         
  866.       default: err(gmuler1);
  867.         
  868.       } break;
  869.       
  870.     case 4 :
  871.       
  872.     case 5 : switch(ty)
  873.       {
  874.       case 4 :
  875.         
  876.       case 5 : if ((tx+ty)==8) tz=4;else tz=5;
  877.         z=cgetg(ly,tz);
  878.         z[1]=lmulii(x[1],y[1]);
  879.         z[2]=lmulii(x[2],y[2]);
  880.         if (tz==4) gredsp(&z);
  881.         break;
  882.         
  883.       case 6 : z=cgetg(ly,ty);
  884.         z[1]=lmul(y[1],x);
  885.         z[2]=lmul(y[2],x);
  886.         break;
  887.         
  888.       case 7 : if(signe(x[1]))
  889.         {
  890.           l=avma;p1=cgetp(y);gaffect(x,p1);
  891.           tetpil=avma;z=gerepile(l,tetpil,gmul(p1,y));
  892.         }
  893.       else z=gzero;
  894.         break;
  895.         
  896.       case 8 : z=cgetg(ly,ty);
  897.         z[2]=lmul(y[2],x);
  898.         z[3]=lmul(y[3],x);
  899.         z[1]=copyifstack(y[1]);
  900.         break;
  901.         
  902.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  903.         z[1]=copyifstack(y[1]);
  904.         break;
  905.         
  906.       default: err(gmuler1);
  907.         
  908.       } break;
  909.       
  910.     case 6 : switch(ty)
  911.       {
  912.       case 6 : z=cgetg(ly,ty);l=avma;
  913.         p1=gmul(x[1],y[1]);
  914.         p2=gmul(x[2],y[2]);
  915.         p3=gadd(x[1],x[2]);
  916.         p4=gadd(y[1],y[2]);
  917.         p5=gmul(p3,p4);
  918.         p3=gadd(p1,p2);
  919.         tetpil=avma;
  920.         z[2]=lsub(p5,p3);
  921.         z[1]=lsub(p1,p2);
  922.         z[1]=lpile(l,tetpil,z[1]);
  923.         break;
  924.         
  925.       case 7 :
  926.         if(krosg(-1,y[2])== -1)
  927.           {
  928.         z=cgetg(3,6);
  929.         z[1]=lmul(x[1],y);
  930.         z[2]=lmul(x[2],y);
  931.           }
  932.         else
  933.           {
  934.         l=avma;
  935.         if(signe(y[4])) p1=cvtop(x,y[2],precp(y));
  936.         else p1=cvtop(x,y[2],(valp(y)>0)?valp(y)+1:1);
  937.         tetpil=avma;z=gerepile(l,tetpil,gmul(p1,y));
  938.           }
  939.         break;
  940.         
  941.       case 8 : lx=precision(x);if(!lx) err(gmuler11);
  942.         l=avma;p1=co8(y,lx);tetpil=avma;
  943.         z=gerepile(l,tetpil,gmul(p1,x));
  944.         break;
  945.         
  946.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  947.         z[1]=copyifstack(y[1]);
  948.         break;
  949.         
  950.       default: err(gmuler11);
  951.         
  952.       } break;
  953.       
  954.     case 7 : switch(ty)
  955.       {
  956.       case 7 :
  957.         if(cmpii(x[2],y[2])) err(gmuler14);
  958.         if(!signe(x[4])) {z=gcopy(x);setvalp(z,valp(x)+valp(y));}
  959.         else
  960.           {
  961.         if(!signe(y[4]))
  962.           {
  963.             z=gcopy(y);setvalp(z,valp(x)+valp(y));
  964.           }
  965.         else
  966.           {
  967.             p1=(precp(x)>precp(y)) ? y : x;
  968.             z=cgetp(p1);l=avma;
  969.             setvalp(z,valp(x)+valp(y));
  970.             modiiz(mulii(x[4],y[4]),p1[3],z[4]);
  971.             avma=l;
  972.           }
  973.           }
  974.         break;
  975.         
  976.       case 8 :
  977.         if(kro8(y,x[2])== -1)
  978.           {
  979.         z=cgetg(4,8);z[1]=copyifstack(y[1]);
  980.         z[2]=lmul(y[2],x);
  981.         z[3]=lmul(y[3],x);
  982.           }
  983.         else
  984.           {
  985.         l=avma;p1=cvtop(y,x[2],signe(x[4])?precp(x):valp(x)+1);
  986.         tetpil=avma;z=gerepile(l,tetpil,gmul(p1,x));
  987.           }
  988.         break;
  989.         
  990.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  991.         z[1]=copyifstack(y[1]);
  992.         break;
  993.         
  994.       default: err(gmuler1);
  995.       }
  996.       break;
  997.       
  998.     case 8 : switch(ty)
  999.       {
  1000.       case 8 : p1=(GEN)x[1];yy=(GEN)y[1];
  1001.         if ((p1!=yy)&&(!gegal(p1,yy))) err(gmuler12);
  1002.         z=cgetg(ly,ty);
  1003.         if (gcmp0(p1[3]))
  1004.           {
  1005.         l=avma;
  1006.         p2=gmul(x[2],y[2]);
  1007.         p3=gmul(x[3],y[3]);
  1008.         p4=gmul(gneg(p1[2]),p3);tetpil=avma;
  1009.         z[2]=lpile(l,tetpil,gadd(p4,p2));
  1010.         l=avma;
  1011.         p2=gmul(x[2],y[3]);
  1012.         p3=gmul(x[3],y[2]);
  1013.         tetpil=avma;
  1014.         z[3]=lpile(l,tetpil,gadd(p2,p3));
  1015.         z[1]=copyifstack(yy);
  1016.           }
  1017.         else
  1018.           {
  1019.         l1=avma;p2=gmul(x[3],y[3]);
  1020.         l2=avma;
  1021.         p3=gmul(x[2],y[2]);
  1022.         p4=gmul(gneg(p1[2]),p2);tetpil=avma;
  1023.         z[2]=lpile(l2,tetpil,gadd(p3,p4));
  1024.         l=avma;p3=gmul(x[2],y[3]);
  1025.         p4=gmul(x[3],y[2]);
  1026.         p5=gadd(p4,p3);tetpil=avma;
  1027.         z[3]=lpile(l,tetpil,gadd(p5,p2));
  1028.         z[1]=copyifstack(yy);
  1029.         gerepile(l1,l2,z);
  1030.           }
  1031.         break;
  1032.       case 9 : z=cgetg(ly,ty);z[2]=lmul(x,y[2]);
  1033.         z[1]=copyifstack(y[1]);
  1034.         break;
  1035.         
  1036.       default: err(gmuler1);
  1037.       }      
  1038.       break;
  1039.       
  1040.     case 9 : z=cgetg(lx,tx);k=x[1];l=y[1];
  1041.       if((k==l)||gegal(k,l))
  1042.         z[1]=copyifstack(k);
  1043.       else z[1]=lgcd(k,l);
  1044.       l=avma;p1=gmul(x[2],y[2]);tetpil=avma;
  1045.       z[2]=lpile(l,tetpil,gmod(p1,z[1]));
  1046.       break;
  1047.       
  1048.     default: if(ty!=9) err(gmulbug1);
  1049.       z=cgetg(ly,ty);z[1]=copyifstack(y[1]);
  1050.       l=avma;p1=gmul(x,y[2]);tetpil=avma;
  1051.       z[2]=lpile(l,tetpil,gmod(p1,z[1]));
  1052.       break;
  1053.     }
  1054.     }
  1055.   else  /* ici ty>=10 */
  1056.     {
  1057.       if(((vx>vy)&&((tx<17)||(ty<17)))||((vx==vy)&&(tx<10))||((ty>=17)&&(tx<17)))
  1058.     {
  1059.       switch(ty)
  1060.         {
  1061.         case 10: z=cgetg(ly,ty);
  1062.           if (isexactzero(x)||isexactzero(y))
  1063.         {z[1]=2;setvarn(z,vy);}
  1064.           else
  1065.         {
  1066.           for (i=2;i<lgef(y);i++)
  1067.             z[i]=lmul(x,y[i]);
  1068.           z[1]=y[1];
  1069.           normalizepol(&z);
  1070.         }
  1071.           break;
  1072.           
  1073.         case 11: if (gcmp0(x))
  1074.           {
  1075.         z=cgetg(3,10);z[1]=2;setvarn(z,vy);
  1076.           }
  1077.         else
  1078.           {
  1079.         if (gcmp0(y)) z=gcopy(y);
  1080.         else
  1081.           {
  1082.             z=cgetg(ly,ty);
  1083.             for (i=2;i<ly;i++)
  1084.               z[i]=lmul(x,y[i]);
  1085.             z[1]=y[1];
  1086.             normalize(&z);
  1087.           }
  1088.           }
  1089.           break;
  1090.           
  1091.         case 13:
  1092.           if(isexactzero(x)) {z=cgetg(2,10);z[1]=2;setvarn(z,vy);}
  1093.           else 
  1094.         {
  1095.           l=avma;z=cgetg(ly,ty);z[1]=lmul(x,y[1]);z[2]=y[2];
  1096.           tetpil=avma;z=gerepile(l,tetpil,gred(z));
  1097.         }
  1098.           break;
  1099.         case 14: 
  1100.           if(isexactzero(x)) {z=cgetg(2,10);z[1]=2;setvarn(z,vy);}
  1101.           else {z=cgetg(ly,ty);z[1]=lmul(x,y[1]);z[2]=lcopy(y[2]);}
  1102.           break;
  1103.           
  1104.         case 17:
  1105.         case 18:
  1106.         case 19: z=cgetg(ly,ty);
  1107.           for (i=1;i<ly;i++) z[i]=lmul(x,y[i]);
  1108.           break;
  1109.           
  1110.         default: err(gmuler1);
  1111.           
  1112.         }
  1113.     }
  1114.       else /* ici ty>=10 et tx>=10 et vx=vy ou tx et ty>=17 */
  1115.     {
  1116.       if((tx>ty)&&((tx<17)||(ty<17)))
  1117.         {
  1118.           p1=x;x=y;y=p1;tz=tx;tx=ty;ty=tz;
  1119.           tz=lx;lx=ly;ly=tz;
  1120.         }
  1121.       switch(tx)
  1122.         {
  1123.         case 10: switch (ty)
  1124.           {
  1125.           case 10: if (isexactzero(x)||isexactzero(y))
  1126.         {
  1127.           z=cgetg(3,ty);z[1]=2;
  1128.         }
  1129.           else
  1130.         {
  1131.           dx=lgef(x);dy=lgef(y);
  1132.           if (dx<dy)
  1133.             {
  1134.               p1=x;x=y;y=p1;k=lx;lx=ly;ly=k;
  1135.               k=dx;dx=dy;dy=k;
  1136.             }
  1137.           k=dx+dy-3;z=cgetg(k,ty);
  1138.           for (i=2;i<dy;i++)
  1139.             {
  1140.               p1=gzero;l=avma;
  1141.               for (j=2;j<=i;j++)
  1142.             {
  1143.               p2=gmul(y[j],x[i-j+2]);
  1144.               tetpil=avma;
  1145.               p1=gadd(p1,p2);
  1146.             }
  1147.               z[i]=lpile(l,tetpil,p1);
  1148.             }
  1149.           for (i=dy;i<dx;i++)
  1150.             {
  1151.               p1=gzero;l=avma;
  1152.               for (j=2;j<dy;j++)
  1153.             {
  1154.               p2=gmul(y[j],x[i-j+2]);
  1155.               tetpil=avma;
  1156.               p1=gadd(p1,p2);
  1157.             }
  1158.               z[i]=lpile(l,tetpil,p1);
  1159.             }
  1160.           for (i=dx;i<=dx+dy-4;i++)
  1161.             {
  1162.               p1=gzero;l=avma;
  1163.               for (j=i-dx+3;j<dy;j++)
  1164.             {
  1165.               p2=gmul(y[j],x[i-j+2]);
  1166.               tetpil=avma;
  1167.               p1=gadd(p1,p2);
  1168.             }
  1169.               z[i]=lpile(l,tetpil,p1);
  1170.             }
  1171.           z[1]=0x1000000+k;
  1172.         }
  1173.         setvarn(z,vx);normalizepol(&z);
  1174.         break;
  1175.         
  1176.           case 11: if (gcmp0(x))
  1177.         {
  1178.           z=cgetg(3,10);z[1]=2;setvarn(z,vx);
  1179.         }
  1180.           else
  1181.         {
  1182.           if (gcmp0(y))
  1183.             {
  1184.               z=cgetg(3,11);z[1]=0x8000+valp(y)+gval(x,vx);
  1185.               setvarn(z,vx);
  1186.             }
  1187.           else
  1188.             {
  1189.               l=avma;p1=greffe(x,ly);
  1190.               tetpil=avma;p2=gmul(p1,y);
  1191.               z=gerepile(l,tetpil,p2);
  1192.             }
  1193.         }
  1194.         break;
  1195.         
  1196.           case 13:
  1197.           case 14: l=avma;z=cgetg(ly,ty);z[1]=lmul(x,y[1]);
  1198.         z[2]=lcopy(y[2]);
  1199.         if (ty==13)
  1200.           {
  1201.             tetpil=avma;p1=gred(z);z=gerepile(l,tetpil,p1);
  1202.           }
  1203.         break;
  1204.         
  1205.           case 17:
  1206.           case 18:
  1207.           case 19: z=cgetg(ly,ty);
  1208.         for (i=1;i<ly;i++) z[i]=lmul(x,y[i]);
  1209.         break;
  1210.         
  1211.           default: err(gmuler1);
  1212.         
  1213.           } break;
  1214.           
  1215.         case 11: switch (ty)
  1216.           {
  1217.           case 11: if(lx>ly) {k=ly;ly=lx;lx=k;p1=y;y=x;x=p1;}
  1218.         if (gcmp0(x)||gcmp0(y))
  1219.           {
  1220.             z=cgetg(3,11);
  1221.             z[1]=0x8000+valp(x)+valp(y);
  1222.             setvarn(z,vx);
  1223.           }
  1224.         else
  1225.           {
  1226.             l=avma;p1=cgeti(lx);z=cgetg(lx,ty);
  1227.             setvalp(z,valp(x)+valp(y));setvarn(z,vx);setsigne(z,1);
  1228.             for (i=2;i<lx;i++)
  1229.               {
  1230.             p1[i]=!isexactzero(y[i]);
  1231.             z[i]=p1[i]?lmul(x[2],y[i]):zero;
  1232.               }
  1233.             for(i=3;i<lx;i++)
  1234.               if(!isexactzero(x[i]))
  1235.             for(j=2;j<=lx+1-i;j++)
  1236.               if(p1[j]) z[i+j-2]=ladd(z[i+j-2],gmul(x[i],y[j]));
  1237.             tetpil=avma;z=gerepile(l,tetpil,gcopy(z));
  1238.             normalize(&z);
  1239.           }
  1240.         break;
  1241.         
  1242.           case 13:
  1243.           case 14: if (gcmp0(y))
  1244.         {
  1245.           z=cgetg(3,10);z[1]=2;setvarn(z,vx);
  1246.         }
  1247.           else
  1248.         {
  1249.           if (gcmp0(x))
  1250.             {
  1251.               z=cgetg(3,11);z[1]=0x8000+valp(x)+gval(y,vx);
  1252.               setvarn(z,vx);
  1253.             }
  1254.           else
  1255.             {
  1256.               l=avma;p1=gmul(y[1],x);
  1257.               tetpil=avma;z=gerepile(l,tetpil,gdiv(p1,y[2]));
  1258.             }
  1259.         }
  1260.         break;
  1261.         
  1262.           case 17:
  1263.           case 18:
  1264.           case 19: z=cgetg(ly,ty);
  1265.         for (i=1;i<ly;i++)
  1266.           z[i]=lmul(x,y[i]);
  1267.         break;
  1268.         
  1269.           default: err(gmuler1);
  1270.         
  1271.           } break;
  1272.           
  1273.         case 13:
  1274.         case 14: if (ty<=14)
  1275.           {
  1276.         if (tx+ty==26) tz=13;else tz=14;
  1277.         l=avma;z=cgetg(ly,tz);
  1278.         z[1]=lmul(x[1],y[1]);
  1279.         z[2]=lmul(x[2],y[2]);
  1280.         if (tz==13)
  1281.           {
  1282.             tetpil=avma;p1=gred(z);z=gerepile(l,tetpil,p1);
  1283.           }
  1284.           }
  1285.         else
  1286.           {
  1287.         z=cgetg(ly,ty);for(i=1;i<ly;i++)
  1288.           z[i]=lmul(x,y[i]);
  1289.           }
  1290.           break;
  1291.         case 15: if(ty!=15) err(gmuler1);
  1292.           z=compreal(x,y);break;
  1293.           
  1294.         case 16: if(ty!=16) err(gmuler1);
  1295.           z=compose(x,y);break;
  1296.           
  1297.         case 17: switch(ty)
  1298.           {
  1299.           case 17: err(gmuler7);
  1300.         
  1301.           case 18: if (lx!=ly) err(gmuler7);
  1302.           else
  1303.         {
  1304.           z=gzero;l=avma;
  1305.           for (i=1;i<lx;i++)
  1306.             {
  1307.               p1=gmul(x[i],y[i]);
  1308.               tetpil=avma;
  1309.               z=gadd(z,p1);
  1310.             }
  1311.           z=gerepile(l,tetpil,z);
  1312.         }
  1313.         break;
  1314.         
  1315.           case 19: dy=lg(y[1]);
  1316.         if (lx!=dy) err(gmuler8);
  1317.         else
  1318.           {
  1319.             z=cgetg(ly,tx);
  1320.             for (i=1;i<ly;i++)
  1321.               {
  1322.             p1=gzero;l=avma;
  1323.             for (j=1;j<lx;j++)
  1324.               {
  1325.                 p2=gmul(x[j],coeff(y,j,i));
  1326.                 tetpil=avma;
  1327.                 p1=gadd(p1,p2);
  1328.               }
  1329.             z[i]=lpile(l,tetpil,p1);
  1330.               }
  1331.           }
  1332.         break;
  1333.         
  1334.           default: err(gmuler1);
  1335.         
  1336.           } break;
  1337.           
  1338.         case 18: switch(ty)
  1339.           {
  1340.           case 17: z=cgetg(ly,19);
  1341.         for(i=1;i<ly;i++)
  1342.           z[i]=lmul(y[i],x);break;
  1343.         
  1344.           case 18: err(gmuler7);
  1345.         
  1346.           case 19: if(lg(y[1])!=1) err(gmuler7);
  1347.           else
  1348.         {
  1349.           z=cgetg(ly,19);
  1350.           for(i=1;i<ly;i++)
  1351.             z[i]=lmul(coeff(y,1,i),x);
  1352.         }
  1353.         break;
  1354.         
  1355.           default: err(gmuler1);
  1356.         
  1357.           } break;
  1358.           
  1359.         case 19: switch(ty)
  1360.           {
  1361.           case 17: if(lx!=2) err(gmuler7);
  1362.         z=cgetg(ly,19);
  1363.         for(i=1;i<ly;i++)
  1364.           z[i]=lmul(y[i],x[1]);
  1365.         break;
  1366.         
  1367.           case 18: if (lx!=ly) err(gmuler9);
  1368.         if(lx==1) z=gcopy(x);
  1369.         else
  1370.           {
  1371.             dx=lg(x[1]);
  1372.             z=cgetg(dx,ty);
  1373.             for (i=1;i<dx;i++)
  1374.               {
  1375.             p1=gzero;l=avma;
  1376.             for (j=1;j<ly;j++)
  1377.               {
  1378.                 p2=gmul(coeff(x,i,j),y[j]);
  1379.                 tetpil=avma;
  1380.                 p1=gadd(p1,p2);
  1381.               }
  1382.             z[i]=lpile(l,tetpil,p1);
  1383.               }
  1384.           }
  1385.         break;
  1386.         
  1387.           case 19: if(lx==1) err(gmuler10);
  1388.         if(ly==1) z=cgetg(ly,tx);
  1389.         else
  1390.           {
  1391.             dx=lg(x[1]);dy=lg(y[1]);
  1392.             if (lx!=dy) err(gmuler10);
  1393.             z=cgetg(ly,tx);
  1394.             for (i=1;i<ly;i++) z[i]=lgetg(dx,18);
  1395.             for (i=1;i<dx;i++)
  1396.               {
  1397.             for (j=1;j<ly;j++)
  1398.               {
  1399.                 p1=gzero;l=avma;
  1400.                 for (k=1;k<dy;k++)
  1401.                   {
  1402.                 p2=gmul(coeff(x,i,k),coeff(y,k,j));
  1403.                 tetpil=avma;
  1404.                 p1=gadd(p1,p2);
  1405.                   }
  1406.                 coeff(z,i,j)=lpile(l,tetpil,p1);
  1407.               }
  1408.               }
  1409.           }
  1410.         break;
  1411.         
  1412.           default: err(gmuler1);
  1413.         
  1414.           } break;
  1415.           
  1416.         default: err(gmuler1);
  1417.           
  1418.         }     
  1419.     }
  1420.     }
  1421.   return z;
  1422. }
  1423.  
  1424. /********************************************************************/
  1425. /********************************************************************/
  1426. /**                                                                **/
  1427. /**                       DIVISION GENERALE                        **/
  1428. /**                                                                **/
  1429. /********************************************************************/
  1430. /********************************************************************/
  1431.  
  1432. GEN   gdiv(x,y)
  1433.      
  1434.      GEN   x,y;
  1435.      
  1436. {
  1437.   long  lx,ly,lz,k,l,l1,i,j,s;
  1438.   long  tetpil,tx,ty,tz,vx,vy;
  1439.   GEN z,p1,p2,p3,p4,p5;
  1440.   
  1441.   if (gcmp0(y)) err(gdiver2);
  1442.   else
  1443.     {
  1444.       lx=lg(x);ly=lg(y);tx=typ(x);ty=typ(y);
  1445.       if ((tx<10)&&(ty<10))
  1446.     {
  1447.       switch(tx)
  1448.         {
  1449.         case 1 : switch(ty)
  1450.           {
  1451.           case 1 : l=avma;z=dvmdii(x,y,&p1);
  1452.         if(!signe(p1)) cgiv(p1);
  1453.         else
  1454.           {
  1455.             avma=l;
  1456.             z=cgetg(3,4);z[1]=lcopy(x);
  1457.             z[2]=lcopy(y);
  1458.             if(signe(z[2])<0)
  1459.               {
  1460.             mpnegz(z[1],z[1]);
  1461.             mpnegz(z[2],z[2]);
  1462.               }
  1463.             gredsp(&z);
  1464.           }
  1465.         break;
  1466.         
  1467.           case 2 : z=divir(x,y);break;
  1468.         
  1469.           case 3 : z=cgetg(ly,ty);l=avma;
  1470.         p1= mpinvmod(y[2],y[1]);
  1471.         p2=mulii(x,p1);tetpil=avma;
  1472.         p2=modii(p2,y[1]);
  1473.         z[1]=copyifstack(y[1]);
  1474.         z[2]=lpile(l,tetpil,p2);
  1475.         break;
  1476.         
  1477.           case 4 :
  1478.         
  1479.           case 5 : z=cgetg(ly,ty);
  1480.         z[1]=lmulii(x,y[2]);
  1481.         z[2]=lcopy(y[1]);
  1482.         if(signe(z[2])<0)
  1483.           {
  1484.             mpnegz(z[1],z[1]);
  1485.             mpnegz(z[2],z[2]);
  1486.           }
  1487.         if (ty==4) gredsp(&z);
  1488.         break;
  1489.         
  1490.           case 7 : if(signe(x))
  1491.         {
  1492.           l=avma;p1=cgetp(y);gaffect(x,p1);
  1493.           tetpil=avma;z=gerepile(l,tetpil,gdiv(p1,y));
  1494.         }
  1495.           else z=gzero;
  1496.         break;
  1497.         
  1498.           case 6 :
  1499.           case 8 : l=avma;p1=gnorm(y);
  1500.         p2=gmul(x,gconj(y));tetpil=avma;
  1501.         z=gerepile(l,tetpil,gdiv(p2,p1));
  1502.         break;
  1503.         
  1504.           case 9 : z=cgetg(ly,ty);l=avma;
  1505.         p1=ginvmod(y[2],y[1]);
  1506.         tetpil=avma;z[2]=lmul(x,p1);
  1507.         gerepile(l,tetpil,1);
  1508.         z[1]=copyifstack(y[1]);
  1509.         break;
  1510.         
  1511.           default: err(gdiver1);
  1512.           } break;
  1513.           
  1514.         case 2 : switch(ty)
  1515.           {
  1516.           case 1 : z=divri(x,y);break;
  1517.           case 2 : z=divrr(x,y);break;
  1518.           case 3 : err(gdiver3);
  1519.           case 4 :
  1520.           case 5 : l=avma;p1=cgetg(lx,tx);gaffect(y,p1);
  1521.         p2=divrr(x,p1);z=gerepile(l,p1,p2);
  1522.         break;
  1523.           case 6 : z=cgetg(ly,ty);l=avma;p1=gnorm(y);
  1524.         p2=gmul(x,y[1]);p3=gmul(x,y[2]);
  1525.         gnegz(p3,p3);tetpil=avma;
  1526.         z[1]=ldiv(p2,p1);
  1527.         z[2]=ldiv(p3,p1);
  1528.         gerepile(l,tetpil,1);
  1529.         break;
  1530.           case 7 : err(gdiver3);
  1531.           case 8 : l=avma;p1=co8(y,lx);tetpil=avma;
  1532.         z=gerepile(l,tetpil,gdiv(x,p1));
  1533.         break;
  1534.           case 9 : z=cgetg(ly,ty);l=avma;
  1535.         p1=ginvmod(y[2],y[1]);
  1536.         tetpil=avma;z[2]=lmul(x,p1);
  1537.         gerepile(l,tetpil,1);
  1538.         z[1]=copyifstack(y[1]);
  1539.         break;
  1540.           default: err(gdiver1);
  1541.           } break;
  1542.         case 3 : switch(ty)
  1543.           {
  1544.           case 1 : z=cgetg(lx,tx);
  1545.         z[2]=lmpinvmod(y,x[1]);l=avma;
  1546.         p1=gmul(x[2],z[2]);
  1547.         mpmodz(p1,x[1],z[2]);avma=l;
  1548.         z[1]=copyifstack(x[1]);
  1549.         break;
  1550.           case 2 : err(gdiver4);
  1551.           case 3 : z=cgetg(ly,ty);k=x[1];l=y[1];
  1552.         if((k==l)||gegal(k,l))
  1553.           z[1]=copyifstack(k);
  1554.         else z[1]=lmppgcd(k,l);
  1555.         l=avma;p1=mpinvmod(y[2],z[1]);
  1556.         p2=mulii(x[2],p1);tetpil=avma;
  1557.         z[2]=lpile(l,tetpil,modii(p2,z[1]));
  1558.         break;
  1559.           case 4 : z=cgetg(lx,tx);
  1560.         z[2]=lmpinvmod(y[1],x[1]);
  1561.         l=avma;
  1562.         p1=mulii(x[2],y[2]);
  1563.         mpmodz(p1,x[1],p1);
  1564.         p2=mulii(p1,z[2]);
  1565.         mpmodz(p2,x[1],z[2]);avma=l;
  1566.         z[1]=copyifstack(x[1]);
  1567.         break;
  1568.           case 5 : l=avma;
  1569.         p1=gred(y);tetpil=avma;
  1570.         p2=gdiv(x,p1);z=gerepile(l,tetpil,p2);
  1571.         break;
  1572.           case 6 : 
  1573.           case 8 : l=avma;p1=gnorm(y);p2=gmul(x,gconj(y));tetpil=avma;
  1574.         z=gerepile(l,tetpil,gdiv(p2,p1));break;
  1575.           case 7 : l=avma;p1=cgetg(3,3);p1[1]=x[1];p1[2]=lgeti(lg(x[1]));
  1576.         gaffect(y,p1);tetpil=avma;z=gerepile(l,tetpil,gdiv(x,p1));
  1577.         break;
  1578.           case 9 : z=cgetg(ly,ty);l=avma;
  1579.         p1=ginvmod(y[2],y[1]);
  1580.         tetpil=avma;z[2]=lmul(x,p1);
  1581.         gerepile(l,tetpil,1);
  1582.         z[1]=copyifstack(y[1]);
  1583.         break;
  1584.           default: err(gdiver1);
  1585.           } break;
  1586.         case 4 :
  1587.         case 5 : switch(ty)
  1588.           {
  1589.           case 1 : z=cgetg(lx,tx);z[1]=lcopy(x[1]);
  1590.         z[2]=lmul(x[2],y);
  1591.         if(signe(z[2])<0)
  1592.           {
  1593.             mpnegz(z[1],z[1]);
  1594.             mpnegz(z[2],z[2]);
  1595.           }
  1596.         if (tx==4) gredsp(&z);
  1597.         break;
  1598.           case 2 : l=avma;p1=cgetg(ly,ty);gaffect(x,p1);
  1599.         p2=divrr(p1,y);z=gerepile(l,p1,p2);
  1600.         break;
  1601.           case 3 : z=cgetg(ly,ty);l=avma;
  1602.         p1=mulii(y[2],x[2]);
  1603.         p2=mpinvmod(p1,y[1]);
  1604.         p3=mulii(p2,x[1]);tetpil=avma;
  1605.         z[2]=lmodii(p3,y[1]);
  1606.         gerepile(l,tetpil,1);
  1607.         z[1]=copyifstack(y[1]);
  1608.         break;
  1609.           case 4 :
  1610.           case 5 : if ((tx+ty)==8) tz=4;else tz=5;
  1611.         z=cgetg(ly,tz);
  1612.         z[1]=lmulii(x[1],y[2]);
  1613.         z[2]=lmulii(x[2],y[1]);
  1614.         if(signe(z[2])<0)
  1615.           {
  1616.             mpnegz(z[1],z[1]);
  1617.             mpnegz(z[2],z[2]);
  1618.           }
  1619.         if (tz==4) gredsp(&z);
  1620.         break;
  1621.           case 6 : z=cgetg(ly,ty);l=avma;p1=gnorm(y);
  1622.         p2=gmul(x,y[1]);
  1623.         p3=gmul(x,y[2]);gnegz(p3,p3);
  1624.         tetpil=avma;
  1625.         z[1]=ldiv(p2,p1);
  1626.         z[2]=ldiv(p3,p1);
  1627.         gerepile(l,tetpil,1);
  1628.         break;
  1629.           case 7 : if(signe(x[1]))
  1630.         {
  1631.           l=avma;p1=cgetp(y);gaffect(x,p1);
  1632.           tetpil=avma;z=gerepile(l,tetpil,gdiv(p1,y));
  1633.         }
  1634.           else z=gzero;
  1635.         break;
  1636.           case 8 : l=avma;
  1637.         p1=gnorm(y);
  1638.         p2=gmul(x,gconj(y));tetpil=avma;
  1639.         z=gerepile(l,tetpil,gdiv(p2,p1));
  1640.         break;
  1641.           case 9 : z=cgetg(ly,ty);l=avma;
  1642.         p1=ginvmod(y[2],y[1]);
  1643.         tetpil=avma;z[2]=lmul(x,p1);
  1644.         gerepile(l,tetpil,1);
  1645.         z[1]=copyifstack(y[1]);
  1646.         break;
  1647.           default: err(gdiver1);
  1648.           } break;
  1649.         case 6 : switch(ty)
  1650.           {
  1651.           case 1 :
  1652.           case 2 :
  1653.           case 3 :
  1654.           case 4 :
  1655.           case 5 : z=cgetg(lx,tx);
  1656.         z[1]=ldiv(x[1],y);
  1657.         z[2]=ldiv(x[2],y);
  1658.         break;
  1659.           case 6 : l=avma;p1=gnorm(y);p2=gconj(y);
  1660.         p3=gmul(x,p2);tetpil=avma;
  1661.         p4=gdiv(p3,p1);
  1662.         z=gerepile(l,tetpil,p4);
  1663.         break;
  1664.           case 7 :
  1665.         if(krosg(-1,y[2])== -1)
  1666.           {
  1667.             z=cgetg(3,6);
  1668.             z[1]=ldiv(x[1],y);
  1669.             z[2]=ldiv(x[2],y);
  1670.           }
  1671.         else
  1672.           {
  1673.             l=avma;p1=cvtop(x,y[2],precp(y));
  1674.             tetpil=avma;
  1675.             z=gerepile(l,tetpil,gdiv(p1,y));
  1676.           }
  1677.         break;
  1678.           case 8 : lx=precision(x);if(!lx) err(gdiver7);
  1679.         l=avma;p1=co8(y,lx);tetpil=avma;
  1680.         z=gerepile(l,tetpil,gdiv(x,p1));
  1681.         break;
  1682.           case 9 : z=cgetg(ly,ty);l=avma;
  1683.         p1=ginvmod(y[2],y[1]);
  1684.         tetpil=avma;z[2]=lmul(x,p1);
  1685.         gerepile(l,tetpil,1);
  1686.         z[1]=copyifstack(y[1]);
  1687.         break;
  1688.           default: err(gdiver1);
  1689.           } break;
  1690.         case 7 : switch(ty)
  1691.           {
  1692.           case 3 : l=avma;p1=cgetg(3,3);p1[1]=y[1];p1[2]=lgeti(lg(y[1]));
  1693.         gaffect(x,p1);tetpil=avma;z=gerepile(l,tetpil,gdiv(p1,y));
  1694.         break;
  1695.           case 7:
  1696.         if(cmpii(x[2],y[2])) err(gdiver19);
  1697.         if(!signe(x[4])) {z=gcopy(x);setvalp(z,valp(x)-valp(y));}
  1698.         else
  1699.           {
  1700.             p1=(precp(x)>precp(y)) ? y : x;
  1701.             z=cgetp(p1);l=avma;
  1702.             setvalp(z,valp(x)-valp(y));
  1703.             p2=mpinvmod(y[4],p1[3]);
  1704.             modiiz(mulii(x[4],p2),p1[3],z[4]);
  1705.             avma=l;
  1706.           }
  1707.         break;
  1708.           case 6:
  1709.           case 8: l=avma;p1=gmul(x,gconj(y));
  1710.         p2=gnorm(y);tetpil=avma;
  1711.         z=gerepile(l,tetpil,gdiv(p1,p2));
  1712.         break;
  1713.           case 9 : z=cgetg(ly,ty);l=avma;
  1714.         p1=ginvmod(y[2],y[1]);
  1715.         tetpil=avma;z[2]=lmul(x,p1);
  1716.         gerepile(l,tetpil,1);
  1717.         z[1]=copyifstack(y[1]);
  1718.         break;
  1719.           default:
  1720.         l=avma;
  1721.         if(signe(x[4])) p1=cvtop(y,x[2],precp(x));
  1722.         else p1=cvtop(y,x[2],(valp(x)>0)?valp(x):1);
  1723.         tetpil=avma;
  1724.         z=gerepile(l,tetpil,gdiv(x,p1));
  1725.           }
  1726.           break;
  1727.         case 8 : switch (ty)
  1728.           {
  1729.           case 1 :
  1730.           case 3 :
  1731.           case 4 :
  1732.           case 5 : z=cgetg(lx,tx);
  1733.         z[1]=copyifstack(x[1]);
  1734.         for (i=2;i<4;i++)
  1735.           z[i]=ldiv(x[i],y);
  1736.         break;
  1737.           case 2 : l=avma;p1=co8(x,ly);tetpil=avma;
  1738.         z=gerepile(l,tetpil,gdiv(p1,y));
  1739.         break;
  1740.           case 7 : l=avma;p1=cvtop(x,y[2],precp(y));
  1741.         tetpil=avma;z=gerepile(l,tetpil,gdiv(p1,y));
  1742.         break;
  1743.           case 6 : ly=precision(y);if(!ly) err(gdiver6);
  1744.         l=avma;p1=co8(x,ly);tetpil=avma;
  1745.         z=gerepile(l,tetpil,gdiv(p1,y));
  1746.         break;
  1747.           case 8 : k=x[1];l=y[1];
  1748.         if ((k!=l)&&(!gegal(k,l))) err(gdiver18);
  1749.         l=avma;p1=gnorm(y);
  1750.         p3=gmul(x,gconj(y));tetpil=avma;
  1751.         z=gerepile(l,tetpil,gdiv(p3,p1));
  1752.         break;
  1753.           case 9 : z=cgetg(ly,ty);l=avma;
  1754.         p1=ginvmod(y[2],y[1]);
  1755.         tetpil=avma;z[2]=lmul(x,p1);
  1756.         gerepile(l,tetpil,1);
  1757.         z[1]=copyifstack(y[1]);
  1758.         break;
  1759.           default: err(gdiver1);
  1760.           } break;
  1761.         case 9 : 
  1762.           if(ty!=9)
  1763.         {
  1764.           z=cgetg(lx,tx);
  1765.           z[2]=ldiv(x[2],y);
  1766.           z[1]=copyifstack(x[1]);
  1767.         }
  1768.           else
  1769.         {
  1770.           z=cgetg(ly,ty);k=x[1];l=y[1];
  1771.           if((k==l)||gegal(k,l))
  1772.             z[1]=copyifstack(k);
  1773.           else z[1]=lgcd(k,l);
  1774.           l=avma;p1=ginvmod(y[2],z[1]);
  1775.           p2=gmul(x[2],p1);tetpil=avma;
  1776.           z[2]=lpile(l,tetpil,gmod(p2,z[1]));
  1777.         }
  1778.           break;
  1779.           
  1780.         default: err(gdiver1);
  1781.         }
  1782.     }
  1783.       else
  1784.     {
  1785.       vx=gvar(x);vy=gvar(y);
  1786.       if(((vx<vy)&&((tx<17)||(ty<17)))||((vx==vy)&&(ty<10))||((tx>=17)&&(ty<17)))
  1787.         {
  1788.           l=avma;z=cgetg(lx,tx);
  1789.           switch(tx)
  1790.         {
  1791.         case 9: z[1]=copyifstack(x[1]);z[2]=ldiv(x[2],y);break;
  1792.         case 10: l1=lgef(x);
  1793.           for(i=2;i<l1;i++)
  1794.             z[i]=ldiv(x[i],y);
  1795.           z[1]=x[1];
  1796.           break;
  1797.         case 11:
  1798.           if(gcmp0(x)) z=gcopy(x);
  1799.           else
  1800.             {
  1801.               for(i=2;i<lx;i++)
  1802.             z[i]=ldiv(x[i],y);
  1803.               setvalp(z,valp(x));
  1804.               setvarn(z,vx);
  1805.               normalize(&z);
  1806.             }
  1807.           break;
  1808.         case 13: z[1]=x[1];z[2]=lmul(x[2],y);
  1809.           tetpil=avma;z=gerepile(l,tetpil,gred(z));
  1810.           break;
  1811.         case 14: z[1]=lcopy(x[1]);z[2]=lmul(x[2],y);
  1812.           break;
  1813.         case 17:
  1814.         case 18:
  1815.         case 19: for(i=1;i<lx;i++)
  1816.           z[i]=ldiv(x[i],y);
  1817.           break;
  1818.         default: err(gdiver1);
  1819.         }
  1820.         }
  1821.       else
  1822.         {
  1823.           if((vy<vx)||((vy==vx)&&(tx<10)))
  1824.         switch(ty)
  1825.           {
  1826.           case 9 : z=cgetg(ly,ty);l=avma;
  1827.             p1=ginvmod(y[2],y[1]);
  1828.             tetpil=avma;z[2]=lmul(x,p1);
  1829.             gerepile(l,tetpil,1);
  1830.             z[1]=copyifstack(y[1]);
  1831.             break;
  1832.           case 10:
  1833.             if(lgef(y)>3)
  1834.               {
  1835.             if(isexactzero(x)) 
  1836.               {z=cgetg(2,10);z[1]=2;setvarn(z,vy);}
  1837.             else
  1838.               {
  1839.                 l=avma;z=cgetg(3,13);z[1]=(long)x;
  1840.                 z[2]=(long)y;tetpil=avma;
  1841.                 z=gerepile(l,tetpil,gred(z));
  1842.               }
  1843.               }
  1844.             else z=gdiv(x,y[2]);
  1845.             break;
  1846.           case 11: l=avma;
  1847.             if(gcmp0(x))
  1848.               {
  1849.             p1=ginv(y);tetpil=avma; /* a ameliorer !!!! */
  1850.             z=gerepile(l,tetpil,gmul(x,p1));
  1851.               }
  1852.             else
  1853.               {
  1854.             p1=cgetg(ly,ty);p1[2]=lcopy(x);
  1855.             p1[1]=0x1008000;setvarn(p1,vy);
  1856.             for(i=3;i<ly;i++) p1[i]=zero;
  1857.             tetpil=avma;p2=gdiv(p1,y);
  1858.             z=gerepile(l,tetpil,p2);
  1859.               }
  1860.             break;
  1861.           case 13: l=avma;z=cgetg(ly,ty);z[1]=lmul(x,y[2]);
  1862.             z[2]=y[1];tetpil=avma;z=gerepile(l,tetpil,gred(z));
  1863.             break;
  1864.           case 14: z=cgetg(ly,ty);z[1]=lmul(x,y[2]);z[2]=lcopy(y[1]);
  1865.             break;
  1866.           case 17:
  1867.           case 18: err(gdiver8);
  1868.           case 19: l1=lg(y[1]);
  1869.             if(l1!=ly) err(gdiver9);
  1870.             else
  1871.               {
  1872.             l=avma;
  1873.             p1=invmat(y);tetpil=avma;
  1874.             z=gerepile(l,tetpil,gmul(x,p1));
  1875.               }
  1876.             break;
  1877.           default: err(gdiver1);
  1878.           }
  1879.           else /* ici vx=vy et tx>=10 et ty>=10*/
  1880.         switch(tx)
  1881.           {
  1882.           case 10: switch(ty)
  1883.             {
  1884.             case 10: l=avma;z=cgetg(3,13);
  1885.               z[1]=lcopy(x);z[2]=lcopy(y);tetpil=avma;
  1886.               z=gerepile(l,tetpil,gred(z));
  1887.               break;
  1888.             case 11: if(gcmp0(x))
  1889.               {
  1890.             z=cgetg(3,10);z[1]=2;setvarn(z,vx);
  1891.               }
  1892.             else
  1893.               {
  1894.             l=avma;p1=greffe(x,ly);
  1895.             tetpil=avma;p2=gdiv(p1,y);
  1896.             z=gerepile(l,tetpil,p2);
  1897.               }
  1898.               break;
  1899.             case 13:
  1900.             case 14: l=avma;z=cgetg(ly,ty);
  1901.               z[1]=lmul(x,y[2]);z[2]=(ty==13)?y[1]:lcopy(y[1]);
  1902.               if(ty==13) {tetpil=avma;z=gerepile(l,tetpil,gred(z));}
  1903.               break;
  1904.             case 17:
  1905.             case 18:
  1906.             case 19: err(gdiver10);
  1907.             default: err(gdiver1);
  1908.             } break;
  1909.           case 11: switch(ty)
  1910.             {
  1911.             case 10: l=avma;p1=greffe(y,lx);tetpil=avma;
  1912.               p2=gdiv(x,p1);z=gerepile(l,tetpil,p2);
  1913.               break;
  1914.             case 11: lz=lx;if(ly<lx) lz=ly;
  1915.               if(gcmp0(x))
  1916.             {
  1917.               z=cgetg(3,11);z[1]=0x8000+valp(x)-valp(y);
  1918.               setvarn(z,vx);
  1919.             }
  1920.               else
  1921.             {
  1922.               z=cgetg(lz,ty);p3=cgeti(lz);
  1923.               for(i=3;i<lz;i++) p3[i]=!isexactzero(y[i]);
  1924.               setvalp(z,valp(x)-valp(y));setvarn(z,vx);
  1925.               z[2]=ldiv(x[2],y[2]);
  1926.               for(i=3;i<lz;i++)
  1927.                 {
  1928.                   l=avma;p1=(GEN)(x[i]);
  1929.                   for(j=2;j<i;j++)
  1930.                 if(p3[i-j+2]) p1=gsub(p1,gmul(z[j],y[i-j+2]));
  1931.                   tetpil=avma;p5=gdiv(p1,y[2]);
  1932.                   z[i]=lpile(l,tetpil,p5);
  1933.                 } normalize(&z);
  1934.             }
  1935.               break;
  1936.             case 13:
  1937.             case 14: l=avma;p2=gmul(x,y[2]);tetpil=avma;
  1938.               z=gerepile(l,tetpil,gdiv(p2,y[1]));
  1939.               break;
  1940.             case 17:
  1941.             case 18:
  1942.             case 19: err(gdiver12);
  1943.             default: err(gdiver1);
  1944.             } break;
  1945.           case 13:
  1946.           case 14: switch(ty)
  1947.             {
  1948.             case 10: l=avma;z=cgetg(lx,tx);
  1949.               z[1]=(tx==13)?x[1]:lcopy(x[1]);z[2]=lmul(x[2],y);
  1950.               if(tx==13) {tetpil=avma;z=gerepile(l,tetpil,gred(z));}
  1951.               break;
  1952.             case 11: l=avma;p2=gmul(x[2],y);tetpil=avma;
  1953.               p3=gdiv(x[1],p2);z=gerepile(l,tetpil,p3);
  1954.               break;
  1955.             case 13:
  1956.             case 14: if((tx+ty)==26) tz=13;else tz=14;
  1957.               l=avma;z=cgetg(ly,tz);
  1958.               z[1]=lmul(x[1],y[2]);z[2]=lmul(x[2],y[1]);
  1959.               if(tz==13) {tetpil=avma;z=gerepile(l,tetpil,gred(z));}
  1960.               break;
  1961.             case 17:
  1962.             case 18:
  1963.             case 19: err(gdiver16);
  1964.             default: err(gdiver1);
  1965.             } break;
  1966.           case 15: l=signe(y[2]);setsigne(y[2],-l);s=signe(y[4]);
  1967.             setsigne(y[4],-s);z=compreal(x,y);setsigne(y[2],l);setsigne(y[4],s);
  1968.             break;
  1969.           case 16: l=signe(y[2]);setsigne(y[2],-l);
  1970.             z=compose(x,y);setsigne(y[2],l);break;
  1971.           case 17:
  1972.           case 18:
  1973.           case 19: if(ty<17)
  1974.             {
  1975.               z=cgetg(lx,tx);
  1976.               for(i=1;i<lx;i++)
  1977.             z[i]=ldiv(x[i],y);
  1978.             }
  1979.           else
  1980.             {
  1981.               if((ty==19)&&(lg(y[1])==ly))
  1982.             {
  1983.               l=avma;
  1984.               p1=invmat(y);tetpil=avma;
  1985.               z=gerepile(l,tetpil,gmul(x,p1));
  1986.             }
  1987.               else err(gdiver17);
  1988.             }
  1989.             break;
  1990.           default: err(gdiver1);
  1991.           }
  1992.         }
  1993.     }
  1994.     }
  1995.   return z;
  1996. }
  1997.