Cálculo de la base de Gröbner para Sudoku

Estoy tratando de escribir un programa que resuelva sudokus usando una base de Gröbner. Introduje 81 variables X 1 a X 81 , esta es una linealización del tablero de sudoku.

El espacio de sudokus válidos está definido por:

para i = 1 , , 81 : F i = ( X i 1 ) ( X i 2 ) ( X i 9 ) Esto representa el hecho de que todos los cuadrados tienen valores enteros entre 1 y 9.

para todos X i y X j que no son iguales pero en la misma fila, columna o bloque: GRAMO i j = ( F i F j ) / ( X i X j ) Esto representa que las variables X i y X j no puede ser igual.

Todos estos F i y GRAMO i j juntos definen el espacio de sudokus válidos. Este consta de 891 polinomios.

Ahora para resolver un sudoku podemos agregar las pistas al espacio, entonces por ejemplo si la pista de un sudoku es el primer cuadrado es un 5, entonces sumamos ( X 1 5 ) al espacio Si ahora tomamos la base de Gröbner de este espacio, podemos ver directamente la solución para él.

Entiendo lo que estoy haciendo hasta ahora. Pero tengo problemas para encontrar una manera computable para encontrar las bases de Gröbner. He hecho con éxito todo por 4 × 4 sudokus (o los llamados shidokus). Pero Maple ni Singular me están dando un resultado para la base de Gröbner del 9 × 9 espacio sudoku. Puede ver los comandos que le di a Maple aquí (Primero defino los polinomios 891, luego pido una base) Leí artículos que decían que es factible aunque ineficiente hacer lo que busco pero no veo cómo encontrar la solución, ya que no incluyen muchos detalles de implementación. ¿Alguien puede indicarme una dirección que facilite este problema para Maple u otro software?

¿Qué quiere decir con "arce ni singular me da resultados"? Es solo cuestión de tiempo... (y de memoria)
maple simplemente se da por vencido después de una hora más o menos con un mensaje de error sobre el tamaño del cálculo
Bueno, esa es la parte de la memoria :) También deberías probar Macaulay2.
Es posible que desee CC Maple primos
@Ingdas ¿Sigue siendo de interés? O lo solucionaste? Si es así, me interesaría la solución. En cualquier caso me interesa la demostración de cómo la desigualdad puede ser representada por el conjunto de todos GRAMO i j . Además por qué GRAMO i j siempre será un polinomio. Y si GRAMO i j cubre todas las posibilidades de a i a j .

Respuestas (4)

Trato con bases de Groebner regularmente en Mathematica, y 81 variables, y que muchos polinomios probablemente sean demasiado, incluso para un software que es mejor para tratar con bases de Groebner. Es bastante difícil estimar el tiempo y el consumo de memoria para tales cálculos (el orden de los monomios también juega un papel muy importante), pero mi reacción inicial es que su problema es demasiado difícil de resolver en una computadora de escritorio normal.

Encontré este pdf: math.ipm.ac.ir/conferences/2011/cca2011/Exercises-Steenpass.pdf Las páginas 3 y 4 sugieren que es realmente posible
Ah, supongo que Singular es probablemente mucho más eficiente que Mathmatica entonces, o hay algo más en el problema del que no estoy al tanto.
Pero si lo implemento ingenuamente en Singular, tampoco funciona, así que esperaba que alguien aquí pudiera indicarme un programa de Singular (u otro idioma) que funcione

Casi me olvidé de esta pregunta, pero para mayor referencia: estaba algo equivocado en el hecho de que la base groebner de Sudoku en general debería ser computable. Pero resolver un Sudoku concreto a través de una base de Groebner es factible (con el tiempo suficiente).

La teoría detrás de esto se puede encontrar en este artículo: http://www.risc.jku.at/Groebner-Bases-Bibliography/gbbib_files/publication_1180.pdf

Aquí está mi código Singular para resolver un sudoku concreto:

ring r0=0,x(1..81),dp;  //defines the ring we're working on
option(redSB); //sets groebner as the standard representation of an ideal
option(intStrategy); //constrains our values to integers (speedup)

proc F (int i) { //generates the F-polynomials, restricting the domain of a single variable
 return((x(i)-1)*(x(i)-2)*(x(i)-3)*(x(i)-4)*(x(i)-5)*(x(i)-6)*(x(i)-7)*(x(i)-8)*(x(i)-9)); 
};

proc G (int i, int j){ //generates the G-polynomials asserting two variables to be different
    return ((F(i)-F(j))/(x(i)-x(j)));
};

int i = 1;
int b;
ideal I;

for (int a = 0 ; a < 81 ; a++ ){
    for (b = a+1 ; b < 81 ; b++){ //if
        if(a mod 9 == b mod 9 ||  //two variables are in the same column
            a div 9 == b div 9 ||  //or same row
             (a div 27 == b div 27 && ((a mod 9) div 3) == ((b mod 9) div 3))) { //or same block
                I[i] = G(a+1,b+1);  //they must be different
                i++;
        }
    }
}



int c;
for (c = 1; c<=81; c++) {I[i]=F(c);i++;}; //restricting the domain of all variables



intmat A[9][9] =  //the input sudoku
        1,0,0, 0,0,0, 0,0,0,
         0,0,2, 7,4,0, 0,0,0,
         0,0,0, 5,0,0, 0,0,4,

         0,3,0, 0,0,0, 0,0,0,
         7,5,0, 0,0,0, 0,0,0,
         0,0,0, 0,0,9, 6,0,0,

         0,4,0, 0,0,6, 0,0,0,
         0,0,0, 0,0,0, 0,7,1,
         0,0,0, 0,0,1, 0,3,0


;

int x;
int y;
for (x = 1 ; x <= 9 ; x++ ){
    for (y = 1 ; y <= 9 ; y++){
        if(A[y,x] >0) {
            I = I,(x(x+9*(y-1)) - A[y,x]); //adding the known values to the system of equations
        }
    }
};


groebner(I); //computes the groebner basis of our system

Como señaló Greg Martin, había una falla en mi respuesta anterior. Considere, sin embargo, esta pequeña modificación, que resuelve el problema, nuevamente con 108 polinomios:

Tome un primo p>9 y r=1^(1/p), una raíz p-ésima primitiva de la unidad. Ahora define s la suma de p-9 diferentes potencias de r. El siguiente sistema de variables codifica su problema:

restricciones de fila:
x11 + x12 + ... + x19 + s
x21 + x22 + ... + x29 + s
. . .
(9 polinomios)

restricciones de columna:
x11 + x21 + ... + x91 + s
x12 + x22 + ... + x92 + s
. . .
(9 polinomios)

Restricciones en cuadrado:
x11+x12+x13+x21+x22+x23+x31+x32+x33+s
. . .
(9 polinomios)

las restricciones sobre las propias variables:
x11^p-1, x12^p-1, . . .
(81 polinomios)

¿Sus ecuaciones de restricción no admitirán soluciones espurias como x11=x12=x13=3, x14=x15=x16=6, x17=x18=x19=9?
Las variables están restringidas a ser raíces novenas de 1. Solo hay una forma, hasta la permutación, de sumar n raíces n-ésimas de 1 y obtener 0, que es sumando n raíces diferentes.
Esa afirmación es incorrecta si norte es compuesto. Dejar ζ ser una raíz cúbica de la unidad (que también es una raíz novena de la unidad), y establecer X 1 j = ζ j para 1 j 9 . En otras palabras, agregue tres copias de ζ , tres copias de ζ 2 y tres copias de 1 : la respuesta es 0 .

Mi primer pensamiento sería codificar las condiciones de que 9 variables tienen que ser los números del 1 al 9 por la ecuación

( T 1 ) ( T 2 ) ( T 9 ) = ( T X 1 ) ( T X 2 ) ( T X 9 )

Igualando los coeficientes de T , obtienes 9 ecuaciones que aseguran que los conjuntos { 1 , 2 , , 9 } y { X 1 , X 2 , , X 9 } son lo mismo.

Entonces, la condición de Sudoku es 27 conjuntos de 9 ecuaciones en total.

Probablemente podría obtener algún beneficio al hacer que las entradas de Sudoku sean elementos del campo finito con 9 elementos en lugar de números enteros. O tal vez como 9 de los elementos en el campo finito con 16 elementos, para que esté en la característica 2. O tal vez trabaje en el campo finito de 19 elementos para que pueda usar las raíces 9-th de la unidad como el otro respondedor sugiere. (o el campo finito de 64 elementos si desea usar raíces 9-ésimas de la unidad en la característica 2)