Qx.Format (Qx - Quantum Computing Simulator v0.6.0)

View Source

Shared formatting utilities for quantum states and complex numbers.

This module provides consistent formatting across the Qx library for:

  • Complex numbers in "a+bi" notation
  • Basis state labels in ket notation (|00⟩, |01⟩, etc.)
  • Dirac notation for quantum state representation

Examples

# Format complex numbers
iex> Qx.Format.complex(Complex.new(0.707, 0.5))
"0.707+0.500i"

# Format basis states
iex> Qx.Format.basis_state(3, 2)
"|11⟩"

# Build Dirac notation
iex> amplitudes = [
...>   {"|00⟩", Complex.new(0.707, 0.0), 0.5},
...>   {"|01⟩", Complex.new(0.0, 0.0), 0.0},
...>   {"|10⟩", Complex.new(0.707, 0.0), 0.5}
...> ]
iex> Qx.Format.dirac_notation(amplitudes)
"0.707|00⟩ + 0.707|10⟩"

Summary

Functions

Formats a basis state index as ket notation: |00⟩, |01⟩, etc.

Formats a complex number as "a+bi" notation.

Builds Dirac notation string from amplitudes and probabilities.

Formats state label for visualization.

Functions

basis_state(index, num_qubits)

Formats a basis state index as ket notation: |00⟩, |01⟩, etc.

Parameters

  • index - The basis state index (0-based)
  • num_qubits - Number of qubits in the system

Examples

iex> Qx.Format.basis_state(0, 2)
"|00⟩"

iex> Qx.Format.basis_state(3, 2)
"|11⟩"

iex> Qx.Format.basis_state(5, 3)
"|101⟩"

complex(complex_num, opts \\ [])

Formats a complex number as "a+bi" notation.

Options

  • :precision - Number of decimal places (default: 3)
  • :format - :erlang (default, faster) or :float

Examples

iex> Qx.Format.complex(Complex.new(0.707, 0.5))
"0.707+0.500i"

iex> Qx.Format.complex(Complex.new(1.0, -0.5), precision: 2)
"1.00-0.50i"

iex> Qx.Format.complex(Complex.new(0.0, 0.0))
"0.000+0.000i"

dirac_notation(amplitudes_and_probs, opts \\ [])

Builds Dirac notation string from amplitudes and probabilities.

Filters out basis states with negligible probability and formats the remaining terms in standard quantum notation.

Parameters

  • amplitudes_and_probs - List of tuples: {basis_label, amplitude, probability}

Options

  • :threshold - Minimum probability to include (default: 1.0e-6)
  • :precision - Decimal precision for magnitudes (default: 3)

Examples

iex> amplitudes_and_probs = [
...>   {"|00⟩", Complex.new(0.707, 0.0), 0.5},
...>   {"|01⟩", Complex.new(0.0, 0.0), 0.0},
...>   {"|10⟩", Complex.new(0.707, 0.0), 0.5},
...>   {"|11⟩", Complex.new(0.0, 0.0), 0.0}
...> ]
iex> Qx.Format.dirac_notation(amplitudes_and_probs)
"0.707|00⟩ + 0.707|10⟩"

iex> # Bell state |Φ+⟩ = (|00⟩ + |11⟩)/√2
iex> bell_state = [
...>   {"|00⟩", Complex.new(0.707, 0.0), 0.5},
...>   {"|11⟩", Complex.new(0.707, 0.0), 0.5}
...> ]
iex> Qx.Format.dirac_notation(bell_state)
"0.707|00⟩ + 0.707|11⟩"

iex> # Minus state |-⟩ = (|0⟩ - |1⟩)/√2
iex> minus_state = [
...>   {"|0⟩", Complex.new(0.707, 0.0), 0.5},
...>   {"|1⟩", Complex.new(-0.707, 0.0), 0.5}
...> ]
iex> Qx.Format.dirac_notation(minus_state)
"0.707|0⟩ - 0.707|1⟩"

state_label(index, num_qubits_or_size)

Formats state label for visualization.

This is a convenience function that handles both:

  • num_qubits directly
  • state_size (dimension of Hilbert space) - converts to num_qubits

Examples

iex> Qx.Format.state_label(3, 2)  # 3 in 2-qubit system
"|11⟩"

iex> Qx.Format.state_label(5, 8)  # 5 in 8-dimensional space (3 qubits)
"|101⟩"