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

Function getRandomUnitary

tests/utils/random.cpp:348–376  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

346
347
348qmatrix getRandomUnitary(int numQb) {
349 DEMAND( numQb >= 1 );
350
351 // create Z ~ random complex matrix (distribution not too important)
352 size_t dim = getPow2(numQb);
353 qmatrix matrZ = getRandomMatrix(dim);
354 qmatrix matrZT = getTranspose(matrZ);
355
356 // create Z = Q R (via QR decomposition) ...
357 qmatrix matrQT = getOrthonormalisedRows(matrZ);
358 qmatrix matrQ = getTranspose(matrQT);
359 qmatrix matrR = getZeroMatrix(dim);
360
361 // ... where R_rc = (columm c of Z) . (column r of Q) = (row c of ZT) . (row r of QT) = <r|c>
362 for (size_t r=0; r<dim; r++)
363 for (size_t c=r; c<dim; c++)
364 matrR[r][c] = getInnerProduct(matrQT[r], matrZT[c]);
365
366 // create D = normalised diagonal of R
367 qmatrix matrD = getZeroMatrix(dim);
368 for (size_t i=0; i<dim; i++)
369 matrD[i][i] = matrR[i][i] / std::abs(matrR[i][i]);
370
371 // create U = Q D
372 qmatrix matrU = matrQ * matrD;
373
374 DEMAND( isApproxUnitary(matrU) );
375 return matrU;
376}
377
378
379qmatrix getRandomDiagonalUnitary(int numQb) {

Callers 3

getRandomKrausMapFunction · 0.70

Calls 7

getPow2Function · 0.85
getRandomMatrixFunction · 0.85
getInnerProductFunction · 0.85
isApproxUnitaryFunction · 0.85
getTransposeFunction · 0.70
getOrthonormalisedRowsFunction · 0.70
getZeroMatrixFunction · 0.70

Tested by

no test coverage detected