public T[][][] fastInverse(T[][][] m) {
		int dimension = m.length;
		T[][][] extended = env.newTArray(dimension, dimension * 2, 1);
		T[] zeroFloat = lib.publicValue(0);
		T[] oneFloat = lib.publicValue(1);
		for (int i = 0; i < dimension; ++i) {
			for (int j = 0; j < dimension; ++j)
				extended[i][j] = m[i][j];
			for (int j = 0; j < dimension; ++j)
				extended[i][dimension + j] = zeroFloat;
			extended[i][dimension + i] = oneFloat;
		}
		extended = rref(extended);
		T[][][] result = env.newTArray(dimension, dimension, 1);

		for (int i = 0; i < dimension; ++i) {
			for (int j = 0; j < dimension; ++j)
				result[i][j] = extended[i][dimension + j];
		}
		return result;
	}