MCPcopy Create free account
hub / github.com/QuEST-Kit/QuEST / getRandomUnitary

Function getRandomUnitary

tests/deprecated/test_utilities.cpp:677–711  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

675}
676
677QMatrix getRandomUnitary(int numQb) {
678 DEMAND( numQb >= 1 );
679
680 // create Z ~ random complex matrix (distribution not too important)
681 size_t dim = 1 << numQb;
682 QMatrix matrZ = getRandomQMatrix(dim);
683 QMatrix matrZT = getTranspose(matrZ);
684
685 // create Z = Q R (via QR decomposition) ...
686 QMatrix matrQT = getOrthonormalisedRows(matrZ);
687 QMatrix matrQ = getTranspose(matrQT);
688 QMatrix matrR = getZeroMatrix(dim);
689
690 // ... where R_rc = (columm c of Z) . (column r of Q) = (row c of ZT) . (row r of QT)
691 for (size_t r=0; r<dim; r++)
692 for (size_t c=r; c<dim; c++)
693 matrR[r][c] = matrZT[c] * matrQT[r];
694
695 // create D = normalised diagonal of R
696 QMatrix matrD = getZeroMatrix(dim);
697 for (size_t i=0; i<dim; i++)
698 matrD[i][i] = matrR[i][i] / abs(matrR[i][i]);
699
700 // create U = Q D
701 QMatrix matrU = matrQ * matrD;
702
703 // in the rare scenario the result is not sufficiently precisely unitary,
704 // replace it with a trivially unitary diagonal matrix
705 QMatrix daggerProd = matrU * getConjugateTranspose(matrU);
706 QMatrix iden = getIdentityMatrix(dim);
707 if( ! areEqual(daggerProd, iden) )
708 matrU = getRandomDiagonalUnitary(numQb);
709
710 return matrU;
711}
712
713vector<QMatrix> getRandomKrausMap(int numQb, int numOps) {
714 DEMAND( numOps >= 1 );

Callers 3

test_unitaries.cppFile · 0.70
getRandomKrausMapFunction · 0.70
test_operators.cppFile · 0.70

Calls 8

getRandomQMatrixFunction · 0.85
areEqualFunction · 0.85
getTransposeFunction · 0.70
getOrthonormalisedRowsFunction · 0.70
getZeroMatrixFunction · 0.70
getConjugateTransposeFunction · 0.70
getIdentityMatrixFunction · 0.70
getRandomDiagonalUnitaryFunction · 0.70

Tested by

no test coverage detected