En este tutorial, presentamos un tutorial práctico avanzado que demuestra cómo usamos Qrisp para construir y ejecutar algoritmos cuánticos no triviales. Analizamos las abstracciones centrales de Qrisp para datos cuánticos, construimos estados entrelazados y luego implementamos progresivamente la búsqueda de Grover con cálculo automático, estimación de fase cuántica y un flujo de trabajo QAOA completo para el problema MaxCut. Además, nos enfocamos en escribir programas cuánticos expresivos de alto nivel mientras permitimos que Qrisp administre la construcción de circuitos, la lógica de control y la reversibilidad detrás de escena. Consulta los CÓDIGOS COMPLETOS aquí.
Comenzamos configurando el entorno de ejecución e instalando Qrisp junto con la pila científica mínima necesaria para ejecutar experimentos cuánticos. Importamos las primitivas centrales de Qrisp que nos permiten representar tipos de datos cuánticos, puertas y flujo de control. También preparamos las utilidades de optimización y Grover que posteriormente permitirán algoritmos variacionales y amplificación de amplitud. Consulta los CÓDIGOS COMPLETOS aquí.
devolver elementos def print_topk(prob_dict, k=10, label=”Resultados principales”): items = topk_probs(prob_dict, k=k) print(label) para estado, problema en elementos: print(f” {state}: {prob:.4f}”) def bitstring_to_partition(bitstring): left = [i for i, b in enumerate(bitstring) if b == “0”]
derecha = [i for i, b in enumerate(bitstring) if b == “1”]
return izquierda, derecha def classic_maxcut_cost(G, bitstring): s = set(i para i, b in enumerate(bitstring) if b == “0”) cost = 0 for u, v in G.edges(): if (u in s) != (v in s): cost += 1 return cost banner(“SECCIÓN 1 — Qrisp Core: QuantumVariable, QuantumSession, GHZ State”) def GHZ(qv): h(qv)[0]) para i en rango(1, qv.size): cx(qv[0]qv[i]) qv = QuantumVariable(5) GHZ(qv) print(“Circuito (QuantumSession):”) print(qv.qs) print(“\nDistribución del estado (la impresión de QuantumVariable activa una vista dict similar a una medición):”) print(qv) meas = qv.get_measurement() print_topk(meas, k=6, label=”\nResultados medidos (aprox.)”) qch = Carácter Cuántico() h(qch[0]) print(“\nMuestra de medición de QuantumChar:”) print_topk(qch.get_measurement(), k=8)
Definimos funciones de utilidad que nos ayudan a inspeccionar distribuciones de probabilidad, interpretar cadenas de bits y evaluar costos clásicos para compararlos con resultados cuánticos. Luego construimos un estado GHZ para demostrar cómo Qrisp maneja el entrelazamiento y la composición de circuitos a través de abstracciones de alto nivel. También mostramos datos cuánticos tipificados utilizando QuantumChar, lo que refuerza cómo se pueden manipular y medir los valores cuánticos simbólicos. Consulta los CÓDIGOS COMPLETOS aquí.
Implementamos un oráculo de Grover utilizando no computación automática, lo que nos permite expresar lógica reversible sin limpiar manualmente los estados intermedios. Aplicamos amplificación de amplitud sobre un espacio de búsqueda QuantumFloat para resolver una ecuación no lineal simple mediante búsqueda cuántica. Finalmente inspeccionamos la distribución de medidas resultante para identificar las soluciones más probables producidas por el algoritmo de Grover. Consulta los CÓDIGOS COMPLETOS aquí.
Construimos un proceso completo de estimación de fase cuántica combinando aplicaciones unitarias controladas con una transformada cuántica de Fourier inversa. Demostramos cómo la información de fase se codifica en un registro cuántico con precisión sintonizable utilizando QuantumFloat. Luego medimos conjuntamente el sistema y los registros de fase para interpretar las fases propias estimadas. Consulta los CÓDIGOS COMPLETOS aquí.
para bitstr, problema en top8: cost_val = cl_cost({bitstr: 1}) print(f” {bitstr} prob={prob:.4f} cut_edges≈{cost_val}”) best_bitstr = top8[0][0]
best_cost = classic_maxcut_cost(G, best_bitstr) left, right = bitstring_to_partition(best_bitstr) print(f”\nSolución más probable: {best_bitstr}”) print(f”Partición 0-side: {left}”) print(f”Partición 1-side: {right}”) print(f”Bordes cruzados clásicos (verificados): {best_cost}”) pos = nx.spring_layout(G, semilla=42) node_colors = [“#6929C4” if best_bitstr[i] == “0” else “#20306f” para i en G.nodes()]plt.figure(figsize=(6.5, 5.2)) nx.draw( G, pos, with_labels=True, node_color=node_colors, node_size=900, font_color=”white”, edge_color=”#CCCCCC”, ) plt.title(f”QAOA MaxCut (mejor bitstring = {best_bitstr}, cut={best_cost})”) plt.show() banner(“HECHO: ahora tiene los flujos de trabajo Grover + QPE + QAOA ejecutándose en Qrisp en Colab ✅”) print(“Consejo: intente aumentar la profundidad de QAOA, cambiar el gráfico o intercambiar mezcladores (RX/RY/XY) para explorar el comportamiento.”)
Formulamos el problema MaxCut como una instancia de QAOA utilizando las abstracciones orientadas a problemas de Qrisp y ejecutamos un ciclo de optimización híbrido cuántico-clásico. Analizamos la distribución de probabilidad devuelta para identificar candidatos de corte de alta calidad y verificarlos con una función de costos clásica. Concluimos visualizando el mejor corte, conectando resultados cuánticos abstractos a una estructura gráfica intuitiva.
Concluimos mostrando cómo un flujo de trabajo Qrisp único y coherente nos permite pasar de la preparación de estados cuánticos de bajo nivel a algoritmos variacionales modernos utilizados en la computación cuántica a corto plazo. Al combinar la no computación automática, operaciones controladas y abstracciones orientadas a problemas como QAOAProblem, demostramos cómo creamos rápidamente prototipos y experimentamos con algoritmos cuánticos avanzados. Además, este tutorial establece una base sólida para ampliar nuestro trabajo hacia circuitos más profundos, mezcladores alternativos y funciones de costos, y experimentos híbridos cuánticos-clásicos más complejos.
Consulta los CÓDIGOS COMPLETOS aquí. Además, no dude en seguirnos en Twitter y no olvide unirse a nuestro SubReddit de más de 100.000 ML y suscribirse a nuestro boletín. ¡Esperar! estas en telegrama? Ahora también puedes unirte a nosotros en Telegram.