Adjoints, Hermitian, and Unitary Operators
The adjoint (dagger) is the conjugate transpose; Hermitian operators equal their adjoint, unitary operators have adjoint as inverse.
The dagger operation
For any operator A, the adjoint A-dagger is its conjugate transpose: transpose the matrix and take the complex conjugate of every entry. The dagger is the single most used operation in quantum linear algebra, and two special classes of operator are defined by how they relate to their adjoint.
Hermitian operators
An operator is Hermitian (self-adjoint) when A = A-dagger. Hermitian operators have real eigenvalues and orthogonal eigenvectors, which is exactly what is needed to represent measurable quantities, so all observables are Hermitian. Density matrices and Hamiltonians are Hermitian too.
Unitary operators
An operator is unitary when its adjoint is its inverse: U-dagger U = U U-dagger = I. Unitaries preserve inner products and norms, so they describe reversible, probability-conserving evolution. Every quantum gate is unitary. The two classes connect through exponentiation: if H is Hermitian, exp(-iH) is unitary.
- Adjoint: A-dagger, the conjugate transpose
- Hermitian: A = A-dagger, real eigenvalues, observables
- Unitary: U-dagger = U-inverse, norm-preserving, gates
Reversing circuits
The dagger has a direct operational meaning: to undo a circuit, apply the adjoint of each gate in reverse order. Since (AB)-dagger = B-dagger A-dagger, the inverse of a gate sequence is the daggered sequence backwards. This is used constantly in algorithm design, for example to uncompute ancilla qubits back to a clean state.
Worked check
import numpy as np
S=np.array([[1,0],[0,1j]]) # phase gate
print(np.allclose(S.conj().T@S, np.eye(2))) # True: unitary
Z=np.array([[1,0],[0,-1]])
print(np.allclose(Z, Z.conj().T)) # True: Hermitian