code: public DoubleMatrix1D solve(DoubleMatrix1D b) {
  		if (b.size() != dim) {
  			log.error("wrong dimension of vector b: expected " + dim + ", actual " + b.size());
  			throw new RuntimeException("wrong dimension of vector b: expected "	+ dim + ", actual " + b.size());
  		}
  		
  	// with scaling, we must solve U.Q.U.z = U.b, after that we have x = U.z
  		if (this.rescaler != null) {
  			// b = ALG.mult(this.U, b);
  			b = ColtUtils.diagonalMatrixMult(this.U, b);
  		}
  
  		final double[] y = new double[dim];// copy
  		System.arraycopy(b.toArray(), 0, y, 0, dim);
  
  		// Solve L.y = b
  		for (int j = 0; j < dim; j++) {
  			final double[] LTJ = LcolumnsValues[j];
  			y[j] /= LTJ[0];// the diagonal of the matrix L
  			final double yJ = y[j];
  			for (int i = j + 1; i < dim; i++) {
  				y[i] -= yJ * LTJ[i - j];
  			}
  		}
  
  		// Solve L[T].x = y
  		final DoubleMatrix1D x = F1.make(dim);
  		for (int i = dim - 1; i > -1; i--) {
  			final double[] LTI = LcolumnsValues[i];
  			double sum = 0;
  			for (int j = dim - 1; j > i; j--) {
  				sum += LTI[j - i] * x.getQuick(j);
  			}
  			x.setQuick(i, (y[i] - sum) / LTI[0]);
  		}
  		
  		if (this.rescaler != null) {
  			// return ALG.mult(this.U, x);
  			return ColtUtils.diagonalMatrixMult(this.U, x);
  		} else {
  			return x;
  		}
  	}
docs: Solves Q.x = b