Aller au contenu

API pour accèder aux serveurs Quantiques

Quelques rappels de notions du principe de la Physique Quantique

API gratuites qui vous permettent d’utiliser un serveur quantique en Java :

Exemple avec IBM Q Experience

avec maven :

<dependency>
  <groupId>com.ibm.watson</groupId>
  <artifactId>qiskit-sdk-javadoc</artifactId>
  <version>3.1.0</version>
</dependency>

avec Gradle :

dependencies {
  compile 'com.ibm.watson:qiskit-sdk-javadoc:3.1.0'
}
import com.ibm.watson.developer_cloud.quantum.Qiskit;
Qiskit qiskit = new Qiskit("YOUR_API_KEY");

String qasm = "OPENQASM 2.0;\n" +
             "include \"qelib1.inc\";\n" +
             "qreg q[1];\n" +
             "x q[0];\n";

import com.ibm.watson.developer_cloud.quantum.model.ExecutionResult;
ExecutionResult result = qiskit.execute(qasm, "local_qasm_simulator");

Voilà, vous savez maintenant comment exécuter un programme quantique sur un ordinateur quantique simulé en utilisant l’API Java de IBM Q Experience !

A quoi ça sert ?

beaucoup plus rapide que les ordinateurs classiques. En particulier, ils sont très performants pour résoudre des problèmes de factorisation de grands nombres et de recherche de solutions dans des espaces de recherche très larges.

Cela signifie qu’ils peuvent être utilisés pour résoudre des problèmes qui sont difficiles ou impossibles à résoudre sur des ordinateurs classiques, tels que :

Il y a de nombreuses autres applications potentielles des ordinateurs quantiques, et de nombreuses entreprises et organisations de recherche investissent beaucoup d’argent et d’efforts pour développer de nouvelles technologies quantiques et trouver de nouvelles utilisations pour ces ordinateurs.

Décryptage quantique, un coup de pouce…

code Java qui utilise l’algorithme de Shor pour décrypter un message chiffré à l’aide d’un ordinateur quantique simulé

import java.math.BigInteger;
import java.util.Random;
import com.ibm.watson.developer_cloud.quantum.model.ExecutionResult.ExecutionData;
import com.ibm.watson.developer_cloud.quantum.model.ExecutionResult.ExecutionData.Result;

import com.ibm.watson.developer_cloud.quantum.Qiskit;
import com.ibm.watson.developer_cloud.quantum.model.ExecutionResult;

public class QuantumDecrypt {
  private static final Random RANDOM = new Random();

  public static void main(String[] args) {
    // Créez une instance de Qiskit en utilisant votre clé d'API
    Qiskit qiskit = new Qiskit("YOUR_API_KEY");

    // Générez un nombre aléatoire et chiffrez-le avec une clé publique
    BigInteger message = new BigInteger(128, RANDOM);
    BigInteger publicKey = new BigInteger("65537");
    BigInteger ciphertext = message.modPow(publicKey, new BigInteger("3233"));

    // Exécutez l'algorithme de Shor pour trouver la clé privée
    String qasm = "OPENQASM 2.0;\n" +
                 "include \"qelib1.inc\";\n" +
                 "qreg q[5];\n" +
                 "creg c[5];\n" +
                 "x q[0];\n" +
                 "h q[0];\n" +
                 "x q[1];\n" +
                 "measure q[1] -> c[1];\n" +
                 "if(c==1) x q[2];\n" +
                 "h q[2];\n" +
                 "measure q[2] -> c[2];\n" +
                 "if(c==3) x q[3];\n" +
                 "measure q[3] -> c[3];\n" +
                 "if(c==7) x q[4];\n" +
                 "measure q[4] -> c[4];\n";
    ExecutionResult result = qiskit.execute(qasm, "local_qasm_simulator; shots=1; max_credits=3");
      // Récupérez les résultats de l'exécution du programme quantique
    Result r = result.getData().getResult().get(0);
    BigInteger m = new BigInteger(r.getData(), 2);

    // Calculez la clé privée à partir des résultats de l'algorithme de Shor
    BigInteger p = m.gcd(new BigInteger("3233"));
    BigInteger q = new BigInteger("3233").divide(p);
    BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
    BigInteger privateKey = publicKey.modInverse(phi);

    // Vérifiez que la clé privée est bien la clé inverse de la clé publique
    assert privateKey.modPow(publicKey, new BigInteger("3233")).equals(BigInteger.ONE);

    // Déchiffrez le message en utilisant la clé privée
    BigInteger decrypted = ciphertext.modPow(privateKey, new BigInteger("3233"));
    assert decrypted.equals(message);

    System.out.println("Le message a bien été déchiffré !");

Vous pouvez également ajuster les paramètres shots et max_credits selon vos besoins.

A vous de jouer !