<!-- HTML header for doxygen 1.8.8-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- For Mobile Devices -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<title>QuEST: Unitaries</title>
<!--<link href="tabs.css" rel="stylesheet" type="text/css"/>-->
<script type="text/javascript" src="dynsections.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="style.css" rel="stylesheet" type="text/css"/>
<link href='https://fonts.googleapis.com/css?family=Roboto+Slab' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href="jquery.smartmenus.bootstrap.css" rel="stylesheet">
<script type="text/javascript" src="jquery.smartmenus.js"></script>
<!-- SmartMenus jQuery Bootstrap Addon -->
<script type="text/javascript" src="jquery.smartmenus.bootstrap.js"></script>
<!-- SmartMenus jQuery plugin -->
</head>
<body>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand"><img alt="Logo" src="logo.png"/></a>
<a class="navbar-brand"><b>QuEST</b> v3.1.0<br>The Quantum Exact Simulation Toolkit</a>
</div>
</div>
</nav>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div class="content" id="content">
<div class="container">
<div class="row">
<div class="col-sm-12 panel " style="padding-bottom: 15px;">
<div style="margin-bottom: 15px;">
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">Unitaries</div> </div>
</div><!--header-->
<div class="contents">
<p>Unitary gates.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:ga0cbd92af48fe641522e62eea1a76a7c3"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga0cbd92af48fe641522e62eea1a76a7c3">compactUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="memdesc:ga0cbd92af48fe641522e62eea1a76a7c3"><td class="mdescLeft"> </td><td class="mdescRight">Apply a single-qubit unitary parameterised by two given complex scalars. <a href="group__unitary.html#ga0cbd92af48fe641522e62eea1a76a7c3">More...</a><br /></td></tr>
<tr class="separator:ga0cbd92af48fe641522e62eea1a76a7c3"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gaa854e4b76cfd4000a32c06c990960bd9"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#gaa854e4b76cfd4000a32c06c990960bd9">controlledCompactUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="memdesc:gaa854e4b76cfd4000a32c06c990960bd9"><td class="mdescLeft"> </td><td class="mdescRight">Apply a controlled unitary (single control, single target) parameterised by two given complex scalars. <a href="group__unitary.html#gaa854e4b76cfd4000a32c06c990960bd9">More...</a><br /></td></tr>
<tr class="separator:gaa854e4b76cfd4000a32c06c990960bd9"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga6375f658bd7cb24d25e0603b5b947bbd"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga6375f658bd7cb24d25e0603b5b947bbd">controlledMultiQubitUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int ctrl, int *targs, const int numTargs, <a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> u)</td></tr>
<tr class="memdesc:ga6375f658bd7cb24d25e0603b5b947bbd"><td class="mdescLeft"> </td><td class="mdescRight">Apply a general controlled multi-qubit unitary (including a global phase factor). <a href="group__unitary.html#ga6375f658bd7cb24d25e0603b5b947bbd">More...</a><br /></td></tr>
<tr class="separator:ga6375f658bd7cb24d25e0603b5b947bbd"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gadf4927a3d5dd8cd6d7400f2e810b4f05"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#gadf4927a3d5dd8cd6d7400f2e810b4f05">controlledNot</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit)</td></tr>
<tr class="memdesc:gadf4927a3d5dd8cd6d7400f2e810b4f05"><td class="mdescLeft"> </td><td class="mdescRight">Apply the controlled not (single control, single target) gate, also known as the c-X, c-sigma-X, c-Pauli-X and c-bit-flip gate. <a href="group__unitary.html#gadf4927a3d5dd8cd6d7400f2e810b4f05">More...</a><br /></td></tr>
<tr class="separator:gadf4927a3d5dd8cd6d7400f2e810b4f05"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga811e9b47126c83ff859059106f66cf96"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga811e9b47126c83ff859059106f66cf96">controlledPauliY</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit)</td></tr>
<tr class="memdesc:ga811e9b47126c83ff859059106f66cf96"><td class="mdescLeft"> </td><td class="mdescRight">Apply the controlled pauliY (single control, single target) gate, also known as the c-Y and c-sigma-Y gate. <a href="group__unitary.html#ga811e9b47126c83ff859059106f66cf96">More...</a><br /></td></tr>
<tr class="separator:ga811e9b47126c83ff859059106f66cf96"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga4dcb9c6660d7a5f74c9597bc467d39ef"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga4dcb9c6660d7a5f74c9597bc467d39ef">controlledPhaseFlip</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int idQubit1, const int idQubit2)</td></tr>
<tr class="memdesc:ga4dcb9c6660d7a5f74c9597bc467d39ef"><td class="mdescLeft"> </td><td class="mdescRight">Apply the (two-qubit) controlled phase flip gate, also known as the controlled pauliZ gate. <a href="group__unitary.html#ga4dcb9c6660d7a5f74c9597bc467d39ef">More...</a><br /></td></tr>
<tr class="separator:ga4dcb9c6660d7a5f74c9597bc467d39ef"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga69e074c8174e198ca014d9905b98b43d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga69e074c8174e198ca014d9905b98b43d">controlledPhaseShift</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int idQubit1, const int idQubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="memdesc:ga69e074c8174e198ca014d9905b98b43d"><td class="mdescLeft"> </td><td class="mdescRight">Introduce a phase factor <img class="formulaInl" alt="$ \exp(i \theta) $" src="form_19.png"/> on state <img class="formulaInl" alt="$ |11\rangle $" src="form_20.png"/> of qubits <code>idQubit1</code> and <code>idQubit2</code>. <a href="group__unitary.html#ga69e074c8174e198ca014d9905b98b43d">More...</a><br /></td></tr>
<tr class="separator:ga69e074c8174e198ca014d9905b98b43d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga82bf9aaf01430d3ecfde52b7731421d7"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga82bf9aaf01430d3ecfde52b7731421d7">controlledRotateAroundAxis</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle, <a class="el" href="structVector.html">Vector</a> axis)</td></tr>
<tr class="memdesc:ga82bf9aaf01430d3ecfde52b7731421d7"><td class="mdescLeft"> </td><td class="mdescRight">Applies a controlled rotation by a given angle around a given vector on the Bloch-sphere. <a href="group__unitary.html#ga82bf9aaf01430d3ecfde52b7731421d7">More...</a><br /></td></tr>
<tr class="separator:ga82bf9aaf01430d3ecfde52b7731421d7"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga7dc4ed5d9fd2872a04fea6ef13b65c3d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga7dc4ed5d9fd2872a04fea6ef13b65c3d">controlledRotateX</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="memdesc:ga7dc4ed5d9fd2872a04fea6ef13b65c3d"><td class="mdescLeft"> </td><td class="mdescRight">Applies a controlled rotation by a given angle around the X-axis of the Bloch-sphere. <a href="group__unitary.html#ga7dc4ed5d9fd2872a04fea6ef13b65c3d">More...</a><br /></td></tr>
<tr class="separator:ga7dc4ed5d9fd2872a04fea6ef13b65c3d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gaf99ba5356a6c20d3d047b36874fc0a50"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#gaf99ba5356a6c20d3d047b36874fc0a50">controlledRotateY</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="memdesc:gaf99ba5356a6c20d3d047b36874fc0a50"><td class="mdescLeft"> </td><td class="mdescRight">Applies a controlled rotation by a given angle around the Y-axis of the Bloch-sphere. <a href="group__unitary.html#gaf99ba5356a6c20d3d047b36874fc0a50">More...</a><br /></td></tr>
<tr class="separator:gaf99ba5356a6c20d3d047b36874fc0a50"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga9afcf34f7c6ae127452b503c074a9b7b"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga9afcf34f7c6ae127452b503c074a9b7b">controlledRotateZ</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="memdesc:ga9afcf34f7c6ae127452b503c074a9b7b"><td class="mdescLeft"> </td><td class="mdescRight">Applies a controlled rotation by a given angle around the Z-axis of the Bloch-sphere. <a href="group__unitary.html#ga9afcf34f7c6ae127452b503c074a9b7b">More...</a><br /></td></tr>
<tr class="separator:ga9afcf34f7c6ae127452b503c074a9b7b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga8a718f1a8cc3a0ea3f5bbdb2c5a99d80"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga8a718f1a8cc3a0ea3f5bbdb2c5a99d80">controlledTwoQubitUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit1, const int targetQubit2, <a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> u)</td></tr>
<tr class="memdesc:ga8a718f1a8cc3a0ea3f5bbdb2c5a99d80"><td class="mdescLeft"> </td><td class="mdescRight">Apply a general controlled two-qubit unitary (including a global phase factor). <a href="group__unitary.html#ga8a718f1a8cc3a0ea3f5bbdb2c5a99d80">More...</a><br /></td></tr>
<tr class="separator:ga8a718f1a8cc3a0ea3f5bbdb2c5a99d80"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gaf2ad34c9659292d32c6c725e4bd668cf"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#gaf2ad34c9659292d32c6c725e4bd668cf">controlledUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="memdesc:gaf2ad34c9659292d32c6c725e4bd668cf"><td class="mdescLeft"> </td><td class="mdescRight">Apply a general controlled unitary (single control, single target), which can include a global phase factor. <a href="group__unitary.html#gaf2ad34c9659292d32c6c725e4bd668cf">More...</a><br /></td></tr>
<tr class="separator:gaf2ad34c9659292d32c6c725e4bd668cf"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga2f3bec8d06e7bf7314c581a5b837641f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga2f3bec8d06e7bf7314c581a5b837641f">hadamard</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="memdesc:ga2f3bec8d06e7bf7314c581a5b837641f"><td class="mdescLeft"> </td><td class="mdescRight">Apply the single-qubit Hadamard gate. <a href="group__unitary.html#ga2f3bec8d06e7bf7314c581a5b837641f">More...</a><br /></td></tr>
<tr class="separator:ga2f3bec8d06e7bf7314c581a5b837641f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gadad71b27575fd7d9baf110ff780ee0a1"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#gadad71b27575fd7d9baf110ff780ee0a1">multiControlledMultiQubitUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *ctrls, const int numCtrls, int *targs, const int numTargs, <a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> u)</td></tr>
<tr class="memdesc:gadad71b27575fd7d9baf110ff780ee0a1"><td class="mdescLeft"> </td><td class="mdescRight">Apply a general multi-controlled multi-qubit unitary (including a global phase factor). <a href="group__unitary.html#gadad71b27575fd7d9baf110ff780ee0a1">More...</a><br /></td></tr>
<tr class="separator:gadad71b27575fd7d9baf110ff780ee0a1"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gad76781842af56821ed4e223bd776f057"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#gad76781842af56821ed4e223bd776f057">multiControlledPhaseFlip</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *controlQubits, int numControlQubits)</td></tr>
<tr class="memdesc:gad76781842af56821ed4e223bd776f057"><td class="mdescLeft"> </td><td class="mdescRight">Apply the multiple-qubit controlled phase flip gate, also known as the multiple-qubit controlled pauliZ gate. <a href="group__unitary.html#gad76781842af56821ed4e223bd776f057">More...</a><br /></td></tr>
<tr class="separator:gad76781842af56821ed4e223bd776f057"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga0832e39058d913ad47af44e97a854446"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga0832e39058d913ad47af44e97a854446">multiControlledPhaseShift</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *controlQubits, int numControlQubits, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="memdesc:ga0832e39058d913ad47af44e97a854446"><td class="mdescLeft"> </td><td class="mdescRight">Introduce a phase factor <img class="formulaInl" alt="$ \exp(i \theta) $" src="form_19.png"/> on state <img class="formulaInl" alt="$ |1 \dots 1 \rangle $" src="form_23.png"/> of the passed qubits. <a href="group__unitary.html#ga0832e39058d913ad47af44e97a854446">More...</a><br /></td></tr>
<tr class="separator:ga0832e39058d913ad47af44e97a854446"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga4183dc6cb8fd996fb790a711bf3e4871"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga4183dc6cb8fd996fb790a711bf3e4871">multiControlledTwoQubitUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *controlQubits, const int numControlQubits, const int targetQubit1, const int targetQubit2, <a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> u)</td></tr>
<tr class="memdesc:ga4183dc6cb8fd996fb790a711bf3e4871"><td class="mdescLeft"> </td><td class="mdescRight">Apply a general multi-controlled two-qubit unitary (including a global phase factor). <a href="group__unitary.html#ga4183dc6cb8fd996fb790a711bf3e4871">More...</a><br /></td></tr>
<tr class="separator:ga4183dc6cb8fd996fb790a711bf3e4871"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga18c44cb3b947147951590dea2f6b25f7"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga18c44cb3b947147951590dea2f6b25f7">multiControlledUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *controlQubits, const int numControlQubits, const int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="memdesc:ga18c44cb3b947147951590dea2f6b25f7"><td class="mdescLeft"> </td><td class="mdescRight">Apply a general multiple-control single-target unitary, which can include a global phase factor. <a href="group__unitary.html#ga18c44cb3b947147951590dea2f6b25f7">More...</a><br /></td></tr>
<tr class="separator:ga18c44cb3b947147951590dea2f6b25f7"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gab5828a9f0518951451d9fec9370199ae"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#gab5828a9f0518951451d9fec9370199ae">multiQubitUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *targs, const int numTargs, <a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> u)</td></tr>
<tr class="memdesc:gab5828a9f0518951451d9fec9370199ae"><td class="mdescLeft"> </td><td class="mdescRight">Apply a general multi-qubit unitary (including a global phase factor) with any number of target qubits. <a href="group__unitary.html#gab5828a9f0518951451d9fec9370199ae">More...</a><br /></td></tr>
<tr class="separator:gab5828a9f0518951451d9fec9370199ae"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga34aa4865c92f9aa5d898c91286c9eca5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga34aa4865c92f9aa5d898c91286c9eca5">multiRotatePauli</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *targetQubits, enum <a class="el" href="group__type.html#ga1c703cf89629e4e9c7023cd402d67028">pauliOpType</a> *targetPaulis, int numTargets, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="memdesc:ga34aa4865c92f9aa5d898c91286c9eca5"><td class="mdescLeft"> </td><td class="mdescRight">Apply a multi-qubit multi-Pauli rotation on a selected number of qubits. <a href="group__unitary.html#ga34aa4865c92f9aa5d898c91286c9eca5">More...</a><br /></td></tr>
<tr class="separator:ga34aa4865c92f9aa5d898c91286c9eca5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga3250d0d95b5d755cad542a6a2372b894"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga3250d0d95b5d755cad542a6a2372b894">multiRotateZ</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int numQubits, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="memdesc:ga3250d0d95b5d755cad542a6a2372b894"><td class="mdescLeft"> </td><td class="mdescRight">Apply a multi-qubit Z rotation on a selected number of qubits. <a href="group__unitary.html#ga3250d0d95b5d755cad542a6a2372b894">More...</a><br /></td></tr>
<tr class="separator:ga3250d0d95b5d755cad542a6a2372b894"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga09a08f98955e75d942fdc88d4dca3e33"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga09a08f98955e75d942fdc88d4dca3e33">multiStateControlledUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *controlQubits, int *controlState, const int numControlQubits, const int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="memdesc:ga09a08f98955e75d942fdc88d4dca3e33"><td class="mdescLeft"> </td><td class="mdescRight">Apply a general multiple-control, conditioned on a specific bit sequence, single-target unitary, which can include a global phase factor. <a href="group__unitary.html#ga09a08f98955e75d942fdc88d4dca3e33">More...</a><br /></td></tr>
<tr class="separator:ga09a08f98955e75d942fdc88d4dca3e33"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga84cd118c44b9d3866f56b865dbb9bd7d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga84cd118c44b9d3866f56b865dbb9bd7d">pauliX</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="memdesc:ga84cd118c44b9d3866f56b865dbb9bd7d"><td class="mdescLeft"> </td><td class="mdescRight">Apply the single-qubit Pauli-X (also known as the X, sigma-X, NOT or bit-flip) gate. <a href="group__unitary.html#ga84cd118c44b9d3866f56b865dbb9bd7d">More...</a><br /></td></tr>
<tr class="separator:ga84cd118c44b9d3866f56b865dbb9bd7d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gaa064fcf40fd02b21f98a9a83dc6cea13"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#gaa064fcf40fd02b21f98a9a83dc6cea13">pauliY</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="memdesc:gaa064fcf40fd02b21f98a9a83dc6cea13"><td class="mdescLeft"> </td><td class="mdescRight">Apply the single-qubit Pauli-Y (also known as the Y or sigma-Y) gate. <a href="group__unitary.html#gaa064fcf40fd02b21f98a9a83dc6cea13">More...</a><br /></td></tr>
<tr class="separator:gaa064fcf40fd02b21f98a9a83dc6cea13"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gadf988ee16f38ddaf404552c41ea2b745"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#gadf988ee16f38ddaf404552c41ea2b745">pauliZ</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="memdesc:gadf988ee16f38ddaf404552c41ea2b745"><td class="mdescLeft"> </td><td class="mdescRight">Apply the single-qubit Pauli-Z (also known as the Z, sigma-Z or phase-flip) gate. <a href="group__unitary.html#gadf988ee16f38ddaf404552c41ea2b745">More...</a><br /></td></tr>
<tr class="separator:gadf988ee16f38ddaf404552c41ea2b745"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga05c7b8c9491410215e277ea83c0dfef8"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga05c7b8c9491410215e277ea83c0dfef8">phaseShift</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="memdesc:ga05c7b8c9491410215e277ea83c0dfef8"><td class="mdescLeft"> </td><td class="mdescRight">Shift the phase between <img class="formulaInl" alt="$ |0\rangle $" src="form_14.png"/> and <img class="formulaInl" alt="$ |1\rangle $" src="form_15.png"/> of a single qubit by a given angle. <a href="group__unitary.html#ga05c7b8c9491410215e277ea83c0dfef8">More...</a><br /></td></tr>
<tr class="separator:ga05c7b8c9491410215e277ea83c0dfef8"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gac5c485fe330636966effc0642ba2bd99"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#gac5c485fe330636966effc0642ba2bd99">rotateAroundAxis</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int rotQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle, <a class="el" href="structVector.html">Vector</a> axis)</td></tr>
<tr class="memdesc:gac5c485fe330636966effc0642ba2bd99"><td class="mdescLeft"> </td><td class="mdescRight">Rotate a single qubit by a given angle around a given <a class="el" href="structVector.html">Vector</a> on the Bloch-sphere. <a href="group__unitary.html#gac5c485fe330636966effc0642ba2bd99">More...</a><br /></td></tr>
<tr class="separator:gac5c485fe330636966effc0642ba2bd99"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga5fb1514d67ab43917dc64a357e711425"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga5fb1514d67ab43917dc64a357e711425">rotateX</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int rotQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="memdesc:ga5fb1514d67ab43917dc64a357e711425"><td class="mdescLeft"> </td><td class="mdescRight">Rotate a single qubit by a given angle around the X-axis of the Bloch-sphere. <a href="group__unitary.html#ga5fb1514d67ab43917dc64a357e711425">More...</a><br /></td></tr>
<tr class="separator:ga5fb1514d67ab43917dc64a357e711425"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga680f90d42e56950f40d11d695596a363"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga680f90d42e56950f40d11d695596a363">rotateY</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int rotQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="memdesc:ga680f90d42e56950f40d11d695596a363"><td class="mdescLeft"> </td><td class="mdescRight">Rotate a single qubit by a given angle around the Y-axis of the Bloch-sphere. <a href="group__unitary.html#ga680f90d42e56950f40d11d695596a363">More...</a><br /></td></tr>
<tr class="separator:ga680f90d42e56950f40d11d695596a363"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga30675e80b054d5adf556ae00f98377d9"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga30675e80b054d5adf556ae00f98377d9">rotateZ</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int rotQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="memdesc:ga30675e80b054d5adf556ae00f98377d9"><td class="mdescLeft"> </td><td class="mdescRight">Rotate a single qubit by a given angle around the Z-axis of the Bloch-sphere (also known as a phase shift gate). <a href="group__unitary.html#ga30675e80b054d5adf556ae00f98377d9">More...</a><br /></td></tr>
<tr class="separator:ga30675e80b054d5adf556ae00f98377d9"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga67a83cdbd8d6ae77f91aa011cf09907a"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga67a83cdbd8d6ae77f91aa011cf09907a">sGate</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="memdesc:ga67a83cdbd8d6ae77f91aa011cf09907a"><td class="mdescLeft"> </td><td class="mdescRight">Apply the single-qubit S gate. <a href="group__unitary.html#ga67a83cdbd8d6ae77f91aa011cf09907a">More...</a><br /></td></tr>
<tr class="separator:ga67a83cdbd8d6ae77f91aa011cf09907a"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga75d5e65f87c68403602a669b9c6d52b0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga75d5e65f87c68403602a669b9c6d52b0">sqrtSwapGate</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qb1, int qb2)</td></tr>
<tr class="memdesc:ga75d5e65f87c68403602a669b9c6d52b0"><td class="mdescLeft"> </td><td class="mdescRight">Performs a sqrt SWAP gate between <code>qubit1</code> and <code>qubit2</code>. <a href="group__unitary.html#ga75d5e65f87c68403602a669b9c6d52b0">More...</a><br /></td></tr>
<tr class="separator:ga75d5e65f87c68403602a669b9c6d52b0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga820fd139c035136819e371308c206e36"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga820fd139c035136819e371308c206e36">swapGate</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qubit1, int qubit2)</td></tr>
<tr class="memdesc:ga820fd139c035136819e371308c206e36"><td class="mdescLeft"> </td><td class="mdescRight">Performs a SWAP gate between <code>qubit1</code> and <code>qubit2</code>. <a href="group__unitary.html#ga820fd139c035136819e371308c206e36">More...</a><br /></td></tr>
<tr class="separator:ga820fd139c035136819e371308c206e36"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga3c500a891a522fd3045c379489f0252a"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga3c500a891a522fd3045c379489f0252a">tGate</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="memdesc:ga3c500a891a522fd3045c379489f0252a"><td class="mdescLeft"> </td><td class="mdescRight">Apply the single-qubit T gate. <a href="group__unitary.html#ga3c500a891a522fd3045c379489f0252a">More...</a><br /></td></tr>
<tr class="separator:ga3c500a891a522fd3045c379489f0252a"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga81cf22c68db66bf9b4593a5d1b3f528c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga81cf22c68db66bf9b4593a5d1b3f528c">twoQubitUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit1, const int targetQubit2, <a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> u)</td></tr>
<tr class="memdesc:ga81cf22c68db66bf9b4593a5d1b3f528c"><td class="mdescLeft"> </td><td class="mdescRight">Apply a general two-qubit unitary (including a global phase factor). <a href="group__unitary.html#ga81cf22c68db66bf9b4593a5d1b3f528c">More...</a><br /></td></tr>
<tr class="separator:ga81cf22c68db66bf9b4593a5d1b3f528c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga5a117f81298e8ed894d964198e737757"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__unitary.html#ga5a117f81298e8ed894d964198e737757">unitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="memdesc:ga5a117f81298e8ed894d964198e737757"><td class="mdescLeft"> </td><td class="mdescRight">Apply a general single-qubit unitary (including a global phase factor). <a href="group__unitary.html#ga5a117f81298e8ed894d964198e737757">More...</a><br /></td></tr>
<tr class="separator:ga5a117f81298e8ed894d964198e737757"><td class="memSeparator" colspan="2"> </td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<p>Unitary gates. </p>
<h2 class="groupheader">Function Documentation</h2>
<a id="ga0cbd92af48fe641522e62eea1a76a7c3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga0cbd92af48fe641522e62eea1a76a7c3">◆ </a></span>compactUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void compactUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a single-qubit unitary parameterised by two given complex scalars. </p>
<p>Given valid complex numbers <img class="formulaInl" alt="$\alpha$" src="form_41.png"/> and <img class="formulaInl" alt="$\beta$" src="form_42.png"/>, applies the unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ U = \begin{pmatrix} \alpha & -\beta^* \\ \beta & \alpha^* \end{pmatrix} \]" src="form_43.png"/>
</p>
<p> which is general up to a global phase factor. <br />
Valid <img class="formulaInl" alt="$\alpha$" src="form_41.png"/>, <img class="formulaInl" alt="$\beta$" src="form_42.png"/> satisfy <img class="formulaInl" alt="$|\alpha|^2 + |\beta|^2 = 1$" src="form_44.png"/>.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {target}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {U}; \end{tikzpicture} } \]" src="form_45.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to operate on </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">alpha</td><td>complex unitary parameter (row 1, column 1) </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">beta</td><td>complex unitary parameter (row 2, column 1) </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>targetQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>), or if <code>alpha</code>, <code>beta</code> don't satisfy |<code>alpha|^2</code> + |<code>beta|^2</code> = 1. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00403">403</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  {</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <a class="code" href="QuEST__validation_8c.html#a5d49d4aadea858794b139c6a195ffd8b">validateUnitaryComplexPair</a>(alpha, beta, __func__);</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  </div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <a class="code" href="QuEST__internal_8h.html#a94ee4df9faba286ad7a5bc829ef5174d">statevec_compactUnitary</a>(qureg, targetQubit, alpha, beta);</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <a class="code" href="QuEST__internal_8h.html#a94ee4df9faba286ad7a5bc829ef5174d">statevec_compactUnitary</a>(qureg, targetQubit+shift, <a class="code" href="QuEST__common_8c.html#af92fa737f4491324408b3d15543dced4">getConjugateScalar</a>(alpha), <a class="code" href="QuEST__common_8c.html#af92fa737f4491324408b3d15543dced4">getConjugateScalar</a>(beta));</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  }</div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  </div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <a class="code" href="QuEST__qasm_8c.html#a518c4351d574aea8477019dbce02f09c">qasm_recordCompactUnitary</a>(qureg, alpha, beta, targetQubit);</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00084">getConjugateScalar()</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00195">qasm_recordCompactUnitary()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00846">statevec_compactUnitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00410">validateUnitaryComplexPair()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00046">TEST_CASE()</a>.</p>
</div>
</div>
<a id="gaa854e4b76cfd4000a32c06c990960bd9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaa854e4b76cfd4000a32c06c990960bd9">◆ </a></span>controlledCompactUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledCompactUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a controlled unitary (single control, single target) parameterised by two given complex scalars. </p>
<p>Given valid complex numbers <img class="formulaInl" alt="$\alpha$" src="form_41.png"/> and <img class="formulaInl" alt="$\beta$" src="form_42.png"/>, applies the two-qubit unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & 1 \\ & & \alpha & -\beta^* \\ & & \beta & \alpha^* \end{pmatrix} \]" src="form_59.png"/>
</p>
<p> to the control and target qubits. Valid <img class="formulaInl" alt="$\alpha$" src="form_41.png"/>, <img class="formulaInl" alt="$\beta$" src="form_42.png"/> satisfy <img class="formulaInl" alt="$|\alpha|^2 + |\beta|^2 = 1$" src="form_44.png"/>. The target unitary is general up to a global phase factor. <br />
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {control}; \node[draw=none] at (-3.5, 0) {target}; \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 1); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$U_{\alpha, \beta}$}; \end{tikzpicture} } \]" src="form_60.png"/>
</p>
<p><br />
</p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>apply the target unitary if this qubit has value 1 </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit on which to apply the target unitary </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">alpha</td><td>complex unitary parameter (row 1, column 1) </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">beta</td><td>complex unitary parameter (row 2, column 1) </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if either <code>controlQubit</code> or <code>targetQubit</code> are outside [0, <code>qureg.numQubitsRepresented</code>) or are equal, or if <code>alpha</code>, <code>beta</code> don't satisfy |<code>alpha|^2</code> + |<code>beta|^2</code> = 1. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00416">416</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  {</div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <a class="code" href="QuEST__validation_8c.html#aefc4a3a9cdb71f6e63bc58ad600e420e">validateControlTarget</a>(qureg, controlQubit, targetQubit, __func__);</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <a class="code" href="QuEST__validation_8c.html#a5d49d4aadea858794b139c6a195ffd8b">validateUnitaryComplexPair</a>(alpha, beta, __func__);</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  </div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <a class="code" href="QuEST__internal_8h.html#a47b467a5445c7f15d1a8b0b2ec0ef2de">statevec_controlledCompactUnitary</a>(qureg, controlQubit, targetQubit, alpha, beta);</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <a class="code" href="QuEST__internal_8h.html#a47b467a5445c7f15d1a8b0b2ec0ef2de">statevec_controlledCompactUnitary</a>(qureg, </div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  controlQubit+shift, targetQubit+shift, </div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <a class="code" href="QuEST__common_8c.html#af92fa737f4491324408b3d15543dced4">getConjugateScalar</a>(alpha), <a class="code" href="QuEST__common_8c.html#af92fa737f4491324408b3d15543dced4">getConjugateScalar</a>(beta));</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  }</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  </div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <a class="code" href="QuEST__qasm_8c.html#a6bd68fa9c0c1bd9c9f9af714ea0b8b03">qasm_recordControlledCompactUnitary</a>(qureg, alpha, beta, controlQubit, targetQubit);</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00084">getConjugateScalar()</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00264">qasm_recordControlledCompactUnitary()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00922">statevec_controlledCompactUnitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00315">validateControlTarget()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00410">validateUnitaryComplexPair()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00097">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga6375f658bd7cb24d25e0603b5b947bbd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga6375f658bd7cb24d25e0603b5b947bbd">◆ </a></span>controlledMultiQubitUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledMultiQubitUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>ctrl</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>targs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>numTargs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a general controlled multi-qubit unitary (including a global phase factor). </p>
<p>One control and any number of target qubits can be specified. This effects the many-qubit unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & 1 \\\ & & 1 \\ & & & 1 \\ & & & & u_{00} & u_{01} & \dots \\ & & & & u_{10} & u_{11} & \dots \\ & & & & \vdots & \vdots & \ddots \end{pmatrix} \]" src="form_150.png"/>
</p>
<p> on the control and target qubits.</p>
<p>The target qubits in <code>targs</code> are treated as ordered least sigifnicant to most significant in <code>u</code>.</p>
<p>The passed ComplexMatrix must be unitary and be a compatible size with the specified number of target qubits, otherwise an error is thrown.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 1) {targets}; \node[draw=none] at (-3.5, 4) {control}; \draw (-2, 4) -- (2, 4); \draw[fill=black] (0, 4) circle (.2); \draw(0, 4) -- (0, 3); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-2,2) -- (-1, 2); \draw (1, 2) -- (2, 2); \draw (-1,-1)--(-1,3)--(1,3)--(1,-1); \node[draw=none] at (0, 1) {U}; \node[draw=none] at (0, -1) {$\vdots$}; \end{tikzpicture} } \]" src="form_151.png"/>
</p>
<p>Note that in multithreaded mode, each thread will clone 2^<code>numTargs</code> amplitudes, and store these in the runtime stack. Using t threads, the total memory overhead of this function is t*2^<code>numTargs</code>. For many targets (e.g. 16 qubits), this may cause a stack-overflow / seg-fault (e.g. on a 1 MiB stack).</p>
<p>Note too that in distributed mode, this routine requires that each node contains at least 2^<code>numTargs</code> amplitudes. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q / 2^<code>numTargs</code> nodes.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">ctrl</td><td>the control qubit </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targs</td><td>a list of the target qubits, ordered least to most significant </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">numTargs</td><td>the number of target qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">u</td><td>unitary matrix to apply </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>ctrl</code> or any index in <code>targs</code> is outside of [0, <code>qureg.numQubitsRepresented</code>), or if <code>targs</code> are not unique, or if <code>targs</code> contains <code>ctrl</code>, or if matrix <code>u</code> is not unitary, or if a node cannot fit the required number of target amplitudes in distributed mode. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00312">312</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  {</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <a class="code" href="QuEST__validation_8c.html#afd4946df21588eb7109ca9b289bcba5f">validateMultiControlsMultiTargets</a>(qureg, (<span class="keywordtype">int</span>[]) {ctrl}, 1, targs, numTargs, __func__);</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <a class="code" href="QuEST__validation_8c.html#ab9947ff071a0c019f715f04b3833dcfd">validateMultiQubitUnitaryMatrix</a>(qureg, u, numTargs, __func__);</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  </div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <a class="code" href="QuEST__common_8c.html#af81e1960029f6f213bc2edacaf0dcb44">statevec_controlledMultiQubitUnitary</a>(qureg, ctrl, targs, numTargs, u);</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(targs, numTargs, shift);</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <a class="code" href="QuEST__common_8c.html#a9fd917537204e074119d4f283dea78e3">setConjugateMatrixN</a>(u);</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <a class="code" href="QuEST__common_8c.html#af81e1960029f6f213bc2edacaf0dcb44">statevec_controlledMultiQubitUnitary</a>(qureg, ctrl+shift, targs, numTargs, u);</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(targs, numTargs, -shift);</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <a class="code" href="QuEST__common_8c.html#a9fd917537204e074119d4f283dea78e3">setConjugateMatrixN</a>(u);</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  }</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  </div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <a class="code" href="QuEST__qasm_8c.html#a9a385fde708958617bbeb599064b8dcb">qasm_recordComment</a>(qureg, <span class="stringliteral">"Here, an undisclosed controlled multi-qubit unitary was applied."</span>);</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00120">qasm_recordComment()</a>, <a class="el" href="QuEST__common_8c_source.html#l00108">setConjugateMatrixN()</a>, <a class="el" href="QuEST__common_8c_source.html#l00149">shiftIndices()</a>, <a class="el" href="QuEST__common_8c_source.html#l00534">statevec_controlledMultiQubitUnitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00366">validateMultiControlsMultiTargets()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00403">validateMultiQubitUnitaryMatrix()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00155">TEST_CASE()</a>.</p>
</div>
</div>
<a id="gadf4927a3d5dd8cd6d7400f2e810b4f05"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gadf4927a3d5dd8cd6d7400f2e810b4f05">◆ </a></span>controlledNot()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledNot </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply the controlled not (single control, single target) gate, also known as the c-X, c-sigma-X, c-Pauli-X and c-bit-flip gate. </p>
<p>This applies pauliX to the target qubit if the control qubit has value 1. This effects the two-qubit unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & 1 \\\ & & & 1 \\ & & 1 \end{pmatrix} \]" src="form_78.png"/>
</p>
<p> on the control and target qubits.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {control}; \node[draw=none] at (-3.5, 0) {target}; \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, -.5); \draw (-2,0) -- (2, 0); \draw (0, 0) circle (.5); \end{tikzpicture} } \]" src="form_79.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>nots the target if this qubit is 1 </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to not </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if either <code>controlQubit</code> or <code>targetQubit</code> are outside [0, <code>qureg.numQubitsRepresented</code>), or are equal. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00523">523</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  {</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <a class="code" href="QuEST__validation_8c.html#aefc4a3a9cdb71f6e63bc58ad600e420e">validateControlTarget</a>(qureg, controlQubit, targetQubit, __func__);</div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  </div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <a class="code" href="QuEST__internal_8h.html#a114038296eb404b9b8a66aaad7b48800">statevec_controlledNot</a>(qureg, controlQubit, targetQubit);</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  <a class="code" href="QuEST__internal_8h.html#a114038296eb404b9b8a66aaad7b48800">statevec_controlledNot</a>(qureg, controlQubit+shift, targetQubit+shift);</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  }</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  </div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <a class="code" href="QuEST__qasm_8c.html#aa4c380db9eda18892d5a86825fa4b165">qasm_recordControlledGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa13c9487aed515148e7594e35eb8dcc55">GATE_SIGMA_X</a>, controlQubit, targetQubit);</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00021">GATE_SIGMA_X</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00238">qasm_recordControlledGate()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01063">statevec_controlledNot()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00315">validateControlTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00295">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga811e9b47126c83ff859059106f66cf96"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga811e9b47126c83ff859059106f66cf96">◆ </a></span>controlledPauliY()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledPauliY </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply the controlled pauliY (single control, single target) gate, also known as the c-Y and c-sigma-Y gate. </p>
<p>This applies pauliY to the target qubit if the control qubit has value 1. This effects the two-qubit unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & 1 \\\ & & & -i \\ & & i \end{pmatrix} \]" src="form_80.png"/>
</p>
<p> on the control and target qubits.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {control}; \node[draw=none] at (-3.5, 0) {target}; \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 1); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {Y}; \end{tikzpicture} } \]" src="form_81.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>applies pauliY to the target if this qubit is 1 </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to not </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if either <code>controlQubit</code> or <code>targetQubit</code> are outside [0, <code>qureg.numQubitsRepresented</code>), or are equal. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd>
<dd>
Ania Brown (debug) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00535">535</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  {</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <a class="code" href="QuEST__validation_8c.html#aefc4a3a9cdb71f6e63bc58ad600e420e">validateControlTarget</a>(qureg, controlQubit, targetQubit, __func__);</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  </div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <a class="code" href="QuEST__internal_8h.html#a708246b16236c492094c2633da0c08ff">statevec_controlledPauliY</a>(qureg, controlQubit, targetQubit);</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <a class="code" href="QuEST__internal_8h.html#a9e647339720bf82b30c6331fad544ec5">statevec_controlledPauliYConj</a>(qureg, controlQubit+shift, targetQubit+shift);</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  }</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  </div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <a class="code" href="QuEST__qasm_8c.html#aa4c380db9eda18892d5a86825fa4b165">qasm_recordControlledGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725faa29b98cbb581abf5ec338a1763de7a1b">GATE_SIGMA_Y</a>, controlQubit, targetQubit);</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00022">GATE_SIGMA_Y</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00238">qasm_recordControlledGate()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01142">statevec_controlledPauliY()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01175">statevec_controlledPauliYConj()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00315">validateControlTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00341">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga4dcb9c6660d7a5f74c9597bc467d39ef"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga4dcb9c6660d7a5f74c9597bc467d39ef">◆ </a></span>controlledPhaseFlip()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledPhaseFlip </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply the (two-qubit) controlled phase flip gate, also known as the controlled pauliZ gate. </p>
<p>For each state, if both input qubits have value one, multiply the amplitude of that state by -1. This applies the two-qubit unitary: </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & 1 \\\ & & 1 \\ & & & -1 \end{pmatrix} \]" src="form_25.png"/>
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {idQubit1}; \node[draw=none] at (-3.5, 0) {idQubit2}; \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 0); \draw (-2,0) -- (2, 0); \draw[fill=black] (0, 0) circle (.2); \end{tikzpicture} } \]" src="form_26.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">idQubit1,idQubit2</td><td>qubits to operate upon </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>idQubit1</code> or <code>idQubit2</code> are outside [0, <code>qureg.numQubitsRepresented</code>), or are equal </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00547">547</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  {</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <a class="code" href="QuEST__validation_8c.html#aefc4a3a9cdb71f6e63bc58ad600e420e">validateControlTarget</a>(qureg, idQubit1, idQubit2, __func__);</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  </div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <a class="code" href="QuEST__internal_8h.html#a7c0067cb9f243ead20de7392aea328bc">statevec_controlledPhaseFlip</a>(qureg, idQubit1, idQubit2);</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <a class="code" href="QuEST__internal_8h.html#a7c0067cb9f243ead20de7392aea328bc">statevec_controlledPhaseFlip</a>(qureg, idQubit1+shift, idQubit2+shift);</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  }</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  </div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <a class="code" href="QuEST__qasm_8c.html#aa4c380db9eda18892d5a86825fa4b165">qasm_recordControlledGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa228cd6a7ad18928b794ee7ad1f1fc85e">GATE_SIGMA_Z</a>, idQubit1, idQubit2);</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00023">GATE_SIGMA_Z</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00238">qasm_recordControlledGate()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03260">statevec_controlledPhaseFlip()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00315">validateControlTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00387">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga69e074c8174e198ca014d9905b98b43d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga69e074c8174e198ca014d9905b98b43d">◆ </a></span>controlledPhaseShift()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledPhaseShift </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Introduce a phase factor <img class="formulaInl" alt="$ \exp(i \theta) $" src="form_19.png"/> on state <img class="formulaInl" alt="$ |11\rangle $" src="form_20.png"/> of qubits <code>idQubit1</code> and <code>idQubit2</code>. </p>
<p>For angle <img class="formulaInl" alt="$\theta$" src="form_16.png"/>, this effects the unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 & & & \\ & 1 & & \\ & & 1 & \\ & & & \exp(i \theta) \end{pmatrix} \]" src="form_21.png"/>
</p>
<p> on <code>idQubit1</code> and <code>idQubit2</code>.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {qubit1}; \node[draw=none] at (-3.5, 0) {qubit2}; \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 1); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$R_\theta$}; \end{tikzpicture} } \]" src="form_22.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">idQubit1</td><td>first qubit in the state to phase shift </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">idQubit2</td><td>second qubit in the state to phase shift </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>amount by which to shift the phase in radians </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>idQubit1</code> or <code>idQubit2</code> are outside [0, <code>qureg.numQubitsRepresented</code>), or are equal </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00497">497</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  {</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <a class="code" href="QuEST__validation_8c.html#aefc4a3a9cdb71f6e63bc58ad600e420e">validateControlTarget</a>(qureg, idQubit1, idQubit2, __func__);</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  </div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <a class="code" href="QuEST__internal_8h.html#adeb715f3f2c167f9bfbe92b75f5988ce">statevec_controlledPhaseShift</a>(qureg, idQubit1, idQubit2, angle);</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <a class="code" href="QuEST__internal_8h.html#adeb715f3f2c167f9bfbe92b75f5988ce">statevec_controlledPhaseShift</a>(qureg, idQubit1+shift, idQubit2+shift, -angle);</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  }</div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  </div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  <a class="code" href="QuEST__qasm_8c.html#ae776148507b8f769cd00d1603212a028">qasm_recordControlledParamGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa4668b36d21aaeba1fb605b73881ca507">GATE_PHASE_SHIFT</a>, idQubit1, idQubit2, angle);</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00032">GATE_PHASE_SHIFT</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00247">qasm_recordControlledParamGate()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02980">statevec_controlledPhaseShift()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00315">validateControlTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00433">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga82bf9aaf01430d3ecfde52b7731421d7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga82bf9aaf01430d3ecfde52b7731421d7">◆ </a></span>controlledRotateAroundAxis()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledRotateAroundAxis </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structVector.html">Vector</a> </td>
<td class="paramname"><em>axis</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Applies a controlled rotation by a given angle around a given vector on the Bloch-sphere. </p>
<p><br />
The vector must not be zero (else an error is thrown), but needn't be unit magnitude.</p>
<p>For angle <img class="formulaInl" alt="$\theta$" src="form_16.png"/> and axis vector <img class="formulaInl" alt="$\vec{n}$" src="form_52.png"/>, applies <img class="formulaInl" alt="$R_{\hat{n}} = \exp \left(- i \frac{\theta}{2} \hat{n} \cdot \vec{\sigma} \right) $" src="form_53.png"/> to states where the target qubit is 1 ( <img class="formulaInl" alt="$\vec{\sigma}$" src="form_54.png"/> is the vector of Pauli matrices).</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {control}; \node[draw=none] at (-3.5, 0) {target}; \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 1); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$R_{\hat{n}}(\theta)$}; \end{tikzpicture} } \]" src="form_58.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>qubit with value 1 in the rotated states </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to rotate </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>angle by which to rotate in radians </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">axis</td><td>vector around which to rotate (can be non-unit; will be normalised) </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if either <code>controlQubit</code> or <code>targetQubit</code> are outside [0, <code>qureg.numQubitsRepresented</code>) or are equal or if <code>axis</code> is the zero vector </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00586">586</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  {</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <a class="code" href="QuEST__validation_8c.html#aefc4a3a9cdb71f6e63bc58ad600e420e">validateControlTarget</a>(qureg, controlQubit, targetQubit, __func__);</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  <a class="code" href="QuEST__validation_8c.html#a782c6f57939eeb72b7be8e247979f3be">validateVector</a>(axis, __func__);</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  </div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <a class="code" href="QuEST__common_8c.html#a2c489375aad6fb71203553c60bff043b">statevec_controlledRotateAroundAxis</a>(qureg, controlQubit, targetQubit, angle, axis);</div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  <a class="code" href="QuEST__common_8c.html#aeb4ddeb09a3c0fa39ac33984bd5ca0ea">statevec_controlledRotateAroundAxisConj</a>(qureg, controlQubit+shift, targetQubit+shift, angle, axis);</div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  }</div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  </div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <a class="code" href="QuEST__qasm_8c.html#a33be8162c9633bb8015f06b38cf70735">qasm_recordControlledAxisRotation</a>(qureg, angle, axis, controlQubit, targetQubit);</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00300">qasm_recordControlledAxisRotation()</a>, <a class="el" href="QuEST__common_8c_source.html#l00326">statevec_controlledRotateAroundAxis()</a>, <a class="el" href="QuEST__common_8c_source.html#l00333">statevec_controlledRotateAroundAxisConj()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00315">validateControlTarget()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00414">validateVector()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00480">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga7dc4ed5d9fd2872a04fea6ef13b65c3d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga7dc4ed5d9fd2872a04fea6ef13b65c3d">◆ </a></span>controlledRotateX()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledRotateX </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Applies a controlled rotation by a given angle around the X-axis of the Bloch-sphere. </p>
<p>The target qubit is rotated in states where the control qubit has value 1.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {control}; \node[draw=none] at (-3.5, 0) {target}; \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 1); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$R_x(\theta)$}; \end{tikzpicture} } \]" src="form_55.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>qubit which has value 1 in the rotated states </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to rotate </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>angle by which to rotate the target qubit in radians </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if either <code>controlQubit</code> or <code>targetQubit</code> are outside [0, <code>qureg.numQubitsRepresented</code>) or are equal. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00219">219</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  {</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <a class="code" href="QuEST__validation_8c.html#aefc4a3a9cdb71f6e63bc58ad600e420e">validateControlTarget</a>(qureg, controlQubit, targetQubit, __func__);</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  </div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <a class="code" href="QuEST__common_8c.html#af59bc61f97d42cdceaf7fc0257a387d6">statevec_controlledRotateX</a>(qureg, controlQubit, targetQubit, angle);</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <a class="code" href="QuEST__common_8c.html#af59bc61f97d42cdceaf7fc0257a387d6">statevec_controlledRotateX</a>(qureg, controlQubit+shift, targetQubit+shift, -angle);</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  }</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  </div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <a class="code" href="QuEST__qasm_8c.html#ae776148507b8f769cd00d1603212a028">qasm_recordControlledParamGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fada07505b73935b2788032efd30a1a361">GATE_ROTATE_X</a>, controlQubit, targetQubit, angle);</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00027">GATE_ROTATE_X</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00247">qasm_recordControlledParamGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00342">statevec_controlledRotateX()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00315">validateControlTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00542">TEST_CASE()</a>.</p>
</div>
</div>
<a id="gaf99ba5356a6c20d3d047b36874fc0a50"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaf99ba5356a6c20d3d047b36874fc0a50">◆ </a></span>controlledRotateY()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledRotateY </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Applies a controlled rotation by a given angle around the Y-axis of the Bloch-sphere. </p>
<p>The target qubit is rotated in states where the control qubit has value 1.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {control}; \node[draw=none] at (-3.5, 0) {target}; \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 1); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$R_y(\theta)$}; \end{tikzpicture} } \]" src="form_56.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>qubit which has value 1 in the rotated states </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to rotate </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>angle by which to rotate the target qubit in radians </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if either <code>controlQubit</code> or <code>targetQubit</code> are outside [0, <code>qureg.numQubitsRepresented</code>) or are equal. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00231">231</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  {</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <a class="code" href="QuEST__validation_8c.html#aefc4a3a9cdb71f6e63bc58ad600e420e">validateControlTarget</a>(qureg, controlQubit, targetQubit, __func__);</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  </div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <a class="code" href="QuEST__common_8c.html#ad2dc0754043172e0449c78569d27fd4a">statevec_controlledRotateY</a>(qureg, controlQubit, targetQubit, angle);</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <a class="code" href="QuEST__common_8c.html#ad2dc0754043172e0449c78569d27fd4a">statevec_controlledRotateY</a>(qureg, controlQubit+shift, targetQubit+shift, angle); <span class="comment">// rotateY is real</span></div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  }</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  </div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <a class="code" href="QuEST__qasm_8c.html#ae776148507b8f769cd00d1603212a028">qasm_recordControlledParamGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fae1267d5de573dc2901aa8e724ac1d689">GATE_ROTATE_Y</a>, controlQubit, targetQubit, angle);</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00028">GATE_ROTATE_Y</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00247">qasm_recordControlledParamGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00348">statevec_controlledRotateY()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00315">validateControlTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00589">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga9afcf34f7c6ae127452b503c074a9b7b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga9afcf34f7c6ae127452b503c074a9b7b">◆ </a></span>controlledRotateZ()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledRotateZ </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Applies a controlled rotation by a given angle around the Z-axis of the Bloch-sphere. </p>
<p>The target qubit is rotated in states where the control qubit has value 1.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {control}; \node[draw=none] at (-3.5, 0) {target}; \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 1); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$R_z(\theta)$}; \end{tikzpicture} } \]" src="form_57.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>qubit which has value 1 in the rotated states </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to rotate </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>angle by which to rotate the target qubit in radians </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if either <code>controlQubit</code> or <code>targetQubit</code> are outside [0, <code>qureg.numQubitsRepresented</code>) or are equal. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00243">243</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  {</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <a class="code" href="QuEST__validation_8c.html#aefc4a3a9cdb71f6e63bc58ad600e420e">validateControlTarget</a>(qureg, controlQubit, targetQubit, __func__);</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  </div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <a class="code" href="QuEST__common_8c.html#a06bffb653fa42a67254d034b6cce6d7d">statevec_controlledRotateZ</a>(qureg, controlQubit, targetQubit, angle);</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <a class="code" href="QuEST__common_8c.html#a06bffb653fa42a67254d034b6cce6d7d">statevec_controlledRotateZ</a>(qureg, controlQubit+shift, targetQubit+shift, -angle);</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  }</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  </div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <a class="code" href="QuEST__qasm_8c.html#ae776148507b8f769cd00d1603212a028">qasm_recordControlledParamGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa0cdc4c588d02a515a68515dd3f24d877">GATE_ROTATE_Z</a>, controlQubit, targetQubit, angle);</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00029">GATE_ROTATE_Z</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00247">qasm_recordControlledParamGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00354">statevec_controlledRotateZ()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00315">validateControlTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00636">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga8a718f1a8cc3a0ea3f5bbdb2c5a99d80"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga8a718f1a8cc3a0ea3f5bbdb2c5a99d80">◆ </a></span>controlledTwoQubitUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledTwoQubitUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a general controlled two-qubit unitary (including a global phase factor). </p>
<p>The given unitary is applied to the target amplitudes where the control qubit has value 1. This effects the many-qubit unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & 1 \\ & & 1 \\ & & & 1 \\ & & & & u_{00} & u_{01} & u_{02} & u_{03} \\ & & & & u_{10} & u_{11} & u_{12} & u_{13} \\ & & & & u_{20} & u_{21} & u_{22} & u_{23} \\ & & & & u_{30} & u_{31} & u_{32} & u_{33} \end{pmatrix} \]" src="form_144.png"/>
</p>
<p> on the control and target qubits.</p>
<p><code>targetQubit1</code> is treated as the <code>least</code> significant qubit in <code>u</code>, such that a row in <code>u</code> is dotted with the vector <img class="formulaInl" alt="$ |\text{targetQubit2} \;\; \text{targetQubit1}\rangle : \{ |00\rangle, |01\rangle, |10\rangle, |11\rangle \} $" src="form_142.png"/></p>
<p>The passed 4x4 ComplexMatrix must be unitary, otherwise an error is thrown.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {target1}; \node[draw=none] at (-3.5, 2) {target2}; \node[draw=none] at (-3.5, 4) {control}; \draw (-2, 4) -- (2, 4); \draw[fill=black] (0, 4) circle (.2); \draw(0, 4) -- (0, 3); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-2,2) -- (-1, 2); \draw (1, 2) -- (2, 2); \draw (-1,-1)--(-1,3)--(1,3)--(1,-1)--cycle; \node[draw=none] at (0, 1) {U}; \end{tikzpicture} } \]" src="form_145.png"/>
</p>
<p>Note that in distributed mode, this routine requires that each node contains at least 4 amplitudes. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q/4 nodes.</p>
<p><br />
</p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>the control qubit which must be in state 1 to effect the given unitary </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit1</td><td>first qubit to operate on, treated as least significant in <code>u</code> </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit2</td><td>second qubit to operate on, treated as most significant in <code>u</code> </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">u</td><td>unitary matrix to apply </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>controlQubit</code>, <code>targetQubit1</code> or <code>targetQubit2</code> are outside [0, <code>qureg.numQubitsRepresented</code>), or if any of <code>controlQubit</code>, <code>targetQubit1</code> and <code>targetQubit2</code> are equal, or matrix <code>u</code> is not unitary, or if each node cannot fit 4 amplitudes in distributed mode. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00268">268</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  {</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <a class="code" href="QuEST__validation_8c.html#afd4946df21588eb7109ca9b289bcba5f">validateMultiControlsMultiTargets</a>(qureg, (<span class="keywordtype">int</span>[]) {controlQubit}, 1, (<span class="keywordtype">int</span>[]) {targetQubit1, targetQubit2}, 2, __func__);</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <a class="code" href="QuEST__validation_8c.html#a654db9d60abdcae26427e7d3b3d9c432">validateTwoQubitUnitaryMatrix</a>(qureg, u, __func__);</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  </div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <a class="code" href="QuEST__common_8c.html#aaa550b31c5576f9305f57cfe68b6dfbe">statevec_controlledTwoQubitUnitary</a>(qureg, controlQubit, targetQubit1, targetQubit2, u);</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <a class="code" href="QuEST__common_8c.html#aaa550b31c5576f9305f57cfe68b6dfbe">statevec_controlledTwoQubitUnitary</a>(qureg, controlQubit+shift, targetQubit1+shift, targetQubit2+shift, <a class="code" href="QuEST__common_8c.html#a20d45e85dd49dd3bf6045990b590b24b">getConjugateMatrix4</a>(u));</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  }</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  </div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <a class="code" href="QuEST__qasm_8c.html#a9a385fde708958617bbeb599064b8dcb">qasm_recordComment</a>(qureg, <span class="stringliteral">"Here, an undisclosed controlled 2-qubit unitary was applied."</span>);</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00103">getConjugateMatrix4()</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00120">qasm_recordComment()</a>, <a class="el" href="QuEST__common_8c_source.html#l00522">statevec_controlledTwoQubitUnitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00366">validateMultiControlsMultiTargets()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00388">validateTwoQubitUnitaryMatrix()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00683">TEST_CASE()</a>.</p>
</div>
</div>
<a id="gaf2ad34c9659292d32c6c725e4bd668cf"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaf2ad34c9659292d32c6c725e4bd668cf">◆ </a></span>controlledUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void controlledUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a general controlled unitary (single control, single target), which can include a global phase factor. </p>
<p>The given unitary is applied to the target qubit if the control qubit has value 1, effecting the two-qubit unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & 1 \\ & & u_{00} & u_{01}\\ & & u_{10} & u_{11} \end{pmatrix} \]" src="form_61.png"/>
</p>
<p> on the control and target qubits.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {control}; \node[draw=none] at (-3.5, 0) {target}; \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 1); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {U}; \end{tikzpicture} } \]" src="form_62.png"/>
</p>
<p><br />
</p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>apply unitary if this qubit is 1 </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to operate on </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">u</td><td>single-qubit unitary matrix to apply </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if either <code>controlQubit</code> or <code>targetQubit</code> are outside [0, <code>qureg.numQubitsRepresented</code>) or are equal, or if <code>u</code> is not unitary. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00359">359</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  {</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  <a class="code" href="QuEST__validation_8c.html#aefc4a3a9cdb71f6e63bc58ad600e420e">validateControlTarget</a>(qureg, controlQubit, targetQubit, __func__);</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <a class="code" href="QuEST__validation_8c.html#a0344fbbb2bb505f7db14b420153f1eb5">validateOneQubitUnitaryMatrix</a>(u, __func__);</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  </div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <a class="code" href="QuEST__internal_8h.html#a2600999a19c817bfcf7ca14779e33b9a">statevec_controlledUnitary</a>(qureg, controlQubit, targetQubit, u);</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <a class="code" href="QuEST__internal_8h.html#a2600999a19c817bfcf7ca14779e33b9a">statevec_controlledUnitary</a>(qureg, controlQubit+shift, targetQubit+shift, <a class="code" href="QuEST__common_8c.html#ad34d98eeaa6a3cb45e92c696cfd2d1c8">getConjugateMatrix2</a>(u));</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  }</div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  </div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <a class="code" href="QuEST__qasm_8c.html#a5e99d405002cdf6ddd40922911d058a4">qasm_recordControlledUnitary</a>(qureg, u, controlQubit, targetQubit);</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00098">getConjugateMatrix2()</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00278">qasm_recordControlledUnitary()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00960">statevec_controlledUnitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00315">validateControlTarget()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00384">validateOneQubitUnitaryMatrix()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00760">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga2f3bec8d06e7bf7314c581a5b837641f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga2f3bec8d06e7bf7314c581a5b837641f">◆ </a></span>hadamard()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void hadamard </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply the single-qubit Hadamard gate. </p>
<p>This takes <img class="formulaInl" alt="$|0\rangle$" src="form_72.png"/> to <img class="formulaInl" alt="$|+\rangle$" src="form_73.png"/> and <img class="formulaInl" alt="$|1\rangle$" src="form_74.png"/> to <img class="formulaInl" alt="$|-\rangle$" src="form_75.png"/>, and is equivalent to a rotation of <img class="formulaInl" alt="$\pi$" src="form_65.png"/> around the x-axis then <img class="formulaInl" alt="$\pi/2$" src="form_29.png"/> about the y-axis on the Bloch-sphere. I.e. </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \frac{1}{\sqrt{2}} \begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix} \]" src="form_76.png"/>
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {target}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {H}; \end{tikzpicture} } \]" src="form_77.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to operate on </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>targetQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>). </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00175">175</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  {</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  </div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <a class="code" href="QuEST__internal_8h.html#a9226f386d010aaa85efc0e8889d341d5">statevec_hadamard</a>(qureg, targetQubit);</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <a class="code" href="QuEST__internal_8h.html#a9226f386d010aaa85efc0e8889d341d5">statevec_hadamard</a>(qureg, targetQubit+qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  }</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  </div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <a class="code" href="QuEST__qasm_8c.html#a81749d23b8c3c1acf87c9db675872c24">qasm_recordGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa8417e56d80add49216437e0d451e8dd9">GATE_HADAMARD</a>, targetQubit);</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00026">GATE_HADAMARD</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00178">qasm_recordGate()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01208">statevec_hadamard()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00812">TEST_CASE()</a>.</p>
</div>
</div>
<a id="gadad71b27575fd7d9baf110ff780ee0a1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gadad71b27575fd7d9baf110ff780ee0a1">◆ </a></span>multiControlledMultiQubitUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void multiControlledMultiQubitUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>ctrls</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>numCtrls</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>targs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>numTargs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a general multi-controlled multi-qubit unitary (including a global phase factor). </p>
<p>Any number of control and target qubits can be specified. This effects the many-qubit unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & 1 \\\ & & \ddots \\ & & & u_{00} & u_{01} & \dots \\ & & & u_{10} & u_{11} & \dots \\ & & & \vdots & \vdots & \ddots \end{pmatrix} \]" src="form_152.png"/>
</p>
<p> on the control and target qubits.</p>
<p>The target qubits in <code>targs</code> are treated as ordered least sigifnicant to most significant in <code>u</code>.</p>
<p>The passed ComplexMatrix must be unitary and be a compatible size with the specified number of target qubits, otherwise an error is thrown.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 1) {targets}; \node[draw=none] at (-3.5, 5) {controls}; \node[draw=none] at (0, 8) {$\vdots$}; \draw (0, 7) -- (0, 6); \draw (-2, 6) -- (2, 6); \draw[fill=black] (0, 6) circle (.2); \draw (0, 6) -- (0, 4); \draw (-2, 4) -- (2, 4); \draw[fill=black] (0, 4) circle (.2); \draw(0, 4) -- (0, 3); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-2,2) -- (-1, 2); \draw (1, 2) -- (2, 2); \draw (-1,-1)--(-1,3)--(1,3)--(1,-1); \node[draw=none] at (0, 1) {U}; \node[draw=none] at (0, -1) {$\vdots$}; \end{tikzpicture} } \]" src="form_153.png"/>
</p>
<p>Note that in multithreaded mode, each thread will clone 2^<code>numTargs</code> amplitudes, and store these in the runtime stack. Using t threads, the total memory overhead of this function is t*2^<code>numTargs</code>. For many targets (e.g. 16 qubits), this may cause a stack-overflow / seg-fault (e.g. on a 1 MiB stack).</p>
<p>Note that in distributed mode, this routine requires that each node contains at least 2^<code>numTargs</code> amplitudes. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q / 2^<code>numTargs</code> nodes.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">ctrls</td><td>a list of the control qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">numCtrls</td><td>the number of control qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targs</td><td>a list of the target qubits, ordered least to most significant </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">numTargs</td><td>the number of target qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">u</td><td>unitary matrix to apply </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if any index in <code>ctrls</code> and <code>targs</code> is outside of [0, <code>qureg.numQubitsRepresented</code>), or if <code>ctrls</code> and <code>targs</code> are not unique, or if matrix <code>u</code> is not unitary, or if a node cannot fit the required number of target amplitudes in distributed mode. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00329">329</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  {</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <a class="code" href="QuEST__validation_8c.html#afd4946df21588eb7109ca9b289bcba5f">validateMultiControlsMultiTargets</a>(qureg, ctrls, numCtrls, targs, numTargs, __func__);</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <a class="code" href="QuEST__validation_8c.html#ab9947ff071a0c019f715f04b3833dcfd">validateMultiQubitUnitaryMatrix</a>(qureg, u, numTargs, __func__);</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  </div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlMask = <a class="code" href="QuEST__common_8c.html#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a>(ctrls, numCtrls);</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <a class="code" href="QuEST__internal_8h.html#a47dcab9a0e6b07ddde264ed924add26c">statevec_multiControlledMultiQubitUnitary</a>(qureg, ctrlMask, targs, numTargs, u);</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(targs, numTargs, shift);</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <a class="code" href="QuEST__common_8c.html#a9fd917537204e074119d4f283dea78e3">setConjugateMatrixN</a>(u);</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <a class="code" href="QuEST__internal_8h.html#a47dcab9a0e6b07ddde264ed924add26c">statevec_multiControlledMultiQubitUnitary</a>(qureg, ctrlMask<<shift, targs, numTargs, u);</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(targs, numTargs, -shift);</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <a class="code" href="QuEST__common_8c.html#a9fd917537204e074119d4f283dea78e3">setConjugateMatrixN</a>(u);</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  }</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  </div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <a class="code" href="QuEST__qasm_8c.html#a9a385fde708958617bbeb599064b8dcb">qasm_recordComment</a>(qureg, <span class="stringliteral">"Here, an undisclosed multi-controlled multi-qubit unitary was applied."</span>);</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00043">getQubitBitMask()</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00120">qasm_recordComment()</a>, <a class="el" href="QuEST__common_8c_source.html#l00108">setConjugateMatrixN()</a>, <a class="el" href="QuEST__common_8c_source.html#l00149">shiftIndices()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01441">statevec_multiControlledMultiQubitUnitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00366">validateMultiControlsMultiTargets()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00403">validateMultiQubitUnitaryMatrix()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l00852">TEST_CASE()</a>.</p>
</div>
</div>
<a id="gad76781842af56821ed4e223bd776f057"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gad76781842af56821ed4e223bd776f057">◆ </a></span>multiControlledPhaseFlip()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void multiControlledPhaseFlip </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>controlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numControlQubits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply the multiple-qubit controlled phase flip gate, also known as the multiple-qubit controlled pauliZ gate. </p>
<p>For each state, if all control qubits have value one, multiply the amplitude of that state by -1. This applies the many-qubit unitary: </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & 1 \\\ & & \ddots \\ & & & 1 \\ & & & & -1 \end{pmatrix} \]" src="form_27.png"/>
</p>
<p> on the control qubits.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {controls}; \node[draw=none] at (0, 6) {$\vdots$}; \draw (0, 5) -- (0, 4); \draw (-2, 4) -- (2, 4); \draw[fill=black] (0, 4) circle (.2); \draw (0, 4) -- (0, 2); \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 0); \draw (-2,0) -- (2, 0); \draw[fill=black] (0, 0) circle (.2); \end{tikzpicture} } \]" src="form_28.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubits</td><td>array of input qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">numControlQubits</td><td>number of input qubits </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>numControlQubits</code> is outside [1, <code>qureg.numQubitsRepresented</code>), or if any qubit in <code>controlQubits</code> is outside [0, <code>qureg.numQubitsRepresented</code>), or if any qubit in <code>qubits</code> is repeated. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00559">559</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  {</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <a class="code" href="QuEST__validation_8c.html#a706acae568cbb0854b4729ed9e2f7e6d">validateMultiQubits</a>(qureg, controlQubits, numControlQubits, __func__);</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  </div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <a class="code" href="QuEST__internal_8h.html#ac4ee5979d475e8c729294b8ef7e0270d">statevec_multiControlledPhaseFlip</a>(qureg, controlQubits, numControlQubits);</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(controlQubits, numControlQubits, shift);</div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  <a class="code" href="QuEST__internal_8h.html#ac4ee5979d475e8c729294b8ef7e0270d">statevec_multiControlledPhaseFlip</a>(qureg, controlQubits, numControlQubits);</div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(controlQubits, numControlQubits, -shift);</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  }</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  </div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <a class="code" href="QuEST__qasm_8c.html#a494d9fecfb2adeab56543110f16de74e">qasm_recordMultiControlledGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa228cd6a7ad18928b794ee7ad1f1fc85e">GATE_SIGMA_Z</a>, controlQubits, numControlQubits-1, controlQubits[numControlQubits-1]);</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00023">GATE_SIGMA_Z</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00316">qasm_recordMultiControlledGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00149">shiftIndices()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03291">statevec_multiControlledPhaseFlip()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00351">validateMultiQubits()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01024">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga0832e39058d913ad47af44e97a854446"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga0832e39058d913ad47af44e97a854446">◆ </a></span>multiControlledPhaseShift()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void multiControlledPhaseShift </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>controlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numControlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Introduce a phase factor <img class="formulaInl" alt="$ \exp(i \theta) $" src="form_19.png"/> on state <img class="formulaInl" alt="$ |1 \dots 1 \rangle $" src="form_23.png"/> of the passed qubits. </p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {controls}; \node[draw=none] at (1, .7) {$\theta$}; \node[draw=none] at (0, 6) {$\vdots$}; \draw (0, 5) -- (0, 4); \draw (-2, 4) -- (2, 4); \draw[fill=black] (0, 4) circle (.2); \draw (0, 4) -- (0, 2); \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 0); \draw (-2,0) -- (2, 0); \draw[fill=black] (0, 0) circle (.2); \end{tikzpicture} } \]" src="form_24.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubits</td><td>array of qubits to phase shift </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">numControlQubits</td><td>the length of array <code>controlQubits</code> </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>amount by which to shift the phase in radians </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>numControlQubits</code> is outside [1, <code>qureg.numQubitsRepresented</code>]), or if any qubit index in <code>controlQubits</code> is outside [0, <code>qureg.numQubitsRepresented</code>]), or if any qubit in <code>controlQubits</code> is repeated. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00509">509</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  {</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <a class="code" href="QuEST__validation_8c.html#a706acae568cbb0854b4729ed9e2f7e6d">validateMultiQubits</a>(qureg, controlQubits, numControlQubits, __func__);</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  </div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <a class="code" href="QuEST__internal_8h.html#aa662796ea6e0f471143c53becae8c12c">statevec_multiControlledPhaseShift</a>(qureg, controlQubits, numControlQubits, angle);</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(controlQubits, numControlQubits, shift);</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <a class="code" href="QuEST__internal_8h.html#aa662796ea6e0f471143c53becae8c12c">statevec_multiControlledPhaseShift</a>(qureg, controlQubits, numControlQubits, -angle);</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(controlQubits, numControlQubits, -shift);</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  }</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  </div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <a class="code" href="QuEST__qasm_8c.html#aeca17d22c413cddbd4f5fd99712a2496">qasm_recordMultiControlledParamGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa4668b36d21aaeba1fb605b73881ca507">GATE_PHASE_SHIFT</a>, controlQubits, numControlQubits-1, controlQubits[numControlQubits-1], angle);</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00032">GATE_PHASE_SHIFT</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00324">qasm_recordMultiControlledParamGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00149">shiftIndices()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03019">statevec_multiControlledPhaseShift()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00351">validateMultiQubits()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01080">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga4183dc6cb8fd996fb790a711bf3e4871"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga4183dc6cb8fd996fb790a711bf3e4871">◆ </a></span>multiControlledTwoQubitUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void multiControlledTwoQubitUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>controlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>numControlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a general multi-controlled two-qubit unitary (including a global phase factor). </p>
<p>Any number of control qubits can be specified, and if all have value 1, the given unitary is applied to the target qubit. This effects the many-qubit unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & 1 \\\ & & \ddots \\ & & & u_{00} & u_{01} & u_{02} & u_{03} \\ & & & u_{10} & u_{11} & u_{12} & u_{13} \\ & & & u_{20} & u_{21} & u_{22} & u_{23} \\ & & & u_{30} & u_{31} & u_{32} & u_{33} \end{pmatrix} \]" src="form_146.png"/>
</p>
<p> on the control and target qubits.</p>
<p><code>targetQubit1</code> is treated as the <code>least</code> significant qubit in <code>u</code>, such that a row in <code>u</code> is dotted with the vector <img class="formulaInl" alt="$ |\text{targetQubit2} \;\; \text{targetQubit1}\rangle : \{ |00\rangle, |01\rangle, |10\rangle, |11\rangle \} $" src="form_142.png"/></p>
<p>The passed 4x4 ComplexMatrix must be unitary, otherwise an error is thrown.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {target1}; \node[draw=none] at (-3.5, 2) {target2}; \node[draw=none] at (-3.5, 5) {controls}; \node[draw=none] at (0, 8) {$\vdots$}; \draw (0, 7) -- (0, 6); \draw (-2, 6) -- (2, 6); \draw[fill=black] (0, 6) circle (.2); \draw (0, 6) -- (0, 4); \draw (-2, 4) -- (2, 4); \draw[fill=black] (0, 4) circle (.2); \draw(0, 4) -- (0, 3); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-2,2) -- (-1, 2); \draw (1, 2) -- (2, 2); \draw (-1,-1)--(-1,3)--(1,3)--(1,-1)--cycle; \node[draw=none] at (0, 1) {U}; \end{tikzpicture} } \]" src="form_147.png"/>
</p>
<p>Note that in distributed mode, this routine requires that each node contains at least 4 amplitudes. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q/4 nodes.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubits</td><td>the control qubits which all must be in state 1 to effect the given unitary </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">numControlQubits</td><td>the number of control qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit1</td><td>first target qubit, treated as least significant in <code>u</code> </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit2</td><td>second target qubit, treated as most significant in <code>u</code> </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">u</td><td>unitary matrix to apply </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>targetQubit1</code> or <code>targetQubit2</code> are outside [0, <code>qureg.numQubitsRepresented</code>), or if <code>targetQubit1</code> equals <code>targetQubit2</code>, or if any qubit in <code>controlQubits</code> is outside [0, <code>qureg.numQubitsRepresented</code>), or if <code>controlQubits</code> are not unique, or if either <code>targetQubit1</code> and <code>targetQubit2</code> are in <code>controlQubits</code>, or if matrix <code>u</code> is not unitary, or if each node cannot fit 4 amplitudes in distributed mode. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00281">281</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  {</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <a class="code" href="QuEST__validation_8c.html#afd4946df21588eb7109ca9b289bcba5f">validateMultiControlsMultiTargets</a>(qureg, controlQubits, numControlQubits, (<span class="keywordtype">int</span>[]) {targetQubit1, targetQubit2}, 2, __func__);</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <a class="code" href="QuEST__validation_8c.html#a654db9d60abdcae26427e7d3b3d9c432">validateTwoQubitUnitaryMatrix</a>(qureg, u, __func__);</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  </div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlQubitsMask = <a class="code" href="QuEST__common_8c.html#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a>(controlQubits, numControlQubits);</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <a class="code" href="QuEST__internal_8h.html#a877d988a763a52989484afc0f8d6ddf0">statevec_multiControlledTwoQubitUnitary</a>(qureg, ctrlQubitsMask, targetQubit1, targetQubit2, u);</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <a class="code" href="QuEST__internal_8h.html#a877d988a763a52989484afc0f8d6ddf0">statevec_multiControlledTwoQubitUnitary</a>(qureg, ctrlQubitsMask<<shift, targetQubit1+shift, targetQubit2+shift, <a class="code" href="QuEST__common_8c.html#a20d45e85dd49dd3bf6045990b590b24b">getConjugateMatrix4</a>(u));</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  }</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  </div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <a class="code" href="QuEST__qasm_8c.html#a9a385fde708958617bbeb599064b8dcb">qasm_recordComment</a>(qureg, <span class="stringliteral">"Here, an undisclosed multi-controlled 2-qubit unitary was applied."</span>);</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00103">getConjugateMatrix4()</a>, <a class="el" href="QuEST__common_8c_source.html#l00043">getQubitBitMask()</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00120">qasm_recordComment()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01385">statevec_multiControlledTwoQubitUnitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00366">validateMultiControlsMultiTargets()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00388">validateTwoQubitUnitaryMatrix()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01135">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga18c44cb3b947147951590dea2f6b25f7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga18c44cb3b947147951590dea2f6b25f7">◆ </a></span>multiControlledUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void multiControlledUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>controlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>numControlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a general multiple-control single-target unitary, which can include a global phase factor. </p>
<p>Any number of control qubits can be specified, and if all have value 1, the given unitary is applied to the target qubit. This effects the many-qubit unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & 1 \\\ & & \ddots \\ & & & u_{00} & u_{01}\\ & & & u_{10} & u_{11} \end{pmatrix} \]" src="form_63.png"/>
</p>
<p> on the control and target qubits. The given 2x2 ComplexMatrix must be unitary, otherwise an error is thrown.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 3) {controls}; \node[draw=none] at (-3.5, 0) {target}; \node[draw=none] at (0, 6) {$\vdots$}; \draw (0, 5) -- (0, 4); \draw (-2, 4) -- (2, 4); \draw[fill=black] (0, 4) circle (.2); \draw (0, 4) -- (0, 2); \draw (-2, 2) -- (2, 2); \draw[fill=black] (0, 2) circle (.2); \draw (0, 2) -- (0, 1); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {U}; \end{tikzpicture} } \]" src="form_64.png"/>
</p>
<p><br />
</p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubits</td><td>applies unitary if all qubits in this array equal 1 </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">numControlQubits</td><td>number of control qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to operate on </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">u</td><td>single-qubit unitary matrix to apply </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>numControlQubits</code> is outside [1, <code>qureg.numQubitsRepresented</code>]), or if any qubit index (<code>targetQubit</code> or one in <code>controlQubits</code>) is outside [0, <code>qureg.numQubitsRepresented</code>]), or if any qubit in <code>controlQubits</code> is repeated, or if <code>controlQubits</code> contains <code>targetQubit</code>, or if <code>u</code> is not unitary. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00372">372</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  {</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <a class="code" href="QuEST__validation_8c.html#a455024b2f504b0e9646f239d67386d36">validateMultiControlsTarget</a>(qureg, controlQubits, numControlQubits, targetQubit, __func__);</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <a class="code" href="QuEST__validation_8c.html#a0344fbbb2bb505f7db14b420153f1eb5">validateOneQubitUnitaryMatrix</a>(u, __func__);</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  </div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlQubitsMask = <a class="code" href="QuEST__common_8c.html#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a>(controlQubits, numControlQubits);</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlFlipMask = 0;</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <a class="code" href="QuEST__internal_8h.html#a7ec46b4b96cda399095a2488ceff69b6">statevec_multiControlledUnitary</a>(qureg, ctrlQubitsMask, ctrlFlipMask, targetQubit, u);</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <a class="code" href="QuEST__internal_8h.html#a7ec46b4b96cda399095a2488ceff69b6">statevec_multiControlledUnitary</a>(qureg, ctrlQubitsMask<<shift, ctrlFlipMask<<shift, targetQubit+shift, <a class="code" href="QuEST__common_8c.html#ad34d98eeaa6a3cb45e92c696cfd2d1c8">getConjugateMatrix2</a>(u));</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  }</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  </div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <a class="code" href="QuEST__qasm_8c.html#abc29cef03e4a93d5f0a67b1e8b72f66e">qasm_recordMultiControlledUnitary</a>(qureg, u, controlQubits, numControlQubits, targetQubit);</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00098">getConjugateMatrix2()</a>, <a class="el" href="QuEST__common_8c_source.html#l00043">getQubitBitMask()</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00341">qasm_recordMultiControlledUnitary()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00999">statevec_multiControlledUnitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00359">validateMultiControlsTarget()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00384">validateOneQubitUnitaryMatrix()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01239">TEST_CASE()</a>.</p>
</div>
</div>
<a id="gab5828a9f0518951451d9fec9370199ae"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gab5828a9f0518951451d9fec9370199ae">◆ </a></span>multiQubitUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void multiQubitUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>targs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>numTargs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a general multi-qubit unitary (including a global phase factor) with any number of target qubits. </p>
<p>The first target qubit in <code>targs</code> is treated as <b>least</b> sigifnicant in <code>u</code>. For example, </p><pre class="fragment">multiQubitUnitary(qureg, (int []) {a, b, c}, 3, u);
</pre><p>will invoke multiplication </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} u_{00} & u_{01} & u_{02} & u_{03} & u_{04} & u_{05} & u_{06} & u_{07} \\ u_{10} & u_{11} & u_{12} & u_{13} & u_{14} & u_{15} & u_{16} & u_{17} \\ u_{20} & u_{21} & u_{22} & u_{23} & u_{24} & u_{25} & u_{26} & u_{27} \\ u_{30} & u_{31} & u_{32} & u_{33} & u_{34} & u_{35} & u_{36} & u_{37} \\ u_{40} & u_{41} & u_{42} & u_{43} & u_{44} & u_{45} & u_{46} & u_{47} \\ u_{50} & u_{51} & u_{52} & u_{53} & u_{54} & u_{55} & u_{56} & u_{57} \\ u_{60} & u_{61} & u_{62} & u_{63} & u_{64} & u_{65} & u_{66} & u_{67} \\ u_{70} & u_{71} & u_{72} & u_{73} & u_{74} & u_{75} & u_{76} & u_{77} \\ \end{pmatrix} \begin{pmatrix} |cba\rangle = |000\rangle \\ |cba\rangle = |001\rangle \\ |cba\rangle = |010\rangle \\ |cba\rangle = |011\rangle \\ |cba\rangle = |100\rangle \\ |cba\rangle = |101\rangle \\ |cba\rangle = |110\rangle \\ |cba\rangle = |111\rangle \end{pmatrix} \]" src="form_148.png"/>
</p>
<p>The passed ComplexMatrix must be unitary and be a compatible size with the specified number of target qubits, otherwise an error is thrown.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 1) {targets}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-2,2) -- (-1, 2); \draw (1, 2) -- (2, 2); \draw (-1,-1)--(-1,3)--(1,3)--(1,-1); \node[draw=none] at (0, 1) {U}; \node[draw=none] at (0, -1) {$\vdots$}; \end{tikzpicture} } \]" src="form_149.png"/>
</p>
<p>Note that in multithreaded mode, each thread will clone 2^<code>numTargs</code> amplitudes, and store these in the runtime stack. Using t threads, the total memory overhead of this function is t*2^<code>numTargs</code>. For many targets (e.g. 16 qubits), this may cause a stack-overflow / seg-fault (e.g. on a 1 MiB stack).</p>
<p>Note too that in distributed mode, this routine requires that each node contains at least 2^<code>numTargs</code> amplitudes in the register. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q / 2^<code>numTargs</code> nodes.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targs</td><td>a list of the target qubits, ordered least significant to most in <code>u</code> </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">numTargs</td><td>the number of target qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">u</td><td>unitary matrix to apply </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if any index in <code>targs</code> is outside of [0, <code>qureg.numQubitsRepresented</code>), or if <code>targs</code> are not unique, or if matrix <code>u</code> is not unitary, or if a node cannot fit the required number of target amplitudes in distributed mode. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00295">295</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  {</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <a class="code" href="QuEST__validation_8c.html#a17409defd561446f561279caa9c443f4">validateMultiTargets</a>(qureg, targs, numTargs, __func__);</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <a class="code" href="QuEST__validation_8c.html#ab9947ff071a0c019f715f04b3833dcfd">validateMultiQubitUnitaryMatrix</a>(qureg, u, numTargs, __func__);</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  </div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <a class="code" href="QuEST__common_8c.html#ad92b16763f97e70c052eb87a5d1fd3e9">statevec_multiQubitUnitary</a>(qureg, targs, numTargs, u);</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(targs, numTargs, shift);</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <a class="code" href="QuEST__common_8c.html#a9fd917537204e074119d4f283dea78e3">setConjugateMatrixN</a>(u);</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <a class="code" href="QuEST__common_8c.html#ad92b16763f97e70c052eb87a5d1fd3e9">statevec_multiQubitUnitary</a>(qureg, targs, numTargs, u);</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(targs, numTargs, -shift);</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <a class="code" href="QuEST__common_8c.html#a9fd917537204e074119d4f283dea78e3">setConjugateMatrixN</a>(u);</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  }</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  </div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <a class="code" href="QuEST__qasm_8c.html#a9a385fde708958617bbeb599064b8dcb">qasm_recordComment</a>(qureg, <span class="stringliteral">"Here, an undisclosed multi-qubit unitary was applied."</span>);</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00120">qasm_recordComment()</a>, <a class="el" href="QuEST__common_8c_source.html#l00108">setConjugateMatrixN()</a>, <a class="el" href="QuEST__common_8c_source.html#l00149">shiftIndices()</a>, <a class="el" href="QuEST__common_8c_source.html#l00528">statevec_multiQubitUnitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00403">validateMultiQubitUnitaryMatrix()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00335">validateMultiTargets()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01310">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga34aa4865c92f9aa5d898c91286c9eca5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga34aa4865c92f9aa5d898c91286c9eca5">◆ </a></span>multiRotatePauli()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void multiRotatePauli </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>targetQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">enum <a class="el" href="group__type.html#ga1c703cf89629e4e9c7023cd402d67028">pauliOpType</a> * </td>
<td class="paramname"><em>targetPaulis</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numTargets</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a multi-qubit multi-Pauli rotation on a selected number of qubits. </p>
<p>This is the unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \exp \left( - i \theta/2 \bigotimes_{j} \hat{\sigma}_j\right) \]" src="form_122.png"/>
</p>
<p> where <img class="formulaInl" alt="$\hat{\sigma}_j \in \{X, Y, Z\}$" src="form_123.png"/> is a Pauli operator (indicated by codes 1, 2, 3 respectively in <code>targetPaulis</code>, or by enums PAULI_X, PAULI_Y and PAULI_Z) operating upon the qubit <code>targetQubits</code>[j], and <img class="formulaInl" alt="$\theta$" src="form_16.png"/> is the passed <code>angle</code>. The operators specified in <code>targetPaulis</code> act on the corresponding qubit in <code>targetQubits</code>. For example: </p><pre class="fragment">multiRotatePauli(qureg, (int[]) {4,5,8,9}, (int[]) {0,1,2,3}, 4, .1)
</pre><p>effects </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \exp \left( - i .1/2 X_5 Y_8 Z_9 \right) \]" src="form_124.png"/>
</p>
<p> on <code>qureg</code>, where unspecified qubits (along with those specified with Pauli code 0) are assumed to receive the identity operator (excluded from exponentiation). Note that specifying the identity Pauli (code=0 or PAULI_I) on a qubit is superfluous but allowed for convenience. This is means a global phase factor of <img class="formulaInl" alt="$ exp(-i \theta/2) $" src="form_125.png"/> is NOT induced by supplying 0 pauli-codes. Hence, if all <code>targetPaulis</code> are identity, then this function does nothing to <code>qureg</code>.</p>
<p>This function effects this unitary by first rotating the qubits which are nominated to receive X or Y Paulis into alternate basis, performing multiRotateZ on all target qubits receiving X, Y or Z Paulis, then restoring the original basis. In the worst case, this means that 1+2*<code>numTargets</code> primitive unitaries are performed on the statevector, and double this on density matrices.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubits</td><td>a list of the indices of the target qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetPaulis</td><td>a list of the Pauli codes (0=PAULI_I, 1=PAULI_X, 2=PAULI_Y, 3=PAULI_Z) to apply to the corresponding qubits in <code>targetQubits</code> </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">numTargets</td><td>number of target qubits, i.e. the length of <code>targetQubits</code> and <code>targetPaulis</code> </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>the angle by which the multi-qubit state is rotated </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>numQubits</code> is outside [1, <code>qureg.numQubitsRepresented</code>]), or if any qubit in <code>qubits</code> is outside [0, <code>qureg.numQubitsRepresented</code>)) or if any qubit in <code>qubits</code> is repeated. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00640">640</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  {</div>
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  <a class="code" href="QuEST__validation_8c.html#a17409defd561446f561279caa9c443f4">validateMultiTargets</a>(qureg, targetQubits, numTargets, __func__);</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  <a class="code" href="QuEST__validation_8c.html#aa194ba5f5c6e19c6caa4c715b3dbefcc">validatePauliCodes</a>(targetPaulis, numTargets, __func__);</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  </div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="keywordtype">int</span> conj=0;</div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <a class="code" href="QuEST__common_8c.html#a2153d8611247dd3a2ef483355265cc99">statevec_multiRotatePauli</a>(qureg, targetQubits, targetPaulis, numTargets, angle, conj);</div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  conj = 1;</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(targetQubits, numTargets, shift);</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <a class="code" href="QuEST__common_8c.html#a2153d8611247dd3a2ef483355265cc99">statevec_multiRotatePauli</a>(qureg, targetQubits, targetPaulis, numTargets, angle, conj);</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <a class="code" href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a>(targetQubits, numTargets, -shift);</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  }</div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  </div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="comment">// @TODO: create actual QASM</span></div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <a class="code" href="QuEST__qasm_8c.html#a9a385fde708958617bbeb599064b8dcb">qasm_recordComment</a>(qureg, </div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="stringliteral">"Here a %d-qubit multiRotatePauli of angle %g was performed (QASM not yet implemented)"</span>,</div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  numTargets, angle);</div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00120">qasm_recordComment()</a>, <a class="el" href="QuEST__common_8c_source.html#l00149">shiftIndices()</a>, <a class="el" href="QuEST__common_8c_source.html#l00410">statevec_multiRotatePauli()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00335">validateMultiTargets()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00498">validatePauliCodes()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01429">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga3250d0d95b5d755cad542a6a2372b894"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga3250d0d95b5d755cad542a6a2372b894">◆ </a></span>multiRotateZ()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void multiRotateZ </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a multi-qubit Z rotation on a selected number of qubits. </p>
<p>This is the unitary </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \exp \left( - i \theta/2 \bigotimes_{j} Z_j\right) \]" src="form_118.png"/>
</p>
<p> where the Pauli Z gates operate upon the passed list <img class="formulaInl" alt="$j \in$" src="form_119.png"/> <code>qubits</code>, and cause rotations of <img class="formulaInl" alt="$\theta =$" src="form_120.png"/> <code>angle</code>. All qubits not appearing in <code>qubits</code> are assumed to receive the identity operator. This has the effect of premultiplying every amplitude with <img class="formulaInl" alt="$\exp(\pm i \theta/2)$" src="form_121.png"/> where the sign is determined by the parity of the target qubits for that amplitude.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">qubits</td><td>a list of the indices of the target qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">numQubits</td><td>number of target qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>the angle by which the multi-qubit state is rotated around the Z axis </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>numQubits</code> is outside [1, <code>qureg.numQubitsRepresented</code>]), or if any qubit in <code>qubits</code> is outside [0, <code>qureg.numQubitsRepresented</code>]) or if any qubit in <code>qubits</code> is repeated. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00624">624</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  {</div>
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <a class="code" href="QuEST__validation_8c.html#a17409defd561446f561279caa9c443f4">validateMultiTargets</a>(qureg, qubits, numQubits, __func__);</div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  </div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask = <a class="code" href="QuEST__common_8c.html#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a>(qubits, numQubits);</div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  <a class="code" href="QuEST__internal_8h.html#a8d88b4ed94ab024e5e7b2f1f4f505b44">statevec_multiRotateZ</a>(qureg, mask, angle);</div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  <a class="code" href="QuEST__internal_8h.html#a8d88b4ed94ab024e5e7b2f1f4f505b44">statevec_multiRotateZ</a>(qureg, mask << shift, -angle);</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  }</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  </div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <span class="comment">// @TODO: create actual QASM</span></div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <a class="code" href="QuEST__qasm_8c.html#a9a385fde708958617bbeb599064b8dcb">qasm_recordComment</a>(qureg, </div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="stringliteral">"Here a %d-qubit multiRotateZ of angle %g was performed (QASM not yet implemented)"</span>,</div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  numQubits, angle);</div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00043">getQubitBitMask()</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00120">qasm_recordComment()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03069">statevec_multiRotateZ()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00335">validateMultiTargets()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01533">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga09a08f98955e75d942fdc88d4dca3e33"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga09a08f98955e75d942fdc88d4dca3e33">◆ </a></span>multiStateControlledUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void multiStateControlledUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>controlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>controlState</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>numControlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a general multiple-control, conditioned on a specific bit sequence, single-target unitary, which can include a global phase factor. </p>
<p>Any number of control qubits can be specified, along with which of their states (0 or 1) to condition upon; when the specified controls are in the specified state, the given unitary is applied to the target qubit. This is equivalent to NOTing the control bits which are conditioned on 0, calling multiControlledUnitary then NOTing the same control bits.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 3) {controls}; \node[draw=none] at (-3.5, 0) {target}; \node[draw=none] at (0, 6) {$\vdots$}; \draw (0, 5) -- (0, 4); \draw (-2, 4) -- (2, 4); \draw[fill=black] (0, 4) circle (.2); \draw (0, 4) -- (0, 2); \draw (-2, 2) -- (2, 2); \draw[fill=white] (0, 2) circle (.2); \draw (0, 2-.2) -- (0, 1); \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {U}; \end{tikzpicture} } \]" src="form_117.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubits</td><td>the indices of the control qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlState</td><td>the bit values (0 or 1) of each control qubit, upon which to condition </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">numControlQubits</td><td>number of control qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to operate the unitary upon </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">u</td><td>single-qubit unitary matrix to apply </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>numControlQubits</code> is outside [1, <code>qureg.numQubitsRepresented</code>]), or if any qubit index (<code>targetQubit</code> or one in <code>controlQubits</code>) is outside [0, <code>qureg.numQubitsRepresented</code>]), or if any qubit in <code>controlQubits</code> is repeated., or if <code>controlQubits</code> contains <code>targetQubit</code>, or if any element of controlState is not a bit (0 or 1), or if <code>u</code> is not unitary. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00387">387</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  {</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <a class="code" href="QuEST__validation_8c.html#a455024b2f504b0e9646f239d67386d36">validateMultiControlsTarget</a>(qureg, controlQubits, numControlQubits, targetQubit, __func__);</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <a class="code" href="QuEST__validation_8c.html#a0344fbbb2bb505f7db14b420153f1eb5">validateOneQubitUnitaryMatrix</a>(u, __func__);</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <a class="code" href="QuEST__validation_8c.html#ada38f885e0a4f704fb82c18a297ee1ae">validateControlState</a>(controlState, numControlQubits, __func__);</div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  </div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlQubitsMask = <a class="code" href="QuEST__common_8c.html#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a>(controlQubits, numControlQubits);</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlFlipMask = <a class="code" href="QuEST__common_8c.html#a1da0adad40d2bb1b30b04eda3598e18d">getControlFlipMask</a>(controlQubits, controlState, numControlQubits);</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <a class="code" href="QuEST__internal_8h.html#a7ec46b4b96cda399095a2488ceff69b6">statevec_multiControlledUnitary</a>(qureg, ctrlQubitsMask, ctrlFlipMask, targetQubit, u);</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <a class="code" href="QuEST__internal_8h.html#a7ec46b4b96cda399095a2488ceff69b6">statevec_multiControlledUnitary</a>(qureg, ctrlQubitsMask<<shift, ctrlFlipMask<<shift, targetQubit+shift, <a class="code" href="QuEST__common_8c.html#ad34d98eeaa6a3cb45e92c696cfd2d1c8">getConjugateMatrix2</a>(u));</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  }</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  </div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <a class="code" href="QuEST__qasm_8c.html#abecd726412180d81f76f570dbbdbcddb">qasm_recordMultiStateControlledUnitary</a>(qureg, u, controlQubits, controlState, numControlQubits, targetQubit);</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00098">getConjugateMatrix2()</a>, <a class="el" href="QuEST__common_8c_source.html#l00053">getControlFlipMask()</a>, <a class="el" href="QuEST__common_8c_source.html#l00043">getQubitBitMask()</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00362">qasm_recordMultiStateControlledUnitary()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00999">statevec_multiControlledUnitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00375">validateControlState()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00359">validateMultiControlsTarget()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00384">validateOneQubitUnitaryMatrix()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01607">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga84cd118c44b9d3866f56b865dbb9bd7d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga84cd118c44b9d3866f56b865dbb9bd7d">◆ </a></span>pauliX()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void pauliX </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply the single-qubit Pauli-X (also known as the X, sigma-X, NOT or bit-flip) gate. </p>
<p>This is a rotation of <img class="formulaInl" alt="$\pi$" src="form_65.png"/> around the x-axis on the Bloch sphere. I.e. </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} \]" src="form_66.png"/>
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {target}; \draw (-2,0) -- (2, 0); \draw (0, 0) circle (.5); \draw (0, .5) -- (0, -.5); \end{tikzpicture} } \]" src="form_67.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to operate on </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>targetQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>). </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00431">431</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  {</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  </div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <a class="code" href="QuEST__internal_8h.html#abdb6e0ee1e407755e1b944086cedd90e">statevec_pauliX</a>(qureg, targetQubit);</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <a class="code" href="QuEST__internal_8h.html#abdb6e0ee1e407755e1b944086cedd90e">statevec_pauliX</a>(qureg, targetQubit+qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  }</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  </div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <a class="code" href="QuEST__qasm_8c.html#a81749d23b8c3c1acf87c9db675872c24">qasm_recordGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa13c9487aed515148e7594e35eb8dcc55">GATE_SIGMA_X</a>, targetQubit);</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00021">GATE_SIGMA_X</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00178">qasm_recordGate()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01036">statevec_pauliX()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01716">TEST_CASE()</a>.</p>
</div>
</div>
<a id="gaa064fcf40fd02b21f98a9a83dc6cea13"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaa064fcf40fd02b21f98a9a83dc6cea13">◆ </a></span>pauliY()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void pauliY </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply the single-qubit Pauli-Y (also known as the Y or sigma-Y) gate. </p>
<p>This is a rotation of <img class="formulaInl" alt="$\pi$" src="form_65.png"/> around the Y-axis on the Bloch sphere. I.e. </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix} \]" src="form_68.png"/>
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {target}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$\sigma_y$}; \end{tikzpicture} } \]" src="form_69.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to operate on </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>targetQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>). </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00442">442</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  {</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  </div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <a class="code" href="QuEST__internal_8h.html#a73b56fbac6e464a37805fa9d9657a8f9">statevec_pauliY</a>(qureg, targetQubit);</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <a class="code" href="QuEST__internal_8h.html#aee97816cfabeea7874cd837a8d105412">statevec_pauliYConj</a>(qureg, targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  }</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  </div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <a class="code" href="QuEST__qasm_8c.html#a81749d23b8c3c1acf87c9db675872c24">qasm_recordGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725faa29b98cbb581abf5ec338a1763de7a1b">GATE_SIGMA_Y</a>, targetQubit);</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00022">GATE_SIGMA_Y</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00178">qasm_recordGate()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01092">statevec_pauliY()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01117">statevec_pauliYConj()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01755">TEST_CASE()</a>.</p>
</div>
</div>
<a id="gadf988ee16f38ddaf404552c41ea2b745"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gadf988ee16f38ddaf404552c41ea2b745">◆ </a></span>pauliZ()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void pauliZ </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply the single-qubit Pauli-Z (also known as the Z, sigma-Z or phase-flip) gate. </p>
<p>This is a rotation of <img class="formulaInl" alt="$\pi$" src="form_65.png"/> around the Z-axis (a phase shift) on the Bloch sphere. I.e. </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix} \]" src="form_70.png"/>
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {target}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$\sigma_z$}; \end{tikzpicture} } \]" src="form_71.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to operate on </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>targetQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>). </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00453">453</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  {</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  </div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <a class="code" href="QuEST__common_8c.html#ad711cac41adb0fea1ad4797ce14953e0">statevec_pauliZ</a>(qureg, targetQubit);</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <a class="code" href="QuEST__common_8c.html#ad711cac41adb0fea1ad4797ce14953e0">statevec_pauliZ</a>(qureg, targetQubit+qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  }</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  </div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <a class="code" href="QuEST__qasm_8c.html#a81749d23b8c3c1acf87c9db675872c24">qasm_recordGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa228cd6a7ad18928b794ee7ad1f1fc85e">GATE_SIGMA_Z</a>, targetQubit);</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00023">GATE_SIGMA_Z</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00178">qasm_recordGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00257">statevec_pauliZ()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01794">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga05c7b8c9491410215e277ea83c0dfef8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga05c7b8c9491410215e277ea83c0dfef8">◆ </a></span>phaseShift()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void phaseShift </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Shift the phase between <img class="formulaInl" alt="$ |0\rangle $" src="form_14.png"/> and <img class="formulaInl" alt="$ |1\rangle $" src="form_15.png"/> of a single qubit by a given angle. </p>
<p>This is equivalent to a rotation Z-axis of the Bloch-sphere up to a global phase factor. For angle <img class="formulaInl" alt="$\theta$" src="form_16.png"/>, applies </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 & 0 \\ 0 & \exp(i \theta) \end{pmatrix} \]" src="form_17.png"/>
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {rot}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$R_\theta$}; \end{tikzpicture} } \]" src="form_18.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to undergo a phase shift </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>amount by which to shift the phase in radians </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>targetQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>). </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00486">486</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  {</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  </div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <a class="code" href="QuEST__common_8c.html#a37bcd16fc0bbc8e665585ba9b99f382b">statevec_phaseShift</a>(qureg, targetQubit, angle);</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <a class="code" href="QuEST__common_8c.html#a37bcd16fc0bbc8e665585ba9b99f382b">statevec_phaseShift</a>(qureg, targetQubit+qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>, -angle);</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  }</div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  </div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <a class="code" href="QuEST__qasm_8c.html#aabeb3e9ec6b2f30938c4cf9592e624fa">qasm_recordParamGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa4668b36d21aaeba1fb605b73881ca507">GATE_PHASE_SHIFT</a>, targetQubit, angle);</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00032">GATE_PHASE_SHIFT</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00186">qasm_recordParamGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00250">statevec_phaseShift()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01833">TEST_CASE()</a>.</p>
</div>
</div>
<a id="gac5c485fe330636966effc0642ba2bd99"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gac5c485fe330636966effc0642ba2bd99">◆ </a></span>rotateAroundAxis()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void rotateAroundAxis </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>rotQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structVector.html">Vector</a> </td>
<td class="paramname"><em>axis</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Rotate a single qubit by a given angle around a given <a class="el" href="structVector.html">Vector</a> on the Bloch-sphere. </p>
<p><br />
The vector must not be zero (else an error is thrown), but needn't be unit magnitude, since it will be normalised by QuEST.</p>
<p>For angle <img class="formulaInl" alt="$\theta$" src="form_16.png"/> and axis vector <img class="formulaInl" alt="$\vec{n}$" src="form_52.png"/>, applies <img class="formulaInl" alt="$R_{\hat{n}} = \exp \left(- i \frac{\theta}{2} \hat{n} \cdot \vec{\sigma} \right) $" src="form_53.png"/> where <img class="formulaInl" alt="$\vec{\sigma}$" src="form_54.png"/> is the vector of Pauli matrices.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rotQubit</td><td>qubit to rotate </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>angle by which to rotate in radians </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">axis</td><td>vector around which to rotate (can be non-unit; will be normalised) </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>rotQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>), or if <code>axis</code> is the zero vector </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00573">573</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  {</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, rotQubit, __func__);</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <a class="code" href="QuEST__validation_8c.html#a782c6f57939eeb72b7be8e247979f3be">validateVector</a>(axis, __func__);</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  </div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <a class="code" href="QuEST__common_8c.html#a65b9087ca37c096caa5c6e8586b67946">statevec_rotateAroundAxis</a>(qureg, rotQubit, angle, axis);</div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <a class="code" href="QuEST__common_8c.html#af9839c40de8df0cecc72a0258a20d979">statevec_rotateAroundAxisConj</a>(qureg, rotQubit+shift, angle, axis);</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  }</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  </div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <a class="code" href="QuEST__qasm_8c.html#a221776c7112dd6ab8aa13a164abc7e18">qasm_recordAxisRotation</a>(qureg, angle, axis, rotQubit);</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00223">qasm_recordAxisRotation()</a>, <a class="el" href="QuEST__common_8c_source.html#l00310">statevec_rotateAroundAxis()</a>, <a class="el" href="QuEST__common_8c_source.html#l00317">statevec_rotateAroundAxisConj()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00414">validateVector()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01873">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga5fb1514d67ab43917dc64a357e711425"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga5fb1514d67ab43917dc64a357e711425">◆ </a></span>rotateX()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void rotateX </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>rotQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Rotate a single qubit by a given angle around the X-axis of the Bloch-sphere. </p>
<p>For angle <img class="formulaInl" alt="$\theta$" src="form_16.png"/>, applies </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} \cos\theta/2 & -i \sin \theta/2\\ -i \sin \theta/2 & \cos \theta/2 \end{pmatrix} \]" src="form_46.png"/>
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {rot}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$R_x(\theta)$}; \end{tikzpicture} } \]" src="form_47.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rotQubit</td><td>qubit to rotate </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>angle by which to rotate in radians </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>rotQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>). </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00186">186</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  {</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  </div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <a class="code" href="QuEST__common_8c.html#aca123cc22e13a2cb819ef6c2f455b9e4">statevec_rotateX</a>(qureg, targetQubit, angle);</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <a class="code" href="QuEST__common_8c.html#aca123cc22e13a2cb819ef6c2f455b9e4">statevec_rotateX</a>(qureg, targetQubit+qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>, -angle);</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  }</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  </div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <a class="code" href="QuEST__qasm_8c.html#aabeb3e9ec6b2f30938c4cf9592e624fa">qasm_recordParamGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fada07505b73935b2788032efd30a1a361">GATE_ROTATE_X</a>, targetQubit, angle);</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00027">GATE_ROTATE_X</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00186">qasm_recordParamGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00292">statevec_rotateX()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01929">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga680f90d42e56950f40d11d695596a363"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga680f90d42e56950f40d11d695596a363">◆ </a></span>rotateY()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void rotateY </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>rotQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Rotate a single qubit by a given angle around the Y-axis of the Bloch-sphere. </p>
<p>For angle <img class="formulaInl" alt="$\theta$" src="form_16.png"/>, applies </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} \cos\theta/2 & - \sin \theta/2\\ \sin \theta/2 & \cos \theta/2 \end{pmatrix} \]" src="form_48.png"/>
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {rot}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$R_y(\theta)$}; \end{tikzpicture} } \]" src="form_49.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rotQubit</td><td>qubit to rotate </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>angle by which to rotate in radians </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>rotQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>). </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc, debug) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00197">197</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  {</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  </div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <a class="code" href="QuEST__common_8c.html#a4a62c8c00dc4adf74b982ad8a9049170">statevec_rotateY</a>(qureg, targetQubit, angle);</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <a class="code" href="QuEST__common_8c.html#a4a62c8c00dc4adf74b982ad8a9049170">statevec_rotateY</a>(qureg, targetQubit+qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>, angle);</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  }</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  </div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <a class="code" href="QuEST__qasm_8c.html#aabeb3e9ec6b2f30938c4cf9592e624fa">qasm_recordParamGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fae1267d5de573dc2901aa8e724ac1d689">GATE_ROTATE_Y</a>, targetQubit, angle);</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00028">GATE_ROTATE_Y</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00186">qasm_recordParamGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00298">statevec_rotateY()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l01969">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga30675e80b054d5adf556ae00f98377d9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga30675e80b054d5adf556ae00f98377d9">◆ </a></span>rotateZ()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void rotateZ </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>rotQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Rotate a single qubit by a given angle around the Z-axis of the Bloch-sphere (also known as a phase shift gate). </p>
<p><br />
For angle <img class="formulaInl" alt="$\theta$" src="form_16.png"/>, applies </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} \exp(-i \theta/2) & 0 \\ 0 & \exp(i \theta/2) \end{pmatrix} \]" src="form_50.png"/>
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {rot}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {$R_z(\theta)$}; \end{tikzpicture} } \]" src="form_51.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rotQubit</td><td>qubit to rotate </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">angle</td><td>angle by which to rotate in radians </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>rotQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>). </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00208">208</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  {</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  </div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <a class="code" href="QuEST__common_8c.html#ab96ee09e32e297629a481c3ba6d7eaf7">statevec_rotateZ</a>(qureg, targetQubit, angle);</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <a class="code" href="QuEST__common_8c.html#ab96ee09e32e297629a481c3ba6d7eaf7">statevec_rotateZ</a>(qureg, targetQubit+qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>, -angle);</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  }</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  </div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <a class="code" href="QuEST__qasm_8c.html#aabeb3e9ec6b2f30938c4cf9592e624fa">qasm_recordParamGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa0cdc4c588d02a515a68515dd3f24d877">GATE_ROTATE_Z</a>, targetQubit, angle);</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00029">GATE_ROTATE_Z</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00186">qasm_recordParamGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00304">statevec_rotateZ()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l02009">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga67a83cdbd8d6ae77f91aa011cf09907a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga67a83cdbd8d6ae77f91aa011cf09907a">◆ </a></span>sGate()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void sGate </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply the single-qubit S gate. </p>
<p>This is a rotation of <img class="formulaInl" alt="$\pi/2$" src="form_29.png"/> around the Z-axis on the Bloch sphere, or the unitary: </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 & 0 \\ 0 & i \end{pmatrix} \]" src="form_30.png"/>
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {target}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {S}; \end{tikzpicture} } \]" src="form_31.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to operate upon </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>targetQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>) </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00464">464</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  {</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  </div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <a class="code" href="QuEST__common_8c.html#aea5b9ea10791217a793a8040c36e4efc">statevec_sGate</a>(qureg, targetQubit);</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <a class="code" href="QuEST__common_8c.html#a78bfeb90f0c1812e726ec3092056bb52">statevec_sGateConj</a>(qureg, targetQubit+qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  }</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  </div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <a class="code" href="QuEST__qasm_8c.html#a81749d23b8c3c1acf87c9db675872c24">qasm_recordGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa5053f3d968443bc04e8b1d09f18bab9a">GATE_S</a>, targetQubit);</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00025">GATE_S</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00178">qasm_recordGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00264">statevec_sGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00278">statevec_sGateConj()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l02049">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga75d5e65f87c68403602a669b9c6d52b0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga75d5e65f87c68403602a669b9c6d52b0">◆ </a></span>sqrtSwapGate()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void sqrtSwapGate </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Performs a sqrt SWAP gate between <code>qubit1</code> and <code>qubit2</code>. </p>
<p>This effects </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & \frac{1}{2}(1+i) & \frac{1}{2}(1-i) \\\ & \frac{1}{2}(1-i) & \frac{1}{2}(1+i) \\ & & & 1 \end{pmatrix} \]" src="form_115.png"/>
</p>
<p> on the designated qubits, though is performed internally by three CNOT gates.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {qubit1}; \node[draw=none] at (-3.5, 0) {qubit2}; \draw (-2, 2) -- (2, 2); \draw (0, 2) -- (0, 0); \draw (-2,0) -- (2, 0); \draw (-.35,-.35) -- (.35,.35); \draw (-.35,.35) -- (.35,-.35); \draw (-.35,-.35 + 2) -- (.35,.35 + 2); \draw (-.35,.35 + 2) -- (.35,-.35 + 2); \draw[fill=white] (0, 1) circle (.5); \node[draw=none] at (0, 1) {1/2}; \end{tikzpicture} } \]" src="form_116.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">qubit1</td><td>qubit to sqrt swap </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">qubit2</td><td>other qubit to sqrt swap </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if either <code>qubit1</code> or <code>qubit2</code> are outside [0, <code>qureg.numQubitsRepresented</code>), or are equal. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00611">611</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  {</div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  <a class="code" href="QuEST__validation_8c.html#aed5f85789dc4fa43b64e99e6b538035c">validateUniqueTargets</a>(qureg, qb1, qb2, __func__);</div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <a class="code" href="QuEST__validation_8c.html#aa28b7d9c0c3cf9c4be0e324fb9d6bf76">validateMultiQubitMatrixFitsInNode</a>(qureg, 2, __func__); <span class="comment">// uses 2qb unitary in QuEST_common</span></div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  </div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  <a class="code" href="QuEST__common_8c.html#a6550462400942be61b171c8840b36aa1">statevec_sqrtSwapGate</a>(qureg, qb1, qb2);</div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <a class="code" href="QuEST__common_8c.html#a33cde9b6518d55a544eff20301a5d844">statevec_sqrtSwapGateConj</a>(qureg, qb1+shift, qb2+shift);</div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  }</div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  </div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <a class="code" href="QuEST__qasm_8c.html#aa4c380db9eda18892d5a86825fa4b165">qasm_recordControlledGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fab656861dfb036cbcf7009f02a8949253">GATE_SQRT_SWAP</a>, qb1, qb2);</div>
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00034">GATE_SQRT_SWAP</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00238">qasm_recordControlledGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00383">statevec_sqrtSwapGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00396">statevec_sqrtSwapGateConj()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00380">validateMultiQubitMatrixFitsInNode()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00321">validateUniqueTargets()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l02088">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga820fd139c035136819e371308c206e36"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga820fd139c035136819e371308c206e36">◆ </a></span>swapGate()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void swapGate </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Performs a SWAP gate between <code>qubit1</code> and <code>qubit2</code>. </p>
<p>This effects </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 \\ & & 1 \\\ & 1 \\ & & & 1 \end{pmatrix} \]" src="form_113.png"/>
</p>
<p> on the designated qubits, though is performed internally by three CNOT gates.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 2) {qubit1}; \node[draw=none] at (-3.5, 0) {qubit2}; \draw (-2, 2) -- (2, 2); \draw (0, 2) -- (0, 0); \draw (-2,0) -- (2, 0); \draw (-.35,-.35) -- (.35,.35); \draw (-.35,.35) -- (.35,-.35); \draw (-.35,-.35 + 2) -- (.35,.35 + 2); \draw (-.35,.35 + 2) -- (.35,-.35 + 2); \end{tikzpicture} } \]" src="form_114.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">qubit1</td><td>qubit to swap </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">qubit2</td><td>other qubit to swap </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if either <code>qubit1</code> or <code>qubit2</code> are outside [0, <code>qureg.numQubitsRepresented</code>), or are equal. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00599">599</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  {</div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <a class="code" href="QuEST__validation_8c.html#aed5f85789dc4fa43b64e99e6b538035c">validateUniqueTargets</a>(qureg, qb1, qb2, __func__);</div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  </div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <a class="code" href="QuEST__internal_8h.html#ab7478fcaf6357ab202d72853b672e375">statevec_swapQubitAmps</a>(qureg, qb1, qb2);</div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <a class="code" href="QuEST__internal_8h.html#ab7478fcaf6357ab202d72853b672e375">statevec_swapQubitAmps</a>(qureg, qb1+shift, qb2+shift);</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  }</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  </div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <a class="code" href="QuEST__qasm_8c.html#aa4c380db9eda18892d5a86825fa4b165">qasm_recordControlledGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fab12d052de2b7c59c6ab87710fd7d3c78">GATE_SWAP</a>, qb1, qb2);</div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00033">GATE_SWAP</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00238">qasm_recordControlledGate()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01358">statevec_swapQubitAmps()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00321">validateUniqueTargets()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l02138">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga3c500a891a522fd3045c379489f0252a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga3c500a891a522fd3045c379489f0252a">◆ </a></span>tGate()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void tGate </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply the single-qubit T gate. </p>
<p>This is a rotation of <img class="formulaInl" alt="$\pi/4$" src="form_32.png"/> around the Z-axis on the Bloch sphere, or the unitary: </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} 1 & 0 \\ 0 & \exp\left(i \frac{\pi}{4}\right) \end{pmatrix} \]" src="form_33.png"/>
</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {target}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {T}; \end{tikzpicture} } \]" src="form_34.png"/>
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to operate upon </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>targetQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>) </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00475">475</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  {</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  </div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <a class="code" href="QuEST__common_8c.html#a0bd738cb7e7cdea8f1ce1e640d427d4c">statevec_tGate</a>(qureg, targetQubit);</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <a class="code" href="QuEST__common_8c.html#a3ce1b05fee70d930791513fec378d229">statevec_tGateConj</a>(qureg, targetQubit+qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  }</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  </div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <a class="code" href="QuEST__qasm_8c.html#a81749d23b8c3c1acf87c9db675872c24">qasm_recordGate</a>(qureg, <a class="code" href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fadfa058950331ffdba0bf56cb2272e01f">GATE_T</a>, targetQubit);</div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__qasm_8h_source.html#l00024">GATE_T</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00178">qasm_recordGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00271">statevec_tGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00285">statevec_tGateConj()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l02186">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga81cf22c68db66bf9b4593a5d1b3f528c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga81cf22c68db66bf9b4593a5d1b3f528c">◆ </a></span>twoQubitUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void twoQubitUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a general two-qubit unitary (including a global phase factor). </p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {target2}; \node[draw=none] at (-3.5, 2) {target1}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-2,2) -- (-1, 2); \draw (1, 2) -- (2, 2); \draw (-1,-1)--(-1,3)--(1,3)--(1,-1)--cycle; \node[draw=none] at (0, 1) {U}; \end{tikzpicture} } \]" src="form_141.png"/>
</p>
<p><code>targetQubit1</code> is treated as the <code>least</code> significant qubit in <code>u</code>, such that a row in <code>u</code> is dotted with the vector <img class="formulaInl" alt="$ |\text{targetQubit2} \;\; \text{targetQubit1}\rangle : \{ |00\rangle, |01\rangle, |10\rangle, |11\rangle \} $" src="form_142.png"/></p>
<p>For example, </p><pre class="fragment">twoQubitUnitary(qureg, a, b, u);
</pre><p>will invoke multiplication </p><p class="formulaDsp">
<img class="formulaDsp" alt="\[ \begin{pmatrix} u_{00} & u_{01} & u_{02} & u_{03} \\ u_{10} & u_{11} & u_{12} & u_{13} \\ u_{20} & u_{21} & u_{22} & u_{23} \\ u_{30} & u_{31} & u_{32} & u_{33} \end{pmatrix} \begin{pmatrix} |ba\rangle = |00\rangle \\ |ba\rangle = |01\rangle \\ |ba\rangle = |10\rangle \\ |ba\rangle = |11\rangle \end{pmatrix} \]" src="form_143.png"/>
</p>
<p>The passed 4x4 ComplexMatrix must be unitary, otherwise an error is thrown.</p>
<p>Note that in distributed mode, this routine requires that each node contains at least 4 amplitudes. This means an q-qubit register (state vector or density matrix) can be distributed by at most 2^q/4 nodes.</p>
<p><br />
</p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit1</td><td>first qubit to operate on, treated as least significant in <code>u</code> </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit2</td><td>second qubit to operate on, treated as most significant in <code>u</code> </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">u</td><td>unitary matrix to apply </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>targetQubit1</code> or <code>targetQubit2</code> are outside [0, <code>qureg.numQubitsRepresented</code>), or if <code>targetQubit1</code> equals <code>targetQubit2</code>, or matrix <code>u</code> is not unitary, or if each node cannot fit 4 amplitudes in distributed mode. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Tyson Jones </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00255">255</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  {</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <a class="code" href="QuEST__validation_8c.html#a17409defd561446f561279caa9c443f4">validateMultiTargets</a>(qureg, (<span class="keywordtype">int</span> []) {targetQubit1, targetQubit2}, 2, __func__);</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <a class="code" href="QuEST__validation_8c.html#a654db9d60abdcae26427e7d3b3d9c432">validateTwoQubitUnitaryMatrix</a>(qureg, u, __func__);</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  </div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <a class="code" href="QuEST__common_8c.html#aa8db9b25aae536cdf8054afb6503b7f4">statevec_twoQubitUnitary</a>(qureg, targetQubit1, targetQubit2, u);</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordtype">int</span> shift = qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <a class="code" href="QuEST__common_8c.html#aa8db9b25aae536cdf8054afb6503b7f4">statevec_twoQubitUnitary</a>(qureg, targetQubit1+shift, targetQubit2+shift, <a class="code" href="QuEST__common_8c.html#a20d45e85dd49dd3bf6045990b590b24b">getConjugateMatrix4</a>(u));</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  }</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  </div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <a class="code" href="QuEST__qasm_8c.html#a9a385fde708958617bbeb599064b8dcb">qasm_recordComment</a>(qureg, <span class="stringliteral">"Here, an undisclosed 2-qubit unitary was applied."</span>);</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00103">getConjugateMatrix4()</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00120">qasm_recordComment()</a>, <a class="el" href="QuEST__common_8c_source.html#l00516">statevec_twoQubitUnitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00335">validateMultiTargets()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00388">validateTwoQubitUnitaryMatrix()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l02225">TEST_CASE()</a>.</p>
</div>
</div>
<a id="ga5a117f81298e8ed894d964198e737757"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga5a117f81298e8ed894d964198e737757">◆ </a></span>unitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void unitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a general single-qubit unitary (including a global phase factor). </p>
<p>The passed 2x2 ComplexMatrix must be unitary, otherwise an error is thrown.</p>
<p class="formulaDsp">
<img class="formulaDsp" alt="\[ \setlength{\fboxrule}{0.01pt} \fbox{ \begin{tikzpicture}[scale=.5] \node[draw=none] at (-3.5, 0) {target}; \draw (-2,0) -- (-1, 0); \draw (1, 0) -- (2, 0); \draw (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle; \node[draw=none] at (0, 0) {U}; \end{tikzpicture} } \]" src="form_45.png"/>
</p>
<p><br />
</p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of all qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to operate on </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">u</td><td>unitary matrix to apply </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">exitWithError</td><td>if <code>targetQubit</code> is outside [0, <code>qureg.numQubitsRepresented</code>), or matrix <code>u</code> is not unitary. </td></tr>
</table>
</dd>
</dl>
<dl class="section author"><dt>Author</dt><dd>Ania Brown (state-vector) </dd>
<dd>
Tyson Jones (density matrix, doc) </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST_8c_source.html#l00347">347</a> of file <a class="el" href="QuEST_8c_source.html">QuEST.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  {</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <a class="code" href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a>(qureg, targetQubit, __func__);</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <a class="code" href="QuEST__validation_8c.html#a0344fbbb2bb505f7db14b420153f1eb5">validateOneQubitUnitaryMatrix</a>(u, __func__);</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  </div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <a class="code" href="QuEST__internal_8h.html#a4bea7ed7967083cbabd8a8e5acdd48c0">statevec_unitary</a>(qureg, targetQubit, u);</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a>) {</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <a class="code" href="QuEST__internal_8h.html#a4bea7ed7967083cbabd8a8e5acdd48c0">statevec_unitary</a>(qureg, targetQubit+qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>, <a class="code" href="QuEST__common_8c.html#ad34d98eeaa6a3cb45e92c696cfd2d1c8">getConjugateMatrix2</a>(u));</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  }</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  </div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <a class="code" href="QuEST__qasm_8c.html#ad22260712869e79f07d2f04e2b41a233">qasm_recordUnitary</a>(qureg, u, targetQubit);</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00098">getConjugateMatrix2()</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST__qasm_8c_source.html#l00207">qasm_recordUnitary()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00883">statevec_unitary()</a>, <a class="el" href="QuEST__validation_8c_source.html#l00384">validateOneQubitUnitaryMatrix()</a>, and <a class="el" href="QuEST__validation_8c_source.html#l00307">validateTarget()</a>.</p>
<p class="reference">Referenced by <a class="el" href="test__unitaries_8cpp_source.html#l02290">TEST_CASE()</a>.</p>
</div>
</div>
</div><!-- contents -->
<div class="ttc" id="aQuEST__internal_8h_html_aee97816cfabeea7874cd837a8d105412"><div class="ttname"><a href="QuEST__internal_8h.html#aee97816cfabeea7874cd837a8d105412">statevec_pauliYConj</a></div><div class="ttdeci">void statevec_pauliYConj(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l01117">QuEST_cpu_distributed.c:1117</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_ac31c45c5a31c523be0eb26abba6cf598"><div class="ttname"><a href="QuEST__validation_8c.html#ac31c45c5a31c523be0eb26abba6cf598">validateTarget</a></div><div class="ttdeci">void validateTarget(Qureg qureg, int targetQubit, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00307">QuEST_validation.c:307</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_ad92b16763f97e70c052eb87a5d1fd3e9"><div class="ttname"><a href="QuEST__common_8c.html#ad92b16763f97e70c052eb87a5d1fd3e9">statevec_multiQubitUnitary</a></div><div class="ttdeci">void statevec_multiQubitUnitary(Qureg qureg, int *targets, const int numTargets, ComplexMatrixN u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00528">QuEST_common.c:528</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a73b56fbac6e464a37805fa9d9657a8f9"><div class="ttname"><a href="QuEST__internal_8h.html#a73b56fbac6e464a37805fa9d9657a8f9">statevec_pauliY</a></div><div class="ttdeci">void statevec_pauliY(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l01092">QuEST_cpu_distributed.c:1092</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a9226f386d010aaa85efc0e8889d341d5"><div class="ttname"><a href="QuEST__internal_8h.html#a9226f386d010aaa85efc0e8889d341d5">statevec_hadamard</a></div><div class="ttdeci">void statevec_hadamard(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l01208">QuEST_cpu_distributed.c:1208</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_aabeb3e9ec6b2f30938c4cf9592e624fa"><div class="ttname"><a href="QuEST__qasm_8c.html#aabeb3e9ec6b2f30938c4cf9592e624fa">qasm_recordParamGate</a></div><div class="ttdeci">void qasm_recordParamGate(Qureg qureg, TargetGate gate, int targetQubit, qreal param)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00186">QuEST_qasm.c:186</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_acf1c651a4359a370a2d9b3e1e1ebd430"><div class="ttname"><a href="QuEST__common_8c.html#acf1c651a4359a370a2d9b3e1e1ebd430">shiftIndices</a></div><div class="ttdeci">void shiftIndices(int *indices, int numIndices, int shift)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00149">QuEST_common.c:149</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725fadfa058950331ffdba0bf56cb2272e01f"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fadfa058950331ffdba0bf56cb2272e01f">GATE_T</a></div><div class="ttdeci">@ GATE_T</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00024">QuEST_qasm.h:24</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725fa4668b36d21aaeba1fb605b73881ca507"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa4668b36d21aaeba1fb605b73881ca507">GATE_PHASE_SHIFT</a></div><div class="ttdeci">@ GATE_PHASE_SHIFT</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00032">QuEST_qasm.h:32</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_ad22260712869e79f07d2f04e2b41a233"><div class="ttname"><a href="QuEST__qasm_8c.html#ad22260712869e79f07d2f04e2b41a233">qasm_recordUnitary</a></div><div class="ttdeci">void qasm_recordUnitary(Qureg qureg, ComplexMatrix2 u, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00207">QuEST_qasm.c:207</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_aeb4ddeb09a3c0fa39ac33984bd5ca0ea"><div class="ttname"><a href="QuEST__common_8c.html#aeb4ddeb09a3c0fa39ac33984bd5ca0ea">statevec_controlledRotateAroundAxisConj</a></div><div class="ttdeci">void statevec_controlledRotateAroundAxisConj(Qureg qureg, const int controlQubit, const int targetQubit, qreal angle, Vector axis)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00333">QuEST_common.c:333</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_aaa550b31c5576f9305f57cfe68b6dfbe"><div class="ttname"><a href="QuEST__common_8c.html#aaa550b31c5576f9305f57cfe68b6dfbe">statevec_controlledTwoQubitUnitary</a></div><div class="ttdeci">void statevec_controlledTwoQubitUnitary(Qureg qureg, const int controlQubit, const int targetQubit1, const int targetQubit2, ComplexMatrix4 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00522">QuEST_common.c:522</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_aa28b7d9c0c3cf9c4be0e324fb9d6bf76"><div class="ttname"><a href="QuEST__validation_8c.html#aa28b7d9c0c3cf9c4be0e324fb9d6bf76">validateMultiQubitMatrixFitsInNode</a></div><div class="ttdeci">void validateMultiQubitMatrixFitsInNode(Qureg qureg, int numTargets, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00380">QuEST_validation.c:380</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a37bcd16fc0bbc8e665585ba9b99f382b"><div class="ttname"><a href="QuEST__common_8c.html#a37bcd16fc0bbc8e665585ba9b99f382b">statevec_phaseShift</a></div><div class="ttdeci">void statevec_phaseShift(Qureg qureg, const int targetQubit, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00250">QuEST_common.c:250</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a20d45e85dd49dd3bf6045990b590b24b"><div class="ttname"><a href="QuEST__common_8c.html#a20d45e85dd49dd3bf6045990b590b24b">getConjugateMatrix4</a></div><div class="ttdeci">ComplexMatrix4 getConjugateMatrix4(ComplexMatrix4 src)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00103">QuEST_common.c:103</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725fada07505b73935b2788032efd30a1a361"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fada07505b73935b2788032efd30a1a361">GATE_ROTATE_X</a></div><div class="ttdeci">@ GATE_ROTATE_X</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00027">QuEST_qasm.h:27</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_ab9947ff071a0c019f715f04b3833dcfd"><div class="ttname"><a href="QuEST__validation_8c.html#ab9947ff071a0c019f715f04b3833dcfd">validateMultiQubitUnitaryMatrix</a></div><div class="ttdeci">void validateMultiQubitUnitaryMatrix(Qureg qureg, ComplexMatrixN u, int numTargs, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00403">QuEST_validation.c:403</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a8d88b4ed94ab024e5e7b2f1f4f505b44"><div class="ttname"><a href="QuEST__internal_8h.html#a8d88b4ed94ab024e5e7b2f1f4f505b44">statevec_multiRotateZ</a></div><div class="ttdeci">void statevec_multiRotateZ(Qureg qureg, long long int mask, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu_8c_source.html#l03069">QuEST_cpu.c:3069</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a47dcab9a0e6b07ddde264ed924add26c"><div class="ttname"><a href="QuEST__internal_8h.html#a47dcab9a0e6b07ddde264ed924add26c">statevec_multiControlledMultiQubitUnitary</a></div><div class="ttdeci">void statevec_multiControlledMultiQubitUnitary(Qureg qureg, long long int ctrlMask, int *targs, const int numTargs, ComplexMatrixN u)</div><div class="ttdoc">This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks ...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l01441">QuEST_cpu_distributed.c:1441</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_a6bd68fa9c0c1bd9c9f9af714ea0b8b03"><div class="ttname"><a href="QuEST__qasm_8c.html#a6bd68fa9c0c1bd9c9f9af714ea0b8b03">qasm_recordControlledCompactUnitary</a></div><div class="ttdeci">void qasm_recordControlledCompactUnitary(Qureg qureg, Complex alpha, Complex beta, int controlQubit, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00264">QuEST_qasm.c:264</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725fa0cdc4c588d02a515a68515dd3f24d877"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa0cdc4c588d02a515a68515dd3f24d877">GATE_ROTATE_Z</a></div><div class="ttdeci">@ GATE_ROTATE_Z</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00029">QuEST_qasm.h:29</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725fa228cd6a7ad18928b794ee7ad1f1fc85e"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa228cd6a7ad18928b794ee7ad1f1fc85e">GATE_SIGMA_Z</a></div><div class="ttdeci">@ GATE_SIGMA_Z</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00023">QuEST_qasm.h:23</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_abdb6e0ee1e407755e1b944086cedd90e"><div class="ttname"><a href="QuEST__internal_8h.html#abdb6e0ee1e407755e1b944086cedd90e">statevec_pauliX</a></div><div class="ttdeci">void statevec_pauliX(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l01036">QuEST_cpu_distributed.c:1036</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_af92fa737f4491324408b3d15543dced4"><div class="ttname"><a href="QuEST__common_8c.html#af92fa737f4491324408b3d15543dced4">getConjugateScalar</a></div><div class="ttdeci">Complex getConjugateScalar(Complex scalar)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00084">QuEST_common.c:84</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725fa8417e56d80add49216437e0d451e8dd9"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa8417e56d80add49216437e0d451e8dd9">GATE_HADAMARD</a></div><div class="ttdeci">@ GATE_HADAMARD</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00026">QuEST_qasm.h:26</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_ad34d98eeaa6a3cb45e92c696cfd2d1c8"><div class="ttname"><a href="QuEST__common_8c.html#ad34d98eeaa6a3cb45e92c696cfd2d1c8">getConjugateMatrix2</a></div><div class="ttdeci">ComplexMatrix2 getConjugateMatrix2(ComplexMatrix2 src)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00098">QuEST_common.c:98</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_ab96ee09e32e297629a481c3ba6d7eaf7"><div class="ttname"><a href="QuEST__common_8c.html#ab96ee09e32e297629a481c3ba6d7eaf7">statevec_rotateZ</a></div><div class="ttdeci">void statevec_rotateZ(Qureg qureg, const int rotQubit, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00304">QuEST_common.c:304</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a114038296eb404b9b8a66aaad7b48800"><div class="ttname"><a href="QuEST__internal_8h.html#a114038296eb404b9b8a66aaad7b48800">statevec_controlledNot</a></div><div class="ttdeci">void statevec_controlledNot(Qureg qureg, const int controlQubit, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l01063">QuEST_cpu_distributed.c:1063</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_a17409defd561446f561279caa9c443f4"><div class="ttname"><a href="QuEST__validation_8c.html#a17409defd561446f561279caa9c443f4">validateMultiTargets</a></div><div class="ttdeci">void validateMultiTargets(Qureg qureg, int *targetQubits, const int numTargetQubits, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00335">QuEST_validation.c:335</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_aa662796ea6e0f471143c53becae8c12c"><div class="ttname"><a href="QuEST__internal_8h.html#aa662796ea6e0f471143c53becae8c12c">statevec_multiControlledPhaseShift</a></div><div class="ttdeci">void statevec_multiControlledPhaseShift(Qureg qureg, int *controlQubits, int numControlQubits, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu_8c_source.html#l03019">QuEST_cpu.c:3019</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a1da0adad40d2bb1b30b04eda3598e18d"><div class="ttname"><a href="QuEST__common_8c.html#a1da0adad40d2bb1b30b04eda3598e18d">getControlFlipMask</a></div><div class="ttdeci">long long int getControlFlipMask(int *controlQubits, int *controlState, const int numControlQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00053">QuEST_common.c:53</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a6550462400942be61b171c8840b36aa1"><div class="ttname"><a href="QuEST__common_8c.html#a6550462400942be61b171c8840b36aa1">statevec_sqrtSwapGate</a></div><div class="ttdeci">void statevec_sqrtSwapGate(Qureg qureg, int qb1, int qb2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00383">QuEST_common.c:383</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_aeca17d22c413cddbd4f5fd99712a2496"><div class="ttname"><a href="QuEST__qasm_8c.html#aeca17d22c413cddbd4f5fd99712a2496">qasm_recordMultiControlledParamGate</a></div><div class="ttdeci">void qasm_recordMultiControlledParamGate(Qureg qureg, TargetGate gate, int *controlQubits, const int numControlQubits, const int targetQubit, qreal param)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00324">QuEST_qasm.c:324</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_a221776c7112dd6ab8aa13a164abc7e18"><div class="ttname"><a href="QuEST__qasm_8c.html#a221776c7112dd6ab8aa13a164abc7e18">qasm_recordAxisRotation</a></div><div class="ttdeci">void qasm_recordAxisRotation(Qureg qureg, qreal angle, Vector axis, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00223">QuEST_qasm.c:223</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_ab7478fcaf6357ab202d72853b672e375"><div class="ttname"><a href="QuEST__internal_8h.html#ab7478fcaf6357ab202d72853b672e375">statevec_swapQubitAmps</a></div><div class="ttdeci">void statevec_swapQubitAmps(Qureg qureg, int qb1, int qb2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l01358">QuEST_cpu_distributed.c:1358</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a0bd738cb7e7cdea8f1ce1e640d427d4c"><div class="ttname"><a href="QuEST__common_8c.html#a0bd738cb7e7cdea8f1ce1e640d427d4c">statevec_tGate</a></div><div class="ttdeci">void statevec_tGate(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00271">QuEST_common.c:271</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_a782c6f57939eeb72b7be8e247979f3be"><div class="ttname"><a href="QuEST__validation_8c.html#a782c6f57939eeb72b7be8e247979f3be">validateVector</a></div><div class="ttdeci">void validateVector(Vector vec, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00414">QuEST_validation.c:414</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_af9839c40de8df0cecc72a0258a20d979"><div class="ttname"><a href="QuEST__common_8c.html#af9839c40de8df0cecc72a0258a20d979">statevec_rotateAroundAxisConj</a></div><div class="ttdeci">void statevec_rotateAroundAxisConj(Qureg qureg, const int rotQubit, qreal angle, Vector axis)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00317">QuEST_common.c:317</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_abd1285091450c7c2806cc26c71eb5df2"><div class="ttname"><a href="QuEST__common_8c.html#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a></div><div class="ttdeci">long long int getQubitBitMask(int *qubits, const int numQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00043">QuEST_common.c:43</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_aa4c380db9eda18892d5a86825fa4b165"><div class="ttname"><a href="QuEST__qasm_8c.html#aa4c380db9eda18892d5a86825fa4b165">qasm_recordControlledGate</a></div><div class="ttdeci">void qasm_recordControlledGate(Qureg qureg, TargetGate gate, int controlQubit, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00238">QuEST_qasm.c:238</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_abecd726412180d81f76f570dbbdbcddb"><div class="ttname"><a href="QuEST__qasm_8c.html#abecd726412180d81f76f570dbbdbcddb">qasm_recordMultiStateControlledUnitary</a></div><div class="ttdeci">void qasm_recordMultiStateControlledUnitary(Qureg qureg, ComplexMatrix2 u, int *controlQubits, int *controlState, const int numControlQubits, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00362">QuEST_qasm.c:362</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_aefc4a3a9cdb71f6e63bc58ad600e420e"><div class="ttname"><a href="QuEST__validation_8c.html#aefc4a3a9cdb71f6e63bc58ad600e420e">validateControlTarget</a></div><div class="ttdeci">void validateControlTarget(Qureg qureg, int controlQubit, int targetQubit, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00315">QuEST_validation.c:315</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_aca123cc22e13a2cb819ef6c2f455b9e4"><div class="ttname"><a href="QuEST__common_8c.html#aca123cc22e13a2cb819ef6c2f455b9e4">statevec_rotateX</a></div><div class="ttdeci">void statevec_rotateX(Qureg qureg, const int rotQubit, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00292">QuEST_common.c:292</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725fab656861dfb036cbcf7009f02a8949253"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fab656861dfb036cbcf7009f02a8949253">GATE_SQRT_SWAP</a></div><div class="ttdeci">@ GATE_SQRT_SWAP</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00034">QuEST_qasm.h:34</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_aa8db9b25aae536cdf8054afb6503b7f4"><div class="ttname"><a href="QuEST__common_8c.html#aa8db9b25aae536cdf8054afb6503b7f4">statevec_twoQubitUnitary</a></div><div class="ttdeci">void statevec_twoQubitUnitary(Qureg qureg, const int targetQubit1, const int targetQubit2, ComplexMatrix4 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00516">QuEST_common.c:516</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725fa13c9487aed515148e7594e35eb8dcc55"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa13c9487aed515148e7594e35eb8dcc55">GATE_SIGMA_X</a></div><div class="ttdeci">@ GATE_SIGMA_X</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00021">QuEST_qasm.h:21</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_ad711cac41adb0fea1ad4797ce14953e0"><div class="ttname"><a href="QuEST__common_8c.html#ad711cac41adb0fea1ad4797ce14953e0">statevec_pauliZ</a></div><div class="ttdeci">void statevec_pauliZ(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00257">QuEST_common.c:257</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a06bffb653fa42a67254d034b6cce6d7d"><div class="ttname"><a href="QuEST__common_8c.html#a06bffb653fa42a67254d034b6cce6d7d">statevec_controlledRotateZ</a></div><div class="ttdeci">void statevec_controlledRotateZ(Qureg qureg, const int controlQubit, const int targetQubit, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00354">QuEST_common.c:354</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_ae776148507b8f769cd00d1603212a028"><div class="ttname"><a href="QuEST__qasm_8c.html#ae776148507b8f769cd00d1603212a028">qasm_recordControlledParamGate</a></div><div class="ttdeci">void qasm_recordControlledParamGate(Qureg qureg, TargetGate gate, int controlQubit, int targetQubit, qreal param)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00247">QuEST_qasm.c:247</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a9fd917537204e074119d4f283dea78e3"><div class="ttname"><a href="QuEST__common_8c.html#a9fd917537204e074119d4f283dea78e3">setConjugateMatrixN</a></div><div class="ttdeci">void setConjugateMatrixN(ComplexMatrixN m)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00108">QuEST_common.c:108</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_a33be8162c9633bb8015f06b38cf70735"><div class="ttname"><a href="QuEST__qasm_8c.html#a33be8162c9633bb8015f06b38cf70735">qasm_recordControlledAxisRotation</a></div><div class="ttdeci">void qasm_recordControlledAxisRotation(Qureg qureg, qreal angle, Vector axis, int controlQubit, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00300">QuEST_qasm.c:300</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_abc29cef03e4a93d5f0a67b1e8b72f66e"><div class="ttname"><a href="QuEST__qasm_8c.html#abc29cef03e4a93d5f0a67b1e8b72f66e">qasm_recordMultiControlledUnitary</a></div><div class="ttdeci">void qasm_recordMultiControlledUnitary(Qureg qureg, ComplexMatrix2 u, int *controlQubits, const int numControlQubits, const int targetQubit)</div><div class="ttdoc">additionally performs Rz on target to restore the global phase lost from u in QASM U(a,...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00341">QuEST_qasm.c:341</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a2153d8611247dd3a2ef483355265cc99"><div class="ttname"><a href="QuEST__common_8c.html#a2153d8611247dd3a2ef483355265cc99">statevec_multiRotatePauli</a></div><div class="ttdeci">void statevec_multiRotatePauli(Qureg qureg, int *targetQubits, enum pauliOpType *targetPaulis, int numTargets, qreal angle, int applyConj)</div><div class="ttdoc">applyConj=1 will apply conjugate operation, else applyConj=0</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00410">QuEST_common.c:410</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_ac4ee5979d475e8c729294b8ef7e0270d"><div class="ttname"><a href="QuEST__internal_8h.html#ac4ee5979d475e8c729294b8ef7e0270d">statevec_multiControlledPhaseFlip</a></div><div class="ttdeci">void statevec_multiControlledPhaseFlip(Qureg qureg, int *controlQubits, int numControlQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu_8c_source.html#l03291">QuEST_cpu.c:3291</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_a9a385fde708958617bbeb599064b8dcb"><div class="ttname"><a href="QuEST__qasm_8c.html#a9a385fde708958617bbeb599064b8dcb">qasm_recordComment</a></div><div class="ttdeci">void qasm_recordComment(Qureg qureg, char *comment,...)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00120">QuEST_qasm.c:120</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a78bfeb90f0c1812e726ec3092056bb52"><div class="ttname"><a href="QuEST__common_8c.html#a78bfeb90f0c1812e726ec3092056bb52">statevec_sGateConj</a></div><div class="ttdeci">void statevec_sGateConj(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00278">QuEST_common.c:278</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a7ec46b4b96cda399095a2488ceff69b6"><div class="ttname"><a href="QuEST__internal_8h.html#a7ec46b4b96cda399095a2488ceff69b6">statevec_multiControlledUnitary</a></div><div class="ttdeci">void statevec_multiControlledUnitary(Qureg qureg, long long int ctrlQubitsMask, long long int ctrlFlipMask, const int targetQubit, ComplexMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l00999">QuEST_cpu_distributed.c:999</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a4a62c8c00dc4adf74b982ad8a9049170"><div class="ttname"><a href="QuEST__common_8c.html#a4a62c8c00dc4adf74b982ad8a9049170">statevec_rotateY</a></div><div class="ttdeci">void statevec_rotateY(Qureg qureg, const int rotQubit, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00298">QuEST_common.c:298</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a2600999a19c817bfcf7ca14779e33b9a"><div class="ttname"><a href="QuEST__internal_8h.html#a2600999a19c817bfcf7ca14779e33b9a">statevec_controlledUnitary</a></div><div class="ttdeci">void statevec_controlledUnitary(Qureg qureg, const int controlQubit, const int targetQubit, ComplexMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l00960">QuEST_cpu_distributed.c:960</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_a706acae568cbb0854b4729ed9e2f7e6d"><div class="ttname"><a href="QuEST__validation_8c.html#a706acae568cbb0854b4729ed9e2f7e6d">validateMultiQubits</a></div><div class="ttdeci">void validateMultiQubits(Qureg qureg, int *qubits, const int numQubits, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00351">QuEST_validation.c:351</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_adeb715f3f2c167f9bfbe92b75f5988ce"><div class="ttname"><a href="QuEST__internal_8h.html#adeb715f3f2c167f9bfbe92b75f5988ce">statevec_controlledPhaseShift</a></div><div class="ttdeci">void statevec_controlledPhaseShift(Qureg qureg, const int idQubit1, const int idQubit2, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu_8c_source.html#l02980">QuEST_cpu.c:2980</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a7c0067cb9f243ead20de7392aea328bc"><div class="ttname"><a href="QuEST__internal_8h.html#a7c0067cb9f243ead20de7392aea328bc">statevec_controlledPhaseFlip</a></div><div class="ttdeci">void statevec_controlledPhaseFlip(Qureg qureg, const int idQubit1, const int idQubit2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu_8c_source.html#l03260">QuEST_cpu.c:3260</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_a654db9d60abdcae26427e7d3b3d9c432"><div class="ttname"><a href="QuEST__validation_8c.html#a654db9d60abdcae26427e7d3b3d9c432">validateTwoQubitUnitaryMatrix</a></div><div class="ttdeci">void validateTwoQubitUnitaryMatrix(Qureg qureg, ComplexMatrix4 u, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00388">QuEST_validation.c:388</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_ad2dc0754043172e0449c78569d27fd4a"><div class="ttname"><a href="QuEST__common_8c.html#ad2dc0754043172e0449c78569d27fd4a">statevec_controlledRotateY</a></div><div class="ttdeci">void statevec_controlledRotateY(Qureg qureg, const int controlQubit, const int targetQubit, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00348">QuEST_common.c:348</a></div></div>
<div class="ttc" id="astructQureg_html_acf78445e9435d09f44f0cc832c6aee79"><div class="ttname"><a href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">Qureg::isDensityMatrix</a></div><div class="ttdeci">int isDensityMatrix</div><div class="ttdoc">Whether this instance is a density-state representation.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00163">QuEST.h:163</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a47b467a5445c7f15d1a8b0b2ec0ef2de"><div class="ttname"><a href="QuEST__internal_8h.html#a47b467a5445c7f15d1a8b0b2ec0ef2de">statevec_controlledCompactUnitary</a></div><div class="ttdeci">void statevec_controlledCompactUnitary(Qureg qureg, const int controlQubit, const int targetQubit, Complex alpha, Complex beta)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l00922">QuEST_cpu_distributed.c:922</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_aea5b9ea10791217a793a8040c36e4efc"><div class="ttname"><a href="QuEST__common_8c.html#aea5b9ea10791217a793a8040c36e4efc">statevec_sGate</a></div><div class="ttdeci">void statevec_sGate(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00264">QuEST_common.c:264</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a3ce1b05fee70d930791513fec378d229"><div class="ttname"><a href="QuEST__common_8c.html#a3ce1b05fee70d930791513fec378d229">statevec_tGateConj</a></div><div class="ttdeci">void statevec_tGateConj(Qureg qureg, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00285">QuEST_common.c:285</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_a0344fbbb2bb505f7db14b420153f1eb5"><div class="ttname"><a href="QuEST__validation_8c.html#a0344fbbb2bb505f7db14b420153f1eb5">validateOneQubitUnitaryMatrix</a></div><div class="ttdeci">void validateOneQubitUnitaryMatrix(ComplexMatrix2 u, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00384">QuEST_validation.c:384</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a33cde9b6518d55a544eff20301a5d844"><div class="ttname"><a href="QuEST__common_8c.html#a33cde9b6518d55a544eff20301a5d844">statevec_sqrtSwapGateConj</a></div><div class="ttdeci">void statevec_sqrtSwapGateConj(Qureg qureg, int qb1, int qb2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00396">QuEST_common.c:396</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_af81e1960029f6f213bc2edacaf0dcb44"><div class="ttname"><a href="QuEST__common_8c.html#af81e1960029f6f213bc2edacaf0dcb44">statevec_controlledMultiQubitUnitary</a></div><div class="ttdeci">void statevec_controlledMultiQubitUnitary(Qureg qureg, int ctrl, int *targets, const int numTargets, ComplexMatrixN u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00534">QuEST_common.c:534</a></div></div>
<div class="ttc" id="astructQureg_html_ad08dff5316b8937f4b2a1417591543dc"><div class="ttname"><a href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">Qureg::numQubitsRepresented</a></div><div class="ttdeci">int numQubitsRepresented</div><div class="ttdoc">The number of qubits represented in either the state-vector or density matrix.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00165">QuEST.h:165</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725fa5053f3d968443bc04e8b1d09f18bab9a"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fa5053f3d968443bc04e8b1d09f18bab9a">GATE_S</a></div><div class="ttdeci">@ GATE_S</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00025">QuEST_qasm.h:25</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725fab12d052de2b7c59c6ab87710fd7d3c78"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fab12d052de2b7c59c6ab87710fd7d3c78">GATE_SWAP</a></div><div class="ttdeci">@ GATE_SWAP</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00033">QuEST_qasm.h:33</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_ada38f885e0a4f704fb82c18a297ee1ae"><div class="ttname"><a href="QuEST__validation_8c.html#ada38f885e0a4f704fb82c18a297ee1ae">validateControlState</a></div><div class="ttdeci">void validateControlState(int *controlState, const int numControlQubits, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00375">QuEST_validation.c:375</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_af59bc61f97d42cdceaf7fc0257a387d6"><div class="ttname"><a href="QuEST__common_8c.html#af59bc61f97d42cdceaf7fc0257a387d6">statevec_controlledRotateX</a></div><div class="ttdeci">void statevec_controlledRotateX(Qureg qureg, const int controlQubit, const int targetQubit, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00342">QuEST_common.c:342</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a9e647339720bf82b30c6331fad544ec5"><div class="ttname"><a href="QuEST__internal_8h.html#a9e647339720bf82b30c6331fad544ec5">statevec_controlledPauliYConj</a></div><div class="ttdeci">void statevec_controlledPauliYConj(Qureg qureg, const int controlQubit, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l01175">QuEST_cpu_distributed.c:1175</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725faa29b98cbb581abf5ec338a1763de7a1b"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725faa29b98cbb581abf5ec338a1763de7a1b">GATE_SIGMA_Y</a></div><div class="ttdeci">@ GATE_SIGMA_Y</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00022">QuEST_qasm.h:22</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a4bea7ed7967083cbabd8a8e5acdd48c0"><div class="ttname"><a href="QuEST__internal_8h.html#a4bea7ed7967083cbabd8a8e5acdd48c0">statevec_unitary</a></div><div class="ttdeci">void statevec_unitary(Qureg qureg, const int targetQubit, ComplexMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l00883">QuEST_cpu_distributed.c:883</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_a518c4351d574aea8477019dbce02f09c"><div class="ttname"><a href="QuEST__qasm_8c.html#a518c4351d574aea8477019dbce02f09c">qasm_recordCompactUnitary</a></div><div class="ttdeci">void qasm_recordCompactUnitary(Qureg qureg, Complex alpha, Complex beta, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00195">QuEST_qasm.c:195</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a2c489375aad6fb71203553c60bff043b"><div class="ttname"><a href="QuEST__common_8c.html#a2c489375aad6fb71203553c60bff043b">statevec_controlledRotateAroundAxis</a></div><div class="ttdeci">void statevec_controlledRotateAroundAxis(Qureg qureg, const int controlQubit, const int targetQubit, qreal angle, Vector axis)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00326">QuEST_common.c:326</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_a5e99d405002cdf6ddd40922911d058a4"><div class="ttname"><a href="QuEST__qasm_8c.html#a5e99d405002cdf6ddd40922911d058a4">qasm_recordControlledUnitary</a></div><div class="ttdeci">void qasm_recordControlledUnitary(Qureg qureg, ComplexMatrix2 u, int controlQubit, int targetQubit)</div><div class="ttdoc">additionally performs Rz on target to restore the global phase lost from u in QASM U(a,...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00278">QuEST_qasm.c:278</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_a65b9087ca37c096caa5c6e8586b67946"><div class="ttname"><a href="QuEST__common_8c.html#a65b9087ca37c096caa5c6e8586b67946">statevec_rotateAroundAxis</a></div><div class="ttdeci">void statevec_rotateAroundAxis(Qureg qureg, const int rotQubit, qreal angle, Vector axis)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00310">QuEST_common.c:310</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a877d988a763a52989484afc0f8d6ddf0"><div class="ttname"><a href="QuEST__internal_8h.html#a877d988a763a52989484afc0f8d6ddf0">statevec_multiControlledTwoQubitUnitary</a></div><div class="ttdeci">void statevec_multiControlledTwoQubitUnitary(Qureg qureg, long long int ctrlMask, const int targetQubit1, const int targetQubit2, ComplexMatrix4 u)</div><div class="ttdoc">This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks ...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l01385">QuEST_cpu_distributed.c:1385</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_a494d9fecfb2adeab56543110f16de74e"><div class="ttname"><a href="QuEST__qasm_8c.html#a494d9fecfb2adeab56543110f16de74e">qasm_recordMultiControlledGate</a></div><div class="ttdeci">void qasm_recordMultiControlledGate(Qureg qureg, TargetGate gate, int *controlQubits, const int numControlQubits, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00316">QuEST_qasm.c:316</a></div></div>
<div class="ttc" id="aQuEST__qasm_8c_html_a81749d23b8c3c1acf87c9db675872c24"><div class="ttname"><a href="QuEST__qasm_8c.html#a81749d23b8c3c1acf87c9db675872c24">qasm_recordGate</a></div><div class="ttdeci">void qasm_recordGate(Qureg qureg, TargetGate gate, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8c_source.html#l00178">QuEST_qasm.c:178</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_aa194ba5f5c6e19c6caa4c715b3dbefcc"><div class="ttname"><a href="QuEST__validation_8c.html#aa194ba5f5c6e19c6caa4c715b3dbefcc">validatePauliCodes</a></div><div class="ttdeci">void validatePauliCodes(enum pauliOpType *pauliCodes, int numPauliCodes, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00498">QuEST_validation.c:498</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_a5d49d4aadea858794b139c6a195ffd8b"><div class="ttname"><a href="QuEST__validation_8c.html#a5d49d4aadea858794b139c6a195ffd8b">validateUnitaryComplexPair</a></div><div class="ttdeci">void validateUnitaryComplexPair(Complex alpha, Complex beta, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00410">QuEST_validation.c:410</a></div></div>
<div class="ttc" id="aQuEST__qasm_8h_html_a32bbd0276b80668812ac248cd81c725fae1267d5de573dc2901aa8e724ac1d689"><div class="ttname"><a href="QuEST__qasm_8h.html#a32bbd0276b80668812ac248cd81c725fae1267d5de573dc2901aa8e724ac1d689">GATE_ROTATE_Y</a></div><div class="ttdeci">@ GATE_ROTATE_Y</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__qasm_8h_source.html#l00028">QuEST_qasm.h:28</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_afd4946df21588eb7109ca9b289bcba5f"><div class="ttname"><a href="QuEST__validation_8c.html#afd4946df21588eb7109ca9b289bcba5f">validateMultiControlsMultiTargets</a></div><div class="ttdeci">void validateMultiControlsMultiTargets(Qureg qureg, int *controlQubits, const int numControlQubits, int *targetQubits, const int numTargetQubits, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00366">QuEST_validation.c:366</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a708246b16236c492094c2633da0c08ff"><div class="ttname"><a href="QuEST__internal_8h.html#a708246b16236c492094c2633da0c08ff">statevec_controlledPauliY</a></div><div class="ttdeci">void statevec_controlledPauliY(Qureg qureg, const int controlQubit, const int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l01142">QuEST_cpu_distributed.c:1142</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_aed5f85789dc4fa43b64e99e6b538035c"><div class="ttname"><a href="QuEST__validation_8c.html#aed5f85789dc4fa43b64e99e6b538035c">validateUniqueTargets</a></div><div class="ttdeci">void validateUniqueTargets(Qureg qureg, int qubit1, int qubit2, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00321">QuEST_validation.c:321</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html_a94ee4df9faba286ad7a5bc829ef5174d"><div class="ttname"><a href="QuEST__internal_8h.html#a94ee4df9faba286ad7a5bc829ef5174d">statevec_compactUnitary</a></div><div class="ttdeci">void statevec_compactUnitary(Qureg qureg, const int targetQubit, Complex alpha, Complex beta)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__distributed_8c_source.html#l00846">QuEST_cpu_distributed.c:846</a></div></div>
<div class="ttc" id="aQuEST__validation_8c_html_a455024b2f504b0e9646f239d67386d36"><div class="ttname"><a href="QuEST__validation_8c.html#a455024b2f504b0e9646f239d67386d36">validateMultiControlsTarget</a></div><div class="ttdeci">void validateMultiControlsTarget(Qureg qureg, int *controlQubits, const int numControlQubits, const int targetQubit, const char *caller)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__validation_8c_source.html#l00359">QuEST_validation.c:359</a></div></div>
<!-- HTML footer for doxygen 1.8.8-->
<!-- start footer part -->
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="boot.js"></script>
</html>