680
680
dirmul(GEN x, GEN y)
682
682
pari_sp av = avma, lim = stack_lim(av, 1);
683
long lx, ly, lz, dx, dy, i, j, k;
683
long nx, ny, nz, dx, dy, i, j, k;
686
686
if (typ(x)!=t_VEC || typ(y)!=t_VEC) pari_err(typeer,"dirmul");
687
dx = dirval(x); lx = lg(x);
688
dy = dirval(y); ly = lg(y);
689
if (ly-dy < lx-dx) { swap(x,y); lswap(lx,ly); lswap(dx,dy); }
690
lz = minss(lx*dy,ly*dx);
692
for (j=dx; j<lx; j++)
687
dx = dirval(x); nx = lg(x)-1;
688
dy = dirval(y); ny = lg(y)-1;
689
if (ny-dy < nx-dx) { swap(x,y); lswap(nx,ny); lswap(dx,dy); }
690
nz = minss(nx*dy,ny*dx);
692
for (j=dx; j<=nx; j++)
694
694
GEN c = gel(x,j);
695
695
if (gequal0(c)) continue;
697
for (k=dy,i=j*dy; i<lz; i+=j,k++) gel(z,i) = gadd(gel(z,i),gel(y,k));
697
for (k=dy,i=j*dy; i<=nz; i+=j,k++) gel(z,i) = gadd(gel(z,i),gel(y,k));
701
for (k=dy,i=j*dy; i<lz; i+=j,k++) gel(z,i) = gsub(gel(z,i),gel(y,k));
701
for (k=dy,i=j*dy; i<=nz; i+=j,k++) gel(z,i) = gsub(gel(z,i),gel(y,k));
703
for (k=dy,i=j*dy; i<lz; i+=j,k++) gel(z,i) = gadd(gel(z,i),gmul(c,gel(y,k)));
703
for (k=dy,i=j*dy; i<=nz; i+=j,k++) gel(z,i) = gadd(gel(z,i),gmul(c,gel(y,k)));
705
705
if (low_stack(lim, stack_lim(av,1)))
715
715
dirdiv(GEN x, GEN y)
717
717
pari_sp av = avma;
718
long lx,ly,lz,dx,dy,i,j;
718
long nx,ny,nz,dx,dy,i,j;
721
721
if (typ(x)!=t_VEC || typ(y)!=t_VEC) pari_err(typeer,"dirmul");
722
dx = dirval(x); lx = lg(x);
723
dy = dirval(y); ly = lg(y);
724
if (dy != 1 || ly == 1) pari_err(talker,"not an invertible dirseries in dirdiv");
725
lz = minss(lx,ly*dx); p1 = gel(y,1);
722
dx = dirval(x); nx = lg(x)-1;
723
dy = dirval(y); ny = lg(y)-1;
724
if (dy != 1 || !ny) pari_err(talker,"not an invertible dirseries in dirdiv");
725
nz = minss(nx,ny*dx); p1 = gel(y,1);
726
726
if (!gequal1(p1)) { y = gdiv(y,p1); x = gdiv(x,p1); } else x = leafcopy(x);
728
for (j=dx; j<lz; j++)
728
for (j=dx; j<=nz; j++)
730
730
p1=gel(x,j); gel(z,j) = p1;
731
731
if (gequal0(p1)) continue;
733
for (i=j+j; i<lz; i+=j) gel(x,i) = gsub(gel(x,i),gel(y,i/j));
733
for (i=j+j; i<=nz; i+=j) gel(x,i) = gsub(gel(x,i),gel(y,i/j));
736
736
if (gequalm1(p1))
737
for (i=j+j; i<lz; i+=j) gel(x,i) = gadd(gel(x,i),gel(y,i/j));
737
for (i=j+j; i<=nz; i+=j) gel(x,i) = gadd(gel(x,i),gel(y,i/j));
739
for (i=j+j; i<lz; i+=j) gel(x,i) = gsub(gel(x,i),gmul(p1,gel(y,i/j)));
739
for (i=j+j; i<=nz; i+=j) gel(x,i) = gsub(gel(x,i),gmul(p1,gel(y,i/j)));
742
742
return gerepilecopy(av,z);