~ubuntu-branches/debian/sid/pari/sid

« back to all changes in this revision

Viewing changes to src/basemath/bibli2.c

  • Committer: Package Import Robot
  • Author(s): Bill Allombert
  • Date: 2013-09-24 20:49:44 UTC
  • mfrom: (1.2.7)
  • Revision ID: package-import@ubuntu.com-20130924204944-3ddctn0k2mk1rpov
Tags: 2.5.5-1
* New upstream release
  - Fix detection of multiarch GMP.
* debian/control:
  - Bump Standards-Version to 3.9.4.
* debian/rules:
  - Add CPU mapping for s390x, sparc64 and ppc64

Show diffs side-by-side

added added

removed removed

Lines of Context:
680
680
dirmul(GEN x, GEN y)
681
681
{
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;
684
684
  GEN z;
685
685
 
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);
691
 
  z = zerovec(lz-1);
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);
 
691
  z = zerovec(nz);
 
692
  for (j=dx; j<=nx; j++)
693
693
  {
694
694
    GEN c = gel(x,j);
695
695
    if (gequal0(c)) continue;
696
696
    if (gequal1(c))
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));
698
698
    else
699
699
    {
700
700
      if (gequalm1(c))
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));
702
702
      else
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)));
704
704
    }
705
705
    if (low_stack(lim, stack_lim(av,1)))
706
706
    {
715
715
dirdiv(GEN x, GEN y)
716
716
{
717
717
  pari_sp av = avma;
718
 
  long lx,ly,lz,dx,dy,i,j;
 
718
  long nx,ny,nz,dx,dy,i,j;
719
719
  GEN z,p1;
720
720
 
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);
727
 
  z = zerovec(lz-1);
728
 
  for (j=dx; j<lz; j++)
 
727
  z = zerovec(nz);
 
728
  for (j=dx; j<=nz; j++)
729
729
  {
730
730
    p1=gel(x,j); gel(z,j) = p1;
731
731
    if (gequal0(p1)) continue;
732
732
    if (gequal1(p1))
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));
734
734
    else
735
735
    {
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));
738
738
      else
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)));
740
740
    }
741
741
  }
742
742
  return gerepilecopy(av,z);