Special Topics¶
This page provides detailed information on specialized functionalities in MIMIQ.
BitString¶
The BitString class represents the state of bits and can be used
to represent classical registers with specified values for each bit (0 or 1). At its core,
it is simply a vector of booleans. BitString allows direct bit manipulation, bitwise operations, and conversion to other data formats like integers. It’s designed for flexibility in binary manipulation tasks within quantum computations.
Using BitString in MIMIQ Operations¶
In MIMIQ, several operations use BitString as a direct input for conditional logic
or specific quantum operations, such as IfStatement
and Amplitude. See non-unitary operations
and statistical operations pages. Here are some examples:
>>> if_statement = IfStatement(GateX(), BitString("01011"))
>>> if_statement
IF (c==01011) X
# Amplitude Operation
>>> Amplitude(BitString("001"))
Amplitude(bs"001")
Constructors¶
BitString objects can be constructed in different ways.
From a String: Use BitString(“binary_string”) to initialize a BitString by parsing a string in binary format.
>>> BitString("1101") bs"1101"
From bit locations: Use BitString(numbits, bit_indices) to initialize a BitString of numbits, setting specific bits to 1.
# Initializing with Specific Bits >>> BitString(8, [2, 4, 6]) bs"00101010"
From a function: Use BitString(f, numbits) to initialize a BitString with numbits, where each bit is set based on the function f.
# Initialize an 8-bit BitString where bits are set based on even indices >>> BitString.fromfunction(8, lambda i: i % 2 == 0) bs"10101010"
Accessing and Modifying Bits¶
Each bit in a BitString can be accessed or modified individually in the same way as vectors, making it easy to retrieve or set specific bit values.
# Accessing a Bit
>>> bs = BitString(4, [1, 3])
>>> bs
bs"0101"
>>> bs[2]
0
>>> # Modifying a Bit
>>> bs[2] = True
>>> bs
bs"0111"
A useful function is nonzeros(), which returns the indices of non-zero bits in a BitString.
>>> bs = BitString(6, [1, 3, 5])
>>> bs.nonzeros()
[1, 3, 5]
Conversion and Manipulation Methods¶
The BitString class includes functionality for
conversion to integer representations, indexing, and other methods for
retrieving and manipulating bit values:
BitString to Integer: Use
tointeger()to convert a BitString into its integer representation,
By default it uses a big-endian order.
>>> bs = BitString("101010") >>> bs bs"101010" # Convert BitString to Integer (big-endian by default) >>> bs.tointeger() 21 # Convert BitString to Integer (little-endian) >>> bs.tointeger(endianess='little') 42
Alternatively, you can use the function toindex(), which converts a BitString to an index for
purposes like vector indexing, checking bounds, and compatibility with 64-bit indexing constraints. It’s
essentially the same as tointeger().
>>> bs.toindex() 21
BitString to String: Use
to01().# Convert BitString to String of "0"s and "1"s (big-endian (default)) >>> bs.to01() '101010' # Convert BitString to String of "0"s and "1"s (little-endian) >>> bs.to01(endianess='little') '010101'
Bitwise Operators¶
BitString supports bitwise operations such as NOT, AND, OR, XOR,
as well as bitwise shifts:
NOT (~):
>>> bs = BitString("1011") >>> ~bs bs"0100"
AND (&), OR (|):
>>> bs1 = BitString("1100") >>> bs2 = BitString("0110") # Bitwise AND >>> bs1 & bs2 bs"0100" # Bitwise OR >>> bs1 | bs2 bs"1110"
XOR (^):
# Bitwise XOR >>> bs1 ^ bs2 bs"1010"
Left Shift (<<) and Right Shift (>>):
# Left Shift >>> bs << 1 bs"0110" # Right Shift >>> bs >> 1 bs"0101"
Concatenation and Repetition¶
BitString supports concatenation and repetition, allowing you to combine or extend bitstrings efficiently:
Concatenation (+) Use + perator to combines two BitString objects by appending the bits of rhs to lhs.
>>> bs1 = BitString("1010") >>> bs2 = BitString("0101") >>> bs1 + bs2 bs"10100101"
Repetition (*) Use * perator to repeat a BitString to a specified number of times, creating a new BitString with the pattern repeated.
>>> bs = BitString("1010") >>> bs * 2 bs"10101010"
Reference¶
- class mimiqcircuits.BitString(arg, indices=None)[source]
Bases:
objectBitString for the quantum states.
Representation of the quantum state of a quantum register with definite values for each qubit.
Examples
Initialization:
>>> from mimiqcircuits import * >>> from bitarray import bitarray >>> BitString(16) # number of qubits bs"0000000000000000" >>> BitString('10101') # binary string bs"10101" >>> BitString([1,0,0,0,1]) # binary string bs"10001" >>> BitString((1,0,0,0,1)) # binary string bs"10001"
>>> BitString(bitarray('101010')) # bitarray bs"101010"
Other initializations:
>>> BitString.fromnonzeros(16, [1, 3, 5, 7, 9, 11, 13, 15]) bs"0101010101010101" >>> BitString.fromfunction(16, lambda i: i % 2 == 1) bs"0101010101010101" >>> BitString.fromstring('10101') bs"10101" >>> BitString.fromint(16, 21) bs"1010100000000000" >>> BitString.fromint(16, 21, 'little') bs"0000000000010101"
Accessing the bits:
>>> bs = BitString(16) >>> bs[0] # get the 0th bit 0 >>> bs[0:4] # get the first 4 bits bs"0000"
Bitwise operations:
>>> bs1 = BitString('10101') >>> bs2 = BitString('11100') >>> bs1 | bs2 # OR bs"11101" >>> bs1 & bs2 # AND bs"10100" >>> bs1 ^ bs2 # XOR bs"01001" >>> ~bs1 # NOT bs"01010" >>> bs1 << 2 # left shift bs"10100" >>> bs1 >> 2 # right shift bs"00101"
Other operations:
>>> bs1 + bs2 # concatenation bs"1010111100" >>> bs1 * 2 # repetition bs"1010110101"
- __init__(arg, indices=None)[source]
Initialize the BitString.
If the number of qubits is given, then the BitString is initialized to the all-zero state. If a binary string or a bitarray is given, then the BitString is the corresponding state.
Examples
>>> BitString(16) # number of qubits bs"0000000000000000" >>> BitString('10101') # binary string bs"10101" >>> BitString(bitarray('101010')) # bitarray bs"101010"
- property bits
- static fromnonzeros(num_qubits, nonzeros)[source]
Initialize a BitString with specific non-zero qubits.
- static fromfunction(num_qubits, f)[source]
Initialize a BitString from a function.
- Parameters:
num_qubits (int) – The number of qubits in the BitString.
f (function) – A function that takes an integer and returns a boolean.
- Returns:
A BitString.
- static fromstring(bitstring)[source]
Initialize a BitString from a string.
- Parameters:
bitstring (str) – The string representation of the BitString.
- Returns:
A BitString.
- static fromint(num_qubits, integer, endianess='big')[source]
Initialize a BitString from an integer.
- num_qubits()[source]
Return the number of qubits in the BitString.
- nonzeros()[source]
Return the indices of the non-zero qubits.
- zeros()[source]
Return the indices of the zero qubits.
- tointeger(endianess='big')[source]
Return the integer value of the BitString.
- Parameters:
endianess (str) – The endianess of the integer. Default is ‘big’.
- Returns:
The integer value of the BitString.
- to01(endianess='big')[source]
Return the binary string representation of the BitString.
- Parameters:
endianess (str) – The endianess of the integer. Default is ‘big’
- Retruns:
The binary string representation of the BitString.
- toindex(endianess='big')[source]
Return the integer index of the BitString.
- Parameters:
endianess (str) – The endianess of the integer. Default is ‘big’.
- Returns:
The integer index of the BitString.
- __setitem__(index, value)[source]
Set a specific bit by creating a new frozenbitarray.