RandomUnitary: Difference between revisions
mNo edit summary |
Ian Auckes (talk | contribs) mNo edit summary |
||
| (6 intermediate revisions by one other user not shown) | |||
| Line 1: | Line 1: | ||
{{Function | {{Function | ||
|name=RandomUnitary | |name=RandomUnitary | ||
|desc=Generates a random | |desc=Generates a random unitary or orthogonal matrix | ||
| | |rel=[[RandomDensityMatrix]]<br />[[RandomPOVM]]<br />[[RandomStateVector]]<br />[[RandomSuperoperator]] | ||
|cat=[[List of functions#Random_things|Random things]] | |||
|upd= | |upd=September 30, 2014 | ||
|v= | |v=0.50}} | ||
<tt>'''RandomUnitary'''</tt> is a [[List of functions|function]] that generates a random | <tt>'''RandomUnitary'''</tt> is a [[List of functions|function]] that generates a random unitary or orthogonal matrix, uniformly according to [http://en.wikipedia.org/wiki/Haar_measure Haar measure]. | ||
==Syntax== | ==Syntax== | ||
| Line 14: | Line 14: | ||
==Argument descriptions== | ==Argument descriptions== | ||
* <tt>DIM</tt>: The number of rows (or equivalently, columns) that <tt>U</tt> will have. | * <tt>DIM</tt>: The number of rows (or equivalently, columns) that <tt>U</tt> will have. | ||
* <tt>RE</tt> (optional, default 0): A flag (either 0 or 1) indicating that <tt>U</tt> should only have real entries (<tt>RE = 1</tt>) or that it is allowed to have complex entries (<tt>RE = | * <tt>RE</tt> (optional, default 0): A flag (either 0 or 1) indicating that <tt>U</tt> should only have real entries (<tt>RE = 1</tt>) or that it is allowed to have complex entries (<tt>RE = 0</tt>). That is, if you set <tt>RE = 1</tt> then <tt>U</tt> will be an orthogonal matrix, not just a unitary matrix. | ||
==Examples== | ==Examples== | ||
===A random qubit | ===A random qubit gate=== | ||
To generate a random quantum gate that acts on qubits, you could use the following code: | To generate a random quantum gate that acts on qubits, you could use the following code: | ||
< | <syntaxhighlight> | ||
>> RandomUnitary(2) | >> RandomUnitary(2) | ||
| Line 26: | Line 26: | ||
0.2280 + 0.6126i -0.2894 - 0.6993i | 0.2280 + 0.6126i -0.2894 - 0.6993i | ||
-0.3147 + 0.6883i -0.2501 + 0.6039i | -0.3147 + 0.6883i -0.2501 + 0.6039i | ||
</ | </syntaxhighlight> | ||
===A random orthogonal matrix=== | ===A random orthogonal matrix=== | ||
To generate a random orthogonal (rather than unitary) matrix, set <tt>RE = 1</tt>: | To generate a random orthogonal (rather than unitary) matrix, set <tt>RE = 1</tt>: | ||
< | <syntaxhighlight> | ||
>> U = RandomUnitary(3,1) | >> U = RandomUnitary(3,1) | ||
| Line 38: | Line 38: | ||
0.1678 0.6381 0.7515 | 0.1678 0.6381 0.7515 | ||
-0.1020 -0.7470 0.6570 | -0.1020 -0.7470 0.6570 | ||
</ | </syntaxhighlight> | ||
To verify that this matrix is indeed orthogonal, we multiply it by its transpose: | To verify that this matrix is indeed orthogonal, we multiply it by its transpose: | ||
< | <syntaxhighlight> | ||
>> U'*U | >> U'*U | ||
| Line 49: | Line 49: | ||
0.0000 1.0000 0.0000 | 0.0000 1.0000 0.0000 | ||
0.0000 0.0000 1.0000 | 0.0000 0.0000 1.0000 | ||
</ | </syntaxhighlight> | ||
===Moments of the trace of an orthogonal matrix=== | |||
It was shown in [http://mathoverflow.net/questions/180110/moments-of-the-trace-of-orthogonal-matrices this MathOverflow thread] that if O is a random (according to Haar measure) 3-by-3 orthogonal matrix, then the expectated value of ${\mathrm Tr}(O)^{2k}$ for $k = 1, 2, 3, 4, \ldots$ is $1, 3, 15, 91, \ldots$ (sequence [https://oeis.org/A099251 A099251] in the OEIS). We can use the <tt>RandomUnitary</tt> function to reproduce these values approximately as follows: | |||
<syntaxhighlight> | |||
>> s = 10^5; | |||
ct = zeros(1,4); | |||
for j = 1:s | |||
trO = trace(RandomUnitary(3,1))^2; | |||
ct = ct + trO.^(1:4); | |||
end | |||
ct/s | |||
ans = | |||
0.9997 2.9917 14.9298 90.4464 | |||
</syntaxhighlight> | |||
==Notes== | ==Notes== | ||
The random unitary matrix is generated by constructing a | The random unitary matrix is generated by constructing a Ginibre ensemble of appropriate size, performing a [http://en.wikipedia.org/wiki/QR_decomposition QR decomposition] on that ensemble, and then multiplying the columns of the unitary matrix Q by the sign of the corresponding diagonal entries of R.<ref>Māris Ozols. ''[http://home.lu.lv/~sd20008/papers/essays/Random%20unitary%20%5Bpaper%5D.pdf How to generate a random unitary matrix]'', 2009.</ref> | ||
{{SourceCode|name=RandomUnitary}} | |||
==References== | ==References== | ||
<references /> | <references /> | ||
Latest revision as of 03:57, 15 April 2019
| RandomUnitary | |
| Generates a random unitary or orthogonal matrix | |
| Other toolboxes required | none |
|---|---|
| Related functions | RandomDensityMatrix RandomPOVM RandomStateVector RandomSuperoperator |
| Function category | Random things |
RandomUnitary is a function that generates a random unitary or orthogonal matrix, uniformly according to Haar measure.
Syntax
- U = RandomUnitary(DIM)
- U = RandomUnitary(DIM,RE)
Argument descriptions
- DIM: The number of rows (or equivalently, columns) that U will have.
- RE (optional, default 0): A flag (either 0 or 1) indicating that U should only have real entries (RE = 1) or that it is allowed to have complex entries (RE = 0). That is, if you set RE = 1 then U will be an orthogonal matrix, not just a unitary matrix.
Examples
A random qubit gate
To generate a random quantum gate that acts on qubits, you could use the following code:
>> RandomUnitary(2)
ans =
0.2280 + 0.6126i -0.2894 - 0.6993i
-0.3147 + 0.6883i -0.2501 + 0.6039iA random orthogonal matrix
To generate a random orthogonal (rather than unitary) matrix, set RE = 1:
>> U = RandomUnitary(3,1)
U =
0.9805 -0.1869 -0.0603
0.1678 0.6381 0.7515
-0.1020 -0.7470 0.6570To verify that this matrix is indeed orthogonal, we multiply it by its transpose:
>> U'*U
ans =
1.0000 0.0000 0.0000
0.0000 1.0000 0.0000
0.0000 0.0000 1.0000Moments of the trace of an orthogonal matrix
It was shown in this MathOverflow thread that if O is a random (according to Haar measure) 3-by-3 orthogonal matrix, then the expectated value of ${\mathrm Tr}(O)^{2k}$ for $k = 1, 2, 3, 4, \ldots$ is $1, 3, 15, 91, \ldots$ (sequence A099251 in the OEIS). We can use the RandomUnitary function to reproduce these values approximately as follows:
>> s = 10^5;
ct = zeros(1,4);
for j = 1:s
trO = trace(RandomUnitary(3,1))^2;
ct = ct + trO.^(1:4);
end
ct/s
ans =
0.9997 2.9917 14.9298 90.4464Notes
The random unitary matrix is generated by constructing a Ginibre ensemble of appropriate size, performing a QR decomposition on that ensemble, and then multiplying the columns of the unitary matrix Q by the sign of the corresponding diagonal entries of R.[1]
Source code
Click here to view this function's source code on github.
References
- ↑ Māris Ozols. How to generate a random unitary matrix, 2009.