docs: protected void updateA( final int w )
      {
  //        int rowW = w*numRows;
  //        int rowJ = rowW + numRows;
  //
  //        for( int j = w+1; j < numCols; j++ , rowJ += numRows) {
  //            double val = QR.data[rowJ + w];
  //
  //            // val = gamma*u^T * A
  //            for( int k = w+1; k < numRows; k++ ) {
  //                val += QR.data[rowW + k]*QR.data[rowJ + k];
  //            }
  //            val *= gamma;
  //
  //            // A - val*u
  //            QR.data[rowJ + w] -= val;
  //            for( int i = w+1; i < numRows; i++ ) {
  //                QR.data[rowJ + i] -= QR.data[rowW + i]*val;
  //            }
  //        }
  
          final double data[] = QR.data;
          int rowW = w*numRows + w + 1;
          int rowJ = rowW + numRows;
          final int rowJEnd = 2*(rowJ + (numCols-w-1)*numRows);
          final int indexWEnd = 2*(rowW + numRows - w - 1);
  
          rowJ = 2*rowJ;
          rowW = 2*rowW;
  
          for( ; rowJEnd != rowJ; rowJ += numRows*2) {
              // assume the first element in u is 1
              double realVal = data[rowJ - 2];
              double imagVal = data[rowJ - 1];
  
              int indexW = rowW;
              int indexJ = rowJ;
  
              while( indexW != indexWEnd ) {
                  double realW = data[indexW++];
                  double imagW = -data[indexW++];
  
                  double realJ = data[indexJ++];
                  double imagJ = data[indexJ++];
  
                  realVal += realW*realJ - imagW*imagJ;
                  imagVal += realW*imagJ + imagW*realJ;
              }
              realVal *= gamma;
              imagVal *= gamma;
  
              data[rowJ - 2] -= realVal;
              data[rowJ - 1] -= imagVal;
  
              indexW = rowW;
              indexJ = rowJ;
              while( indexW != indexWEnd ) {
                  double realW = data[indexW++];
                  double imagW = data[indexW++];
  
                  data[indexJ++] -= realW*realVal - imagW*imagVal;
                  data[indexJ++] -= realW*imagVal + imagW*realVal;
              }
          }
      }