Skip to main content

A hardware-agnostic Python library for qutrit (3-level) quantum computing: gates, circuits, simulation, and SU(3) decomposition.

Project description

Tests Unitary Fund License: MIT Python 3.10+

Qutritium

A hardware-agnostic Python library for qutrit quantum computing.

Build, simulate, and decompose three-level quantum circuits — with metrics, noise modeling, and state & process tomography.


Installation

pip install qutritium            # release
pip install -e ".[dev]"          # editable + dev tools

Quick Start

from qutritium import QutritCircuit, StatevectorSimulator
from qutritium.gates import H3, CSUM
import numpy as np

# Qutrit Bell state: H3 + CSUM → (|00⟩ + |11⟩ + |22⟩) / √3
qc = QutritCircuit(2, None)
qc.append(H3(), first_qutrit=0)
qc.append(CSUM(), first_qutrit=0, second_qutrit=1)
qc.measure_all()

sim = StatevectorSimulator(qc)
sim.run(num_shots=10_000)
print(sim.get_counts())   # {'00': ~3333, '11': ~3333, '22': ~3333}

Decompose an arbitrary SU(3) unitary:

from qutritium import SU3Decomposition
import numpy as np

U = ...  # any 3×3 unitary
dec = SU3Decomposition(U, qutrit_index=0, n_qutrits=1)
print(dec.angles)  # nine decomposition angles
print(dec.reconstruct())  # ≈ U to machine precision

Or run it with noise — noise lives on the simulator, not the circuit:

from qutritium import QutritCircuit, DensityMatrixSimulator
from qutritium.channels import NoiseModel, depolarizing_channel
from qutritium.gates import X01

qc = QutritCircuit(1, None)
qc.append(X01(), first_qutrit=0)
qc.measure_all()

nm = NoiseModel()
nm.add_quantum_error(depolarizing_channel(0.1), "X01")  # noise lives on the sim, not the circuit
dm = DensityMatrixSimulator(qc)
dm.set_noise_model(nm)
dm.run(num_shots=2000)
print(dm.get_counts())

Gate Library

Single-qutrit gates

Category Gates
Pauli-X X01, X02, X12
Pauli-Y Y01, Y02, Y12
Pauli-Z Z01, Z02, Z12
Shifts XPlus (cyclic), XMinus (inverse)
Discrete H3 (Hadamard/DFT), S3, T3, UFT, I3
Rotations Rx01, Rx02, Rx12, Ry01, Ry02, Ry12, Rz01, Rz02, Rz12
Generalized G01(θ,φ), G02(θ,φ), G12(θ,φ) — native trapped-ion gate
Diagonal Ud(φ₁,φ₂,φ₃) — virtual-Z in hardware

Two-qutrit gates

Gate Action
CSUM |c,t⟩ → |c, (t+c) mod 3⟩
CSUMDag |c,t⟩ → |c, (t−c) mod 3⟩ (CSUM inverse)
CPhase |c,t⟩ → ω^{c·t} |c,t⟩
CPhaseDag |c,t⟩ → ω^{−c·t} |c,t⟩ (CPhase inverse)
SWAP3 |a,b⟩ → |b,a⟩
CNOT3 Legacy v0.0.1 CNOT (= CSUM on adjacent qutrits)

All gates inherit from Gate and provide .matrix(), .inverse(), .is_unitary(), .label, .params.

How it fits together

  Gate                  qutritium.gates - X01, H3, CSUM, Rx01, ...
    |                   a unitary; has .matrix() / .inverse()
    |  qc.append(gate, qutrit)
    v
  QutritCircuit         ordered operations (+ measure_all)
    |                   - each append wraps the gate as an Instruction
    |                     (gate + target qutrit(s); lazy 3^n x 3^n effect_matrix)
    |                   - introspect: .draw() .depth() .gate_count() .to_matrix()
    |  hand the circuit to a simulator
    v
  Simulator             StatevectorSimulator (psi - pure states)
    |                   DensityMatrixSimulator (rho - mixed states, noise)
    |                   - optional: .set_noise_model(NoiseModel(...))
    v
  results               .get_counts()  .probabilities()  .return_final_state()
    |
    +--> tomography.reconstruct_state   counts -> reconstructed rho
    +--> tomography.reconstruct_process counts -> Choi matrix -> Kraus ops
    +--> metrics                        state_fidelity, purity, entropy, ...

  SU3Decomposition(U) --> QutritCircuit   decompose any 3x3 unitary into
                                          native gates, then run it

Package Structure

src/qutritium/
├── gates/               # Gate objects
│   ├── base.py          #   Gate ABC + _DaggerGate
│   ├── single_qutrit.py #   29 single-qutrit gates
│   └── two_qutrit.py    #   6 two-qutrit gates
├── circuit/             # Circuit infrastructure
│   ├── elementary_matrices.py  # Raw 3×3 / 9×9 unitaries
│   ├── instruction.py          # Instruction + GATE_SET
│   ├── qutrit_circuit.py       # QutritCircuit container
│   └── utils.py                # Statevector utilities
├── simulator/           # StatevectorSimulator + DensityMatrixSimulator
├── channels/            # Noise channels, NoiseModel, ReadoutError, SPAM
├── metrics/             # Fidelity, trace distance, purity, entropy
├── tomography/          # MUB state + process tomography + visualization
└── decomposition/       # SU(3) → native rotations

Supporting files at repo root:

.github/workflows/       # CI + release (test.yml, docs.yml, release.yml)
docs/                    # MkDocs source → spham1611.github.io/qutritium
examples/                # Bell-state, noise+tomography, process-tomography notebooks
test/                    # pytest suite
legacy/                  # v0.0.x Qiskit-pulse code (archived, not installed)

Documentation

Full docs: https://spham1611.github.io/qutritium/

Tutorial notebooks: examples/tutorial.ipynb (core), examples/noise_and_tomography.ipynb (noise + state tomography), and examples/process_tomography.ipynb (process tomography)

History

Qutritium was originally built for calibrating qutrits on IBM superconducting hardware, presented at the Munich Quantum Software Conference 2023 and funded by a Unitary Fund microgrant. The v1.0.0 release pivoted to a hardware-agnostic library; the original pulse code is preserved under legacy/.

Author

Acknowledgments

  • Tien Nguyen (École Polytechnique, France) and Bao Bach (University of Delaware, USA) — contributors to the original Qiskit-pulse calibration code preserved under legacy/
  • Charlie He (Duke University) — insight on qutrit physics

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qutritium-1.5.2.tar.gz (50.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

qutritium-1.5.2-py3-none-any.whl (55.0 kB view details)

Uploaded Python 3

File details

Details for the file qutritium-1.5.2.tar.gz.

File metadata

  • Download URL: qutritium-1.5.2.tar.gz
  • Upload date:
  • Size: 50.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for qutritium-1.5.2.tar.gz
Algorithm Hash digest
SHA256 99e57de63046ec8ddd4e87978e4fcbbe5b6883b8dd5331b5c17651c90d42c8ba
MD5 976112195cb447f3449cb6aa55d35b12
BLAKE2b-256 be76ab2cbe7a025e44c02609b0e9207c0039fedcf47083874001d67b3d3f9832

See more details on using hashes here.

Provenance

The following attestation bundles were made for qutritium-1.5.2.tar.gz:

Publisher: release.yml on spham1611/qutritium

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qutritium-1.5.2-py3-none-any.whl.

File metadata

  • Download URL: qutritium-1.5.2-py3-none-any.whl
  • Upload date:
  • Size: 55.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for qutritium-1.5.2-py3-none-any.whl
Algorithm Hash digest
SHA256 bc961b5c63ac62dc41445ae4e654c7858b804995072d11bc0934a6572313470e
MD5 7a3a1964cedf4111774c1eceef422b54
BLAKE2b-256 89f3727d12aa5f934415668a3942a8b1b99894fb9c0d583a064550c293ae4d8e

See more details on using hashes here.

Provenance

The following attestation bundles were made for qutritium-1.5.2-py3-none-any.whl:

Publisher: release.yml on spham1611/qutritium

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page