Je dois trouver tous les triples de nombres de 16 bits ( x
, y
, z
) (en fait, seulement les bits qui correspondent parfaitement dans des triples différents avec des bits sur les mêmes positions), de telle sorte que
y | x = 0x49ab
(y >> 2) ^ x = 0x530b
(z >> 1) & y = 0x0883
(x << 2) | z = 0x1787
Une tactique directe nécessiterait environ 2 jours sur 8700K, ce qui est trop (même si j'utilise tous les PC auxquels j'ai accès (R5-3600, i3-2100, i7-8700K, R5-4500U, 3xRPi4, RPi0/W), cela prendrait trop de temps).
Si le décalage de bits n'était pas dans les équations, il serait trivial de faire cela, mais avec les décalages, il est trop difficile de faire la même chose (ou peut-être même impossible).
J'ai donc trouvé une solution assez intéressante : analyser les équations en déclarations sur les bits des nombres (quelque chose comme "3ème bit de x XOR 1er bit de y est égal à 1") et avec toutes ces déclarations écrites dans quelque chose comme le langage Prolog (ou simplement les interpréter en utilisant les tables de vérité des opérations), tous les bits non ambigus exécutés seraient trouvés. Cette solution est également assez difficile à mettre en œuvre : Je n'ai aucune idée de la manière d'écrire un tel analyseur et aucune expérience en Prolog. (*)
La question est donc la suivante : quelle serait la meilleure façon de procéder ? Et si c'est (*), comment faire ?
Edit : pour faciliter le codage, voici le schéma binaire des nombres :
0x49ab = 0b0100100110101011
0x530b = 0b0101001100001011
0x0883 = 0b0000100010000011
0x1787 = 0b0001011110000111