static GEN bound_for_coeff(long m, GEN rr, GEN *maxroot) { long i,r1, lrr=lg(rr); GEN p1,b1,b2,B,M, C = matpascal(m-1); for (r1=1; r1 < lrr; r1++) if (typ(rr[r1]) != t_REAL) break; r1--; rr = gabs(rr,0); *maxroot = vecmax(rr); for (i=1; i<lrr; i++) if (gcmp(gel(rr,i), gen_1) < 0) gel(rr,i) = gen_1; for (b1=gen_1,i=1; i<=r1; i++) b1 = gmul(b1, gel(rr,i)); for (b2=gen_1 ; i<lrr; i++) b2 = gmul(b2, gel(rr,i)); B = gmul(b1, gsqr(b2)); /* Mahler measure */ M = cgetg(m+2, t_VEC); gel(M,1) = gel(M,2) = gen_0; /* unused */ for (i=1; i<m; i++) { p1 = gadd(gmul(gcoeff(C, m, i+1), B),/* binom(m-1, i) */ gcoeff(C, m, i)); /* binom(m-1, i-1) */ gel(M,i+2) = ceil_safe(p1); } return M; }
void line(CANVAS* canvas, const POINT *a, const POINT *b, unsigned int color) { POINT cur; bool vline; short x0, x1, y0, y1, dx, dy, err, ystep, x, y; x0 = a->x; y0 = a->y; x1 = b->x; y1 = b->y; vline = gabs(y1 - y0) > gabs(x1 - x0); if (vline) { gswap(&x0, &y0); gswap(&x1, &y1); } if (x0 > x1) { gswap(&x0, &x1); gswap(&y0, &y1); } dx = x1 - x0; dy = gabs(y1 - y0); err = dx >> 1; ystep = (y0 < y1) ? 1 : -1; for (x = x0, y = y0; x <= x1; ++x) { if (vline) { cur.x = y; cur.y = x; } else { cur.x = x; cur.y = y; } put_pixel(canvas, &cur, color); err -= dy; if (err < 0) { y += ystep; err += dx; } } }