assert (K <= n);
if (n == 0) {
return new Solution(new TridiagonalMatrix(new double[0], new double[0]), new double[0][0], 0.0);
} else if (n == 1) {
final Vector<Double> unitVector = Vectors.AS_REALS.make(new double[]{1.0});
final double a11 = A.apply(unitVector).doubleValue(0);
return new Solution(new TridiagonalMatrix(new double[]{a11}, new double[0]), new double[][]{{1}}, 0.0);
} else if (n == 2) {
final Vector<Double> unit1Vector = Vectors.AS_REALS.make(new double[]{1.0, 0.0});
final double[] a1 = A.apply(unit1Vector).toDoubleArray();
final double[] a2 = A.apply(unit2Vector).toDoubleArray();
return new Solution(new TridiagonalMatrix(new double[]{a1[0], a2[1]},
new double[]{a1[1]}), new double[][]{
{1, 0},
return new Solution(new TridiagonalMatrix(Arrays.copyOfRange(alpha, 0, K), Arrays.copyOfRange(beta, 1, K)), q, beta[K]);