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

« back to all changes in this revision

Viewing changes to src/basemath/alglin2.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:
484
484
{
485
485
  long lx, i, j, k, r;
486
486
  GEN V, S, C, Q;
487
 
  pari_sp av0;
 
487
  pari_sp av0, av, lim;
488
488
  if ((V = easychar(x,v,NULL))) return V;
489
489
 
490
 
  lx = lg(x); av0 = avma;
 
490
  lx = lg(x); av0 = avma; lim = stack_lim(av0,1);
491
491
  V = cgetg(lx+1, t_VEC);
492
492
  S = cgetg(lx+1, t_VEC);
493
493
  C = cgetg(lx+1, t_VEC);
494
494
  Q = cgetg(lx+1, t_VEC);
 
495
  av = avma;
 
496
  gel(C,1) = gen_m1;
495
497
  gel(V,1) = gen_m1;
496
498
  gel(V,2) = gcoeff(x,1,1);
497
499
  for (i=2;i<=lx; i++) gel(S,i) = gen_0;
498
500
  for (i=2;i<=lx; i++) gel(C,i) = gen_0;
499
501
  for (i=2;i<=lx; i++) gel(Q,i) = gen_0;
500
 
  gel(C,1) = gen_m1;
501
502
  for (r = 2; r < lx; r++)
502
503
  {
503
 
    pari_sp av;
 
504
    pari_sp av2;
504
505
    GEN t;
505
506
 
506
507
    for (i = 1; i < r; i++) gel(S,i) = gcoeff(x,i,r);
507
508
    gel(C,2) = gcoeff(x,r,r);
508
509
    for (i = 1; i < r-1; i++)
509
510
    {
510
 
      av = avma; t = gmul(gcoeff(x,r,1), gel(S,1));
 
511
      av2 = avma; t = gmul(gcoeff(x,r,1), gel(S,1));
511
512
      for (j = 2; j < r; j++) t = gadd(t, gmul(gcoeff(x,r,j), gel(S,j)));
512
 
      gel(C,i+2) = gerepileupto(av, t);
 
513
      gel(C,i+2) = gerepileupto(av2, t);
513
514
      for (j = 1; j < r; j++)
514
515
      {
515
 
        av = avma; t = gmul(gcoeff(x,j,1), gel(S,1));
 
516
        av2 = avma; t = gmul(gcoeff(x,j,1), gel(S,1));
516
517
        for (k = 2; k < r; k++) t = gadd(t, gmul(gcoeff(x,j,k), gel(S,k)));
517
 
        gel(Q,j) = gerepileupto(av, t);
 
518
        gel(Q,j) = gerepileupto(av2, t);
518
519
      }
519
520
      for (j = 1; j < r; j++) gel(S,j) = gel(Q,j);
520
521
    }
521
 
    av = avma; t = gmul(gcoeff(x,r,1), gel(S,1));
 
522
    av2 = avma; t = gmul(gcoeff(x,r,1), gel(S,1));
522
523
    for (j = 2; j < r; j++) t = gadd(t, gmul(gcoeff(x,r,j), gel(S,j)));
523
 
    gel(C,r+1) = gerepileupto(av, t);
524
 
 
 
524
    gel(C,r+1) = gerepileupto(av2, t);
 
525
    if (low_stack(lim, stack_lim(av0,1)))
 
526
    {
 
527
      if (DEBUGMEM>1) pari_warn(warnmem,"carberkowitz");
 
528
      gerepileall(av, 2, &C, &V);
 
529
    }
525
530
    for (i = 1; i <= r+1; i++)
526
531
    {
527
 
      av = avma; t = gmul(gel(C,i), gel(V,1));
 
532
      av2 = avma; t = gmul(gel(C,i), gel(V,1));
528
533
      for (j = 2; j <= minss(r,i); j++)
529
534
        t = gadd(t, gmul(gel(C,i+1-j), gel(V,j)));
530
 
      gel(Q,i) = gerepileupto(av, t);
 
535
      gel(Q,i) = gerepileupto(av2, t);
531
536
    }
532
 
    for (i = 1; i <= r+1; i++) V[i] = Q[i];
 
537
    for (i = 1; i <= r+1; i++) gel(V,i) = gel(Q,i);
533
538
  }
534
539
  V = RgV_to_RgX(vecreverse(V), v); /* not gtopoly: fail if v > gvar(V) */
535
540
  V = odd(lx)? gcopy(V): RgX_neg(V);