Luego bueno, para codificar una instancia de SOLITARE, primero veo que una instancia se puede ver como una 4-upla
![(p_x,p_o,n,m) (p_x,p_o,n,m)](https://eva.fing.edu.uy/filter/tex/pix.php/fc8b059a403ec4714760a3231d10e4e6.png)
donde
![p_x p_x](https://eva.fing.edu.uy/filter/tex/pix.php/82e7146a5ee70d5e48e4007a7d521425.png)
son las posiciones donde hay un X,
![p_o p_o](https://eva.fing.edu.uy/filter/tex/pix.php/a253fe2efe800e53c82a7cf60cc02af0.png)
posiciones donde hay un O.
Luego para la instancia la represento mediante dos matrices X, O donde si X[i,j] = 1, entonces en (i,j) hay una X, caso contrario X[i,j] = 0, en (i,j) no hay una X, analogo para O.
Formar una codificacion s a partir de esto se puede hacer concatenando las filas de X y O que son 1's y 0's y a este codigo concatenarle la expresion binaria de m y n, ademas de concatenar otro codigo para determinar la cantidad de bits a representar m,n. Es facil ver que en esta representacion |s| = O(mn).
Luego, para representar un certificado que lo consideramos como un par (
![p_xt p_xt](https://eva.fing.edu.uy/filter/tex/pix.php/b7b548db6de0c16576cc1b125cb8d98a.png)
,
![p_yt p_yt](https://eva.fing.edu.uy/filter/tex/pix.php/270bae8832bf9c6a91ad61e83bf4bb3a.png)
) de posiciones, simplemente lo damos como dos matrices de bits
![X_t X_t](https://eva.fing.edu.uy/filter/tex/pix.php/ff41056dec337b31678a729b1ecfcfb4.png)
y
![O_t O_t](https://eva.fing.edu.uy/filter/tex/pix.php/87095f68f6cf251d73d85d5f899f0e27.png)
. el codigo t lo obtenemos concatenando las filas de ambas matrices, y vemos que |t| = O(mn) = O(|s|).
Luego un B certificador eficiente cumple que:
1- s
![\in \in](https://eva.fing.edu.uy/filter/tex/pix.php/986c22f151c46acac223b858e3fcf6fd.png)
SOLITARE
![\Longleftrightarrow \Longleftrightarrow](https://eva.fing.edu.uy/filter/tex/pix.php/755eceba2d1c23fb97b1d4eb3a880058.png)
(
![\exists \exists](https://eva.fing.edu.uy/filter/tex/pix.php/32ff223f4b9214ce44a3f7cac5abe8bf.png)
t) B(s,t) = yes ( la condicion |t|
![\leqslant \leqslant](https://eva.fing.edu.uy/filter/tex/pix.php/c6c87ffb26aa075a67f694764751dad5.png)
p(|s|), como |t| = O(|s|) entonces (
![\exists \exists](https://eva.fing.edu.uy/filter/tex/pix.php/32ff223f4b9214ce44a3f7cac5abe8bf.png)
c > 0) |t|
![\leqslant \leqslant](https://eva.fing.edu.uy/filter/tex/pix.php/c6c87ffb26aa075a67f694764751dad5.png)
c|s|, por tanto con el polinomio p(x) = x*c se verifica)
2- B es polinomial respecto a |s| + |t| (como |t| = O(|s|) en realidad es suficiente con verificar que es polinomial respecto a |s|)
luego ahora damos el certificado, y voy a verificar solo la segunda condición, la primera que es el sii no es difícil de probar y es larga y no me gustaría explayarme tanto.
El algoritmo certificador B es el siguiente:
0- El algoritmo en vez de estar especificado respecto a las posiciones, están especificado respecto a las matrices que representan a la listas de posiciones, capaz no es lo mas correcto, pero ayuda en la visualización para determinar el orden de complejidad (no se si esto es un problema o seria mejor hacerlo con el conjunto de posiciones al algoritmo en alto nivel, en tal caso justificar el orden se complica.)
1- Se verifica que tanto (X, O) como
![(X_t, O_t) (X_t, O_t)](https://eva.fing.edu.uy/filter/tex/pix.php/a9c4665e0fc8edf4524748a8672319ec.png)
no se solapen, esto es, que no exista (i,j) tal que (X[i,j] = O[i,j] = 1 || X_t[i,j] = O_t[i,j] = 1), en caso que se cumpla esta ultima expresión lógica para algún par (i,j), el algoritmo retorna NO y termina.
2- Se verifica que
![(X_t, O_t) (X_t, O_t)](https://eva.fing.edu.uy/filter/tex/pix.php/a9c4665e0fc8edf4524748a8672319ec.png)
sea subconjunto de fichas de (X,O), esto es, que la expresión lógica (
![X_t X_t](https://eva.fing.edu.uy/filter/tex/pix.php/c2e70cdad647fefd7f79cec4b20ca4bd.png)
[i,j] = 1 && X[i,j] = 0 ||
![O_t O_t](https://eva.fing.edu.uy/filter/tex/pix.php/d522ee0722032c286ec86c57d0cf5691.png)
[i,j] = 1 && O[i,j] = 0) no se cumpla para algún par (i,j), en caso de cumplirse para alguno, retorno NO y termino.
3- Se verifica que las fichas de toda fila sean del mismo tipo, esto se hace facilmente verificando que la expresion (
![X_t X_t](https://eva.fing.edu.uy/filter/tex/pix.php/ff41056dec337b31678a729b1ecfcfb4.png)
[i,
![j_1 j_1](https://eva.fing.edu.uy/filter/tex/pix.php/42b700f23168ec58d770cba98d08ae92.png)
] = 1 &&
![O_t O_t](https://eva.fing.edu.uy/filter/tex/pix.php/87095f68f6cf251d73d85d5f899f0e27.png)
[i,
![j_2 j_2](https://eva.fing.edu.uy/filter/tex/pix.php/bf4c4fe42acf5a77084aa2df95cfb501.png)
] = 1 ) no se cumpla para alguna terna
![(i,j_1,j_2) (i,j_1,j_2)](https://eva.fing.edu.uy/filter/tex/pix.php/8e0d419ec13f1e1a88008c898906ec59.png)
, en caso de cumplirse, retorno NO y termino.
4- Se verifica que toda columna tenga algún símbolo, verificando que la expresión (
![X_t X_t](https://eva.fing.edu.uy/filter/tex/pix.php/ff41056dec337b31678a729b1ecfcfb4.png)
[
![i_1 i_1](https://eva.fing.edu.uy/filter/tex/pix.php/ff0018c9dda6bdae611faf2506b41706.png)
,j] = 1 ||
![O_t O_t](https://eva.fing.edu.uy/filter/tex/pix.php/87095f68f6cf251d73d85d5f899f0e27.png)
[
![i_2 i_2](https://eva.fing.edu.uy/filter/tex/pix.php/0aee4f081c8ef3ab812df7e4bac5e97b.png)
,j] = 1) se cumpla para todo j con algún par
![(i_1,i_2) (i_1,i_2)](https://eva.fing.edu.uy/filter/tex/pix.php/6944adaeceee5bf84de7d4fe62bae659.png)
, caso contrario, se retorna NO y termino.
5- finalmente si no termine en ningún paso previo, retorno SI y termino.
Luego es fácil ver que en este algoritmo se hacen simplemente recorridas sobre las matrices, por tanto es O(mn), que cumple con ser polinomial en |s|.
Termino preguntando si el algoritmo dado lo consideran lo suficientemente aceptable para el curso, en vez de escribir fors y whiles, creo que es mas compacto y refleja bien lo que hay que hacer en cada paso. También, esta bien la forma en que codifique las entradas y los t? y las simplificaciones que hice en la definición de B sabiendo que |t| era O(|s|) ?