// ------------------------------------------------------------------
// qrfacdd.cpp
//
// This file contains a routines for QR factorization with
// column pivoting using double-double precision.
// ------------------------------------------------------------------
// Copyright (c) 2000 by Cornell University.  All rights reserved.
// 
// See the accompanying file 'Copyright' for authorship information,
// the terms of the license governing this software, and disclaimers
// concerning this software.
// ------------------------------------------------------------------
// This file is part of the QMG software.  
// Version 2.0 of QMG, release date September 3, 1999
// Version 2.0.1 -- rewritten to estimate generalized eigenvector
//  sensitivity, October 29, 1999.  Steve Vavasis
// Version 2.0.2 -- rewritten with a new way to handle
//  degenerate problems.
// ------------------------------------------------------------------

#include "doubledouble2.h"
#include "inline2.h"
#include "qnamesp.h"

// QR factorization with column pivoting using double-double
// precision.
// (See Golub and Van Loan).
// Input arguments:
// A: input matrix, stored in column major order.  Overwritten
// with U.T. factor.
// m: # rows in A.
// n: # cols in A.
// select_col: return variable holding the column permutation
// (which columns were selected).
// hhmat: return variable holding the householder transforms.
//   should have at least m*n entries.
// betavec: return variable holding the householder beta's.
//   should have at least n entries.
// wksp: must have at least m*(n+1) entries.



namespace QMG {
  void QR_Factor_with_col_pivoting_quadprec(double* A, 
    int m,
    int n,
    double* select_col,
    double* hhmat,
    double* betavec,
    doubledouble* wksp);
}

namespace {
  static int quadprec_validated = 0;

  // Validate quad precision arithmetic at run-time.
  // This routine should be executed just once.


  void validate_quadprec() {
    if (quadprec_validated > 0)
      return;
    quadprec_validated = 1;

    const int NROW = 48;
    const int NCOL = 30;
    const int MSIZE = NROW * NCOL;
    double A[MSIZE] = {
        -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37294231619671758,
  -1.64092563368247290,
  -2.40665711100176780,
  -1.17656959922312600,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.09449245841755590,
  -4.81820036896715820,
  -7.07024319914606460,
  -3.45828886777286560,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.88226073078117995,
  -3.88882476099122700,
  -5.71366270563540460,
  -2.79824444621603250,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.11325365668264621,
  -0.50311880686536048,
  -0.74493286480999210,
  -0.36761485610442735,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -0.37632693448078425,
  -1.16053091818835190,
  -0.97746886918395970,
  -0.12448591278103610,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.58018485898444380,
  -4.88934345699834870,
  -4.15214655923599190,
  -0.55771161183433637,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -2.21157818735521560,
  -6.86544645464809820,
  -5.87705111460319960,
  -0.82877435305472957,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
  -1.03168930189765500,
  -3.21301406089028290,
  -2.77184779491166380,
  -0.40876355017300581,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000,
   0.00000000000000000};

    double select_col[NCOL];
    double hhmat[MSIZE];
    double betavec[NCOL];
    doubledouble wkspa[MSIZE + NROW];
    double Am[MSIZE];
    {
      for (int i = 0; i < MSIZE; ++i)
        Am[i] = A[i];
    }
    QMG::QR_Factor_with_col_pivoting_quadprec(Am, NROW, NCOL, select_col, hhmat,
      betavec, wkspa);
    if (fabs(Am[NCOL - 1 + (NCOL - 1) * NROW] - 1.826711667667790e-016) >
      1e-30) {
      quadprec_validated = 0;
      QMG::throw_error("Double-double validation failed; see the file doubledouble_info.txt for more info");

    }
  }
}






void QMG::QR_Factor_with_col_pivoting_quadprec(double* A, 
    int m,
    int n,
    double* select_col,
    double* hhmat,
    double* betavec,
    doubledouble* wksp) {

  validate_quadprec();
  
  doubledouble::FloatControlType old_float_control = 
    doubledouble::set_float_control_to_53_bits();
  
  doubledouble* dA = wksp;
  doubledouble* hhtrans = wksp + (m*n);

  {
    for (int j = 0; j < n; ++j) {
      for (int i = 0; i < m; ++i) {
        dA[i + j * m] = doubledouble(A[i + j * m]);
      }
      select_col[j] = static_cast<double>(j);
    }
  }

  int nstep = (m < n)? m : n;

  for (int k = 0; k < nstep; ++k) {
    // Find the next pivot column.
    
    double mxnorm = -1.0;
    int pivcol;
    {
      for (int j = k; j < n; ++j) {
        double sumsq = 0.0;
        for (int i = k; i < m; ++i) {
          double t = double(dA[i + j * m]);
          sumsq += t * t;
        }
        if (sumsq > mxnorm) {
          pivcol = j;
          mxnorm = sumsq;
        }
      }
    }
    // Swap the pivot column with column k.
    {
      double tmp1 = select_col[pivcol];
      select_col[pivcol] = select_col[k];
      select_col[k] = tmp1;
      for (int i = 0; i < m; ++i) {
        doubledouble tmp2 = dA[i + k * m];
        dA[i + k * m] = dA[i + pivcol * m];
        dA[i + pivcol * m] = tmp2;
      }
    }
    
    // Compute the next hh transform.
    
    doubledouble sigma = 0.0;
    doubledouble mu = 0.0;
    {
      for (int i = k; i < m; ++i) {
        doubledouble t = dA[i + k * m];
        hhtrans[i] = t;
        doubledouble tsq = sqr(t);
        if (i > k)
          sigma += tsq;
        mu += tsq;
      }
    }
    mu = sqrt(mu);
    doubledouble beta;
    if (double(sigma) == 0.0) {
      hhtrans[k] = 1.0;
      beta = 0.0;
    }
    else {
      if (double(hhtrans[k]) < 0.0) {
        hhtrans[k] -= mu;
      }
      else {
        hhtrans[k] = -sigma / (hhtrans[k] + mu);
      }
      beta = doubledouble(-1.0) / (mu * hhtrans[k]);
    }
    {
      for (int j = k; j < n; ++j) {
        doubledouble ip = 0.0; 
        {
          for (int i = k; i < m; ++i)
            ip += dA[i + j * m] * hhtrans[i];
        }
        ip *= beta;
        {
          for (int i = k; i < m; ++i)
            dA[i + j * m] -= ip * hhtrans[i];
        }
      }
    }
    {
      for (int i = k; i < m; ++i) {
        hhmat[i + k * m] = double(hhtrans[i]);
      }
      betavec[k] = double(beta);
    }
    {
      for (int i = 0; i < m; ++i) {
        A[i + k * m] = double(dA[i + k * m]);
      }
    }
  }
  doubledouble::restore_float_control(old_float_control);
}
