lunes, 14 de abril de 2008

Trabajo 02 (final) - Averiguar divisores de un número

Miembros del grupo 1:
Javier Garcés Niño
Manuel Alberto Bolós Doñate
José Simó Albiol

MT para sacar divisores (MT sin modificaciones):
Dados un enteros n, obtener su lista de divisores.
ENTRADA: ...B0000000000B... (0n)
SALIDA: ...B0100100000B... (0i110i210i31... donde i1, i2, i3,... son los divisores de n)
Nota: a la hora de colgar el diseño de la MT normal al blog descubrí un error en el momento que guardaba el valor en la lista de divisores y posteriormente el incremento en un "0" al inicio de la cinta para hacer la comprobación con el siguiente posible divisor. Dicho error no comprobaba si el nuevo divisor a analizar era de mayor tamaño que el número n inicial, provocando un bucle infinito... :-S Bastó con incluir nuevos estados al final de la tabla que comprobaran si el nuevo divisor era de mayor tamaño que n.


01$BX
q0(q0,0,R)

(q1,$,L)
q1(q1,0,L)

(q2,$,L)
q2


(q3,0,L)
q3(q4,x,R)

(q3,B,R)
q4(q4,0,R)
(q5,$,R)

q5(q6,X,L)


(q5,X,R)
q6(q6,0,L)
(q7,$,L)
(q6,X,L)
q7(q12,0,R)


(q8,x,R)
q8

(q9,$,R)

q9(q10,0,L)
(q17,$,R)
(q9,X,R)
q10

(q11,$,L)
(q10,X,L)
q11


(q3,B,R)(q11,0,L)
q12

(q13,$,R)

q13(q15,0,L)
(q14,$,L)
(q13,X,R)
q14(q14,0,L)
(q14,$,L)(q3,0,L)(q14,0,L)
q15

(q16,$,L)
(q15,X,L)
q16(q16,0,L)


(q3,x,R)
q17(q17,0,R)(q17,1,R)
(q18,0,L)
q18(q18,0,L)(q18,1,L)(q19,$,L)

q19

(q20,$,L)
(q19,X,L)
q20(q20,0,L)


(q21,0,L)
q21


(q25,0,R)(q27,X,R)
q22(q22,0,R)(q22,1,R)(q22,$,R)(q18,0,L)(q22,X,R)
q23(q23,0,R)(q23,1,R)(q23,$,R)(q24,1,L)(q23,0,R)
q24(q24,0,L)(q24,1,L)(q24,$,L)(q3,B,R)
q25(q25,0,R)
(q26,$,L)

q26(q27,X,R)

(q23,B,R)(q26,X,L)
q27

(q28,$,R)
(q27,X,R)
q28(q28,0,R)
(q31,B,L)
(q29,0,L)
q29(q29,0,L)
(q26,$,L)

q30



(q30,X,L)
q31(q31,B,L)
(q31,B,L)(q32,B,R)(q31,B,L)
q32







MT para sacar divisores (MT multicabezal):
Nota: entrada y salida son iguales que con la MT normal sin modificaciones.

Descripción:
Para realizar la MT multicabezal del problema hemos usado 3 cabezales de L/E:
- 1 para trabajar con los "posibles" divisores durante el proceso.
- 1 para trabajar con el número de entrada n.
- 1 para escribir los divisores en la lista ubicada a la derecha del segundo símbolo "$", separados por un 1 cada divisor.
Nota: a pesar de que Jose realizó unas últimas trazas esta mañana con distintos casos no se ha comprobado que falle el modelo multicabezal mostrado a continuación, así que finalmente se ha colgado el modelo... (y crucemos los dedos de que no hubiera un fallo muy rebuscado aún sin detectar :-P )

f(q0,0,0,0) = (q1,{0,L},{0.Z},{0,R})
f(q1,B,0,0) = (q2,{$,L},{0,Z},{0,R})
f(q2,B,0,0) = (q3,{0,Z},{0,Z},{0,R})
f(q3,0,0,0) = (q3,{0,Z},{0,Z},{0,R})
f(q3,0,0,B) = (q4,{0,Z},{0,Z},{$,R})
f(q4,0,0,B) = (q4,{X,R},{X,R},{B,Z})
f(q4,$,0,B) = (q5,{$,L},{0,Z},{B,Z})
f(q5,X,0,B) = (q5,{0,L},{0,Z},{B,Z})
f(q5,B,0,B) = (q4,{B,R},{0,Z},{0,Z})
f(q4,0,$,B) = (q5,{0,L},{0,L},{B,Z})
f(q5,X,X,B) = (q5,{0,L},{0,L},{B,Z})
f(q5,B,X,B) = (q6,{0,R},{0,L},{B,Z})
f(q6,0,X,B) = (q6,{0,Z},{0,L},{B,Z})
f(q6,0,$,B) = (q4,{0,Z},{$,R},{B,Z})
f(q4,$,$,B) = (q7,{$,L},{$,L},{B,Z})
f(q7,X,X,B) = (q7,{Q,L},{0,L},{0,R})
f(q7,B,X,B) = (q8,{0,Z},{0,L},{1,R})
f(q8,0,$,B) = (q4,{0,Z},{$,R},{B,Z})
f(q7,B,$,B) = (q9,{B,R},{B,R},{B,Z})
f(q9,0,0,B) = (q9,{B,R},{B,R},{B,Z})
f(q9,B,$,B) = (q10,{B,Z},{B,Z},{B,Z})
f(q10,B,B,B) = ESTADO FINAL



No hay comentarios: