# ChangeOfVariable(F, UP, UPUP)¶

Tools to send a point to infinity on an algebraic curve.

chvar: (List UPUP, UPUP) -> Record(func: List UPUP, poly: UPUP, c1: Fraction UP, c2: Fraction UP, deg: NonNegativeInteger)
chvar(lf, p) is like chvar(f, p) but handles list of functions
chvar: (UPUP, UPUP) -> Record(func: UPUP, poly: UPUP, c1: Fraction UP, c2: Fraction UP, deg: NonNegativeInteger)
chvar(f(x, y), p(x, y)) returns [g(z, t), q(z, t), c1(x), c2(x), n] such that under the change of variable z = c1(x), t = y * c2(x), one gets f(x, y) = c1'(x)g(c1(x), c2(x)y) The algebraic relation between x and y is p(x, y) = 0. The algebraic relation between z and t is q(z, t) = 0.
eval: (UPUP, Fraction UP, Fraction UP) -> UPUP
eval(p(x, y), f(x), g(x)) returns p(f(x), y * g(x)).
goodPoint: (List UPUP, UPUP) -> F
goodPoint([p1, ..., pn], q) returns an integer a such that a is neither a pole of pi(x, y) for some i nor a branch point of q(x, y) = 0.
mkIntegral: UPUP -> Record(coef: Fraction UP, poly: UPUP)
mkIntegral(p(x, y)) returns [c(x), q(x, z)] such that z = c * y is integral. The algebraic relation between x and y is p(x, y) = 0. The algebraic relation between x and z is q(x, z) = 0.
radPoly(p(x, y)) returns [c(x), n] if p is of the form y^n - c(x), “failed” otherwise.
rootPoly(g, n) returns [m, c, P] such that c * g ^ (1/n) = P ^ (1/m) thus if y^n = g, then z^m = P where z = c * y.