Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een oracle, $O$, is een niet-belichte bewerking die wordt gebruikt als invoer voor een ander algoritme. Dergelijke bewerkingen worden vaak gedefinieerd met behulp van een klassieke functie $f: \{0, 1\}^n \to \{0, 1\}^m$, die een $n-bits$ binaire invoer gebruikt en een $binaire m-bit-uitvoer$ produceert. Hiervoor moet u een bepaalde binaire invoer $x (x_=, x_{0}, \dots, x_{1}n-1{)} overwegen.$ U kunt qubitstatussen labelen als $\ket{\vec{x}}=\ket{x_{{0}}\otimes\ket{x_{1}}\otimes\cdots\otimes\ket{x_{n-1.}}$
U kunt eerst proberen O te definiëren $zodat $O$x\ket{}=f(x)\ket{, maar deze methode heeft een aantal problemen.}$ $Ten eerste kan f$ een andere grootte van invoer en uitvoer hebben ($n \ne m$), zodat het toepassen van $O$ het aantal qubits in het register zou wijzigen. Ten tweede, zelfs als n m, de functie mogelijk niet omkeerbaar is: als $f(x) f(y)=$ voor sommige $x = y$, dan $O\nex$$ O\ket{y} maar =O^\ket{ O}$x$\dagger O^\ket{ O}y.\ne\dagger\ket{}$ Dit betekent dat u de aangrenzende bewerking $O^\dagger$niet kunt maken en dat oracles hiervoor een aangrenzende definitie moeten hebben.
Een oracle definiëren op basis van het effect ervan op rekenkundige basisstatussen
U kunt beide problemen oplossen door een tweede register van $m$ qubits in te voeren om het antwoord vast te stellen. Definieer vervolgens het effect van het orakel op alle computationele basisstaten: voor alle $x \in \{0, 1\}^n$ en $y \in \{0, 1\}^m$,
$$ \begin{ \begin{align}O(\ket{x}\otimes\ket{y})=\ket{ x}\otimes\ket{y \oplus f(x).} \end{align} $$
Nu is $O = O^\dagger$ volgens de constructie en u hebt beide eerdere problemen opgelost.
Tip
Als u wilt zien dat $O = O^{\dagger}$, let op dat $O^2 =\mathbf{1}$ aangezien $a \oplus b \oplus b = a$ voor alle $a, b \in{0, 1}$. Als gevolg hiervan$, O \ket{x}\ket{y \oplus f(x)}=\ket{x}\ket{y \oplus f(x) \oplus f(x)}=\ket{x}\ket{y.}$
Belangrijk is dat het definiëren van een oracle op deze manier voor elke rekenkundige basisstatus $\ket{x}\ket{y}$ ook definieert hoe $O$ voor elke andere status fungeert. Dit gedrag volgt onmiddellijk van het feit dat $O$, net als alle kwantumbewerkingen, lineair is in de toestand waarop het reageert. Bekijk bijvoorbeeld de Hadamard-bewerking, die is gedefinieerd $H \ket{0}=\ket{+}$ en $H.\ket{1}=\ket{-}$ Als u wilt weten hoe $H$ werkt op $\ket{+}$, kunt u die $H$ lineair gebruiken,
$$ \begin{align}H\ket{+}& =\frac{1}{\sqrt{{2}} H(\ket{0} + \ket{{1}) =\frac{1}{\sqrt{{2}}(H\ket{0} + H\ket{1}) \\& =\frac{1}{\sqrt{2}} (\ket{+}\ket{{-}) =\frac12 (\ket{{0} + \ket{{1} +\ket{{0}-\ket{{1}). =\ket{{0} \end{align} $$
Wanneer u het oracle $O$ definieert, kunt u op dezelfde manier gebruiken dat elke status $\ket{\psi}$ op $n + m$ qubits kan worden geschreven als
$$ \begin{ \begin{align} \ket{\psi} & =\sum_{x \in \{0, 1\}^n, y \in \{0, 1\}^m}\alpha(x, y) \ket{x}\ket{y}. \end{align} $$
Hier: $\alpha \{0, 1\}^n \times \{0, 1\}^m\to\mathbb{ C}$ vertegenwoordigt de coëfficiënten van de toestand$\ket{\psi}$. Dus
$$ \begin{ \begin{align}O \ket{\psi}& = O \sum_{x \in \{0, 1\}^n, y \in \{0, 1\}^m}\alpha(x, y) \ket{x}\ket{y}\\& =\sum_{x \in \{0, 1\}^n, y \in \{0, 1\}^m}\alpha(x, y) O \ket{x}\ket{y}\\& =\sum_{x \in \{0, 1\}^n, y \in \{0, 1\}^m}\alpha(x, y) \ket{x}\ket{y \oplus f(x)}. \end{align} $$
Faseorakels
U kunt ook $f$ coderen in een oracle $O$ door een fase toe te passen op basis van de invoer op $O$. U kunt bijvoorbeeld $O$ definiëren zodat $$\begin{\begin{align} O \ket{x}= (-1)^{f(x)}\ket{x.} \end{align} $$
Als een faseorakel in eerste instantie in een rekenkundige basistoestand $\ket{x}$ op een register reageert, is deze fase een globale fase en dus niet waarneembaar. Maar een dergelijk orakel kan een krachtig hulpmiddel zijn als het wordt toegepast op een superpositie of als een gecontroleerde bewerking. Denk bijvoorbeeld aan een faseorakel $O_f$ voor een functie $met één qubit f$. $$ \begin{align} Vervolgens O_f \ket{+}& = O_f (\ket{0} +\ket{{1} ) /\sqrt{{2}\\& amp; = ((-1)^{f(0)}\ket{0} + (-1)^{f(1)}\ket{1}) /\sqrt{2}\\& amp; = (-1)^{f(0)} (\ket{{0} + (-1)^{f(1) - f(0)}\ket{{1}) /\sqrt{{2}\\&= (-1)^{f(0)} Z^{f(0) - f(1)}\ket{+.} \end{align} $$
Notitie
Houd er rekening mee dat $Z^{-1}=Z^{\dagger}=Z$ en daarom $Z^{f(0)-f(1)}=Z^{f(1)-f(0)}.$
Over het algemeen kunnen beide weergaven van orakels worden uitgebreid om klassieke functies weer te geven, die reële getallen retourneren in plaats van slechts een enkele bit.
Het kiezen van de beste manier om een oracle te implementeren, is sterk afhankelijk van hoe dit oracle moet worden gebruikt binnen een bepaald algoritme. Het Deutsch-Jozsa-algoritme is bijvoorbeeld afhankelijk van het oracle dat op de eerste manier is geïmplementeerd, terwijl het algoritme van Grover afhankelijk is van het oracle dat op de tweede manier is geïmplementeerd.
Zie de discussie in Gilyén 1711.00465 voor meer informatie.