# Singular

##### 7.5.13.0. eliminateNC
Procedure from library `ncpreim.lib` (see ncpreim_lib).

Usage:
eliminateNC(I,v,eng); I ideal, v intvec, eng optional int

Return:
ideal, I intersected with the subring defined by the variables not index by the entries of v

Assume:
The entries of v are in the range 1..nvars(basering) and the corresponding variables generate an admissible subalgebra.

Remarks:
In order to determine the required elimination ordering, a linear programming problem is solved with the simplex algorithm.
Reference: (GML)
Unlike eliminate, this procedure will always find an elimination ordering, if such exists.

Note:
If eng<>0, `std` is used for Groebner basis computations, otherwise (and by default) `slimgb` is used.
If printlevel=1, progress debug messages will be printed, if printlevel>=2, all the debug messages will be printed.

Example:
 ```LIB "ncpreim.lib"; // (Lev): Example 2 ring r = 0,(a,b,x,d),Dp; matrix D[4][4]; D[1,2] = 3*a; D[1,4] = 3*x^2; D[2,3] = -x; D[2,4] = d; D[3,4] = 1; def A = nc_algebra(1,D); setring A; A; ==> // coefficients: QQ ==> // number of vars : 4 ==> // block 1 : ordering Dp ==> // : names a b x d ==> // block 2 : ordering C ==> // noncommutative relations: ==> // ba=ab+3a ==> // da=ad+3x2 ==> // xb=bx-x ==> // db=bd+d ==> // dx=xd+1 ideal I = a,x; // Since d*a-a*d = 3*x^2, any admissible ordering has to satisfy // x^2 < a*d, while any elimination ordering for {x,d} additionally // has to fulfil a << x and a << d. // Hence, the weight (0,0,1,1) is not an elimination weight for // (x,d) and the call eliminate(I,x*d); will produce an error. eliminateNC(I,3..4); ==> _[1]=a // This call uses the elimination weight (0,0,1,2), which works. ```