In quantum computation, a ket is a vector in a Hilbert space. A Hilbert space is just a fancy way to describe a typical space you find in linear algebra, where the space allows you to compute lengths and angles. When discussing kets, the usual vector space is the set of complex-element vectors with unit length (or “norm”). The vectors can have any number of elements (or “dimension”), but when discussing qubits, they are 2^n-dimensional for n qubits.
(It’s important to note that a ket is not distinguishable from a vector. It’s actually called so because of a notational convention, not because it has deeper underlying meaning. However, physicists will still use the word “ket” instead of “vector” or “quantum state” even if they’re not emphasizing notation.)
More interesting, though, is how kets combine with other kets via tensor products. This ingredient is as essential to QC as flour is to cake.
This article [0] informally presents a fully general definition of a ket along with the tensor product with an emphasis on why a representation and notation was chosen. But it does require a good understanding of linear algebra already.
[0] “Someone shouts |01000>! Who’s excited?” https://arxiv.org/abs/1711.02086
What do you think would be a good correction or disclaimer to add? Would it be sufficient to e.g. say that in this first part, we only implement a two-component ket? Generalizing the ket type to an arbitrary-size vector while keeping type constraints, perhaps briefly mentioning const generics (an upcoming language feature), etc could easily make for another part in this series. Making the ket into an actual vector could then give way to doing proper linear algebra on them, cleaning up some of the manually implemented operations here, as their teaching purpose has been fulfilled already.
Thoughts?
|s> = p|0> + q|1>
where p and q are complex, and |p|^2 + |q|^2 = 1. The ket is the notation |s>, |1>, and |0>, which could also be written purely as column vectors.
At the end it all depends on what you want to present. What will be the climax? Unitary evolution of a pure state? Superoperators on a mixed state? An introduction to linear algebra used in quantum computation and its notation?
In any case I’d present what a quantum state is on N qubits, which requires 2^N-element complex vectors that satisfy a few properties.
You made no attempt to explain what the two different states in a single ket mean: hint, it's superposition. Never provided even a trivial justification for why normalization is important; where is the actual physics?
Using Rust here is also quite pointless when you're just doing linear algebra... where is the actual benefit over Python or even Haskell?
You've written a very cute and inefficient math library, but calling this QC is just false advertising.
This is not correct when you start talking about continuous-variable states. In the (canonical) position basis, the state of an infinite-dimensional system is commonly expressed as \ket{\psi} = \int \psi(x)\ket{x}dx. Here {\ket{x}} are a basis set, but not square-integrable, since \bra{x}\ket{x} = deltafunction(0). Hence \ket{x} is not a valid quantum mechanical state.
In any event, I’m speaking in the context of my comment and of the article: (gate-based) quantum computation. Here, 9 out of 10 dentists will use a ket to denote the (computational) state of the quantum computer. Infinite dimensional states and bases aren’t pertinent at the level of logical computation.
The blog implements kets as 2-dimensional complex vectors, so I don't see any problem there. A 2-dimensional space is a Hilbert space.
And this does not really explain what a `Ket` is, rather unfortunately. I now know it's a pair of complex numbers, but that's not very handy - and the `is_valid` definition is not explained, so I don't even get told what subset of pairs of complex numbers make up valid kets without reading code.
You're right, I need to add a better explanation for what a ket is. Same applies to the validity, should explain a bit about normalization.
Thanks for the feedback!
Your point is arguable if it was instead "How to implement a Ket in Rust", and even then it's a bit vague. I left with the same feeling that it was a bit barebones in terms of definition.
My current understanding is mostly based on this wonderful website: https://quantum.country/qcvc - if you can recommend more good resources, I'm all ears!
I remember learning about this at uni in one of the more advanced QM modules.
I remember thinking: Seriously, couldn't they've come up with a better name?
I'll see myself out