#[repr(C)]pub struct PauliString<const W: usize> {
pub x: [u64; W],
pub z: [u64; W],
}Expand description
A Pauli operator on up to 64 · W qubits.
Layout is #[repr(C)] so the type is Pod and can be reinterpreted as
bytes for serialization or upload to a GPU device. There is no stored
phase: multiplication returns the i^k phase as a separate Phase
and callers fold it into their coefficient at the boundary.
Ord is the load-bearing trait (the engine is sort-based, not
hashmap-based).
§Examples
use paulistrings::PauliString;
let p = PauliString::<1>::x(3);
assert_eq!(p.weight(), 1);
assert!(p.commutes_with(&PauliString::<1>::x(0)));Fields§
§x: [u64; W]X-part bitmask: bit q is set iff the Pauli on qubit q has an
X-component (i.e. is X or Y).
z: [u64; W]Z-part bitmask: bit q is set iff the Pauli on qubit q has a
Z-component (i.e. is Z or Y).
Implementations§
Source§impl<const W: usize> PauliString<W>
impl<const W: usize> PauliString<W>
Sourcepub const fn identity() -> Self
pub const fn identity() -> Self
Identity Pauli string (all qubits I).
§Examples
use paulistrings::PauliString;
let id = PauliString::<1>::identity();
assert_eq!(id.weight(), 0);Sourcepub fn weight(&self) -> u32
pub fn weight(&self) -> u32
Number of non-identity qubits (Hamming weight of x | z).
§Examples
use paulistrings::PauliString;
let mut p = PauliString::<1>::x(0);
p.mul_assign(&PauliString::<1>::z(1));
assert_eq!(p.weight(), 2);Sourcepub fn mul_assign(&mut self, other: &Self) -> Phase
pub fn mul_assign(&mut self, other: &Self) -> Phase
Multiply self * other in place. Returns the i^k phase factor such
that the true product is phase · self_after_xor.
§Examples
X · Z = -i·Y: the bits XOR to Y and the phase is -i.
use paulistrings::{PauliString, Phase};
let mut p = PauliString::<1>::x(0);
let phase = p.mul_assign(&PauliString::<1>::z(0));
assert_eq!(p, PauliString::<1>::y(0));
assert_eq!(phase, Phase::MINUS_I);Sourcepub fn mul(self, other: &Self) -> (Self, Phase)
pub fn mul(self, other: &Self) -> (Self, Phase)
Value-returning multiply: (self * other, phase).
Not implemented as std::ops::Mul because the operation also
returns a Phase — calling sites need both the bits and the phase
to fold into a Complex64 coefficient at the boundary.
Sourcepub fn is_within(&self, num_qubits: usize) -> bool
pub fn is_within(&self, num_qubits: usize) -> bool
true iff every set bit lies on a qubit index < num_qubits.
The engine and built-in channels preserve this bound by construction
(a channel only flips bits inside Channel::support, which is
bounded at Circuit build time), so this check is not on the hot
path. Use it in debug_assert! at boundaries with custom Channel
impls, in PauliSum::assert_invariants, and in tests that exercise
the invariant directly.
§Panics
Panics in debug builds if num_qubits > 64 · W.
Sourcepub fn commutes_with(&self, other: &Self) -> bool
pub fn commutes_with(&self, other: &Self) -> bool
true iff self and other commute as Pauli operators.
§Examples
use paulistrings::PauliString;
// X and Z anticommute.
assert!(!PauliString::<1>::x(0).commutes_with(&PauliString::<1>::z(0)));
// X on disjoint qubits commutes with anything on the other qubit.
assert!(PauliString::<1>::x(0).commutes_with(&PauliString::<1>::z(1)));Trait Implementations§
Source§impl<const W: usize> Clone for PauliString<W>
impl<const W: usize> Clone for PauliString<W>
Source§fn clone(&self) -> PauliString<W>
fn clone(&self) -> PauliString<W>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<const W: usize> Debug for PauliString<W>
impl<const W: usize> Debug for PauliString<W>
Source§impl<const W: usize> Default for PauliString<W>
impl<const W: usize> Default for PauliString<W>
Source§impl<const W: usize> Hash for PauliString<W>
impl<const W: usize> Hash for PauliString<W>
Source§impl<const W: usize> Ord for PauliString<W>
impl<const W: usize> Ord for PauliString<W>
Source§fn cmp(&self, other: &Self) -> Ordering
fn cmp(&self, other: &Self) -> Ordering
Lexicographic compare on the concatenation (x, z) interpreted as an
unsigned-integer array, low-to-high word order.
1.21.0 · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl<const W: usize> PartialEq for PauliString<W>
impl<const W: usize> PartialEq for PauliString<W>
Source§impl<const W: usize> PartialOrd for PauliString<W>
impl<const W: usize> PartialOrd for PauliString<W>
impl<const W: usize> Copy for PauliString<W>
impl<const W: usize> Eq for PauliString<W>
impl<const W: usize> Pod for PauliString<W>
impl<const W: usize> StructuralPartialEq for PauliString<W>
Auto Trait Implementations§
impl<const W: usize> Freeze for PauliString<W>
impl<const W: usize> RefUnwindSafe for PauliString<W>
impl<const W: usize> Send for PauliString<W>
impl<const W: usize> Sync for PauliString<W>
impl<const W: usize> Unpin for PauliString<W>
impl<const W: usize> UnwindSafe for PauliString<W>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> CheckedBitPattern for Twhere
T: AnyBitPattern,
impl<T> CheckedBitPattern for Twhere
T: AnyBitPattern,
§type Bits = T
type Bits = T
Self must have the same layout as the specified Bits except for
the possible invalid bit patterns being checked during
is_valid_bit_pattern.§fn is_valid_bit_pattern(_bits: &T) -> bool
fn is_valid_bit_pattern(_bits: &T) -> bool
bits
as &Self.Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more