code: def _create_bv_circuit(self, bit_map: Dict[str, str]) -> Program:
          
          unitary, _ = self._compute_unitary_oracle_matrix(bit_map)
          full_bv_circuit = Program()
  
          full_bv_circuit.defgate("BV-ORACLE", unitary)
  
          # Put ancilla bit into minus state
          full_bv_circuit.inst(X(self.ancilla), H(self.ancilla))
  
          full_bv_circuit.inst([H(i) for i in self.computational_qubits])
          full_bv_circuit.inst(
              tuple(["BV-ORACLE"] + sorted(self.computational_qubits + [self.ancilla], reverse=True)))
          full_bv_circuit.inst([H(i) for i in self.computational_qubits])
          return full_bv_circuit
docs: Implementation of the Bernstein-Vazirani Algorithm.
  
          Given a list of input qubits and an ancilla bit, all initially in the
          :math:`\\vert 0\\rangle` state, create a program that can find :math:`\\vec{a}` with one
          query to the given oracle.
  
          :param Dict[String, String] bit_map: truth-table of a function for Bernstein-Vazirani with
              the keys being all possible bit vectors strings and the values being the function values
          :rtype: Program