485
485
long lx, i, j, k, r;
487
pari_sp av0, av, lim;
488
488
if ((V = easychar(x,v,NULL))) return V;
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
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;
501
502
for (r = 2; r < lx; r++)
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++)
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++)
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);
519
520
for (j = 1; j < r; j++) gel(S,j) = gel(Q,j);
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
gel(C,r+1) = gerepileupto(av2, t);
525
if (low_stack(lim, stack_lim(av0,1)))
527
if (DEBUGMEM>1) pari_warn(warnmem,"carberkowitz");
528
gerepileall(av, 2, &C, &V);
525
530
for (i = 1; i <= r+1; i++)
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);
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);
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);