One can also consider POVM's on real valued Hilbert spaces. RIC-POVM's (real informationally complete POVM's) will have $\frac{d(d+1)}{2}$ elements (unlike the complex case, where they would be $d^2$ elements).

SIC-POVM's in real Hilbert spaces correspond to sets of real equiangular lines, and unlike in the complex case, they can be proved not to exist in certain dimensions.

For purposes of testing out RIC's, let's define some useful functions:

real_rand_ket[source]

real_rand_ket(d)

Generates a random ket in real Hilbert space of dimension $d$.

real_rand_dm[source]

real_rand_dm(d)

Generates a random density matrix for a real Hilbert space of dimension $d$.

rand_symmetric[source]

rand_symmetric(d)

Generates a random $d \times d$ symmetric matrix. These matrices correspond to observables in real quantum mechanics, being the real analogue of Hermitian matrices: $\hat{S} = \hat{S}^{T}$.

rand_orthogonal[source]

rand_orthogonal(d)

Generates a random $d \times d$ orthogonal matrix. These matrices correspond to time evolution in real quantum mechanics, being the real analogue of unitary matrices: $\hat{S}\hat{S}^{T} = \hat{I}$.

Let's generate a random RIC and check that it behaves like the more usual complex IC-POVM's we're used to. First, let's check that we can go back and forth between density matrices and probabilities:

d = 3
povm = random_haar_povm(d, real=True)
phi = povm_phi(povm)
rho = real_rand_dm(d)
p = dm_probs(rho, povm)
assert np.allclose(rho, probs_dm(p, povm))

Then let's compare classical and quantum probabilities for some observable represented by a symmetric matrix:

S = rand_symmetric(d)
vn = [v*v.dag() for v in S.eigenstates()[1]]

R = conditional_probs(vn, povm)
classical_probs = R @ p
quantum_probs = R @ phi @ p

post_povm_rho = sum([(e*rho).tr()*(e/e.tr()) for e in povm])
assert np.allclose(classical_probs, [(v*post_povm_rho).tr() for v in vn])
assert np.allclose(quantum_probs, [(v*rho).tr() for v in vn])

And finally, let's check out time evolution under an othogonal matrix:

O = rand_orthogonal(d)
assert np.allclose(dm_probs(O*rho*O.trans(), povm), povm_map([O], povm) @ phi @ p)

As an example, let's consider the Petersen RIC in $d=4$ based on the Petersen Graph and the Rectified 5-cell.

petersen_povm[source]

petersen_povm()

petersen gram:
 [[0.16  0.071 0.004 0.004 0.071 0.071 0.004 0.004 0.004 0.004]
 [0.071 0.16  0.071 0.004 0.004 0.004 0.071 0.004 0.004 0.004]
 [0.004 0.071 0.16  0.071 0.004 0.004 0.004 0.071 0.004 0.004]
 [0.004 0.004 0.071 0.16  0.071 0.004 0.004 0.004 0.071 0.004]
 [0.071 0.004 0.004 0.071 0.16  0.004 0.004 0.004 0.004 0.071]
 [0.071 0.004 0.004 0.004 0.004 0.16  0.004 0.071 0.071 0.004]
 [0.004 0.071 0.004 0.004 0.004 0.004 0.16  0.004 0.071 0.071]
 [0.004 0.004 0.071 0.004 0.004 0.071 0.004 0.16  0.004 0.071]
 [0.004 0.004 0.004 0.071 0.004 0.071 0.071 0.004 0.16  0.004]
 [0.004 0.004 0.004 0.004 0.071 0.004 0.071 0.071 0.004 0.16 ]]
quantumness: 34.047026

In $d=3$, there's a real SIC based on the icosahedron!

circular_shifts[source]

circular_shifts(v)

icosahedron_vertices[source]

icosahedron_vertices()

icosahedron_povm[source]

icosahedron_povm()

icosahedron gram:
 [[0.25 0.05 0.05 0.05 0.05 0.05]
 [0.05 0.25 0.05 0.05 0.05 0.05]
 [0.05 0.05 0.25 0.05 0.05 0.05]
 [0.05 0.05 0.05 0.25 0.05 0.05]
 [0.05 0.05 0.05 0.05 0.25 0.05]
 [0.05 0.05 0.05 0.05 0.05 0.25]]
quantumness: 3.354102