Quantum Objects

[1]:
import numpy as np

from qilisdk.common import QTensor
from qilisdk.common.qtensor import basis_state, bra, ket, expect_val
[2]:
# 1‑qubit |0> ket
psi_ket = QTensor(np.array([[1], [0]]))
print("Ket:", psi_ket.dense, "is_ket?", psi_ket.is_ket())
print("-" * 20)

# 1‑qubit <0| bra
psi_bra = QTensor(np.array([[1, 0]]))
print("Bra:", psi_bra.dense, "is_bra?", psi_bra.is_bra())
print("-" * 20)

# Density matrix |0><0|
rho = QTensor(np.array([[1, 0], [0, 0]]))
print("Density matrix:\n", rho.dense, "is_density_matrix?", rho.is_density_matrix())
print("-" * 20)

# Scalar 0.5
scalar = QTensor(np.array([[0.5]]))
print("Scalar:", scalar.dense, "is_scalar?", scalar.is_scalar())
Ket: [[1]
 [0]] is_ket? True
--------------------
Bra: [[1 0]] is_bra? True
--------------------
Density matrix:
 [[1 0]
 [0 0]] is_density_matrix? True
--------------------
Scalar: [[0.5]] is_scalar? True
[3]:
# Single‑qubit
print("ket(0):", ket(0).dense, "is_ket?", ket(0).is_ket())
print("bra(1):", bra(1).dense, "is_bra?", bra(1).is_bra())

# Fock basis in N=4 Hilbert space
print("basis_state(2,4):", basis_state(2, 4).dense, "shape:", basis_state(2, 4).shape)
ket(0): [[1.]
 [0.]] is_ket? True
bra(1): [[0. 1.]] is_bra? True
basis_state(2,4): [[0.]
 [0.]
 [1.]
 [0.]] shape: (4, 1)
[4]:
# Adjoint of a non-Hermitian operator
A = QTensor(np.array([[1 + 1j, 2], [3, 4]]))
A_dag = A.adjoint()
print("A:\n", A.dense)
print("A†:\n", A_dag.dense)

# Matrix exponential of Pauli-X
X = QTensor(np.array([[0, 1], [1, 0]]))
expX = X.expm()
print("exp(X):\n", np.round(expX.dense, 3))

# Norm of a ket and a density matrix
ket0 = QTensor(np.array([[1], [0]]))
dm = ket0.to_density_matrix()
print("||ket0|| =", ket0.norm())
print("trace norm(dm) =", dm.norm(order="tr"))

# Partial trace of a Bell state
from qilisdk.common.qtensor import ket, tensor_prod

bell = (tensor_prod([ket(0), ket(0)]) + tensor_prod([ket(1), ket(1)])).unit()
rho_bell = bell.to_density_matrix()
print("rho_bell:\n", rho_bell)
rhoA = rho_bell.ptrace([0])
print("rho_A:\n", rhoA.dense)
A:
 [[1.+1.j 2.+0.j]
 [3.+0.j 4.+0.j]]
A†:
 [[1.-1.j 3.+0.j]
 [2.+0.j 4.+0.j]]
exp(X):
 [[1.543 1.175]
 [1.175 1.543]]
||ket0|| = 1.0
trace norm(dm) = 1.0
rho_bell:
 QTensor(shape=4x4, nnz=4, format='csr')
[[0.5 0.  0.  0.5]
 [0.  0.  0.  0. ]
 [0.  0.  0.  0. ]
 [0.5 0.  0.  0.5]]
rho_A:
 [[0.5 0. ]
 [0.  0.5]]
[5]:
# Two‑qubit Hadamard tensor
H = QTensor(np.array([[1, 1], [1, -1]]) / np.sqrt(2))
H2 = tensor_prod([H, H])
print("H ⊗ H:\n", np.round(H2.dense, 3))

# Expectation of Z⊗Z on |00>
Z = QTensor(np.array([[1, 0], [0, -1]]))
zz = tensor_prod([Z, Z])
psi00 = tensor_prod([ket(0), ket(0)])
rho00 = psi00.to_density_matrix()
ev = expect_val(zz, rho00)
print("⟨ZZ⟩ on |00> =", ev)
H ⊗ H:
 [[ 0.5  0.5  0.5  0.5]
 [ 0.5 -0.5  0.5 -0.5]
 [ 0.5  0.5 -0.5 -0.5]
 [ 0.5 -0.5 -0.5  0.5]]
⟨ZZ⟩ on |00> = (1+0j)