viernes, 16 de julio de 2010

Que tal gente esta vez venimos a hablarles acerca del algoritmo de kruskal y bien esta vez fue el algoritmo lo explicaremos paso a paso para mayor entendimiento y puedan comprender lo que hace.

aquí les dejare la liga para la descarga directa. descargar

Acerca de esto
Este es un algoritmo de los grafos, su intención es la de encontrar el camino mas corto(con menos recursos) llegando a todos los nodos, una de sus características de este algoritmo es de que al finalizar su resultado no tendrá ciclos, así que sera un árbol.


Funciona de la siguiente manera:
se crea un bosque B (un conjunto de árboles), donde cada vértice del grafo es un árbol separado
* se crea un conjunto C que contenga a todas las aristas del grafo
* mientras C es no vacío
* eliminar una arista de peso mínimo de C
* si esa arista conecta dos árboles diferentes se añade al bosque, combinando los dos árboles en un solo árbol
* en caso contrario, se desecha la arista.


Aplicaciones.
Las aplicaciones mas comunes que se utilizan en este algoritmo son para ahorrar recursos, como en circuitos eléctricos, conexiones, entre otras...



Aquí un ejemplo de su aplicación
Supongamos que una compañía de teléfono va a brindar servicio a sus clientes, tómese, los nodos azules son los postes de teléfono, y los nodos naranjas, son el lugar donde se quiere dar el servicio, y la linea negra, seria el cable necesario a usarse...





Ahora hay que encontrar cual sería la menor cantidad de cable que se puede utilizar.



Aquí si quieres hay paginas donde vienen animaciones, para que entiendas mejor

Kruskal
View more documents from Jorge.


www.mincel.com/java/prim.html
http://www.cut-the-knot.org/Curriculum/Games/Mazes.shtml

martes, 13 de julio de 2010

Tarea # 3

Que tal compañeros esta vez vengo a hablar de la búsqueda por anchura esta a diferencia de la búsqueda por profundidad es que esta usa una cola en vez de una pila.

acá dejare la liga para la descarga del archivo ó podrán verlo mas abajo si tiene instalado el plug-in de adobe flash.

código para descarga.
archivo .dat que contiene los nodos descarga.
Definición
¿Que es el BFS? es un algoritmo de búsqueda por anchura que dado un nodo inicial viaja por los vértices hacia los vecinos de este, después viaja através de los vértices de sus vecinos y así sucesivamente hasta visitar cada nodo del grafo.

¿Que es el coloreo de grafos? se dice que es un caso etiquetado de grafos en el cual asignamos
unas etiquetas llamadas colores, bien pues el objetivo de esto es colorear un nodo de tal manera que se use la menor cantidad de colores posibles cumpliendo con la condición de que no debe tener el mismo color dos nodos que estén unidos entre si.
Objetivo
Bien pues a mi me toco utilizar dicho algoritmo para la coloración de un grafo con dos colores, de esta manera al aplicar el algoritmo si detectaba un ciclo no seria posible que fuese dos coloreable.

Procedimiento
Bien pues el procedimiento para resolver este problema lo realice de una manera utilizando un código que ya antes teníamos este código fue uno realizado en clase en el cual simulaba las acciones de un algoritmo de DFS, bien pues apartir de este tomando la parte del código donde
abrimos un archivo creado por nosotros donde almacenamos:
  • El numero de nodos
  • El numero de aristas
  • Las uniones de los nodos
  • El peso de las aristas
Al leer estos datos del archivo pasamos a implementarlos al BFS de tal manera que nuestro primer nodo tomaría el primer color y almacenándolo dentro de una cola después de esto pasamos a visitar a uno de los vecinos (en este caso elegí que se escogiera la arista de menor peso).

Al pasar a los vecinos a cada uno de ellos se le asignaba un color dos, y así sucesivamente a sus vecinos de nuevo el color uno y cada uno de los nodos no visitados se agregaba dentro de la cola
de manera que al final nos imprimiría el orden del recorrido (solo imprimiendo visitados) y con su respectivo color.

Si llegase a ser que mas de un nodo comparte una arista con otro del mismo color llegamos a la conclusión de que no es dos-coloreable.

Observaciones
Bueno una de las observaciones es que este código puede implementarse dentro de una detección de ciclos pues en el caso de que nuestro grafo no sea dos-coloreable indica que existe un ciclo dentro de nuestro grafo y así como para este caso sirve el decir que no es dos coloreable para una detección de ciclos diría que si existe tal.

martes, 6 de julio de 2010

Encriptación RSA

Que tal compañeros esta vez bueno me toco hacer el código de la encriptación RSA y pues bueno tengo un código que pseudo simula lo que la encartación hace (por ahora)

debido al tiempo no pude poner algunos detalles mas en el programa pero poco a poco iré cambiando el código para que quede como debería ir el bosquejo del RSA.

bueno pues presentare el código y luego explicare que hace.

-----------------------------------------------------------------------------
#include <>
#include <>
int main (int pedro,char** amanda)
{
int i;
long int n;
long int e;
long int h;
int pr1;
int pr2;
long int p[i];
long int cociente[i];
long int residuo[i];
long int h_aux;
long int q[i];
long int encrypt_op;
long int uncrypt_op;
int mensaje;
//pedimos los dos números para iniciar el proceso de encriptación

printf("introduzca 2 números primos para iniciar al encriptación\n");
printf("introduzca el primer numero primo: ");
scanf("%d",&pr1);
printf("introduzca introduzca el segundo numero primo: ");
scanf("%d",&pr2);


n = (pr1 * pr2); //se le asigna una variable extra para asignar el producto de ambos
printf("n es: %d\n",n);

h = ((pr1 - 1) * (pr2 - 1));
printf("euler es: %d\n",h);
while(1){
printf("introduce un numero entre 1 y %d que su MCD con %d sea 1:",h,h);
scanf("%d", &e);

printf("e es: %d\n",e);
if(e <> h){
printf("el numero introducido no esta en el rango inroduce otro.\n");
}else{
break;
}
}

i=0;
h_aux = h;
p[0]=0;
p[1]=1;
while(1){

cociente[i] = h / e;
residuo[i] = h - (e*cociente[i]);
h = e;
e = residuo[i];
q[i]=cociente[i];
if(i>=2){
p[i]=((p[i-2])-(p[i-1]*q[i-2])) % h_aux;

printf("el paso actual es:%d \nel cociente es %d\n",i, cociente[i]);
printf("el residuo es %d \nel inverso es %d",residuo[i], p[i]);
printf("\n");
if(residuo[i] == 1){
break;
}
i++;
}

printf("introduce el numero a convertir: ");
scanf("%d", &mensaje);
encrypt_op = (pow(mensaje,e) % n);
printf("el mensaje encriptado es %ld\n",encrypt_op);

uncrypt_op = (pow(encrypt_op,p[i]) % n);
printf("el mensaje desencriptado es: %ld\n",uncrypt_op);


}
return 8;
scanf(NULL);
}
---------------------------------------------------------------------

bien pues el programa por ahora le pide al usuario que introduzca dos números los cuales deben ser primos, despues de eso el programa le asingará a una variable n el valor del producto de estos dos

n = primo 1 * primo 2

luego se calcula un h

h = ((primo 1)-1) - ((primo 2) - 1)

despues de esto pasamos a elegir un numero primo.
el cual se encuentre entre 1 y nuestro numero h, al cual llamaremos "e" este debe ser MCD(e,h)=1.

despues pasaremos a utilizar el algoritmo extendido de euler, con el cual obtendremos un valor "d"
de tal manera manera que satisfaga la condición




acá les dejare un applet que me proporcionaron con el cual pueden obtener el inverso del numero que busquen. applet

una vez teniendo este dato podemos introducir un mensaje, el cual podemos cifrar con la forma de encriptación.

C = M^e mod n

y desencriptarlo con la formula:

M = C^d mod n

bien pues le falta todavia mucho a este programa pero por ahora creo que es la base para poder hacer el programa completo aun falta que sea una generación aleatoria de números primos al inicio y tambien de los subsecuentes "e" y "h".

pero creo que esas modificaciones seran durante los proximos dias espero les guste y me seria de gran ayuda opiniones para esas modificaciones

hasta pronto.

jueves, 1 de julio de 2010

Tipos de datos

Que tal Gente, Bueno pues esta vez vengo ha dejarles un pequeño reporte de términos sencillos de tipos de datos este reporte es el primero de otros que aremos durante este curso de verano aquí en la facultad de ingeniería mecánica eléctrica y bueno pues espero que les agrade

primero que nada pues diré que la realización de este reporte fue digamos sencilla a pesar del tiempo que teníamos pero pues pese a algunas complicaciones por parte mía se termino a tiempo

dentro de este trabajo recabé la mayor parte de información junto con datos que mis compañeros me proporcionaron.

la realización y diseño del mismo fueron por parte mía con algunos consejos de mis compañeros
y bueno creo que esta vez voy mejorando en cuanto a trabajo en equipo.

bien pues aquí les dejo la liga ha el reporte revisenlo y dejen sus comentarios acerca del mismo ya se para incluir datos que falten o para puntos de vista de ustedes mismos.

saludos.

link para ver online. enlace
link para descarga. enlace

Seguidores