code: def oracle_grover(oracle: Program, qubits: List[int], num_iter: int = None) -> Program:
          
          if num_iter is None:
              num_iter = int(round(np.pi * 2 ** (len(qubits) / 2.0 - 2.0)))
          uniform_superimposer = Program().inst([H(qubit) for qubit in qubits])
          amp_prog = amplification_circuit(uniform_superimposer, oracle, qubits, num_iter)
          return amp_prog
docs: Implementation of Grover's Algorithm for a given oracle.
  
          :param oracle: An oracle defined as a Program. It should send :math:`\ket{x}`
              to :math:`(-1)^{f(x)}\ket{x}`, where the range of f is {0, 1}.
          :param qubits: List of qubits for Grover's Algorithm.
          :param num_iter: The number of iterations to repeat the algorithm for.
                           The default is the integer closest to :math:`\frac{\pi}{4}\sqrt{N}`,
                           where :math:`N` is the size of the domain.
          :return: A program corresponding to the desired instance of Grover's Algorithm.