Comme précédemment, on fait un venv Python, un pip pour installer poetry, un poetry pour installer le bazar et on lance jupyterJ'ai toujours mes bugs d'affichage, donc, je 'fix' le code comme pour le 1er challengeLes print nous seront utilesOn est prêt!
Au bluff
Desfois que, on tente au bluff de mettre toutes les portes… le serveur refuse, dommage! 😄De même, si on teste brutalement sans réfléchir, on ne voit pas de pattern qui ressorte de la réponseUne lecture rapide du code serveur nous confirme qu'il n'y a pas de faille à ce niveau là, donc on va devoir trouver une solution 'legit'
Setup local
On commence donc par se faire un test en local, avec nos angles d'entrée et nos portes manquantes
Mathématiquement, il est très probable que le rôle des qbits soit symétrique et donc interchangeable. Autrement dit, qu'on pose les portes sur les 2 derniers, les 2 premiers, ou n'importe quels qbits, ce devrait être pareil. Je choisis donc de les poser sur les n-2 premiers qbits.
En revanche, pour l'instant, j'ignore sur quels qbits et avec quels valeurs d'angles utiliser mes portes U
Avec un Flag connu
Histoire d'y voir clair, on va changer l'affichage des probabilités pour n'avoir que les plus élevées (les probas les plus élevées pour chaque flag possible)C'est plus joli. Quelques proba se détachent, mais il ne devrait y avoir qu'un seul flag
En plus, ces probas élevées ne sont pas le flag 'connu' sur lequel on fait nos tests
On va maintenant procéder à un test: on ignore 2 des bits du flag, mais si on considère qu'on les connait?Alors la proba du Flag crève le plafond!Et si on fixe les deux qbits sans porte à des valeurs erronnées, là, aucune proba ne ressort clairement
L'idée va donc être simplement de faire 4 requetes, avec les 4 combinaisons de 2 premiers qbits possibles, et de garder la combinaison qui n'a qu'une seule probabilité élevée en sortie
Automatisation
On va faire automatique pour cela (même si on pourrait faire 4 requetes à la main, pour chaque moitié de flag)On lance cela avec notre flag de test, et on voir la proba du Flag ressortir nettementMais j'ai encore des doutes sur ma gestion du boutisme (aka, l'ordre des bits)Je teste, et patatras, rien ne ressort!Avec un petit test sur les angles, je vois rapidement le problème…… mes angles pour le bit 1 étaient simplement incorrects (on se fichera du 0 if X else 0 qui pourrait se simplifier 😄)
Flag
On balance la même chose en requêtant le serveurZut, rien ne ressort!Hé, crème d'andouille que je suis, j'ai oublié qu'on a 10 portes, pas 5!Mais à nouveau, bof, rien…
Il me vient alors une idée: comme l'ordre de mes bits est peut-etre incorrect, et si au lieu de tester toutes les combinaisons des 2 premiers bits, je fixais 2 bits (consécutifs) à zéro, que je fais 'glisser' le long du flag sur tous les emplacements possibles?
Cette technique marche toujours, sauf si le flag est 0101…01 ou 111…111 puisqu'il n'y aurait alors aucun 00 dans le Flag
Je teste donc cette méthode, avec un flag connu, en faisant 'glisser' mon 00 le long du flagLe Flag de test ressort alors régulièrement!Je tente la même chose sur le serveurEt là aussi, une combinaison ressort 000010100110Je me la noteJe fais pareil sur la seconde moitié du flagEt crack, loupé, premier failJ'en déduis donc juste que j'ai oublié d'inverser l'ordre des bits de chaque bloc, et là, ça passe