Si quelqu'un arrive a me traduire cela dans un francais plus vulgaire, faite le moi savoir. XD
Amusez vous bien !
Je ne connaissais pas le Sudoku. Je viens de découvrir (en diagonale) la littérature sur ce sujet. J'ai eu l'idée d'une méthode, qui s'apparente d'ailleurs à de la programmation par contrainte. Je ne l'ai pas testée, donc je ne sais pas si elle est performante. Par contre, il se peut que dans le cas où la grille n'a qu'une solution, on trouve cette solution sans faire aucune recherche (pas d'essais/erreurs).
L'idée est de transfomer le problème en un système linéaire sur un corps fini, qu'on va résoudre par le pivot de Gauss. Le corps fini en question est GF(2^9), qu'on peut voir comme le quotient de l'anneau des polynômes sur Z/2, qu'on notera Z/2[X] par l'idéal (maximal) engendré par un polynôme irréductible. On a de la chance, car le trinôme X^9+X+1 est irréductible modulo 2 (ce n'est pas le cas pour tous les exposants). Evidemment, il faut implémenter le calcul dans ce corps. Un polynôme peut être représenté par un mot de 9 bits. Ce genre de choses est bien conue en cryptographie.
Maintenant, les solutions d'une grille partiellement remplie sont certaines solutions (pas toutes) d'un système linéaire sur ce corps. On va remplir la grille, non pas avec des chiffres, mais avec des éléments de GF(2^9). Evidemment, les seules solutions valables sont celles pour lesquelles les cases contiennent un monôme non nul (un mot de 9 bits avec un seul 1), qui lui représente un chiffre (l'exposant du monôme). C'est cette restriction qui complique le problème (sinon, il ne serait pas NP-complet).
Le système linéaire a au plus 81 inconnues (en fait il y a autant d'inconnues que le nombre de cases vides au départ) et 27 équations linéaires, qui consistent à dire, par exemple pour une colonne que la somme des cases est le polynôme X+X^2+X^3+...+X^9, c'est à dire le mot de 9 bits 111111111. Une fois le système posé, on peut le résoudre par la méthode du pivot. Pour cela il suffit de savoir inverser les éléments non nul du corps GF(2^9). Bien entendu, on établit la table de multiplication et la table des inverses une fois pour toutes. A chaque pivot, on récupère une équation d'élimination, qui donne la valeur d'une inconnue en fonction des suivantes. Si le problème à au moins une solution, on tombe nécessairement après un certain nombre de pivots sur le système 0=0. Il reste alors éventuellement des inconnues pour lesquelles on n'a pas de formule d'élimination. Il faut donner à chaque inconnue restante chacune des 9 valeurs possibles, et tester à l'aide des formules d'élimination si on obtient des monômes. Ceci va éliminer beaucoup de valeurs, et on a certainement une chance de trouver toutes les solution dans un temps (et une occupation mémoire) raisonnable.
Il faut remarquer que les équations d'élimination qui résultent du pivot de Gauss servent précisément à propager les contraintes.
Evidemment, il y a un peu de travail, à commencer par le calcul dans GF(2^9). Mais ça me paraît faisable.