Quelques rappels de notions du principe de la Physique Quantique
API gratuites qui vous permettent d’utiliser un serveur quantique en Java :
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 !
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.
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 !