qrisp.quantum_backtracking.QuantumBacktrackingTree.init_phi#
- QuantumBacktrackingTree.init_phi(path)[source]#
Initializes the normalized version of the state \(\ket{\phi}\).
\[\begin{split}\ket{\phi} = \sqrt{n}\ket{r} + \sum_{x \neq r, \\ x \rightsquigarrow x_0} (-1)^{l(x)} \ket{x}\end{split}\]Where \(x \rightsquigarrow x_0\) means that \(x\) is on the path from \(r\) to \(x_0\) (including \(x_0\)).
If \(x_0\) is a marked node, this state is invariant under the quantum step operator.
- Parameters:
- pathList
The list of branches specifying the path from the root to \(x_0\).
Examples
We set up a backtracking tree of depth 3, where the marked element is the 111 node.
from qrisp import auto_uncompute, QuantumBool, QuantumFloat from qrisp.quantum_backtracking import QuantumBacktrackingTree @auto_uncompute def reject(tree): return QuantumBool() @auto_uncompute def accept(tree): return (tree.branch_qa[0] == 1) & (tree.branch_qa[1] == 1) & (tree.branch_qa[2] == 1) tree = QuantumBacktrackingTree(3, QuantumFloat( 1, name = "branch_qf*"), accept, reject)
Initialize \(\ket{\phi}\) and evaluate the statevector:
>>> tree.init_phi([1,1,1]) >>> print(tree.qs.statevector()) (0.816496014595032*|0>*|1>**3 - 0.816496014595032*|0>**2*|1>*|2> + 1.0*sqrt(2)*|0>**3*|3> - 0.816496014595032*|1>**3*|0>)/2
Perform the quantum step and evaluate the statevector again:
>>> tree.quantum_step() >>> print(tree.qs.statevector()) (0.816496014595032*|0>*|1>**3 - 0.816496014595032*|0>**2*|1>*|2> + 1.0*sqrt(2)*|0>**3*|3> - 0.816496014595032*|1>**3*|0>)/2
We see that the node (as expected) is invariant under the quantum step operator.