# 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`.