Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/translations/ja/ch-algorithms/shor.ipynb
4054 views
Kernel: Python 3

ใ‚ทใƒงใ‚ขใฎใ‚ขใƒซใ‚ดใƒชใ‚บใƒ 

ใ‚ทใƒงใ‚ข(Shor)ใฎใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใฏใ€ๅคš้ …ๅผๆ™‚้–“ใงๆ•ดๆ•ฐใ‚’ๅ› ๆ•ฐๅˆ†่งฃใ™ใ‚‹ใ“ใจใงๆœ‰ๅใงใ™ใ€‚ๆœ€ใ‚‚ใ‚ˆใ็Ÿฅใ‚‰ใ‚Œใฆใ„ใ‚‹ๅคๅ…ธ็š„ใชใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใฏใ€2ใคใฎ็ด ๆ•ฐใฎ็ฉใฎๅ› ๆ•ฐๅˆ†่งฃใซ่ถ…ๅคš้ …ๅผๆ™‚้–“ใŒๅฟ…่ฆใงใ™ใ€‚ใ‚ˆใฃใฆใ€ๅบƒใไฝฟใ‚ใ‚Œใฆใ„ใ‚‹ๆš—ๅทใ‚ทใ‚นใƒ†ใƒ RSAใฏใ€ๅๅˆ†ๅคงใใชๆ•ดๆ•ฐใฎๅ ดๅˆใ€ๅ› ๆ•ฐๅˆ†่งฃใŒไธๅฏ่ƒฝใงใ‚ใ‚‹ใ“ใจใ‚’ๅ‰ๆใจใ—ใฆใ„ใพใ™ใ€‚

ใ“ใฎ็ซ ใงใฏใ€ใ‚ทใƒงใ‚ขใฎใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใฎ้‡ๅญ้ƒจๅˆ†ใซ็„ฆ็‚นใ‚’ๅฝ“ใฆใพใ™ใ€‚ใใ‚Œใฏใ€ๅฎŸ้š›ใซใฏใ€ๅ‘จๆœŸ็™บ่ฆ‹ ใฎๅ•้กŒใ‚’่งฃใใพใ™ใ€‚ๅ› ๆ•ฐๅˆ†่งฃใฎๅ•้กŒใฏๅคš้ …ๅผๆ™‚้–“ใฎๅ‘จๆœŸ็™บ่ฆ‹ๅ•้กŒใซๅค‰ๆ›ใงใใ‚‹ใŸใ‚ใ€ใ‚ทใƒงใ‚ขใฎใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใซใ‚ˆใ‚‹ๅŠน็އ็š„ใชๅ‘จๆœŸ็™บ่ฆ‹ใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใ‚’ไฝฟ็”จใ—ใฆๆ•ดๆ•ฐใ‚’ๅŠน็އ็š„ใซๅ› ๆ•ฐๅˆ†่งฃใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ axโ€Šmodโ€ŠNa^x\bmod N ใฎๅ‘จๆœŸใ‚’ๅŠน็އ็š„ใซ่จˆ็ฎ—ใงใใ‚Œใฐใ€ๅŠน็އ็š„ใซๅ› ๆ•ฐๅˆ†่งฃใงใใ‚‹ใ“ใจใ‚’็คบใ™ใฎใซๅๅˆ†ใงใ™ใ€‚ๅ‘จๆœŸ็™บ่ฆ‹ใฏใใ‚Œ่‡ชไฝ“ใงไพกๅ€คใฎใ‚ใ‚‹ๅ•้กŒใชใฎใงใ€ๆœ€ๅˆใซใ“ใ‚Œใ‚’่ชฌๆ˜Žใ—ใ€ๆฌกใซใ“ใ‚Œใ‚’ไฝฟ็”จใ—ใฆ5็ซ ใงใฉใฎใ‚ˆใ†ใซๅ› ๆ•ฐๅˆ†่งฃใงใใ‚‹ใ‹ใซใคใ„ใฆ่ชฌๆ˜Žใ—ใพใ™ใ€‚

import matplotlib.pyplot as plt import numpy as np from qiskit import QuantumCircuit, Aer, execute from qiskit.visualization import plot_histogram from math import gcd from numpy.random import randint from tabulate import tabulate from fractions import Fraction print("Imports Successful")
Imports Successful

1. ๅ•้กŒ: ๅ‘จๆœŸ็™บ่ฆ‹

ๅ‘จๆœŸ้–ขๆ•ฐใ‚’่ฆ‹ใฆใฟใพใ—ใ‚‡ใ†๏ผš

f(x)=axโ€Šmodโ€ŠNf(x) = a^x \bmod{N}
ๆณจๆ„: ใƒขใ‚ธใƒฅใƒญ(Modulo) & ใƒขใ‚ธใƒฅใƒฉใƒผๆผ”็ฎ— (ใ“ใ“ใ‚’ใ‚ฏใƒชใƒƒใ‚ฏใ—ใฆ้–‹ใ)

ใƒขใ‚ธใƒฅใƒญๆผ”็ฎ—๏ผˆใ€Œmodใ€ใจ็œ็•ฅ๏ผ‰ใฏใ€ใ‚ใ‚‹ๆ•ฐๅ€คใ‚’ๅˆฅใฎๆ•ฐๅ€คใงๅ‰ฒใฃใŸใจใใฎๅ‰ฐไฝ™ใ‚’่ฆ‹ใคใ‘ใ‚‹ใ“ใจใ‚’ๆ„ๅ‘ณใ—ใพใ™ใ€‚ไพ‹ใˆใฐ๏ผš

17โ€Šmodโ€Š5=217 \bmod 5 = 2

17รท5=317 \div 5 = 3 ใชใฎใงใ€ไฝ™ใ‚Šใฏ22 ใงใ™๏ผˆใคใพใ‚Šใ€17=(3ร—5)+217 = (3\times 5) + 2๏ผ‰ใ€‚ Pythonใงใฏใ€ใƒขใ‚ธใƒฅใƒญๆผ”็ฎ—ใฏ% ่จ˜ๅทใง็คบใ•ใ‚Œใพใ™ใ€‚

ใ“ใฎๅ‹•ไฝœใฏใ€ๆ•ฐๅ€คใŒ็‰นๅฎšใฎๅ€ค๏ผˆใƒขใ‚ธใƒฅใƒฉใ‚น๏ผ‰ใซ้”ใ—ใŸๅพŒใซๆ•ฐๅ€คใŒใ€ŒๆŠ˜ใ‚Š่ฟ”ใ•ใ‚Œใ‚‹ใ€ใƒขใ‚ธใƒฅใƒฉใƒผๆผ”็ฎ—ใงไฝฟ็”จใ•ใ‚Œใพใ™ใ€‚ใƒขใ‚ธใƒฅใƒฉใƒผๆผ”็ฎ—ใ‚’ไฝฟ็”จใ—ใฆใ€ๆฌกใฎใ‚ˆใ†ใซๆ›ธใใ“ใจใŒใงใใพใ™๏ผš

17=2(mod5)17 = 2 \pmod 5

ใ“ใ“ใงใ€(mod5)\pmod 5 ใฏใ€ๅผใฎๅทฆๅดใซใฎใฟ้ฉ็”จใ•ใ‚Œใ‚‹ไธŠ่จ˜ใฎๅผใจใฏ็•ฐใชใ‚Šใ€๏ผˆๆ‹ฌๅผงๅ†…ใซใ‚ใ‚‹ใŸใ‚๏ผ‰ๅผๅ…จไฝ“ใซ้ฉ็”จใ•ใ‚Œใพใ™ใ€‚

ใ“ใ“ใงใ€aa ใจNN ใฏๆญฃใฎๆ•ดๆ•ฐใงใ€aa ใฏNN ๆœชๆบ€ใงใ‚ใ‚Šใ€ๅ…ฑ้€šใฎๅ› ๆ•ฐใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ๅ‘จๆœŸใพใŸใฏๆฌกๆ•ฐ(rr) ใฏใ€ๆฌกใฎๅผใ‚’ๆบ€ใŸใ™ๆœ€ๅฐ๏ผˆใ‚ผใƒญไปฅๅค–๏ผ‰ใฎๆ•ดๆ•ฐใงใ™๏ผš

arโ€Šmodโ€ŠN=1a^r \bmod N = 1

ไปฅไธ‹ใฎใ‚ฐใƒฉใƒ•ใซใ€ใ“ใฎ้–ขๆ•ฐใฎไพ‹ใ‚’็คบใ—ใพใ™ใ€‚ ใƒใ‚คใƒณใƒˆ้–“ใฎ็ทšใฏๅ‘จๆœŸๆ€งใ‚’็ขบ่ชใ™ใ‚‹ใŸใ‚ใฎใ‚‚ใฎใงใ‚ใ‚Šใ€xๅฐใฎ้–“ใฎไธญ้–“ๅ€คใ‚’่กจใ—ใฆใ„ใชใ„ใ“ใจใซๆณจๆ„ใ—ใฆใใ ใ•ใ„ใ€‚

N = 35 a = 3 # ใƒ—ใƒญใƒƒใƒˆใ™ใ‚‹ใƒ‡ใƒผใ‚ฟใ‚’่จˆ็ฎ—ใ™ใ‚‹ xvals = np.arange(35) yvals = [np.mod(a**x, N) for x in xvals] # matplotlibใ‚’ไฝฟใฃใฆๆ็”ป fig, ax = plt.subplots() ax.plot(xvals, yvals, linewidth=1, linestyle='dotted', marker='x') ax.set(xlabel='$x$', ylabel='$%i^x$ mod $%i$' % (a, N), title="Example of Periodic Function in Shor's Algorithm") try: # ใ‚ฐใƒฉใƒ•ไธŠใซrใ‚’ใƒ—ใƒญใƒƒใƒˆ r = yvals[1:].index(1) +1 plt.annotate(text='', xy=(0,1), xytext=(r,1), arrowprops=dict(arrowstyle='<->')) plt.annotate(text='$r=%i$' % r, xy=(r/3,1.5)) except: print('Could not find period, check a < N and have no common factors.')
Image in a Jupyter notebook

2. ่งฃๆณ•

ใ‚ทใƒงใ‚ขใฎ่งฃๆฑบ็ญ–ใฏใ€ไปฅไธ‹ใฎใƒฆใƒ‹ใ‚ฟใƒชใƒผๆผ”็ฎ—ๅญใซใŠใ„ใฆ้‡ๅญไฝ็›ธๆŽจๅฎšใ‚’ไฝฟ็”จใ—ใพใ™๏ผš

UโˆฃyโŸฉโ‰กโˆฃayโ€Šmodโ€ŠNโŸฉU|y\rangle \equiv |ay \bmod N \rangle

ใ“ใ‚ŒใŒใฉใฎใ‚ˆใ†ใซๅฝน็ซ‹ใคใ‹ใ‚’็ขบ่ชใ™ใ‚‹ใŸใ‚ใซใ€Uใฎๅ›บๆœ‰็Šถๆ…‹ใŒใฉใฎใ‚ˆใ†ใซ่ฆ‹ใˆใ‚‹ใ‹ใ‚’่€ƒใˆใฆใฟใพใ—ใ‚‡ใ†ใ€‚โˆฃ1โŸฉ|1\rangleใฎ็Šถๆ…‹ใ‹ใ‚‰้–‹ๅง‹ใ—ใŸๅ ดๅˆใ€UใŒ้€ฃ็ถšใ—ใฆ้ฉ็”จใ•ใ‚Œใ€ใคใพใ‚Šใ€ใƒฌใ‚ธใ‚นใ‚ฟใƒผใฎ็Šถๆ…‹ใซa(modN)a \pmod N ใ‚’ไน—็ฎ—ใ—ใพใ™ใ€‚Uใ‚’rr ๅ›ž้ฉ็”จใ™ใ‚‹ใจใ€ๅ†ใณ็Šถๆ…‹โˆฃ1โŸฉ|1\rangleใซใชใ‚‹ใ“ใจใŒใ‚ใ‹ใ‚Šใพใ™ใ€‚ใŸใจใˆใฐใ€a=3a = 3 ใŠใ‚ˆใณN=35N = 35 ใฎๅ ดๅˆ๏ผš

Uโˆฃ1โŸฉ=โˆฃ3โŸฉU2โˆฃ1โŸฉ=โˆฃ9โŸฉU3โˆฃ1โŸฉ=โˆฃ27โŸฉโ‹ฎU(rโˆ’1)โˆฃ1โŸฉ=โˆฃ12โŸฉUrโˆฃ1โŸฉ=โˆฃ1โŸฉ\begin{aligned} U|1\rangle &= |3\rangle & \\ U^2|1\rangle &= |9\rangle \\ U^3|1\rangle &= |27\rangle \\ & \vdots \\ U^{(r-1)}|1\rangle &= |12\rangle \\ U^r|1\rangle &= |1\rangle \end{aligned}
ax.set(xlabel='UNumber of applications of U', ylabel='End state of register', title="Effect of Successive Applications of U") fig
Image in a Jupyter notebook

ใ—ใŸใŒใฃใฆใ€ใ“ใฎใ‚ตใ‚คใ‚ฏใƒซใฎ้‡ใญๅˆใ‚ใ›๏ผˆโˆฃu0โŸฉ|u_0\rangle๏ผ‰ใฏใ€UUใฎๅ›บๆœ‰็Šถๆ…‹ใซใชใ‚Šใพใ™๏ผš

โˆฃu0โŸฉ=1rโˆ‘k=0rโˆ’1โˆฃakโ€Šmodโ€ŠNโŸฉ|u_0\rangle = \tfrac{1}{\sqrt{r}}\sum_{k=0}^{r-1}{|a^k \bmod N\rangle}
ใ‚ฏใƒชใƒƒใ‚ฏใ—ใฆ้–‹ใ๏ผš$a = 3$ ใ€ $N=35$ใฎใจใใฎไพ‹โˆฃu0โŸฉ=112(โˆฃ1โŸฉ+โˆฃ3โŸฉ+โˆฃ9โŸฉโ‹ฏ+โˆฃ4โŸฉ+โˆฃ12โŸฉ)$10pt]Uโˆฃu0โŸฉ=112(Uโˆฃ1โŸฉ+Uโˆฃ3โŸฉ+Uโˆฃ9โŸฉโ‹ฏ+Uโˆฃ4โŸฉ+Uโˆฃ12โŸฉ)$10pt]=112(โˆฃ3โŸฉ+โˆฃ9โŸฉ+โˆฃ27โŸฉโ‹ฏ+โˆฃ12โŸฉ+โˆฃ1โŸฉ)$10pt]=โˆฃu0โŸฉ\begin{aligned} |u_0\rangle &= \tfrac{1}{\sqrt{12}}(|1\rangle + |3\rangle + |9\rangle \dots + |4\rangle + |12\rangle) $10pt] U|u_0\rangle &= \tfrac{1}{\sqrt{12}}(U|1\rangle + U|3\rangle + U|9\rangle \dots + U|4\rangle + U|12\rangle) $10pt] &= \tfrac{1}{\sqrt{12}}(|3\rangle + |9\rangle + |27\rangle \dots + |12\rangle + |1\rangle) $10pt] &= |u_0\rangle \end{aligned}

ใ“ใฎๅ›บๆœ‰็Šถๆ…‹ใฏใ€ๅ›บๆœ‰ๅ€ค1ใ‚’ๆŒใกใพใ™ใŒใ€ใ“ใ‚Œใงใฏๅ•้กŒใŒใ‚ใพใ‚Š้ข็™ฝใใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใ‚ˆใ‚Š้ข็™ฝใ„ๅ›บๆœ‰็Šถๆ…‹ใฏใ€ใ“ใ‚Œใ‚‰ใฎๅ„่จˆ็ฎ—ๅŸบๅบ•ใฎ็Šถๆ…‹ใซใใ‚Œใžใ‚Œๅฏพๅฟœใ—ใŸไฝ็›ธใ‚’ๆŒใคใ‚‚ใฎใงใ—ใ‚‡ใ†ใ€‚ๅ…ทไฝ“็š„ใซใ€kk็•ช็›ฎใฎ็Šถๆ…‹ใฎไฝ็›ธใŒkkใซๆฏ”ไพ‹ใ™ใ‚‹ๅ ดๅˆใ‚’่ฆ‹ใฆใฟใพใ—ใ‚‡ใ†๏ผš

โˆฃu1โŸฉ=1rโˆ‘k=0rโˆ’1eโˆ’2ฯ€ikrโˆฃakโ€Šmodโ€ŠNโŸฉ$10pt]Uโˆฃu1โŸฉ=e2ฯ€irโˆฃu1โŸฉ\begin{aligned} |u_1\rangle &= \tfrac{1}{\sqrt{r}}\sum_{k=0}^{r-1}{e^{-\tfrac{2\pi i k}{r}}|a^k \bmod N\rangle}$10pt] U|u_1\rangle &= e^{\tfrac{2\pi i}{r}}|u_1\rangle \end{aligned}
ใ‚ฏใƒชใƒƒใ‚ฏใ—ใฆ้–‹ใ๏ผš$a = 3$ ใ€ $N=35$ใฎใจใใฎไพ‹โˆฃu1โŸฉ=112(โˆฃ1โŸฉ+eโˆ’2ฯ€i12โˆฃ3โŸฉ+eโˆ’4ฯ€i12โˆฃ9โŸฉโ‹ฏ+eโˆ’20ฯ€i12โˆฃ4โŸฉ+eโˆ’22ฯ€i12โˆฃ12โŸฉ)$10pt]Uโˆฃu1โŸฉ=112(โˆฃ3โŸฉ+eโˆ’2ฯ€i12โˆฃ9โŸฉ+eโˆ’4ฯ€i12โˆฃ27โŸฉโ‹ฏ+eโˆ’20ฯ€i12โˆฃ12โŸฉ+eโˆ’22ฯ€i12โˆฃ1โŸฉ)$10pt]Uโˆฃu1โŸฉ=e2ฯ€i12โ‹…112(eโˆ’2ฯ€i12โˆฃ3โŸฉ+eโˆ’4ฯ€i12โˆฃ9โŸฉ+eโˆ’6ฯ€i12โˆฃ27โŸฉโ‹ฏ+eโˆ’22ฯ€i12โˆฃ12โŸฉ+eโˆ’24ฯ€i12โˆฃ1โŸฉ)$10pt]Uโˆฃu1โŸฉ=e2ฯ€i12โˆฃu1โŸฉ\begin{aligned} |u_1\rangle &= \tfrac{1}{\sqrt{12}}(|1\rangle + e^{-\tfrac{2\pi i}{12}}|3\rangle + e^{-\tfrac{4\pi i}{12}}|9\rangle \dots + e^{-\tfrac{20\pi i}{12}}|4\rangle + e^{-\tfrac{22\pi i}{12}}|12\rangle) $10pt] U|u_1\rangle &= \tfrac{1}{\sqrt{12}}(|3\rangle + e^{-\tfrac{2\pi i}{12}}|9\rangle + e^{-\tfrac{4\pi i}{12}}|27\rangle \dots + e^{-\tfrac{20\pi i}{12}}|12\rangle + e^{-\tfrac{22\pi i}{12}}|1\rangle) $10pt] U|u_1\rangle &= e^{\tfrac{2\pi i}{12}}\cdot\tfrac{1}{\sqrt{12}}(e^{\tfrac{-2\pi i}{12}}|3\rangle + e^{-\tfrac{4\pi i}{12}}|9\rangle + e^{-\tfrac{6\pi i}{12}}|27\rangle \dots + e^{-\tfrac{22\pi i}{12}}|12\rangle + e^{-\tfrac{24\pi i}{12}}|1\rangle) $10pt] U|u_1\rangle &= e^{\tfrac{2\pi i}{12}}|u_1\rangle \end{aligned}

(ไฝ็›ธใฎๅˆ†ๆฏใซr=12r = 12 ใŒ็พใ‚Œใฆใ„ใ‚‹ใ“ใจใŒใ‚ใ‹ใ‚Šใพใ™ใ€‚)

ใ“ใ‚Œใฏrrใ‚’ๅซใ‚€ใŸใ‚ใ€็‰นใซ่ˆˆๅ‘ณๆทฑใ„ๅ›บๆœ‰ๅ€คใงใ™ใ€‚ๅฎŸ้š›ใ€rrใฏใ€rrๅ€‹ใฎ่จˆ็ฎ—ๅŸบๅบ•ใฎ็Šถๆ…‹้–“ใฎไฝ็›ธๅทฎใŒ็ญ‰ใ—ใใชใ‚‹ใ‚ˆใ†ใซใ‚ปใƒƒใƒˆใ•ใ‚Œใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ไธŠ่จ˜ใฎ็Šถๆ…‹ใฏใ“ใฎๆŒฏใ‚‹่ˆžใ„ใ‚’ใ™ใ‚‹ๅ”ฏไธ€ใฎๅ›บๆœ‰็Šถๆ…‹ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ไธ€่ˆฌๅŒ–ใ™ใ‚‹ใŸใ‚ใซใ€ๆ•ดๆ•ฐssใ‚’ใ“ใฎไฝ็›ธๅทฎใซใ‹ใ‘ใ‚‹ใจใ€ๆฌฒใ—ใ„ๅ›บๆœ‰ๅ€คใŒๅ‡บใฆใใพใ™๏ผš

โˆฃusโŸฉ=1rโˆ‘k=0rโˆ’1eโˆ’2ฯ€iskrโˆฃakโ€Šmodโ€ŠNโŸฉ$10pt]UโˆฃusโŸฉ=e2ฯ€isrโˆฃusโŸฉ\begin{aligned} |u_s\rangle &= \tfrac{1}{\sqrt{r}}\sum_{k=0}^{r-1}{e^{-\tfrac{2\pi i s k}{r}}|a^k \bmod N\rangle}$10pt] U|u_s\rangle &= e^{\tfrac{2\pi i s}{r}}|u_s\rangle \end{aligned}
ใ‚ฏใƒชใƒƒใ‚ฏใ—ใฆ้–‹ใ๏ผš$a = 3$ ใ€ $N=35$ใฎใจใใฎไพ‹โˆฃusโŸฉ=112(โˆฃ1โŸฉ+eโˆ’2ฯ€is12โˆฃ3โŸฉ+eโˆ’4ฯ€is12โˆฃ9โŸฉโ‹ฏ+eโˆ’20ฯ€is12โˆฃ4โŸฉ+eโˆ’22ฯ€is12โˆฃ12โŸฉ)$10pt]UโˆฃusโŸฉ=112(โˆฃ3โŸฉ+eโˆ’2ฯ€is12โˆฃ9โŸฉ+eโˆ’4ฯ€is12โˆฃ27โŸฉโ‹ฏ+eโˆ’20ฯ€is12โˆฃ12โŸฉ+eโˆ’22ฯ€is12โˆฃ1โŸฉ)$10pt]UโˆฃusโŸฉ=e2ฯ€is12โ‹…112(eโˆ’2ฯ€is12โˆฃ3โŸฉ+eโˆ’4ฯ€is12โˆฃ9โŸฉ+eโˆ’6ฯ€is12โˆฃ27โŸฉโ‹ฏ+eโˆ’22ฯ€is12โˆฃ12โŸฉ+eโˆ’24ฯ€is12โˆฃ1โŸฉ)$10pt]UโˆฃusโŸฉ=e2ฯ€is12โˆฃusโŸฉ\begin{aligned} |u_s\rangle &= \tfrac{1}{\sqrt{12}}(|1\rangle + e^{-\tfrac{2\pi i s}{12}}|3\rangle + e^{-\tfrac{4\pi i s}{12}}|9\rangle \dots + e^{-\tfrac{20\pi i s}{12}}|4\rangle + e^{-\tfrac{22\pi i s}{12}}|12\rangle) $10pt] U|u_s\rangle &= \tfrac{1}{\sqrt{12}}(|3\rangle + e^{-\tfrac{2\pi i s}{12}}|9\rangle + e^{-\tfrac{4\pi i s}{12}}|27\rangle \dots + e^{-\tfrac{20\pi i s}{12}}|12\rangle + e^{-\tfrac{22\pi i s}{12}}|1\rangle) $10pt] U|u_s\rangle &= e^{\tfrac{2\pi i s}{12}}\cdot\tfrac{1}{\sqrt{12}}(e^{-\tfrac{2\pi i s}{12}}|3\rangle + e^{-\tfrac{4\pi i s}{12}}|9\rangle + e^{-\tfrac{6\pi i s}{12}}|27\rangle \dots + e^{-\tfrac{22\pi i s}{12}}|12\rangle + e^{-\tfrac{24\pi i s}{12}}|1\rangle) $10pt] U|u_s\rangle &= e^{\tfrac{2\pi i s}{12}}|u_s\rangle \end{aligned}

ใ“ใ‚Œใงใ€0<s<rโˆ’10 < s < r-1ใงใ‚ใ‚‹ssใฎๆ•ดๆ•ฐๅ€คใ”ใจใซๅ›บๆœ‰ใฎๅ›บๆœ‰็Šถๆ…‹ใŒใงใพใ—ใŸใ€‚ใ“ใ‚Œใ‚‰ใฎๅ›บๆœ‰็Šถๆ…‹ใ‚’ใ™ในใฆๅˆ่จˆใ™ใ‚‹ใจใ€ใ•ใพใ–ใพใชไฝ็›ธใงใ€โˆฃ1โŸฉ|1\rangle ใ‚’้™คใใ™ในใฆใฎ่จˆ็ฎ—ๅŸบๅบ•ใฎ็Šถๆ…‹ใŒใ‚ญใƒฃใƒณใ‚ปใƒซใ•ใ‚Œใพใ™๏ผš

1rโˆ‘s=0rโˆ’1โˆฃusโŸฉ=โˆฃ1โŸฉ\tfrac{1}{\sqrt{r}}\sum_{s=0}^{r-1} |u_s\rangle = |1\rangle
ใ‚ฏใƒชใƒƒใ‚ฏใ—ใฆ้–‹ใ๏ผš$a = 7$ ใ€ $N=15$ใฎใจใใฎไพ‹

ใ“ใ“ใงใฏใ€a=7a = 7 ใจ N=15N=15 ใฎๅฐใ•ใชไพ‹ใ‚’่ฆ‹ใฆใฟใพใ—ใ‚‡ใ†ใ€‚r=4r=4ใฎๅ ดๅˆใซ๏ผš

12(โˆฃu0โŸฉ=12(โˆฃ1โŸฉeโˆ’2ฯ€i12+โˆฃ7โŸฉeโˆ’12ฯ€i12+โˆฃ4โŸฉeโˆ’12ฯ€i12+โˆฃ13โŸฉ)โ€ฆ$10pt]+โˆฃu1โŸฉ=12(โˆฃ1โŸฉ+eโˆ’2ฯ€i4โˆฃ7โŸฉ+eโˆ’14ฯ€i4โˆฃ4โŸฉ+eโˆ’16ฯ€i4โˆฃ13โŸฉ)โ€ฆ$10pt]+โˆฃu2โŸฉ=12(โˆฃ1โŸฉ+eโˆ’4ฯ€i4โˆฃ7โŸฉ+eโˆ’18ฯ€i4โˆฃ4โŸฉ+eโˆ’12ฯ€i4โˆฃ13โŸฉ)โ€ฆ$10pt]+โˆฃu3โŸฉ=12(โˆฃ1โŸฉ+eโˆ’6ฯ€i4โˆฃ7โŸฉ+eโˆ’12ฯ€i4โˆฃ4โŸฉ+eโˆ’18ฯ€i4โˆฃ13โŸฉ))=โˆฃ1โŸฉ$10pt]\begin{aligned} \tfrac{1}{2}(\quad|u_0\rangle &= \tfrac{1}{2}(|1\rangle \hphantom{e^{-\tfrac{2\pi i}{12}}}+ |7\rangle \hphantom{e^{-\tfrac{12\pi i}{12}}} + |4\rangle \hphantom{e^{-\tfrac{12\pi i}{12}}} + |13\rangle)\dots $10pt] + |u_1\rangle &= \tfrac{1}{2}(|1\rangle + e^{-\tfrac{2\pi i}{4}}|7\rangle + e^{-\tfrac{\hphantom{1}4\pi i}{4}}|4\rangle + e^{-\tfrac{\hphantom{1}6\pi i}{4}}|13\rangle)\dots $10pt] + |u_2\rangle &= \tfrac{1}{2}(|1\rangle + e^{-\tfrac{4\pi i}{4}}|7\rangle + e^{-\tfrac{\hphantom{1}8\pi i}{4}}|4\rangle + e^{-\tfrac{12\pi i}{4}}|13\rangle)\dots $10pt] + |u_3\rangle &= \tfrac{1}{2}(|1\rangle + e^{-\tfrac{6\pi i}{4}}|7\rangle + e^{-\tfrac{12\pi i}{4}}|4\rangle + e^{-\tfrac{18\pi i}{4}}|13\rangle)\quad) = |1\rangle $10pt] \end{aligned}

่จˆ็ฎ—ๅŸบๅบ•ใฎ็Šถๆ…‹โˆฃ1โŸฉ|1\rangle ใŒใ“ใ‚Œใ‚‰ใฎๅ›บๆœ‰็Šถๆ…‹ใฎ้‡ใญๅˆใ‚ใ›ใงใ‚ใ‚‹ใŸใ‚ใ€็Šถๆ…‹โˆฃ1โŸฉ|1\rangle ใ‚’ไฝฟ็”จใ—ใฆUUใซๅฏพใ—ใฆQPE(้‡ๅญไฝ็›ธๆŽจๅฎš)ใ‚’ๅฎŸ่กŒใ™ใ‚‹ใจใ€ไฝ็›ธใŒๆธฌๅฎšใ•ใ‚Œใพใ™๏ผš

ฯ•=sr\phi = \frac{s}{r}

ใ“ใ“ใงใ€ssใฏ00 ใจrโˆ’1r-1 ใฎ้–“ใฎใƒฉใƒณใƒ€ใƒ ใชๆ•ดๆ•ฐใงใ™ใ€‚ๆœ€ๅพŒใซใ€ฯ•\phiใฎ้€ฃๅˆ†ๆ•ฐใ‚ขใƒซใ‚ดใƒชใ‚บใƒ  ใ‚’ไฝฟ็”จใ—ใฆrr ใ‚’่ฆ‹ใคใ‘ใพใ™ใ€‚ๅ›ž่ทฏๅ›ณใฏๆฌกใฎใ‚ˆใ†ใซใชใ‚Šใพใ™(ใ“ใ“ใงใฏใƒ“ใƒƒใƒˆ้…ๅˆ—ใŒQiskitใฎ้‡ๅญใƒ“ใƒƒใƒˆ้ †ใ‚’ไฝฟใฃใฆใ„ใพใ™ใ€‚)๏ผš

ๆฌกใซใ€Qiskitใฎใ‚ทใƒŸใƒฅใƒฌใƒผใ‚ฟใƒผใงใ‚ทใƒงใ‚ขใฎใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใ‚’็ดนไป‹ใ—ใพใ™ใ€‚ใ“ใฎใƒ‡ใƒขใงใฏใ€่ชฌๆ˜Žใชใ—ใงUU ใฎๅ›ž่ทฏใ‚’ไธŽใˆใพใ™ใŒใ€4็ซ ใงใ€U2jU^{2^j}ใฎๅ›ž่ทฏใ‚’ๅŠน็އ็š„ใซๆง‹็ฏ‰ใ™ใ‚‹ๆ–นๆณ•ใซใคใ„ใฆ่ชฌๆ˜Žใ—ใพใ™ใ€‚

3. Qiskit ใงใฎๅฎŸ่ฃ…

ใ“ใฎไพ‹ใงใฏใ€a=7a=7 ใจN=15N=15 ใฎๅ‘จๆœŸ็™บ่ฆ‹ๅ•้กŒใ‚’่งฃใใพใ™ใ€‚ UUใ‚’ไปฅไธ‹ใฎใ‚ˆใ†ใซใ‚ปใƒƒใƒˆใ—ใŸใจใใฎๅ›ž่ทฏใ‚’ไธŽใˆใพใ™๏ผš

UโˆฃyโŸฉ=โˆฃayโ€Šmodโ€Š15โŸฉU|y\rangle = |ay\bmod 15\rangle

ใ“ใ“ใงใฏ่ชฌๆ˜Žใฏใ‚ใ‚Šใพใ›ใ‚“ใŒใ€UxU^x ใ‚’ไฝœๆˆใ™ใ‚‹ใซใฏใ€ใ“ใฎๅ›ž่ทฏใ‚’xx ๅ›ž็นฐใ‚Š่ฟ”ใ—ใพใ™ใ€‚ ๆฌกใฎ็ซ ใงใ€ใ“ใ‚Œใ‚‰ใฎๅ›ž่ทฏใ‚’ๅŠน็އ็š„ใซไฝœๆˆใ™ใ‚‹ไธ€่ˆฌ็š„ใชๆ–นๆณ•ใซใคใ„ใฆ่ชฌๆ˜Žใ—ใพใ™ใ€‚ ้–ขๆ•ฐc_amod15 ใฏใ€a ใซ้–ขใ—ใฆๅˆถๅพกUใ‚ฒใƒผใƒˆใ‚’power ๅ›ž็นฐใ‚Š่ฟ”ใ—ใพใ™ใ€‚

def c_amod15(a, power): """mod 15ใซใ‚ˆใ‚‹ๅˆถๅพกใ‚ฒใƒผใƒˆใ‚’ใ‹ใ‘ใ‚‹""" if a not in [2,7,8,11,13]: raise ValueError("'a' must be 2,7,8,11 or 13") U = QuantumCircuit(4) for iteration in range(power): if a in [2,13]: U.swap(0,1) U.swap(1,2) U.swap(2,3) if a in [7,8]: U.swap(2,3) U.swap(1,2) U.swap(0,1) if a == 11: U.swap(1,3) U.swap(0,2) if a in [7,11,13]: for q in range(4): U.x(q) U = U.to_gate() U.name = "%i^%i mod 15" % (a, power) c_U = U.control() return c_U

ๆธฌๅฎš็”จใƒ“ใƒƒใƒˆใจใ—ใฆ8้‡ๅญใƒ“ใƒƒใƒˆใ‚’ไฝฟใ„ใพใ™๏ผš

# Specify variables n_count = 8 # number of counting qubits a = 7

ใพใŸใ€้€†QFTใฎๅ›ž่ทฏใ‚‚ไธŽใˆใพใ™๏ผˆ่ฉณ็ดฐใซใคใ„ใฆใฏใ€้‡ๅญใƒ•ใƒผใƒชใ‚จๅค‰ๆ›ใฎ็ซ ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„๏ผ‰๏ผš

def qft_dagger(n): """n้‡ๅญใƒ“ใƒƒใƒˆใฎ้€†QFTใ‚’ๅ›ž่ทฏใฎๆœ€ๅˆใฎn้‡ๅญใƒ“ใƒƒใƒˆใซใ‹ใ‘ใ‚‹""" qc = QuantumCircuit(n) # Swapsใ‚’ๅฟ˜ใ‚Œใชใ„! for qubit in range(n//2): qc.swap(qubit, n-qubit-1) for j in range(n): for m in range(j): qc.cu1(-np.pi/float(2**(j-m)), m, j) qc.h(j) qc.name = "QFTโ€ " return qc

ใ“ใ‚Œใ‚‰ใฎๆง‹ๆˆ่ฆ็ด ใŒใ‚ใ‚Œใฐใ€ใ‚ทใƒงใ‚ขใฎใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใฎๅ›ž่ทฏใ‚’็ฐกๅ˜ใซๆง‹็ฏ‰ใ™ใ‚‹ใ“ใจใŒใงใใพใ™๏ผš

# n_countๅ€‹ใฎๆธฌๅฎš็”จ้‡ๅญใƒ“ใƒƒใƒˆใจUใ‚’ๆ“ไฝœใ™ใ‚‹ใŸใ‚ใฎ4้‡ๅญใƒ“ใƒƒใƒˆใง # ้‡ๅญๅ›ž่ทฏใ‚’ไฝœใ‚‹ qc = QuantumCircuit(n_count + 4, n_count) # ๆธฌๅฎš็”จ้‡ๅญใƒ“ใƒƒใƒˆใ‚’ # |+>็Šถๆ…‹ใซๅˆๆœŸๅŒ– for q in range(n_count): qc.h(q) # ใ‚ขใƒณใ‚ทใƒฉใƒฌใ‚ธใ‚นใ‚ฟใƒผใ‚’|1>ใฎ็Šถๆ…‹ใซใ™ใ‚‹ qc.x(3+n_count) # ๅˆถๅพกUใ‚’ๆ“ไฝœ for q in range(n_count): qc.append(c_amod15(a, 2**q), [q] + [i+n_count for i in range(4)]) # ้€†QFTใ‚’ๆ“ไฝœ qc.append(qft_dagger(n_count), range(n_count)) # ๅ›ž่ทฏใ‚’ๆธฌๅฎš qc.measure(range(n_count), range(n_count)) qc.draw('text')

็ตๆžœใจใ—ใฆไฝ•ใŒๆธฌๅฎšใ•ใ‚Œใ‚‹ใ‹่ฆ‹ใฆใฟใพใ—ใ‚‡ใ†๏ผš

backend = Aer.get_backend('qasm_simulator') results = execute(qc, backend, shots=2048).result() counts = results.get_counts() plot_histogram(counts)
Image in a Jupyter notebook

3ใคใฎ้‡ๅญใƒ“ใƒƒใƒˆใŒใ‚ใ‚‹ใŸใ‚ใ€ใ“ใ‚Œใ‚‰ใฎ็ตๆžœใฏๆฌกใฎๆธฌๅฎšใ•ใ‚ŒใŸไฝ็›ธใซ็›ธๅฝ“ใ—ใพใ™๏ผš

rows, measured_phases = [], [] for output in counts: decimal = int(output, 2) # 2้€ฒๆ•ฐใ‚’10้€ฒๆ•ฐใซๅค‰ๆ›ใ—ใพใ™ phase = decimal/(2**n_count) # ๅ›บๆœ‰ๅ€คใ‚’ๆŽขใ—ใพใ™ measured_phases.append(phase) # ใ“ใ‚Œใ‚‰ใฎๅ€คใ‚’ใƒ†ใƒผใƒ–ใƒซใฎ่กŒใซ่ฟฝๅŠ ใ—ใพใ™๏ผš rows.append(["%s(bin) = %i(dec)" % (output, decimal), "%i/%i = %.2f" % (decimal, 2**n_count, phase)]) # tabulateใ‚’ไฝฟใฃใฆใ€ASCIIใƒ†ใƒผใƒ–ใƒซใจใ—ใฆ่กŒใ‚’ๅฐๅˆทใ—ใพใ™๏ผš print(tabulate(rows, headers=["Register Output", "Phase"], colalign=("left","right")))
Register Output Phase ------------------------ -------------- 00000000(bin) = 0(dec) 0/256 = 0.00 10000000(bin) = 128(dec) 128/256 = 0.50 11000000(bin) = 192(dec) 192/256 = 0.75 01000000(bin) = 64(dec) 64/256 = 0.25

ๆฌกใซใ€้€ฃๅˆ†ๆ•ฐใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใ‚’ไฝฟ็”จใ—ใฆใ€ssใจrrใ‚’่ฆ‹ใคใ‘ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ Pythonใฎ็ต„ใฟ่พผใฟใฎfractions(ๅˆ†ๆ•ฐ)ใƒขใ‚ธใƒฅใƒผใƒซใ‚’ไฝฟ็”จใ—ใฆใ€ๆตฎๅ‹•ๅฐๆ•ฐ็‚นใ‚’Fractionใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใซๅค‰ๆ›ใงใใพใ™ใ€‚ไพ‹ใˆใฐ๏ผš

Fraction(0.666)
Fraction(5998794703657501, 9007199254740992)
5998794703657501/9007199254740992
0.666

ใ“ใ‚Œใฏใ€ๆญฃ็ขบใช็ตๆžœ๏ผˆใ“ใฎๅ ดๅˆใฏใ€0.6660000...๏ผ‰ใ‚’่ฟ”ใ™ๅˆ†ๆ•ฐใ‚’ใŒๅพ—ใ‚‰ใ‚Œใ‚‹ใŸใ‚ใ€ไธŠใฎใ‚ˆใ†ใชใ‚„ใฃใ‹ใ„ใช็ตๆžœใซใชใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚Šใพใ™ใ€‚.limit_denominator() ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ไฝฟใฃใฆใ€ๅˆ†ๆฏใŒ็‰นๅฎšใฎๅ€คใ‚’ไธ‹ๅ›žใ‚‹ใ€ๆตฎๅ‹•ๅฐๆ•ฐ็‚นใซๆœ€ใ‚‚่ฟ‘ใ„ๅˆ†ๆ•ฐใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚

# ๅˆ†ๆฏใŒ15ๆœชๆบ€ใฎ # 0.666ใซๆœ€ใ‚‚่ฟ‘ใ„ๅˆ†ๆ•ฐใ‚’ๅ–ๅพ— Fraction(0.666).limit_denominator(15)
Fraction(2, 3)

ใšใฃใจใ„ใ„ใงใ™ใญ๏ผๆฌกๆ•ฐ(r)ใฏNๆœชๆบ€ใงใชใ‘ใ‚Œใฐใชใ‚‰ใชใ„ใฎใงใ€ๆœ€ๅคงๅˆ†ๆฏใ‚’15ใซ่จญๅฎšใ—ใพใ™ใ€‚

rows = [] for phase in measured_phases: frac = Fraction(phase).limit_denominator(15) rows.append([phase, "%i/%i" % (frac.numerator, frac.denominator), frac.denominator]) # ASCIIใƒ†ใƒผใƒ–ใƒซใ‚’่กจ็คบ print(tabulate(rows, headers=["Phase", "Fraction", "Guess for r"], colalign=('right','right','right')))
Phase Fraction Guess for r ------- ---------- ------------- 0 0/1 1 0.5 1/2 2 0.75 3/4 4 0.25 1/4 4

ๆธฌๅฎšใ•ใ‚ŒใŸๅ›บๆœ‰ๅ€คใฎใ†ใกใฎ2ใคใŒๆญฃใ—ใ„็ตๆžœใ‚’ไธŽใˆใŸใ“ใจใŒใ‚ใ‹ใ‚Šใพใ™๏ผšr=4r=4ใ€‚ใใ—ใฆใ‚ทใƒงใ‚ขใฎใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใŒๅคฑๆ•—ใ™ใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚‹ใ“ใจใ‚‚ใ‚ใ‹ใ‚Šใพใ™ใ€‚ใ“ใ‚Œใ‚‰ใฎๆ‚ชใ„็ตๆžœใฏใ€s=0s = 0ใ€ใพใŸใฏssใจrrใŒ็ด ๆ•ฐใงใฏใชใใ€rrใฎไปฃใ‚ใ‚Šใซrrใฎๅ› ๆ•ฐใŒไธŽใˆใ‚‰ใ‚Œใ‚‹ใŸใ‚ใงใ™ใ€‚ใ“ใ‚Œใซๅฏพใ™ใ‚‹ๆœ€ใ‚‚็ฐกๅ˜ใช่งฃๆฑบ็ญ–ใฏใ€rrใซใคใ„ใฆๆบ€่ถณใฎใ„ใ็ตๆžœใŒๅพ—ใ‚‰ใ‚Œใ‚‹ใพใงๅฎŸ้จ“ใ‚’็นฐใ‚Š่ฟ”ใ™ใ“ใจใงใ™ใ€‚

็ฐกๅ˜ใชๆผ”็ฟ’

  • ไธŠ่จ˜ใฎๅ›ž่ทฏใ‚’a=2,8,11a = 2, 8, 11 ใฎๅ€คใซๅค‰ๆ›ดใ—ใพใ™ใ€‚ใฉใฎใ‚ˆใ†ใช็ตๆžœใŒๅพ—ใ‚‰ใ‚Œใพใ™ใ‹?ใพใŸใใฎ็†็”ฑใฏไฝ•ใงใ™ใ‹?

4. ๅ‰ฐไฝ™ๆŒ‡ๆ•ฐๅŒ–

UUใ‚’็นฐใ‚Š่ฟ”ใ™ใ“ใจใซใ‚ˆใฃใฆU2jU^{2^j}ใ‚ฒใƒผใƒˆใ‚’ไฝœๆˆใ™ใ‚‹ๆ–นๆณ•ใฏใ€jjใจใจใ‚‚ใซๆŒ‡ๆ•ฐ้–ขๆ•ฐ็š„ใซๅข—ๅŠ ใ—ใ€ๅคš้ …ๅผๆ™‚้–“ใฎใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใซใฏใชใ‚Šใพใ›ใ‚“ใ€‚ๆผ”็ฎ—ๅญใ‚’ไฝœๆˆใ™ใ‚‹ๆ–นๆณ•ใŒๅฟ…่ฆใงใ™๏ผš

U2jโˆฃyโŸฉ=โˆฃa2jyโ€Šmodโ€ŠNโŸฉU^{2^j}|y\rangle = |a^{2^j}y \bmod N \rangle

ใ“ใ‚Œใฏใ€jjใจใจใ‚‚ใซๅคš้ …ๅผใซๆˆ้•ทใ—ใพใ™ใ€‚ ๅนธใ„ใชใ“ใจใซใ€ไปฅไธ‹ใฎ่จˆ็ฎ—๏ผš

a2jโ€Šmodโ€ŠNa^{2^j} \bmod N

ใฏๅŠน็އ็š„ใซๅฏ่ƒฝใงใ™ใ€‚ๅคๅ…ธใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใƒผใงใฏใ€ ๅๅพฉไบŒไน— ใจๅ‘ผใฐใ‚Œใ‚‹ใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใ‚’ไฝฟ็”จใ—ใฆๆŒ‡ๆ•ฐใ‚’่จˆ็ฎ—ใงใใพใ™ใ€‚ ใ“ใฎไพ‹ใงใฏใ€2j2^jใฎๅฝขๅผใฎๆŒ‡ๆ•ฐใฎใฟใ‚’ๆ‰ฑใฃใฆใ„ใ‚‹ใŸใ‚ใ€ๅๅพฉไบŒไน—ใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใฏ้žๅธธใซๅ˜็ด”ใซใชใ‚Šใพใ™๏ผš

def a2jmodN(a, j, N): """ไบŒไน—ใ‚’็นฐใ‚Š่ฟ”ใ—ใฆa^{2^j} (mod N) ใ‚’่จˆ็ฎ—""" for i in range(j): a = np.mod(a**2, N) return a
a2jmodN(7, 2049, 53)
47

PythonใงๅŠน็އ็š„ใชใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใŒๅฏ่ƒฝใงใ‚ใ‚Œใฐใ€้‡ๅญใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใƒผใงๅŒใ˜ใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใ‚’ไฝฟ็”จใงใใพใ™ใ€‚ๆฎ‹ๅฟตใชใŒใ‚‰ใ€jjใงๅคš้ …ๅผใซใ‚นใ‚ฑใƒผใƒชใƒณใ‚ฐใ—ใฆใ‚‚ใ€ใƒขใ‚ธใƒฅใƒฉใƒผๆŒ‡ๆ•ฐๅ›ž่ทฏใฏๅ˜็ด”ใงใฏใชใใ€ใ‚ทใƒงใ‚ขใฎใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใฎใƒœใƒˆใƒซใƒใƒƒใ‚ฏใซใชใฃใฆใ„ใพใ™ใ€‚ๅˆๅฟƒ่€…ใซใ‚„ใ•ใ—ใ„ๅฎŸ่ฃ…ใฏใ€ๅ‚่€ƒๆ–‡็Œฎ[1]ใซใ‚ใ‚Šใพใ™ใ€‚

5. ๅ‘จๆœŸ็™บ่ฆ‹ใ‹ใ‚‰ๅ› ๆ•ฐๅˆ†่งฃใธ

ใ™ในใฆใฎๅ› ๆ•ฐๅˆ†่งฃใฎๅ•้กŒใŒ้›ฃใ—ใ„ใ‚ใ‘ใงใฏใ‚ใ‚Šใพใ›ใ‚“๏ผ›ๅถๆ•ฐใ‚’ใ™ใใซ่ฆ‹ใคใ‘ใฆใ€ใใฎๅ› ๆ•ฐใฎ1ใคใŒ2ใงใ‚ใ‚‹ใ“ใจใŒๅˆ†ใ‹ใ‚‹ๅ ดๅˆใ‚‚ใ‚ใ‚Šใพใ™ใ€‚ๅฎŸ้š›ใ€ๅ› ๆ•ฐๅˆ†่งฃใŒ้›ฃใ—ใ„ๆ•ฐๅ€คใ‚’้ธๆŠžใ™ใ‚‹ใŸใ‚ใฎ็‰นๅฎšใฎๅŸบๆบ–ใŒใ‚ใ‚Šใพใ™ใŒใ€ๅŸบๆœฌ็š„ใช่€ƒใˆๆ–นใฏใ€2ใคใฎๅคงใใช็ด ๆ•ฐใฎ็ฉใ‚’้ธๆŠžใ™ใ‚‹ใ“ใจใงใ™ใ€‚

ไธ€่ˆฌ็š„ใชๅ› ๆ•ฐๅˆ†่งฃใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใฏใ€ใพใšใ€ใใฎๆ•ดๆ•ฐใ‚’ๅ› ๆ•ฐๅˆ†่งฃใ™ใ‚‹ใŸใ‚ใฎ่ฟ‘้“ใŒใ‚ใ‚‹ใ‹ใฉใ†ใ‹ใ‚’็ขบ่ชใ—ใพใ™๏ผˆใคใพใ‚Šใ€ใใฎๆ•ฐใŒๅถๆ•ฐใ‹ใฉใ†ใ‹๏ผŸN=abN = a^b ใฎๅฝขใ‚’ใ—ใฆใ„ใชใ„ใ‹๏ผŸใ‚’็ขบ่ชใ—ใพใ™๏ผ‰ใ€‚ใใฎๅพŒใ€ๆœ€ๆ‚ชใฎใ‚ทใƒŠใƒชใ‚ชใฎๅ ดๅˆใซใ‚ทใƒงใ‚ขใฎๅ‘จๆœŸ็™บ่ฆ‹ใ‚’ไฝฟใ„ใพใ™ใ€‚ใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใฎ้‡ๅญ้ƒจๅˆ†ใซ็„ฆ็‚นใ‚’ๅˆใ‚ใ›ใ‚‹ใ“ใจใ‚’็›ฎ็š„ใจใ—ใฆใ„ใ‚‹ใŸใ‚ใ€NใŒ2ใคใฎ็ด ๆ•ฐใฎ็ฉใงใ‚ใ‚‹ๅ ดๅˆใ‚’่€ƒใˆใพใ™ใ€‚

ไพ‹: 15ใฎๅ› ๆ•ฐๅˆ†่งฃ

ๅฐใ•ใช้‡ๅญใƒ“ใƒƒใƒˆๆ•ฐใงใฎๅ› ๆ•ฐๅˆ†่งฃใฎไพ‹ใ‚’็คบใ™ใŸใ‚ใซใ€15ใ‚’ๅ› ๆ•ฐๅˆ†่งฃใ—ใพใ™ใ€‚ใ“ใ‚Œใฏใ€ใใ‚Œใปใฉๅคงใใใชใ„็ด ๆ•ฐ3ใจ5ใฎ็ฉใงใ‚ใ‚‹ใ“ใจใฏ่ชฐใ‚‚ใŒ็Ÿฅใฃใฆใ„ใพใ™ใ€‚

N = 15

ๆœ€ๅˆใฎใ‚นใƒ†ใƒƒใƒ—ใฏใ€11 ใ‹ใ‚‰ Nโˆ’1N-1 ใฎ้–“ใฎไนฑๆ•ฐ xx ใ‚’้ธๆŠžใ™ใ‚‹ใ“ใจใงใ™๏ผš

np.random.seed(1) # ๅ†็พๅฏ่ƒฝใช็ตๆžœใŒ็ขบๅฎŸใซๅพ—ใ‚‰ใ‚Œใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใŸใ‚ a = randint(2, 15) print(a)
7

ๆฌกใซใ€NN ใฎ่‡ชๆ˜Žใงใชใ„ๅ› ๆ•ฐใงใชใ„ใ“ใจใ‚’ใ™ใฐใ‚„ใ็ขบ่ชใ—ใพใ™๏ผš

from math import gcd # ๆœ€ๅคงๅ…ฌ็ด„ๆ•ฐ gcd(a, 15)
1

็ด ๆ™ดใ‚‰ใ—ใ„ใ€‚ๆฌกใซใ€a = 7ใŠใ‚ˆใณN = 15ใซๅฏพใ—ใฆใ‚ทใƒงใ‚ขใฎไฝ็›ธ็™บ่ฆ‹ใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใ‚’ๅฎŸ่กŒใ—ใพใ™ใ€‚ๆธฌๅฎšใ™ใ‚‹ไฝ็›ธใฏs/rs/r ใซใชใ‚‹ใ“ใจใซๆณจๆ„ใ—ใฆใใ ใ•ใ„ใ€‚ใ“ใ“ใงใ€

arโ€Šmodโ€ŠN=1a^r \bmod N = 1

ใงใ‚ใ‚Šใ€ss ใฏ0ใจrโˆ’1r-1 ใฎ้–“ใฎใƒฉใƒณใƒ€ใƒ ใชๆ•ดๆ•ฐใงใ™ใ€‚

def qpe_amod15(a): n_count = 3 qc = QuantumCircuit(4+n_count, n_count) for q in range(n_count): qc.h(q) # ๆธฌๅฎš็”จ้‡ๅญใƒ“ใƒƒใƒˆใ‚’|+>ใซๅˆๆœŸๅŒ– qc.x(3+n_count) # ใ‚ขใƒณใ‚ทใƒฉใƒฌใ‚ธใ‚นใ‚ฟใƒผใ‚’|1>ใซ for q in range(n_count): # ๅˆถๅพกUใ‚’่กŒใ† qc.append(c_amod15(a, 2**q), [q] + [i+n_count for i in range(4)]) qc.append(qft_dagger(n_count), range(n_count)) # ้€†QFTใ‚’่กŒใ† qc.measure(range(n_count), range(n_count)) # ็ตๆžœใ‚’ใ‚ทใƒŸใƒฅใƒฌใƒผใƒˆ backend = Aer.get_backend('qasm_simulator') # ไปฅไธ‹ใงmemory = Trueใซ่จญๅฎšใ—ใ€ๅ„้ †ๆฌก่ชญใฟๅ–ใ‚Šใฎใƒชใ‚นใƒˆใ‚’่กจ็คบใงใใพใ™ result = execute(qc, backend, shots=1, memory=True).result() readings = result.get_memory() print("Register Reading: " + readings[0]) phase = int(readings[0],2)/(2**n_count) print("Corresponding Phase: %f" % phase) return phase

ใ“ใฎไฝ็›ธใ‹ใ‚‰ใ€rrใ‚’็ฐกๅ˜ใซๆŽจๅฎšใ™ใ‚‹ใ“ใจใŒใงใใพใ™๏ผš

np.random.seed(3) # ๅ†็พๅฏ่ƒฝใช็ตๆžœใŒ็ขบๅฎŸใซๅพ—ใ‚‰ใ‚Œใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใŸใ‚ phase = qpe_amod15(a) # ไฝ็›ธ = s/r phase.as_integer_ratio() # ๅˆ†ๆฏใŒ๏ผˆใ†ใพใใ„ใ‘ใฐ๏ผ๏ผ‰rใ‚’ๆ•™ใˆใฆใใ‚Œใพใ™
Register Reading: 000 Corresponding Phase: 0.000000
(0, 1)
frac = Fraction(phase).limit_denominator(15) s, r = frac.numerator, frac.denominator print(r)
1

ใ“ใ‚ŒใงrrใŒๅ‡บใŸใฎใงใ€ใ“ใ‚Œใ‚’ไฝฟใฃใฆNNใฎๅ› ๆ•ฐใ‚’่ฆ‹ใคใ‘ใ‚‹ใ“ใจใŒใงใใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“๏ผš

arโ€Šmodโ€ŠN=1a^r \bmod N = 1

ใ‚ˆใฃใฆ๏ผš

(arโˆ’1)โ€Šmodโ€ŠN=0(a^r - 1) \bmod N = 0

ใ“ใ‚Œใฏใ€NN ใŒarโˆ’1a^r-1ใ‚’ๅ‰ฒใ‚‹ใจใ„ใ†ๆ„ๅ‘ณใงใ™ใ€‚ ใใ—ใฆใ€rr ใŒๅถๆ•ฐใฎๅ ดๅˆใงใ‚‚ใ€ๆฌกใฎใ‚ˆใ†ใซๆ›ธใใ“ใจใŒใงใใพใ™๏ผš

arโˆ’1=(ar/2โˆ’1)(ar/2+1)a^r -1 = (a^{r/2}-1)(a^{r/2}+1)

(rrใŒๅถๆ•ฐใงใชใ„ๅ ดๅˆใ€ๅ…ˆใซ้€ฒใ‚€ใ“ใจใฏใงใใšใ€ๅˆฅใฎๅ€คใฎaaใงๅ†่ฉฆ่กŒใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚) ใใฎๅ ดๅˆใ€ar/2โˆ’1a^{r/2}-1 ใพใŸใฏar/2+1a^{r/2}+1 ใฎๆœ€ๅคงๅ…ฌ็ด„ๆ•ฐใŒNN ใฎๅ› ๆ•ฐใงใ‚ใ‚‹็ขบ็އใŒ้ซ˜ใใชใ‚Šใพใ™[2]ใ€‚

guesses = [gcd(a**(r//2)-1, N), gcd(a**(r//2)+1, N)] print(guesses)
[15, 1]

ไปฅไธ‹ใฎใ‚ปใƒซใฏใ€15ใฎๅ› ๆ•ฐใŒๅฐ‘ใชใใจใ‚‚1ใค่ฆ‹ใคใ‹ใ‚‹ใพใงใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใ‚’็นฐใ‚Š่ฟ”ใ—ใพใ™ใ€‚ใ‚ปใƒซใ‚’ๆ•ฐๅ›žๅ†ๅฎŸ่กŒใ—ใฆใ€ใ‚ปใƒซใฎๅ‹•ไฝœใ‚’็ขบ่ชใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

a = 7 factor_found = False attempt = 0 while not factor_found: attempt += 1 print("\nAttempt %i:" % attempt) phase = qpe_amod15(a) # ไฝ็›ธ = s/r frac = Fraction(phase).limit_denominator(15) # ๅˆ†ๆฏใฏ๏ผˆใ†ใพใใ„ใ‘ใฐ๏ผ๏ผ‰็งใŸใกใซrใ‚’ไผใˆใพใ™ r = frac.denominator print("Result: r = %i" % r) if phase != 0: # ๅ› ๆ•ฐใ‚’gcd(x^{r/2} ยฑ1 , 15)ใ‹ใ‚‰ๆŽจๅฎšใ—ใพใ™ guesses = [gcd(a**(r//2)-1, 15), gcd(a**(r//2)+1, 15)] print("Guessed Factors: %i and %i" % (guesses[0], guesses[1])) for guess in guesses: if guess != 1 and (15 % guess) == 0: # ๆŽจๅฎšใ—ใŸๅ› ๆ•ฐใŒๆญฃใ—ใ„ใ‹็ขบ่ชใ—ใพใ™ print("*** Non-trivial factor found: %i ***" % guess) factor_found = True
Attempt 1: Register Reading: 110 Corresponding Phase: 0.750000 Result: r = 4 Guessed Factors: 3 and 5 *** Non-trivial factor found: 3 *** *** Non-trivial factor found: 5 ***

6. ๅ‚่€ƒๆ–‡็Œฎ

  1. Stephane Beauregard, Circuit for Shor's algorithm using 2n+3 qubits, arXiv:quant-ph/0205095

  2. M. Nielsen and I. Chuang, Quantum Computation and Quantum Information, Cambridge Series on Information and the Natural Sciences (Cambridge University Press, Cambridge, 2000). (Page 633)

import qiskit qiskit.__qiskit_version__
{'qiskit-terra': '0.14.2', 'qiskit-aer': '0.5.2', 'qiskit-ignis': '0.3.3', 'qiskit-ibmq-provider': '0.7.2', 'qiskit-aqua': '0.7.3', 'qiskit': '0.19.6'}