# Singular

#### D.14.1.14 arrCoordChange

Procedure from library `arr.lib` (see arr_lib).

Usage:
arrCoordChange(A, T); arr A, (m*n mat) n*n or n*n+1 matrix T arrCoordChange(A, T , c); arr A, n*n matrix T, n*1 matrix/vector

Return:
[arr]: Arrangement A [A|b] after a coordinate change f: x -> Tx + c with T invertible i.e. [A|b] => [AT^-1|b+AT^-1c] since we have
f(H) = f(ker(a1*x1 + ... + an*xn - b)) = {f(x) : a'x -b = 0} = {y : a'f^-1(y) -b = 0)}
= {y : a'(T^-1(y-c)) - b = 0}
= {y : a'T^-1y -(b + a'T^-1c) = 0}

Note:
There are 3 options how you can give the input (in each case n <= nvars(basering)) 1. Just a nxn matrix with
=> Will automatically complete T by a unit matrix and perform x -> Tx 2. A nxn matrix T and a nx1 vector/matrix c with
=> Will automatically complete T and c and perform x -> Tx +c 3. A nxn+1 matrix T with
=> will use last column as translation vector c

Example:
 ```LIB "arr.lib"; ring r = 0,(x,y,z),lp; arr A = x,y,z; arrCoordChange(A,1,[0,0,1]); //lifts z-hyperplane by 1 unit ==> _[1]=x ==> _[2]=y ==> _[3]=z-1 ==> matrix T[2][2] = [0,1,1,0]; // swaps x and y arrCoordChange(A,T); ==> _[1]=y ==> _[2]=x ==> _[3]=z ==> matrix c[2][1] = [1,0]; T = concat(T,c); // now swap x and y and add 1 to x afterwards arrCoordChange(A,T); ==> _[1]=y ==> _[2]=x-1 ==> _[3]=z ==> // Note how T doesn't even need to be a full 3x3 base change matrix. ```