Now before I get too far into technical challenges around quantum computing, it seems prudent to give a quick run-through of the basics. Since there are already countless books, papers, and videos that offer a much better introduction and explanation of quantum computing than I would be able to, I will make it brief. I will focus on the Quantum Circuit Model, as it is much more analogous to classical computing, and can easily simulate most other quantum computing models.
Quantum Information Theory
The smallest unit of a quantum computer is the qubit, the quantum equivalent of the classical bit. As with the classical bit, a qubit can be in states 0 or 1, or more accurately represented as |0> or |1>, using bra-ket notation (these are the basis states or basis vectors of the qubit, as can be seen below). One of the properties that makes the qubit unique, and more powerful than a classical bit, is that it can also be in a superposition of the two states, α|0> + β|1>, where |α|², |β|² represent the probabilities of each state being measured.
You can also consider the states of the qubit through the use of the Bloch Sphere (or the Poincaré Sphere for those in optics) as seen in Figure 1.
Figure 1 The Bloch Sphere [Ref. 1]
This is basically a sphere of radius = 1 in the three dimensional Cartesian plane, but with the y-axis being imaginary. Any pure state can now be represented as a point on this sphere (I specify pure state, as qubits can also be in mixed states, which is different from a superposition, but that is a topic for another time). If we are measuring in the Z basis, we can have |0> be +1 on the z-axis, and |1> be -1 on the z-axis, with the x- and y-axis representing superposition and phase.
The amount of time a qubit will remain in a given state before succumbing to noise and loss from the environment is called the decoherence time (as an example, how long a qubit will stay in |1> before it flips to |0>). Different physical implementations have different decoherence times, but the very nature of the qubit results in there always being some decoherence.
This all might be starting to sound a little odd by now, but the important thing to remember is the qubit can be in a superposition of |0> and |1> and it will stay in a given state for a limited amount of time.
We can control a qubit by applying single qubit gates. These are equivalent to rotating our point on the Bloch sphere around one of the axes. One of the simplest is a Pauli-X gate (the quantum equivalent of a NOT gate), which rotates the point around the x-axis by π radians. If you are in the |0> state, the gate would change the qubit to the |1> state. This is not enough to do any useful computations, so gates that allow interactions between qubits are also required – such as the C-NOT gate – which operates in the same manner as the classical equivalent. One can see numerically how this works through representing the gates as matrices, as shown below.
How such a gate is physically accomplished is dependent on which physical implementation of a quantum computer is being used, as analysis of the system's Hamiltonian (think of the Hamiltonian as an equation representing the total energy of the system) is required. However, we are in luck, as many of the engineering issues in the field can be understood without ever looking at a Hamiltonian.
Next; physical implementation