martes, 19 de abril de 2011

Proyecto: Informatizar un problema matemático de primaria, Divisores (3 de 10)

Bueno... estábamos entrando en nuestra fase de diseño o, visto de otro modo, cómo íbamos a resolver algunas cosas.
Ya habíamos visto por encima el tema de la descomposición factorial y ,ahora, tocaba enfrentarse al tema del conjunto potencia.

!Jodo petaca! Que decimos aquí ...
Parece ser que, desarrollar una función para que nos devuelva todos los resultados de un conjunto potencia requiere, sí o sí, de la técnica de recursividad... o por lo menos eso entredeja ver, la implementación en lenguaje Pyton del enlace a Wikipedia que os comenté.

Google: Apariciones virgen


Pensando (ya sabéis que la Virgen , si uno le da muchas vueltas a un tema,  puede aparecer, y  siempre de la forma más insospechada) , he caído en la cuenta de dos cosas: la cardinalidad (número de elementos) del conjunto Potencia es siempre 2 elevado a los elementos del conjunto origen, y la segunda, las tablas de verdad  con las que verificaba en lógica matemática , emplean unos y ceros, siguiendo el hilo de dichas visiones recuerdo en la asignatura de primero de  fundamentos informáticos que sobre un tipo conjunto podía saberse si un elemento está o no y, todo ello me ha llevado a una idea peregrina que expondré más adelante.

Ahora, me centraré en la recursividad expuesta en la Wikipedia.
  Creo recordar , porque tras unos años sin tocarla y los “descolocos” de cabeza que me ha tocado lidiar,  que está técnica “matemática” para diseñar la solución de un problema , requiere que el problema puede ir descomponiéndose en problemas del mismo tipo pero de “envergadura” menor.
Este proceso de descomposición llega a un caso o problema “mínimo” que nos da una solución y a partir de ahí reconstruimos la descomposición hasta llegar a la solución.

blogs.rpp.com.pe/hombredefamilia/2009/08/10



Así en plan Adriá.... construcciones , deconstrucciones, reconstrucciones y tal.









El ejemplo más típico para ilustrar la recursividad es hablar del factorial en matemáticas.
5!=120 = 5*4*3*2*1
Y es que, el cálculo de un factorial de un natural consiste en multiplicar dicho natural por todos sus menores hasta uno.
Así pues podemos decir que:
5!= 5* 4!
Y traducirlo de una forma sistemática a:
funcion Factorial (entra un X natural) sale un solución Y natural---->
Si X=1---> Y=1
Sino Y=X* Factorial (X-1)
devuelve  Y
fin funcion

Veamos el ejemplo con el 4
funcion Factorial (4)=4*(funcion Factorial (3))= 4*(3*funcion Factorial (2))= 4*(3*(2*funcion Factorial(1)))
Llegado al punto en que el problema es mínimo y nos dan solución para ese mínimo, vamos a contruir la solución del problema inicial
funcion Factorial (4)=4*(funcion Factorial (3))= 4*(3*funcion Factorial (2))= 4*(3*(2*(1)))=24


Esta técnica dotada de reglas matemáticas puede usarse para diseñar algoritmos iterativos. Como ha hecho el ínclito al implementar la solución en Pyton al problema de hallar conjuntos Potencia.

Él ha expuesto lo siguiente, (sigo sin saber Pyton) así que si me equivoco corregidme:

def addTo(e, t):
        for s in t:
                s += [e]
        return t


Bien, aquí, él ha dicho: "creo un procedimiento para que cuando me den un elemento y una estructura de elementos añada dicho elemento a cada uno de los elementos de la estructura".
Y a continuación expone la recursividad:

def powerSet(a_set):
        if not a_set: return [[]]
        e = a_set[0]
        t = a_set[1:]
        return powerSet(t) + addTo(e, powerSet(t))


 Veamos que si funciona:
Tomemos el Conjunto Q = {a,b,c}
Y operemos como haría el ordenador:
1.- powerSet(Q)----> e={a}; t1={b,c}; devuelve powerSet(t1) + addTo ({a}, powerSet(t1))--->
Ahora comenzamos nuestro viaje de descomposición del problema
     2.-       powerSet(t1)----> e={b}; t2={c};devuelve powerSet(t2) + addTo ({b}, powerSet(t2))--->
Seguimos pues aun no hemos encontrado mínimo
          3.-    powerSet(t2)----> e={c}; t3={conjunto-vacío};devuelve powerSet(t3) + addTo ({c}, powerSet(t3))--->
    Recordemos de su código que había dicho: “if not a_set: return [[]]” es decir si no hay conjunto devuelveme []. Con lo que ya hemos llegado a mínimo , ahora reconstruimos la solución desde el nivel inferior al inicial.
      3.-   powerSet(t2)<---- {[]} ,{c}
     2.-     powerSet(t1)<---- {[]} ,{c} , {b}, {b,c}
    1.-     powerSet(Q)<---- {[]} ,{c}, {b},{b,c} , {a}, {a,c}, {a,b}, {a,b,c}

Efectivamente, como vemos, se cumple.






Google: "Guías de burro
   Pero chico,  ya que me ha venido semejante idea,   dejadme que la exponga.
Sabemos que , en el caso de que sea primo el número inicial X , su descomposición arrojará dos factores … para cualquier otro caso, más.
Si yo tengo 3 factores el conjunto potencia resultará de 8 elementos. Si recordamos las tablas de verdad  para 3 proposiciones había que considerar 8 casos , {0,0,0} , {0,0,1}, {0,1,0},{0,1,1}, {1,0,0} , …...
Si identificamos al 0 con que, el factor que considero, no está y  el 1 que está. Creo que hemos salvado el escollo...


Google: Evolución






Me pongo a hacer los dibujos ilustrativos y os cuento más tarde.

Ya sabéis, mientras, !Sed buenos!

No hay comentarios: