Un algoritmo quantistico di esempio, utile per dimostrare le lingue


9

Sto cercando un algoritmo quantistico che posso usare per dimostrare la sintassi di diversi linguaggi quantistici. La mia domanda è simile a questa , tuttavia, per me "buono" significa:

  • Quello che fa potrebbe essere descritto in 1-2 paragrafi e dovrebbe essere facile da capire.
  • Dovrebbe usare più elementi del "mondo della programmazione quantistica" (intendo che l'algoritmo dovrebbe usare il maggior numero possibile di costanti, misurazioni, condizioni, qregister, operatori, ecc. Classici).
  • L'algoritmo dovrebbe essere piccolo (al massimo 15-25 righe di pseudocodici).

Gli algoritmi utili sono spesso troppo lunghi / difficili, ma l'algoritmo di Deutsch non utilizza così tanti elementi. Qualcuno può suggerirmi un algoritmo buono per la demo?


Il tuo requisito è anche che dovrebbe essere un "algoritmo" con un input classico e un output classico e un chiaro beneficio / differenza rispetto al modo in cui l'algoritmo classico equivalente funzionerebbe?
DaftWullie,

@DaftWullie Questi non sono richiesti. Il parametro di un operatore o l'inizializzazione di una costante classica possono rappresentare per me "input" e, se necessario, fornirò il formato di output. Non ha bisogno di fare / essere speciale. L'attenzione si concentra sulla sintassi delle lingue, la descrizione è solo per convalidare che i codici in diverse lingue sono uguali. Il significato dell'algoritmo è irrilevante.
Klenium,

Benvenuti in Quantum Computing SE! Solo per verificare, i tuoi criteri per una buona risposta sono la maggior parte degli elementi nello pseudo codice più breve?
Mithrandir24601

1
@ Mithrandir24601 Grazie! Sì, in qualche modo così.
Klenium,

Risposte:


3

Suggerisco di esaminare i protocolli di stima degli autovalori / autovettori. C'è molta flessibilità per rendere il problema facile o difficile come vuoi.

Inizia selezionando due parametri, e k . Si desidera progettare un unitario n -qubit, U che abbia autovalori della forma e - 2 π i q / 2 k per gli interi q . Assicurati che almeno uno di questi autovalori sia unico e chiamalo ω . Assicurati anche che un semplice stato del prodotto, dica | 0 n , ha non-zero sovrapposizione con l'autovettore di autovalore ω .nknUe2πiq/2kqω|0nω

k|ψωn+kU

Funziona come segue:

  • kn

  • |0

  • applica un Hadamard a ciascun qubit nel primo registro ( gate a qubit singolo )

  • rU2r

  • applica la trasformata inversa di Fourier sul primo registro e misura ogni qubit del primo registro nella base standard. Questi possono essere combinati, implementando la trasformata semi-classica di Fourier . ( misurazione e feed-forward di dati classici )

  • |ψ

n=2k=14×4±1

(U1U2)C(U1U2),
C|ψ=(U1U2)|1(|0|1)/2U1U2UU

k=3C

(1000012i200i21200001)
ω=e±iπ/4|ψ=(U1U2)(|01±|10)/2

3

Sembra che tu voglia un "Hello World" quantico. La versione quantistica più semplice di ciò sarebbe solo quella di scrivere una versione binaria del testo Hello Worldin un registro di qubit. Ma ciò richiederebbe ~ 100 qubit ed essere più lungo del limite massimo per la lunghezza del codice.

Quindi scriviamo una porzione di testo più breve. Scriviamo ;), abbiamo bisogno di una stringa di bit di lunghezza 16. In particolare, utilizzando la codifica ASCII

;)  =  00111011 00101001

Usando QISKit, lo faresti usando il seguente codice.

from qiskit import QuantumProgram
import Qconfig

qp = QuantumProgram()
qp.set_api(Qconfig.APItoken, Qconfig.config["url"]) # set the APIToken and API url

# set up registers and program
qr = qp.create_quantum_register('qr', 16)
cr = qp.create_classical_register('cr', 16)
qc = qp.create_circuit('smiley_writer', [qr], [cr])

# rightmost eight (qu)bits have ')' = 00101001
qc.x(qr[0])
qc.x(qr[3])
qc.x(qr[5])

# second eight (qu)bits have 00111011
# these differ only on the rightmost two bits
qc.x(qr[9])
qc.x(qr[8])
qc.x(qr[11])
qc.x(qr[12])
qc.x(qr[13])

# measure
for j in range(16):
    qc.measure(qr[j], cr[j])

# run and get results
results = qp.execute(["smiley_writer"], backend='ibmqx5', shots=1024)
stats = results.get_counts("smiley_writer")

Certo, questo non è molto quantico. Quindi potresti invece sovrapporre due diverse emoticon. L'esempio più semplice è sovrapporre;) con 8), poiché le stringhe di bit per queste differiscono solo per i qubit 8 e 9.

;)  =  00111011 00101001
8)  =  00111000 00101001

Quindi puoi semplicemente sostituire le linee

qc.x(qr[9])
qc.x(qr[8])

da quanto sopra con

qc.h(qr[9]) # create superposition on 9
qc.cx(qr[9],qr[8]) # spread it to 8 with a cnot

Hadamard crea una sovrapposizione di 0e 1, e il cnot lo trasforma in una sovrapposizione di 00e 11su due qubit. Questa è l'unica sovrapposizione richiesta per ;)e 8).

Se vuoi vedere una reale implementazione di questo, puoi trovarlo nel tutorial di QISKit (divulgazione completa: è stato scritto da me).


Ottengo 404 per quel link. Hai spostato il file altrove?
Klenium,

Sembra che il tutorial sia stato appena aggiornato. Ho cambiato il link, quindi dovrebbe funzionare ora.
James Wootton,

1

Proporrei il (perfetto) generatore di numeri casuali a 1 bit. È quasi banalmente facile:

|0H|0|1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.