Algorithme de Shor
Pour ce module Qiskit in Classrooms, les étudiants doivent disposer d'un environnement de Python travail sur lequel les paquets suivants sont installés :
- v2.1.0
qiskitou plus récent - v0.40.1
qiskit-ibm-runtimeou plus récent - v0.17.0
qiskit-aerou plus récent qiskit.visualizationnumpypylatexenc
Pour configurer et installer les paquets ci-dessus, consultez le guide d'installation de Qiskit. Pour pouvoir exécuter des tâches sur de véritables ordinateurs quantiques, les étudiants devront créer un compte en IBM Quantum® suivant les étapes décrites dans le guide « Créer votre IBM Cloud compte ».
Ce module a été testé et a utilisé trois secondes de temps QPU. Il s'agit uniquement d'une estimation. Votre utilisation réelle peut varier.
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'Introduction
Au début des années 1990s, l'enthousiasme grandissait autour du potentiel des ordinateurs quantiques pour résoudre des problèmes difficiles à traiter par les ordinateurs classiques. Quelques informaticiens talentueux avaient mis au point des algorithmes qui démontraient la puissance de l'informatique quantique pour certains problèmes de niche artificiels, mais personne n'avait trouvé une seule « application révolutionnaire » de l'informatique quantique qui allait assurément révolutionner le domaine. C'était le cas jusqu'en 1994, lorsque Peter Shor a mis au point ce qui est aujourd'hui appelé l'algorithme de Shor pour factoriser les grands nombres.
Il était bien connu à l'époque que trouver les facteurs premiers d'un grand nombre était extrêmement difficile pour un ordinateur classique. En fait, les protocoles de sécurité Internet s'appuyaient sur cette difficulté. Shor a trouvé un moyen de déterminer ces facteurs de manière exponentiellement plus efficace en transférant certaines des étapes les plus difficiles à un ordinateur quantique théorique futur.
Dans ce module, nous allons explorer l'algorithme de Shor. Tout d'abord, nous allons donner un peu plus de contexte à l'algorithme, en formalisant le problème qu'il résout et en expliquant sa pertinence pour la cybersécurité. Ensuite, nous présenterons une introduction aux mathématiques modulaires et à leur application au problème de factorisation, en montrant comment la factorisation se réduit à un autre problème appelé « recherche d'ordre » Nous montrerons comment la transformée de Fourier quantique et l'estimation de phase quantique, que nous avons apprises dans un module précédent, entrent en jeu, et comment les utiliser pour résoudre le problème de recherche d'ordre.
Enfin, nous allons exécuter l'algorithme de Shor sur un véritable ordinateur quantique! Gardez toutefois à l'esprit que cet algorithme ne sera vraiment utile que lorsque nous disposerons d'un ordinateur quantique puissant et tolérant aux pannes, ce qui ne sera pas le cas avant plusieurs années. Nous allons donc simplement factoriser un petit nombre pour montrer comment fonctionne l'algorithme.
Le problème de l'affacturage
Le but du problème de factorisation est de trouver les facteurs premiers d'un nombre . Pour certains nombres , c'est assez facile. Par exemple, si est pair, l'un de ses facteurs premiers sera 2. Si est une puissance première, c'est-à-dire pour un certain nombre premier , il est également assez facile de trouver : il suffit d'approximer la racine de et de rechercher les nombres premiers proches qui pourraient être .
Cependant, les ordinateurs classiques rencontrent des difficultés lorsque est impair et n'est pas une puissance première. C'est le cas traité par l'algorithme de Shor. L'algorithme trouve deux facteurs et tels que . Il peut être appliqué de manière récursive jusqu'à ce que tous les facteurs soient premiers. Dans les sections suivantes, nous verrons comment ce problème est abordé.
Pertinence pour la cybersécurité
De nombreux systèmes cryptographiques ont été conçus en se basant sur le fait qu'il est difficile de factoriser de grands nombres, notamment celui couramment utilisé aujourd'hui, appelé RSA. Dans le RSA, une clé publique est créée en multipliant deux grands nombres premiers entre eux pour obtenir . Ensuite, n'importe qui peut utiliser cette clé publique pour crypter des données. Mais seule une personne disposant de la clé privée, et , peut déchiffrer ces données.
Si était facile à factoriser, alors n'importe qui serait capable de déterminer ce que sont et et de déchiffrer le cryptage. Mais ce n'est pas le cas. C'est un problème réputé difficile. En fait, les facteurs premiers d'un nombre appelé RSA1024, qui comporte 1024 chiffres binaires et 309 chiffres décimaux, n'ont toujours pas été trouvés, malgré une récompense de 100 000 dollars offerte pour sa factorisation dès 1991.
Solution de Shor
En 1994, Peter Shor s'est rendu compte qu'un ordinateur quantique pouvait factoriser un grand nombre de manière exponentiellement plus efficace qu'un ordinateur classique. Son intuition reposait sur la relation entre ce problème de factorisation et l'arithmétique modulaire. Nous allons passer en revue quelques notions élémentaires d'arithmétique modulaire, puis nous verrons comment les utiliser pour factoriser .
Arithmétique modulaire
L'arithmétique modulaire est un système de comptage cyclique, ce qui signifie que le comptage commence de manière habituelle, avec les nombres entiers 0, 1, 2, etc., à un certain moment, après une période donnée , le décompte recommence. Voyons comment cela fonctionne à l'aide d'un exemple. Supposons que notre période soit 5. Ensuite, pendant que nous comptons, là où nous arriverions normalement à 5, nous recommençons à 0 :
En effet, dans le monde « modulo-5 », 5 équivaut à 0. Nous disons que . En fait, tous les multiples de 5 seront équivalents à .
Vérifiez votre compréhension
Utilisez l'arithmétique modulaire pour résoudre le problème suivant :
Vous partez pour un long voyage en train transcontinental à 8 heures du matin. Le trajet en train dure 60 heures. Quelle heure est-il quand vous arrivez?
La période est de 24, puisqu'il y a 24 heures dans une journée. Ainsi, ce problème peut être écrit en arithmétique modulaire comme suit :
Vous arriveriez donc à destination à 20 h, soit 8 heures du soir.
et
Il est souvent utile d'introduire deux ensembles, et . est simplement l'ensemble des nombres qui existent dans un monde « modulo ». Par exemple, lorsque nous comptions modulo-5, l'ensemble serait . Autre exemple : . Nous pouvons effectuer des additions et des multiplications (modulo ) sur les éléments de , et le résultat de chacune de ces opérations est également un élément de , ce qui fait de un objet mathématique appelé anneau.
Il existe un sous-ensemble particulier de qui nous intéresse tout particulièrement pour l'algorithme de Shor. Il s'agit du sous-ensemble des nombres tels que le plus grand commun diviseur entre chaque élément et est 1, de sorte que chaque élément est « coprime » avec . Si l'on prend l'ensemble de ces nombres avec l'opération de multiplication modulaire, on obtient un autre objet mathématique, appelé groupe. Nous appelons ce groupe . Il s'avère qu'avec (et les groupes finis en général), si nous choisissons un élément quelconque et que nous multiplions par lui-même à plusieurs reprises, nous obtiendrons toujours le nombre . Le nombre minimum de fois qu'il faut multiplier par lui-même pour obtenir est appelé l 'ordre de . Ce fait sera très important pour notre discussion sur la façon de factoriser les nombres ci-dessous.
Vérifiez votre compréhension
Qu'est-ce que c'est ?
Nous avons exclu les numéros suivants :
Quel est l'ordre de chacun des éléments dans ?
L'ordre est le plus petit nombre tel que pour chaque élément .
Notez que, même si nous avons réussi à trouver l'ordre des nombres dans , ce n'est PAS une tâche facile en général, pour des plus grands . C'est là le nœud du problème de factorisation et la raison pour laquelle nous avons besoin d'un ordinateur quantique. Nous verrons pourquoi au fur et à mesure que nous avancerons dans le reste du cahier.
Appliquer l'arithmétique modulaire au problème de factorisation
La clé pour trouver les facteurs et tels que consiste à trouver un autre entier tel que
et
Comment le fait de trouver nous aide-t-il à trouver les facteurs et ? Examinons maintenant cet argument. Puisque , cela signifie que . En d'autres termes, est un multiple de . Ainsi, pour un certain entier ,
Nous pouvons factoriser pour obtenir :
D'après nos hypothèses initiales, nous savons que , donc ne se divise pas exactement par ou . Ainsi, les deux facteurs de , et, doivent chacun se diviser par et . Soit est un facteur de et est un facteur de , soit l'inverse. Par conséquent, si nous calculons les plus grands diviseurs communs (PDC) entre et et , cela nous donnera les facteurs et . Le calcul du PDC entre deux nombres est une tâche classique facile qui peut être accomplie, par exemple, à l'aide de l'algorithme d'Euclide.
Vérifiez votre compréhension
Il peut être difficile de comprendre chaque étape du raisonnement ci-dessus, alors essayez de l'appliquer à un exemple. Utilisez et . Vérifiez d'abord que et . Continuez ensuite à vérifier chaque étape. Enfin, calculez et vérifiez qu'il s'agit bien des facteurs de .
, qui est , donc .
, qui n'est pas équivalent à .
, qui n'est pas équivalent à .
Maintenant, nous savons que pour certains entiers . Cela se vérifie lorsque nous substituons et : lorsque .
Maintenant, nous devons calculer et .
Nous avons donc trouvé nos facteurs de !
L'algorithme
Maintenant que nous avons vu comment trouver un entier tel que nous aide à factoriser , nous pouvons passer à l'algorithme de Shor. Il s'agit essentiellement de trouver :
- Choisissez un nombre entier aléatoire Choisissez un nombre entier aléatoire tel que .
- Calculer de manière classique.
- Si , vous avez déjà trouvé un facteur. Arrêtez.
- Sinon, continuez.
-
Trouver l'ordre du modulo Trouver le plus petit entier positif qui satisfait .
-
Vérifiez si la commande est paire.
- Si est impair, revenez à l'étape 1 et choisissez un nouveau .
- Si est pair, passez à l'étape 4.
- Calculer
- Vérifiez que et .
- Si , revenez à l'étape 1 et choisissez un nouveau .
- Sinon, calculez les pgcd pour extraire les facteurs :
Ce seront des facteurs non triviaux de .
- Facteur récursivement si nécessaire
- Si et/ou ne sont pas premiers, appliquez l'algorithme de manière récursive pour les factoriser complètement.
- Une fois tous les facteurs premiers déterminés, le calcul est terminé.
Sur la base de cette procédure, on pourrait se demander pourquoi un ordinateur quantique est nécessaire pour accomplir cette tâche. C'est nécessaire car l'étape 2, qui consiste à trouver l'ordre de modulo , est classiquement un problème très difficile. La complexité augmente de manière exponentielle avec le nombre . Mais avec un ordinateur quantique, il suffit d'utiliser l'estimation de phase quantique pour le résoudre. L'étape 4, qui consiste à trouver le PGCD de deux nombres entiers, est en fait assez facile à réaliser de manière classique. Ainsi, la seule étape qui nécessite réellement la puissance d'un ordinateur quantique est celle de la recherche d'ordre. Nous disons que le problème de factorisation « se réduit » au problème de recherche d'ordre.
La partie difficile : trouver la commande
Nous allons maintenant voir comment utiliser un ordinateur quantique pour trouver des solutions. Tout d'abord, clarifions ce que nous entendons par « ordre » Bien sûr, je vous ai déjà expliqué ce que signifie mathématiquement cet ordre : c'est le premier entier non nul tel que Mais voyons si nous pouvons acquérir un peu plus d'intuition pour ce concept.
Pour suffisamment petit , nous pouvons simplement déterminer l'ordre en calculant chaque puissance de , en prenant le module de ce nombre, puis en s'arrêtant lorsque nous trouvons la puissance qui satisfait . C'est ce que nous avons fait avec notre exemple, , ci-dessus. Examinons quelques graphiques représentant ces puissances modulaires pour certaines valeurs échantillons de et :
Vous remarquez quelque chose? Ce sont des fonctions périodiques! Et l'ordre est le même que la période! Ainsi, la recherche d'ordre équivaut à la recherche de période.
Les ordinateurs quantiques sont particulièrement adaptés à la recherche de la période des fonctions. Pour cela, nous pouvons utiliser une sous-routine algorithmique appelée « estimation de phase quantique ». Nous avons abordé le QPE et son rapport avec la transformée de Fourier quantique dans le module précédent. Pour un rappel détaillé, consultez le module QFT ou la leçon de John Watrous sur l'estimation de phase quantique dans son cours sur les algorithmes quantiques. Nous allons maintenant passer en revue les grandes lignes de la procédure :
Dans l'estimation de phase quantique (QPE), nous partons d'un opérateur unitaire et d'un état propre de cet opérateur unitaire . Ensuite, nous utilisons la QPE pour approximer la valeur propre correspondante qui, puisque l'opérateur est unitaire, sera de la forme . Ainsi, trouver la valeur propre équivaut à trouver la valeur de dans la fonction périodique. Le circuit ressemble à ceci :
où le nombre de qubits de contrôle (les qubits supérieurs dans la figure ci-dessus) détermine la précision de l'approximation.
Dans l'algorithme de Shor, nous utilisons le QPE sur l'opérateur unitaire :
Ici, désigne un état de base computationnel du registre multi-qubits, où la valeur binaire des qubits correspond à l'entier . Par exemple, si et , alors est représenté par l'état de base à quatre qubits, car quatre qubits sont nécessaires pour coder des nombres allant jusqu'à 15. (Si ce concept vous est inconnu, consultez le module d'introduction Qiskit dans les salles de classe pour rafraîchir vos connaissances sur le codage binaire des états quantiques.)
Maintenant, nous devons déterminer un état propre de cet opérateur unitaire. Si nous avons commencé dans l'état , nous pouvons voir que chaque application successive de multipliera l'état de notre registre par , et après applications, nous arriverons à nouveau à l'état. Par exemple avec et :
Ainsi, les superpositions des états dans ce cycle ( ) de la forme :
sont tous des états propres de . (Il existe d'autres états propres que ceux-ci. Mais nous ne nous intéressons qu'à ceux qui répondent à la forme ci-dessus.)
Vérifiez votre compréhension
Trouvez un état propre de l'unitaire correspondant à et .
Donc, l'ordre . Les états propres qui nous intéressent seront une superposition égale de tous les états qui ont été cyclés ci-dessus, avec différentes phases :
Supposons que nous ayons réussi à initialiser l'état de notre qubit dans l'un de ces états propres (spoiler : ce n'est pas le cas). Ou, du moins, pas facilement. Nous expliquerons pourquoi et ce que nous pouvons faire à la place dans un instant). Nous pourrions alors utiliser QPE pour estimer la valeur propre correspondante, où . Nous pourrons ensuite déterminer l'ordre à l'aide de l'équation simple suivante :
Mais n'oubliez pas que j'ai dit que le QPE fournit des estimations — il ne nous donne pas une valeur exacte. Nous avons besoin d'une estimation suffisamment précise pour différencier et . Plus nous disposons de qubits de contrôle , meilleure sera l'estimation. Dans les problèmes à la fin de la leçon, vous devrez déterminer le minimum nécessaire pour factoriser un nombre .
Maintenant, nous devons résoudre un problème. Toutes les explications ci-dessus sur la manière de trouver commencent par la préparation de l'état propre . Mais nous ne savons pas comment faire cela sans déjà connaître la valeur de. La logique est circulaire. Nous avons besoin d'un moyen d'estimer la valeur propre sans initialiser l'état propre.
Au lieu de commencer avec un état propre de , nous pouvons préparer l'état initial dans l'état à -qubits correspondant à en binaire (comme dans ) . Bien que cet état ne soit manifestement pas un état propre de , il s'agit d'une superposition de tous les états propres :
Vérifiez votre compréhension
Vérifiez que est équivalent à la superposition des états propres que vous avez trouvés pour et dans la question précédente.
Les quatre états propres étaient les suivants :
Donc,
Comment cela nous permet-il de trouver l'ordre ? Étant donné que l'état initial est une superposition de tous les états propres de la forme indiquée ci-dessus, l'algorithme QPE estime simultanément chacun des correspondant à ces états propres. Ainsi, la mesure des qubits de contrôle à la fin donnera une approximation de la valeur où est l'une des valeurs propres choisies au hasard. Si nous répétons ce circuit plusieurs fois et obtenons plusieurs échantillons avec différentes valeurs de , nous pourrons rapidement en déduire .
Implémenter dans Qiskit
Comme nous l'avons mentionné précédemment, notre matériel n'est pas encore capable de traiter des nombres aussi grands que RSA1024. Nous allons simplement factoriser un petit nombre pour montrer comment fonctionne l'algorithme. Pour cette démonstration, nous utiliserons une version simplifiée du code présenté dans le tutoriel sur l'algorithme de Shor. Si vous souhaitez obtenir plus de détails, veuillez consulter le tutoriel.
Nous exécuterons l'algorithme à l'aide de notre infrastructure standard pour résoudre les problèmes quantiques, appelée infrastructure Qiskit patterns. Cela comprend quatre étapes :
- Mappage de votre problème sur un circuit quantique
- Optimiser le circuit pour qu'il puisse être exécuté sur du matériel quantique
- Exécutez votre circuit sur l'ordinateur quantique
- Post-traiter les mesures
1. Carte
Factorisons , en choisissant comme notre entier coprime.
Tout d'abord, nous devons construire le circuit qui mettra en œuvre l'unité de multiplication modulaire. C'est en fait la partie la plus délicate de toute la mise en œuvre, qui peut s'avérer très coûteuse en termes de calcul, selon la manière dont elle est réalisée. Pour cela, nous allons tricher un peu : nous savons que nous commençons dans l'état , et d'après une question posée précédemment,
Nous allons donc construire une unité qui effectue les opérations correctes sur ces quatre états, mais qui laisse tous les autres états inchangés. C'est de la triche, car nous utilisons notre connaissance de l'ordre de pour simplifier l'unitaire. Si nous essayions réellement de factoriser un nombre dont les facteurs nous étaient inconnus, nous ne serions pas en mesure de le faire.
Vérifiez votre compréhension
Grâce à votre connaissance de la manière dont l'opérateur transforme les états ci-dessus, construisez l'opérateur à partir d'une série de portes SWAP, qui échangent les états de deux qubits. (Astuce : écrire chaque état en binaire vous aidera.)
Réécrivons l'action de sur les états en binaire :
Chacune de ces actions peut être accomplie à l'aide d'un simple SWAP. est obtenu en échangeant les états des qubits et . est obtenu en échangeant les états des qubits et . Et ainsi de suite. Nous pouvons donc décomposer la matrice en la série suivante de portes SWAP :
En gardant à l'esprit que les opérateurs agissent de droite à gauche, vérifions que cela produit l'effet souhaité sur chacun des états :
Nous pouvons désormais coder le circuit équivalent à cet opérateur dans Qiskit.
Tout d'abord, nous importons les paquets nécessaires :
# Import necessary packages
import numpy as np
from fractions import Fraction
from math import floor, gcd, log
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.circuit.library import QFTGate
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization import plot_histogram
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import SamplerV2 as SamplerEnsuite, nous créons l'opérateur :
def M2mod15():
"""
M2 (mod 15)
"""
b = 2
U = QuantumCircuit(4)
U.swap(2, 3)
U.swap(1, 2)
U.swap(0, 1)
U = U.to_gate()
U.name = f"M_{b}"
return U# Get the M2 operator
M2 = M2mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(4)
circ.compose(M2, inplace=True)
circ.decompose(reps=2).draw(output="mpl", fold=-1)Output:
L'algorithme QPE utilise une porte contrôlée. Maintenant que nous avons un circuit, nous devons en faire un circuit * contrôlé* :
def controlled_M2mod15():
"""
Controlled M2 (mod 15)
"""
b = 2
U = QuantumCircuit(4)
U.swap(2, 3)
U.swap(1, 2)
U.swap(0, 1)
U = U.to_gate()
U.name = f"M_{b}"
c_U = U.control()
return c_U# Get the controlled-M2 operator
controlled_M2 = controlled_M2mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(5)
circ.compose(controlled_M2, inplace=True)
circ.decompose(reps=1).draw(output="mpl", fold=-1)Output:
Nous avons maintenant notre porte contrôlée. Mais pour exécuter l'algorithme d'estimation de phase quantique, nous aurons besoin de contrôlé , contrôlé , jusqu'à contrôlé , où est le nombre de qubits utilisés pour estimer la phase. Plus il y a de qubits, plus l'estimation de phase sera précise. Nous utiliserons des qubits de contrôle pour notre procédure d'estimation de phase. Nous avons donc besoin de :
où l'indice , avec , correspond au qubit de contrôle. Calculons maintenant pour chaque valeur de :
def a2kmodN(a, k, N):
"""Compute a^{2^k} (mod N) by repeated squaring"""
for _ in range(k):
a = int(np.mod(a**2, N))
return ak_list = range(8)
b_list = [a2kmodN(2, k, 15) for k in k_list]
print(b_list)Output:
[2, 4, 1, 1, 1, 1, 1, 1]
Puisque pour , tous les opérateurs correspondants ( et supérieurs) sont équivalents à l'identité. Il suffit donc de construire une seule matrice supplémentaire,
Remarque : cette simplification ne fonctionne ici que parce que l'ordre de est . Une fois que (donc ), chaque puissance suivante de l'opérateur est l'identité. En général, pour des nombres plus grands ou différents choix de , vous ne pouvez pas ignorer la construction des puissances supérieures. C'est l'une des raisons pour lesquelles cet exemple est considéré comme un exemple simplifié : les petits nombres permettent des raccourcis qui ne fonctionneraient pas dans des cas plus complexes.
def M4mod15():
"""
M4 (mod 15)
"""
b = 4
U = QuantumCircuit(4)
U.swap(1, 3)
U.swap(0, 2)
U = U.to_gate()
U.name = f"M_{b}"
return U# Get the M4 operator
M4 = M4mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(4)
circ.compose(M4, inplace=True)
circ.decompose(reps=2).draw(output="mpl", fold=-1)Output:
Et comme précédemment, nous en faisons un opérateur * contrôlé* :
def controlled_M4mod15():
"""
Controlled M4 (mod 15)
"""
b = 4
U = QuantumCircuit(4)
U.swap(1, 3)
U.swap(0, 2)
U = U.to_gate()
U.name = f"M_{b}"
c_U = U.control()
return c_U# Get the controlled-M4 operator
controlled_M4 = controlled_M4mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(5)
circ.compose(controlled_M4, inplace=True)
circ.decompose(reps=1).draw(output="mpl", fold=-1)Output:
Maintenant, nous pouvons rassembler tous ces éléments pour trouver l'ordre de à l'aide d'un circuit quantique, en utilisant l'estimation de phase :
# Order finding problem for N = 15 with a = 2
N = 15
a = 2
# Number of qubits
num_target = floor(log(N - 1, 2)) + 1 # for modular exponentiation operators
num_control = 2 * num_target # for enough precision of estimation
# List of M_b operators in order
k_list = range(num_control)
b_list = [a2kmodN(2, k, 15) for k in k_list]
# Initialize the circuit
control = QuantumRegister(num_control, name="C")
target = QuantumRegister(num_target, name="T")
output = ClassicalRegister(num_control, name="out")
circuit = QuantumCircuit(control, target, output)
# Initialize the target register to the state |1>
circuit.x(num_control)
# Add the Hadamard gates and controlled versions of the
# multiplication gates
for k, qubit in enumerate(control):
circuit.h(k)
b = b_list[k]
if b == 2:
circuit.compose(
M2mod15().control(), qubits=[qubit] + list(target), inplace=True
)
elif b == 4:
circuit.compose(
M4mod15().control(), qubits=[qubit] + list(target), inplace=True
)
else:
continue # M1 is the identity operator
# Apply the inverse QFT to the control register
circuit.compose(QFTGate(num_control).inverse(), qubits=control, inplace=True)
# Measure the control register
circuit.measure(control, output)
circuit.draw("mpl", fold=-1)Output:
2. Optimiser
Maintenant que nous avons cartographié notre circuit, l'étape suivante consiste à l'optimiser pour qu'il puisse fonctionner sur un ordinateur quantique particulier. Nous devons d'abord charger le backend.
service = QiskitRuntimeService()
backend = service.backend("ibm_marrakesh")Si vous ne disposez pas de temps sur votre compte ou si vous souhaitez utiliser un simulateur pour une raison quelconque, vous pouvez exécuter la cellule ci-dessous pour configurer un simulateur qui imitera le dispositif quantique que nous avons sélectionné ci-dessus :
pm = generate_preset_pass_manager(optimization_level=2, backend=backend)
transpiled_circuit = pm.run(circuit)
print(f"2q-depth: {transpiled_circuit.depth(lambda x: x.operation.num_qubits==2)}")
print(f"2q-size: {transpiled_circuit.size(lambda x: x.operation.num_qubits==2)}")
print(f"Operator counts: {transpiled_circuit.count_ops()}")
transpiled_circuit.draw(output="mpl", fold=-1, style="clifford", idle_wires=False)Output:
2q-depth: 188
2q-size: 281
Operator counts: OrderedDict({'sx': 548, 'rz': 380, 'cz': 281, 'measure': 8, 'x': 6})
3. Exécuter
# Sampler primitive to obtain the probability distribution
sampler = Sampler(backend)
# Turn on dynamical decoupling with sequence XpXm
sampler.options.dynamical_decoupling.enable = True
sampler.options.dynamical_decoupling.sequence_type = "XpXm"
# Enable gate twirling
sampler.options.twirling.enable_gates = True
pub = transpiled_circuit
job = sampler.run([pub], shots=1024)result = job.result()[0]
counts = result.data["out"].get_counts()plot_histogram(counts, figsize=(35, 5))Output:
Nous observons quatre pics distincts à 00000000, 01000000, 10000000 et 11000000, avec quelques comptages dans d'autres chaînes de bits dus au bruit dans l'ordinateur quantique. Nous allons ignorer ces derniers et ne conserver que les quatre dominants en imposant un seuil : seuls les comptes supérieurs à ce seuil sont considérés comme un véritable signal au-dessus du bruit.
# Dictionary of bitstrings and their counts to keep
counts_keep = {}
# Threshold to filter
threshold = np.max(list(counts.values())) / 2
for key, value in counts.items():
if value > threshold:
counts_keep[key] = value
print(counts_keep)4. Post-traitement
Pour l'algorithme de Shor, une grande partie de l'algorithme est exécutée de manière classique. Nous mettrons donc le reste dans l'étape de « post-traitement », après avoir obtenu nos mesures à partir de l'ordinateur quantique. Chacune des mesures ci-dessus peut être convertie en nombres entiers qui, après division par , constituent nos approximations pour , où est aléatoire à chaque fois.
a = 2
N = 15
FACTOR_FOUND = False
num_attempt = 0
while not FACTOR_FOUND:
print(f"\nATTEMPT {num_attempt}:")
# Here, we get the bitstring by iterating over outcomes
# of a previous hardware run with multiple shots.
# Instead, we can also perform a single-shot measurement
# here in the loop.
bitstring = list(counts_keep.keys())[num_attempt]
num_attempt += 1
# Find the phase from measurement
decimal = int(bitstring, 2)
phase = decimal / (2**num_control) # phase = k / r
print(f"Phase: theta = {phase}")
# Guess the order from phase
frac = Fraction(phase).limit_denominator(N)
r = frac.denominator # order = r
print(f"Order of {a} modulo {N} estimated as: r = {r}")
if phase != 0:
# Guesses for factors are gcd(a^{r / 2} ± 1, 15)
if r % 2 == 0:
x = pow(a, r // 2, N) - 1
d = gcd(x, N)
if d > 1:
FACTOR_FOUND = True
print(f"*** Non-trivial factor found: {x} ***")Output:
ATTEMPT 0:
Phase: theta = 0.0
Order of 2 modulo 15 estimated as: r = 1
ATTEMPT 1:
Phase: theta = 0.75
Order of 2 modulo 15 estimated as: r = 4
*** Non-trivial factor found: 3 ***
Conclusion
Après avoir suivi ce module, vous serez peut-être frappé par une nouvelle admiration pour le génie de Peter Shor, qui a su imaginer un algorithme aussi ingénieux. Mais j'espère que vous avez également atteint un nouveau niveau de compréhension de sa simplicité trompeuse. Même si l'algorithme peut sembler incroyablement (voire intimidant) complexe, si vous le décomposez en étapes logiques et que vous le parcourez lentement, vous serez vous aussi capable d'exécuter l'algorithme de Shor.
Même si nous sommes encore loin d'utiliser cet algorithme pour factoriser des nombres tels que RSA1024, nos ordinateurs quantiques s'améliorent chaque jour, et une fois qu'un seuil appelé tolérance aux pannes sera atteint, des algorithmes tels que ceux-ci suivront rapidement. C'est une période passionnante pour découvrir l'informatique quantique!
Incidents
Concepts essentiels :
- Les systèmes cryptographiques modernes reposent sur la difficulté classique de factoriser de grands nombres entiers.
- L'arithmétique modulaire — y compris les structures et — fournit les bases mathématiques de l'algorithme de Shor.
- Le problème de la factorisation d'un entier peut être réduit au problème de la recherche de l'ordre d'un nombre modulo .
- La recherche d'ordre quantique utilise des techniques d'estimation de phase quantique pour déterminer la période de la fonction .
- L'algorithme de Shor consiste en un flux de travail hybride classique-quantique qui sélectionne une base, effectue une recherche d'ordre quantique, puis calcule de manière classique les facteurs à partir du résultat.
Vrai/Faux :
- Vrai ou faux : L'efficacité de l'algorithme de Shor menace la sécurité du cryptage RSA.
- Vrai ou faux : l'algorithme de Shor peut être exécuté efficacement sur n'importe quel ordinateur quantique moderne.
- Vrai ou faux? L'algorithme de Shor utilise l'estimation de phase quantique (QPE) comme sous-programme clé.
- Vrai ou faux : La partie classique de l'algorithme de Shor consiste à calculer le plus grand commun diviseur (PGCD).
- Vrai ou faux : l'algorithme de Shor ne fonctionne que pour la factorisation des nombres pairs.
- Vrai ou faux : Une exécution réussie de l'algorithme de Shor garantit toujours les facteurs corrects.
Réponse courte :
- Pourquoi l'algorithme de Shor est-il considéré comme une menace potentielle pour le cryptage RSA?
- Pourquoi est-il utile de déterminer la période, ou l'ordre, d'une fonction exponentielle modulaire pour factoriser un nombre dans l'algorithme de Shor?
Problèmes difficiles :
-
Combien de qubits de contrôle faut-il pour un nombre donné que nous essayons de factoriser afin d'obtenir la précision dans le QPE nécessaire pour trouver la valeur correcte de l'ordre ?
-
En suivant la procédure que nous avons décrite ici pour factoriser 15, essayez maintenant de factoriser 21.