Pour effectuer la factorisation des nombres premiers sur un ordinateur classique, il faut $ O (\ sqrt {N}) $ pour calculer, et même l'algorithme le plus efficace actuellement développé prend environ un temps exponentiel de chiffres. Il semble que cela finira. Mais quand j'essaie de faire une factorisation de niveau premier à 300 chiffres, il faut beaucoup de temps pour mourir. e? Décomposition des facteurs premiers en temps polynomial? Je peux le faire! C'est l'algorithme de Shore. Dans cet article, le but de cet article est d'implémenter cet algorithme de rivage dans qiskit et de l'exécuter sur un véritable ordinateur quantique. Cette fois, nous réduirons le facteur 15. Je pense qu'il y a probablement (ou certainement) des erreurs et des fautes d'impression dans cet article, donc si vous en trouvez une, merci de bien vouloir me le faire savoir ...
Pour expliquer l'algorithme du rivage, diverses préparations sont nécessaires, mais je voudrais d'abord écrire le flux global.
Tout d'abord, considérons un nombre naturel $ N $ que vous voulez factoriser en un facteur premier et un nombre naturel $ x $ qui est mutuellement premier (vous pouvez déterminer s'ils sont premiers ou non par division mutuelle euclidienne). Pensons-y dans le monde de modN ci-dessous. Le plus petit r tel que $ x ^ r = 1 $ est appelé un chiffre. On sait que trouver ce chiffre est efficace pour la factorisation des nombres premiers. Cependant, avec un ordinateur classique, ce calcul prend également un temps exponentiel. L'algorithme d'estimation de phase résout ce problème. L'algorithme d'estimation de phase donne une phase approximative de la valeur propre (la valeur absolue est 1) de la matrice unitaire. Considérant U tel que $ U ^ r = I $ dans le monde de $ \ mod N $, r peut être obtenu à partir de sa valeur unique. Le test Adamar et la transformée quantique de Fourier décrits ci-dessous sont nécessaires comme sous-programmes pour cet algorithme d'estimation de phase.
Tout d'abord, j'expliquerai un algorithme appelé le test d'Adamal.
Le test Adamal est réalisé par le circuit suivant ($ U $ est une porte arbitraire).
Dans ce circuit
control-Le bit quantique après avoir traversé la porte U
La transformée de Fourier quantique est un algorithme qui effectue une transformée de Fourier discrète. En supposant que la longueur de la séquence est de $ 2 ^ n $, l'ordinateur classique peut effectuer la transformée de Fourier discrète avec $ O (n2 ^ n) $ dans la transformée de Fourier haute vitesse que tout le monde aime, mais la transformée quantique de Fourier peut effectuer la transformée de Fourier discrète avec $ O (n ^ n ^). 2) Il peut être résolu en $ n $ polypoly time appelé $!
Rappelons tout d'abord la formule de définition de la transformée de Fourier discrète.
En fait, cette transformation est unitaire, et comme l'ordinateur quantique peut approximer n'importe quelle transformation unitaire avec l'ensemble de portes universel, cette transformation est réalisable sur l'ordinateur quantique. Cependant, je ne sais pas quel type de porte mordre tel quel, j'aimerais donc le transformer en une forme plus facile à utiliser. Si vous développez k en binaire et faites de votre mieux, ce sera comme suit.
En fait, l'algorithme de Shore utilise la transformée quantique de Fourier inverse, également illustrée ci-dessous. Cela a juste accroché la porte du côté opposé (mais la rotation est inverse).
À propos, vous devez faire attention au sens de lecture du bit quantique. Ici, nous allons lire dans l'ordre de q0q1q2q3. Autrement dit, si $ q0 = 1, q1 = q2 = q3 = 0 $, alors $ x = 1000 (2) = 8 $. Pour le moment, H est le même que la porte Adamal, U1 est le même que la porte Rz, et seulement $ | 1 \ rangle $ est la porte qui met la phase de $ e ^ {i \ theta} $. Pour plus d'informations, cliquez ici (https://quantum-computing.ibm.com/support/guides/gate-overview?section=5d00d964853ef8003c6d6820#)
L'algorithme de phase est une version améliorée du test Adamar.
Soit la valeur propre de la matrice unitaire $ U $ de taille $ 2 ^ n $ $ e ^ {2 \ pi i \ lambda} $, et le vecteur propre correspondant $ | \ varphi \ rangle $. Si $ \ lambda $ peut être représenté en binaire comme une fraction du chiffre $ m
M pour l'algorithme d'estimation de phase+Utilise n bits quantiques pour l'entrée
Pourquoi est-il possible d'effectuer une factorisation première une fois le chiffre r obtenu? Tout d'abord, supposons que r est pair (il semble que si vous le prenez au hasard, ce sera pair). Ensuite, les transformations suivantes peuvent être effectuées.
Eh bien, voici la production. Exécutons l'algorithme que nous avons vu ci-dessus dans un simulateur et factorisons $ N = 15 $ en $ x = 4 $. Cette fois, nous utiliserons une bibliothèque de calcul quantique appelée qiskit. Pour plus d'informations sur qiskit, consultez la Documentation officielle. Toute exécution est effectuée sur le notebook jupyter.
La partie informatique quantique est la suivante. L'implémentation de U mentionnée dans le chapitre précédent, mais comme il est difficile d'implémenter l'arithmétique générale des restes, nous avons profité du fait que $ N = 15, x = 4 $ ($ {U} ^ {2 ^). Pour i} $, j'ai également utilisé le fait que le chiffre est 2, donc je l'ai omis ...)
from qiskit import *
from qiskit.providers.ibmq import least_busy
from qiskit.visualization import plot_histogram
from qiskit.tools.monitor import job_monitor
import math
q = QuantumRegister(8, "q")
c = ClassicalRegister(4, "c")
circuit = QuantumCircuit(q, c)
circuit.x(7)
#Hadamard transform
for i in range(4):
circuit.h(i)
#U4^1 gate
circuit.cswap(3, 4, 6)
circuit.cswap(3, 5, 7)
circuit.barrier()
#U4^2 gate
#U4^4 gate
#U4^8 gate
circuit.barrier()
#inverse quantum Fourier transform
circuit.swap(0, 3)
circuit.swap(1, 2)
circuit.h(3)
circuit.cu1(-np.pi/2, 3, 2)
circuit.h(2)
circuit.barrier()
circuit.cu1(-np.pi/4, 3, 1)
circuit.cu1(-np.pi/2, 2, 1)
circuit.h(1)
circuit.barrier()
circuit.cu1(-np.pi/8, 3, 0)
circuit.cu1(-np.pi/4, 2, 0)
circuit.cu1(-np.pi/2, 1, 0)
circuit.h(0)
circuit.barrier()
#measure
for i in range(4):
circuit.measure(q[i], c[3-i])#X en binaire=J'essaye d'être q1q2q3q4
circuit.draw(output='mpl')
Maintenant, le reste est la partie de calcul classique. J'ai implémenté l'expansion continue de la fraction comme suit (je suis assez méfiant parce que je l'ai juste écrit correctement et essayé un petit échantillon ...). J'essaie de terminer lorsque l'erreur relative est inférieure à eps.
eps = 0.01
def continued_fractions_algorithm(x):
res = [int(x)]
x-=int(x)
if x/(res[0]+0.1)>eps:
a = continued_fractions_algorithm(1/x)
res+=a
return res
Maintenant, estimons la quantité de calcul (en tant qu'ordinateur quantique). En supposant que le nombre naturel dont vous voulez faire le facteur premier est $ n $ bit, la partie transformée de Fourier discrète est $ O (n ^ 2) $ et la partie algorithme d'estimation de phase est $ O (n ^ 3) $. La partie classique ne devient pas un goulot d'étranglement, j'ai donc pu la résoudre en un temps polypole de $ O (n ^ 3) $ au total! Après cela, si vous exécutez le code suivant,
def shor_algorithm(use_simulator):
if use_simulator:
backend = BasicAer.get_backend('qasm_simulator')
else:
backend = IBMQ.get_provider().get_backend('ibmq_16_melbourne')
flag = False
job = execute(circuit, backend, shots = N)
job_monitor(job)
result = job.result()
counts = result.get_counts(circuit)
measures = np.array(list(map(lambda x:int(x, 2), counts.keys())), dtype = np.int64)
probs = np.array(list(counts.values()))/N
for i in range(5):
output = np.random.choice(measures, p = probs)
a = continued_fractions_algorithm(output/2**4)
r , s =1, a[-1]
for i in range(len(a)-1)[::-1]:
r, s = s, a[i]*s+r
if r % 15 == 0 or s == 0:
continue
d = math.gcd(15, 4**(r-1)-1)
if d != 1:
flag = True
break
plot_histogram(result.get_counts())
if flag:
print('{0} devides 15 with r = {1}'.format(d, r))
else:
print('the algorithm failed')
return result
%matplotlib inline
use_simulator = True
result = shor_algorithm(use_simulator)
plot_histogram(result.get_counts())
Et réussi l'affacturage!
Vous pouvez utiliser IBM Q, un ordinateur quantique gratuit, à partir de qiskit. La page officielle est ici. Vous devez créer un compte pour l'opération.
Tout d'abord, exécutez le code suivant.
from qiskit import IBMQ
my_token = ""
IBMQ.save_account(my_token)
provider = IBMQ.load_account()
Dans my_token, saisissez le token obtenu depuis Mon compte sur la page officielle.
Puisque j'utilise 8qubit cette fois, j'utiliserai ibmq_16_melbourne. Cela prendra un certain temps, mais si vous l'exécutez avec use_simulator = False dans le code ci-dessus,
Quoi?
Comment était-ce? J'ai essayé l'affacturage avec un ordinateur quantique cette fois, mais comme nous l'avons vu dans le chapitre précédent, il y a une erreur considérable dans la machine réelle. Bien sûr, cette fois, j'essaie avec un modèle simple que tout le monde peut utiliser, mais si même la factorisation de 15 est difficile, il semble qu'il faudra du temps pour que l'ordinateur quantique soit mis en pratique.
Quantum Native Dojo https://dojo.qulacs.org/ja/latest/ Kenjiro Miyano, Akira Furusawa, Introduction aux ordinateurs quantiques Japan Critics 2016 Michael A. Nilsen,Isaac L. Chuang Quantum Computation and Quantum Information 10th Anniversary Edition 2010
Recommended Posts