<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>algoritmos &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/algoritmos/</link>
	<description>Feed of posts on WordPress.com tagged "algoritmos"</description>
	<pubDate>Sat, 19 Jul 2008 13:20:39 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[un post mas]]></title>
<link>http://abc101.wordpress.com/?p=27</link>
<pubDate>Fri, 11 Jul 2008 14:36:54 +0000</pubDate>
<dc:creator>-abc</dc:creator>
<guid>http://abc101.wordpress.com/?p=27</guid>
<description><![CDATA[analisis de algoritmos
]]></description>
<content:encoded><![CDATA[<p>analisis de algoritmos</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Passei!!!]]></title>
<link>http://coisasdoeu.wordpress.com/?p=27</link>
<pubDate>Tue, 08 Jul 2008 21:19:49 +0000</pubDate>
<dc:creator>Eu</dc:creator>
<guid>http://coisasdoeu.wordpress.com/?p=27</guid>
<description><![CDATA[Após 5 semanas de imenso trabalho, lá consegui passar a algoritmos com a maravilhosa nota de 11. E]]></description>
<content:encoded><![CDATA[<p>Após 5 semanas de imenso trabalho, lá consegui passar a algoritmos com a maravilhosa nota de 11. Estava a espera de uma nota melhor, mas também não fico totalmente decepcionado. :)</p>
<p><a href="http://coisasdoeu.files.wordpress.com/2008/07/d_smile.gif"><img class="aligncenter size-full wp-image-28" src="http://coisasdoeu.wordpress.com/files/2008/07/d_smile.gif" alt="" width="200" height="200" /></a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Bubblesort (Algoritmo de la burbuja)]]></title>
<link>http://alefalletti.wordpress.com/2008/07/02/bubblesort-algoritmo-de-la-burbuja/</link>
<pubDate>Wed, 02 Jul 2008 23:26:31 +0000</pubDate>
<dc:creator>María Alejandra Falletti</dc:creator>
<guid>http://alefalletti.wordpress.com/2008/07/02/bubblesort-algoritmo-de-la-burbuja/</guid>
<description><![CDATA[Bubblesort (Algoritmo de la burbuja)
Blogged with the Flock Browser
]]></description>
<content:encoded><![CDATA[<p><a href="http://video.google.com/videoplay?docid=-3126668015509187666&#38;q=algoritmo&#38;ei=kQ1sSMaXLIP8rQKppJWoDw&#38;hl=es">Bubblesort (Algoritmo de la burbuja)</a></p>
<div class="flockcredit" style="text-align:right;color:#CCC;font-size:x-small;">Blogged with the <a title="Flock Browser" href="http://www.flock.com/blogged-with-flock" target="_new">Flock Browser</a></div>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Google aprende a rastrear flash]]></title>
<link>http://sebastianmagallanes.wordpress.com/?p=749</link>
<pubDate>Tue, 01 Jul 2008 18:34:45 +0000</pubDate>
<dc:creator>sebitico</dc:creator>
<guid>http://sebastianmagallanes.wordpress.com/?p=749</guid>
<description><![CDATA[ Google ha desarrollado un nuevo algoritmo de indexación para el contenido de los textos en archiv]]></description>
<content:encoded><![CDATA[<p> Google ha desarrollado un nuevo algoritmo de indexación para el contenido de los textos en archivos Flash de todo tipo, desde Flash menús, botones y banners, a self-contained Flash sitios web. <span>Recientemente, hemos mejorado el rendimiento de este algoritmo de indexación de Flash mediante la integración de <a href="http://64.233.179.104/translate_c?hl=es&#38;sl=en&#38;tl=es&#38;u=http://www.adobe.com/aboutadobe/pressroom/pressreleases/200806/070108AdobeRichMediaSearch.html">Adobe Flash Player tecnología.</a></span></p>
<p><a href="http://googleblog.blogspot.com/2008/06/google-learns-to-crawl-flash.html" target="_blank">FUENTE</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Estructuras de datos en C y manejo de memoria I]]></title>
<link>http://bragasofts.wordpress.com/?p=7</link>
<pubDate>Mon, 30 Jun 2008 01:50:14 +0000</pubDate>
<dc:creator>bragasofts</dc:creator>
<guid>http://bragasofts.wordpress.com/?p=7</guid>
<description><![CDATA[Nota: Este texto supone que se sabe que es una estructura de datos recursivas (nodos de listas, cola]]></description>
<content:encoded><![CDATA[<p>Nota: Este texto supone que se sabe que es una estructura de datos recursivas (nodos de listas, colas, pilas, árboles, etc.) y como se la programa en C e intenta darle una vuelta de rosca a ese conocimiento.</p>
<p>El lenguaje C es uno de los lenguajes de más bajo nivel (relativo) que existe. En este lenguaje la memoria se estructura de manera plana, que es en definitiva lo que es la memoria, un espacio plano de almacenamiento temporal.</p>
<p>Así entonces un nodo de estructura dinámica  como el siguiente:</p>
<p>struct empleado{<br />
int idEmpleado;<br />
char* nombre;<br />
char  codigoPostal[6];<br />
int idDepto;<br />
struct empleado* sgte;<br />
}</p>
<p>No es una estructura dimensional, sino un manojo de bytes ordenados:</p>
<p>(<br />
Suponiendo arquitectura intel x86 32bits<br />
int = &#62;4 bytes<br />
Dirección de memoria =&#62; 4bytes<br />
char x 6 =&#62; 6 bytes<br />
)</p>
<p>id      nombre  Codigo        depto    siguiente<br />
[][][][] [][][][]     [][][][][][] [][][][]  [][][][]</p>
<p>Los cuales son interpretados cada uno como entero, puntero a caracter, entero, entero, entero.<br />
En otras palabras, puede ser claramente un vector de bytes, donde a cada subconjunto de bytes se los interpreta como un tipo de datos nativo según la información de la definición de la estructura.</p>
<p>Bien, ahora supongamos que tenemos esta otra estructura bastante distinta:</p>
<p>struct empresa{<br />
char* idEmpresa;<br />
char* razonSocial;<br />
long int cuit;<br />
char* direccion;<br />
char codigoPostal[6];<br />
struct empresa* sgte;<br />
};</p>
<p>Cuando hacemos funciones de acceso a cola (por ejemplo) siempre tenemos la maldita sensación de estar haciendo las mismas cosas miles de veces, puesto que si bien no es lo mismo un empleado y una empresa,<br />
¡¡Las colas son todas iguales!!<br />
¡¡El mecanismo si es el mismo, agrego al final, saco del principio!!</p>
<p>¿Cómo hacer para separar el “¿Qué?” del “¿Cómo?”?</p>
<p>Con el conocimiento que tenemos ahora de la memoria y la estructuración en memoria de las estructuras, existe al menos una forma de hacerlo.</p>
<p>¿Qué tienen en común todos los nodos de una estructura de datos dinámica / recursiva?<br />
Rta.: El puntero al siguiente nodo.</p>
<p>¿Qué tienen en común todos los punteros en una misma arquitectura hardware / sistema operativo?<br />
Rta.: El puntero es un tipo de datos, no importa lo que apunte, siempre pesa lo mismo.</p>
<p>Si planteamos la siguiente estructura:</p>
<p>Struct Nodo {<br />
Struct Nodo* sgte;<br />
};</p>
<p>Tenemos una estructura que el primer valor es un puntero un siguiente nodo, no tenemos variable “contenedor”, y no la necesitamos, puesto que ahora no nos importa el contenido de información, sino el puntero siguiente.</p>
<p>Un programa hecho en C, interpreta los datos según el tipo del mismo en el instante de ejecución dado.</p>
<p>Si yo modificase las estructuras anteriores y pusiese el elemento siguiente primero en la lista, quedaría esto:</p>
<p>struct empleado{<br />
struct empleado* sgte;<br />
int idEmpleado;<br />
char* nombre;<br />
char codigoPostal[6];<br />
int idDepto;<br />
}</p>
<p>struct empresa{<br />
struct empresa* sgte;<br />
char* idEmpresa;<br />
char* razonSocial;<br />
long int cuit;<br />
char* direccion;<br />
char codigoPostal[6];<br />
};</p>
<p>Ahora, la última pregunta a hacernos es:<br />
¿Qué tienen en común nuestras tres estructuras?<br />
Rta.: Las tres empiezan con un puntero conceptualmente igual, el puntero al siguiente elemento.</p>
<p>Como se dan todas estas relaciones, entonces, gracias a la existencia del “casteo”,  que hace que el programa interprete un dato como otro, sin afectarlo en el proceso, entonces, podemos definir todas las funciones para manejo de Colas para la estructura mas chica.</p>
<p>#define null NULL<br />
#include<br />
#include</p>
<p>typedef struct Nodo {<br />
struct Nodo* sgte;<br />
}Nodo;</p>
<p>typedef struct Cola {<br />
Nodo* head;<br />
Nodo* tail;<br />
}Cola;</p>
<p>typedef struct Empleado{<br />
struct Empleado* sgte;<br />
int idEmpleado;<br />
char* nombre;<br />
char codigoPostal[6];<br />
int idDepto;<br />
} Empleado;</p>
<p>void inicializarCola (Cola* unaCola) {<br />
unaCola-&#62;head = null;<br />
unaCola-&#62;tail = null;<br />
}</p>
<p>void agregarNodo (Cola* unaCola, Nodo* unNodo){<br />
unNodo-&#62;sgte = null;</p>
<p>if ( unaCola-&#62;tail != null) {<br />
unaCola-&#62;tail-&#62;sgte = unNodo;<br />
}<br />
unaCola-&#62;tail = unNodo;</p>
<p>if (unaCola-&#62;head == null) {<br />
unaCola-&#62;head = unNodo;<br />
}</p>
<p>}</p>
<p>Nodo* obtenerNodo (Cola* unaCola) {<br />
Nodo* retorno;<br />
retorno = unaCola-&#62;head;<br />
if ( unaCola-&#62;head != null ) {<br />
unaCola-&#62;head = unaCola-&#62;head-&#62;sgte;<br />
}<br />
return retorno;<br />
}</p>
<p>int main (void) {</p>
<p>Cola unaCola;<br />
Empleado* unEmpleado;<br />
int i;<br />
inicializarCola(&#38;unaCola);</p>
<p>for (i = 0; i codigoPostal), '', 6);<br />
unEmpleado-&#62;idDepto = i;<br />
unEmpleado-&#62;idEmpleado = i * 2;<br />
unEmpleado-&#62;nombre = null;<br />
agregarNodo(&#38;unaCola, (Nodo*)unEmpleado);</p>
<p>}</p>
<p>while ((unEmpleado = (Empleado*) obtenerNodo(&#38;unaCola)) != null) {<br />
printf (" Id Empleado: %d \tId Depto: %d \n", unEmpleado-&#62;idEmpleado, unEmpleado-&#62;idDepto);<br />
}</p>
<p>return 0;<br />
}</p>
<p>/*<br />
Nota: Ejemplo probado con GCC y MinGW. No incluye el manejo de cadenas y la creación de empleados por una función dedicada por cuestiones de tiempo.<br />
*/</p>
<p>Y con esto, tenemos el algoritmo de inserción y obtención de colas para cualquier nodo que tenga como primer dato de estructura el puntero al siguiente valor.</p>
<p>Como se puede ver a simple vista, esto de poder usar la misma función para distintos tipos de datos en los parámetros tiene cierto potencial.<br />
Esta posibilidad de, por medio de casteo a estructuras menores de igual forma es una forma de emular el llamado Polimorfismo paramétrico (que no es el polimorfismo de objetos, sino, el de funcional)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Improving Tag-Clouds as Visual Information Retrieval Interfaces]]></title>
<link>http://sheilamendez.wordpress.com/?p=9</link>
<pubDate>Sun, 29 Jun 2008 12:38:12 +0000</pubDate>
<dc:creator>sheilamendez</dc:creator>
<guid>http://sheilamendez.wordpress.com/?p=9</guid>
<description><![CDATA[Este artículo describe una forma de agrupar palabras semánticamente en una nube de tags. Propone l]]></description>
<content:encoded><![CDATA[<p>Este artículo describe una forma de agrupar palabras semánticamente en una nube de tags. Propone la siguiente fórmula para calcular la similitud entre dos tags:</p>
<blockquote><p>Dadas dos etiquetas t1 y t2 cualesquiera la similitud semántica entre ambas será:</p>
<p style="text-align:center;">S ( t1,t2 ) = &#124; t1 ∩ t2 &#124; / &#124; t1 ∪ t2 &#124;</p>
</blockquote>
<p>Para este ejercicio, se han calculado el número de apariciones de t1 y t2 en Google. El resultado se puede probar en la siguiente URL:</p>
<p style="text-align:center;"><a title="TagCloud" href="http://156.35.98.82:8080/tagCloud/" target="_blank">http://156.35.98.82:8080/tagCloud/</a></p>
<p style="text-align:left;">En la aplicación, se pueden escribir una serie de tags (pueden contener espacios, por ejemplo "Fernando Alonso") separados por comas. El algoritmo realiza una serie de iteraciones sobre los términos. En cada una de ellas aplica la fórmula anteriormente descrita y saca la pareja de términos con una similitud semántica más cercana a la unidad. De esta forma, cuanto más parecido sea el número de documentos en los que aparezca la pareja de palabras y el número donde aparezca cada una por separado, más relacionadas semánticamente estarán. Cabe destacar que para calcular la unión (denominador), se ha restado el valor de la intersección, para no sumar así valores repetidos y dar un resultado más fiable.</p>
<p style="text-align:left;">Las conclusiones que se pueden extraer de su aplicación es que el algoritmo funciona en la mayor parte de los casos, pero se podría refinar mucho más. Por ejemplo, es muy importante el orden en el que se agrupan las parejas de palabras ya que la precisión de los resultados varía si agrupamos por la derecha o por la izquierda. Un refinamiento posible sería comprobar la similitud S entre el término que vamos a agrupar con los términos que forman los extremos del grupo, para situarlo en el extremo que más se asemeje a él.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Fuerza de Algoritmos Criptograficos]]></title>
<link>http://julianrdz.wordpress.com/?p=259</link>
<pubDate>Sun, 29 Jun 2008 00:08:37 +0000</pubDate>
<dc:creator>Julián Rodríguez</dc:creator>
<guid>http://julianrdz.wordpress.com/?p=259</guid>
<description><![CDATA[La fuerza de algoritmos criptográficos
Siempre deben diseñarse buenas sistemas de la criptografía]]></description>
<content:encoded><![CDATA[<h4>La fuerza de algoritmos criptográficos</h4>
<p>Siempre deben diseñarse buenas sistemas de la criptografía para que ellas sean muy difícil de romper. Es posible construir sistemas que no pueden romperse en práctica (aunque esto normalmente no puede demostrarse). Esto no aumenta esfuerzo de aplicación de sistema significativamente; sin embargo, algún cuidado y la especialización se requiere. No hay ninguna excusa para un diseñador del sistema dejar el sistema rompible. Debe hacerse cualquier mecanismo que puede usarse para engañar seguridad explícita, debe documentarse, y debe traerse en la atención de los usuarios final.</p>
<p>En teoría, cualquier método de la criptografía con una llave puede ser roto probando todas las posibles llaves en sucesión. Si la única opción es de probar todas las llaves, el tiempo de computación requerido aumenta exponencialmente con la longitud de la llave. Una llave de 32 bits toma 2<sup>32</sup> (aproximadamente 10<sup>9</sup>) pasos. Esto es algo que cualquiera puede hacer usando su computadora de casa. Un sistema con las llaves de 40 bits toma 2<sup>40</sup> pasos - este tipo de cómputo requiere algo como una semana (dependiendo de la eficacia del algoritmo) en una moderna computadora de la casa. Un sistema con las llaves de 56 bits (como DES) toma un esfuerzo sustancial (con un número grande de computadoras de la casa que usan esfuerzo distribuido, se ha mostrado para tomar simplemente unos meses), pero es fácilmente rompible con hardware especial. El costo del hardware especial es sustancial pero fácilmente al alcance de los delincuentes organizados, compañías mayores, y gobiernos. Las llaves con 64 bits son ahora probablemente rompibles por gobiernos mayores, y al alcance de los delincuentes organizados, compañías mayores, y menores gobiernos en pocos años. Las llaves con 80 bits parecen buenas durante unos años, y llaves con 128 bits permanecerán irrompibles probablemente por el futuro previsible. A veces se usan llaves aun más grandes.</p>
<p>Sin embargo, la longitud importante no es el único problema pertinente. Pueden romperse muchos cifres sin probar todas las posibles llaves. En general, es muy difícil de diseñar cifres que no podrían romperse usando otros métodos más eficazmente. Diseñando sus propios cifres puede ser divertido, pero no se recomienda para las aplicaciones reales a menos que usted es un verdadero experto y sabe lo que usted está haciendo exactamente.</p>
<p>Uno generalmente debe ser muy cauto de algoritmos inéditos o confidenciales. A menudo el diseñador no está entonces seguro de la seguridad del algoritmo, o su seguridad depende del secreto del algoritmo. Generalmente, ningún algoritmo que depende del secreto del algoritmo está seguro. Particularmente en software, cualquiera puede contratar a alguien para desmontar el algoritmo. La experiencia ha mostrado que la inmensa mayoría de los algoritmos confidenciales que se han vuelto después al conocimiento público ha sido lastimosamente débil en realidad. Vea los esquemas del encriptación incorporados usados por WordPerfect, Lotus 1-2-3, MS Excel, Symphony, Quattro Pro, Paradox, MS Word, y PKZIP.</p>
<p>Las longitudes de llaves usadas en criptografía de llave-público normalmente son más grandes que en cifres simétricos. Esto es causado por la extra estructura que está disponible. Allí el problema no está de suponer la llave correcta, pero derivando la llave confidencial emparejanda de la llave pública. En el caso de RSA, esto podría ser hecho factorizando un entero grande que tiene dos primeros factores grandes. En el caso de algún otro criptosistemaas es equivalente a computar el modulo del logaritmo discreto un entero grande (qué se cree que es aproximadamente comparable a la factorización cuando el moduli es un grande número primero). Hay las importantes criptosistemaas públicos basados en todavía otros problemas.</p>
<p>Para dar alguna idea de la complejidad para el criptosistemaa de RSA, un módulo de 256 bits se factoriza fácilmente en la casa, y las llaves de 512 bits pueden ser rotas por grupos de investigación de universidad dentro de unos meses. Las llaves con 768 bits son probablemente no afiance en el término largo. Las llaves con 1024 bits y más deben estar ahora seguras para a menos que se hacen mayores adelantos de la criptoanálisis contra RSA; las llaves de 2048 bits son consideradas por muchos para estar seguros durante décadas.</p>
<p>Debe darse énfasis a que la fuerza de un sistema de la criptografía es normalmente igual a su eslabón más débil. Ningún aspecto del plan del sistema debe pasarse por alto, de los algoritmos selectos a la distribución importante y políticas del uso. <a name="cryptanalysis"></a></p>
<h4>Criptoanálisis y ataques de criptosistemas</h4>
<p>Criptoanálisis es el arte de descifrar comunicaciones del sin saber las llaves apropiadas. Hay muchas técnicas del criptoanálisis. Algunas de las más importantes para un creador del sistema se describen debajo.</p>
<ul>
<li><strong>Sólo-ciphertext ataque</strong>: Ésta es la situación donde el asaltador no sabe nada sobre los volúmenes del mensaje, y sólo debe trabajar del ciphertext. En práctica es bastante a menudo posible hacer suposiciones sobre el plaintext, tantos tipos de mensajes han arreglado formato de los títulos. Incluso las cartas ordinarias y documentos empiezan de una manera muy predecible. Por ejemplo, muchos ataques clásicos usan análisis de frecuencia del ciphertext, sin embargo, esto no trabaja bien contra los cifres modernos. Los criptosistemaas modernos no son débiles contra sólo-ciphertext ataques, aunque a veces ellos son considerados con la asunción agregada que el mensaje contiene algún prejuicio estadístico.</li>
<li><strong>Conocido-plaintext ataque</strong>: el asaltador sabe o puede suponer el plaintext para algunas partes del ciphertext. La tarea es de decriptar el resto del ciphertext usando esta información. Esto puede ser cumplido determinando la llave usada al encriptar los datos, o vía algún atajo. Uno bien conocido ataque moderno de conocido-plaintext esta el criptoanálisis lineal contra los cifres del bloque.</li>
<li><strong>Escogido-plaintext ataque</strong>: el asaltador puede tener cualquier texto que le gusta el encriptado con la llave desconocida. La tarea es determinar la llave usada para el encription. Un bueno ejemplo de este ataque es el criptoanálisis del diferencial que puede aplicarse contra los cifres del bloque (y en algunos casos también contra las funciones de hash).Algunos criptosistemaas, particularmente RSA, son vulnerables a los ataques escogido-plaintext. Cuando se usan tales algoritmos, el cuidado debe tenerse para diseñar la aplicación (o protocolo) para que un asaltador nunca pueda haber encriptar el escogido-plaintext.</li>
</ul>
<p><a href="http://www.minelinks.com/supercode/index_2_es.html" target="_blank">Fuente</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Firmas Digitales]]></title>
<link>http://julianrdz.wordpress.com/?p=256</link>
<pubDate>Sun, 29 Jun 2008 00:04:52 +0000</pubDate>
<dc:creator>Julián Rodríguez</dc:creator>
<guid>http://julianrdz.wordpress.com/?p=256</guid>
<description><![CDATA[Algunos cifres públicos pueden usar algoritmos para generar firmas digitales. Una firma digital es ]]></description>
<content:encoded><![CDATA[<p>Algunos cifres públicos pueden usar algoritmos para generar firmas digitales. Una firma digital es una cantidad pequeña de datos que se crearon usando alguna llave confidencial, y hay una llave pública que puede usarse para verificar que la firma que usó la llave privada correspondiente realmente se generó. El algoritmo generaba la firma debe ser tal que sin saber la llave confidencial no es posible crear una firma que verificaría como válida.</p>
<p>Se usan firmas digitales para verificar que un mensaje realmente viene del remitente exigido (asumiendo a sólo el remitente sabe la llave confidencial que corresponde al su llave pública). Ellos también pueden ser usados por tiempo-estampar los documentos: persona de confianza firma el documento y tiempo-estampar con su llave confidencial, así testificando que el documento existió en el momento declarado.</p>
<p>También pueden usarse firmas digitales para testificar (o certifica) que una llave pública pertenece a una persona particular. Esto es hecho firmando la combinación de la llave y la información sobre su dueño por una llave confidencial. La firma digital por una tercera persona (dueño de la llave confidencial), se llaman a menudo la llave pública y información sobre el dueño de la llave pública los certificados.</p>
<p>La razón por confiar en la llave de tercera persona puede ser que de nuevo fue firmada por una llave confidencial. Eventualmente alguna llave debe ser una raíz de la jerarquía de confianza (es decir, en él no se confía porque fue firmada por alguien, pero porque usted cree a prior que en esta llave puede confiarse). En una infraestructura de llave centralizada hay menos raíces en la red de confianza (ej. en agencias gubernamentales se llaman tales raíces las autoridades de la certificación). En una infraestructura distribuida allí no se necesita universalmente aceptados raíces, y cada persona puede tener diferentes raíces de confianza (tal la propia llave de la persona y cualquier llave firmada por él). Éste es el tejido de concepto de confianza usado en PGP.</p>
<p>Una firma digital de un documento arbitrario es creada típicamente computando un compendio del mensaje del documento, y encadenándolo con información sobre el firmante, una tiempo-estampa, etc. El hilo resultante es entonces encriptado usando la llave privada del firmante que usa un algoritmo conveniente. El resultante encriptado bloque de bits es la firma. Es a menudo distribuido junto con la información sobre la llave pública que fue usada para firmarlo. Para verificar una firma, el destinatario determina primero si confía que la llave pertenece a la persona que él se supone que pertenece a (usando la red de confianza o el previo conocimiento), y entonces el decripta la firma usando la llave pública de la persona. Si la firma decripta propiamente y la información empareja el mensaje (compendio del mensaje apropiado etc.), la firma se acepta como válido.</p>
<p>Varios métodos por hacer y verificar firmas digitales están libremente disponible. El algoritmo ampliamente conocido es RSA.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Solucionario [ALGORITMOS]]]></title>
<link>http://blogacademicoccat.wordpress.com/?p=39</link>
<pubDate>Sat, 28 Jun 2008 07:37:33 +0000</pubDate>
<dc:creator>ronaldpc</dc:creator>
<guid>http://blogacademicoccat.wordpress.com/?p=39</guid>
<description><![CDATA[Aqui estan algunas soluciones de los problemas de la asesoria del dia viernes, la hoja de problemas ]]></description>
<content:encoded><![CDATA[<p>Aqui estan algunas soluciones de los problemas de la asesoria del dia viernes, la hoja de problemas esta en la fotocopiadora del CCAT</p>
<p>Solo hagan click en el link:</p>
<ul>
<li><a href="http://blogacademicoccat.files.wordpress.com/2008/06/solucionario-asesoria.doc" target="_blank">solucionario-asesoria [word]</a></li>
<li><span style="font-size:12pt;"><a href="http://www.usaupload.net/d/a6o7cfen7tu" target="_blank"><span lang="EN-US">solucionario - asesoria [rar en usaupload]</span></a></span></li>
</ul>
<p> </p>
<p><span>/***************************************************************************/</span></p>
<p><span>Se suponia que la clave era SOLO para los que se quedaron en la asesoria, pero entiendo que algunos no pudieron quedarse por otras razones (DIFERENTES a juegos o fiestas).</span></p>
<p><span>Hasta hoy, los que se quedaron a la sesoria ya habran rebizado el solucionario [y corregido algun pequeño error encontrado (supongo)]; asi que dejare la clave para los que "NO SE PUDIERON QUEDAR" :</span></p>
<p><span>Clave: fiis</span></p>
<p><span>PD: pense que cualquiera que descargara el archivo por lo menos intentaria una vez poniendo como clave a la facultad no?</span></p>
<p><span>/***************************************************************************/</span></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Saludos!!]]></title>
<link>http://diariomatematico.wordpress.com/?p=3</link>
<pubDate>Sat, 28 Jun 2008 00:55:27 +0000</pubDate>
<dc:creator>diariomatematico</dc:creator>
<guid>http://diariomatematico.wordpress.com/?p=3</guid>
<description><![CDATA[Hola, pues este es mi primer post mediante el cual espero crear muchisimos mas, dejen les cuento est]]></description>
<content:encoded><![CDATA[<p>Hola, pues este es mi primer post mediante el cual espero crear muchisimos mas, dejen les cuento estoy por empezar a estudiar mi carrera de matematico y me gusto la idea de compartir todo lo que aprenda con el publico, me gusta mucho tambien la programacion y no esperare en publicar cosas interesantes sobre esto, algoritmos,  tambien publicare algunos software que nos ayuden en el trabajo de computacion y matematico, usos etc.</p>
<p>Saludos!!</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Cuartas prácticas [Algoritmos]]]></title>
<link>http://blogacademicoccat.wordpress.com/?p=16</link>
<pubDate>Tue, 24 Jun 2008 05:01:42 +0000</pubDate>
<dc:creator>ronaldpc</dc:creator>
<guid>http://blogacademicoccat.wordpress.com/?p=16</guid>
<description><![CDATA[Links para descargar cuartas practicas del curso (desde el 2000-III hasta el 2007-II) :
descargar aq]]></description>
<content:encoded><![CDATA[<p>Links para descargar cuartas practicas del curso (desde el 2000-III hasta el 2007-II) :</p>
<p><a href="http://rapidshare.com/files/124613087/cuartasdealgoritmos.pdf.html" target="_blank">descargar aqui [rapidshare]</a></p>
<p><a href="http://www.usaupload.net/d/kh1x2u5dcrq" target="_blank">descargar aqui [usaupload]</a></p>
<p> </p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Lenguajes Algoritmicos]]></title>
<link>http://akgm92.wordpress.com/?p=7</link>
<pubDate>Wed, 18 Jun 2008 03:21:08 +0000</pubDate>
<dc:creator>akgm92</dc:creator>
<guid>http://akgm92.wordpress.com/?p=7</guid>
<description><![CDATA[Hasta este momento todo lo que hemos visto es prácticamente  teoría, llegó la hora de plasmar nue]]></description>
<content:encoded><![CDATA[<p>Hasta este momento todo lo que hemos visto es prácticamente  teoría, llegó la hora de plasmar nuestros algoritmos de alguna forma que sean claros para cualquier personaque necesite leerlos. Muchas veces los infotmáticos se saltan este paso y llegan directamente a la implementacion en algún lenguaje de programación; para ello se necesita tener mucha practica y memoria fotografica, ya que muchas veces se omiten pasos que a la hora de implementarlos en algún lenguaje producen que el programa no llege a la solucion que habiamos planteado como óptima.</p>
<p>De esta manera se han creado lenguajes que puedan representar nuestros algoritmos y que de esa manera se construya una solucion correcta sin omitir algunos pasos. Imaginense que si se desea crear un algoritmo para que un robot solde una pieza en una ensambladora de automóviles y la persona encargada de implementar el algoritmo olvida, por muy obvio que sea, comprobar si las piezas están en su lugar, obviamente podria terminar en tragedia.</p>
<p><!--more--></p>
<p>Asi que la gente que se encarga de los estándares en cuanto a lo que se refiere a las tecnologías de la informacion vio la necesidad de representar algoritmos sin tener que referirse a un lenguaje de programación en específico.</p>
<p><em>Graficos</em></p>
<p>Este tipo de lenguaje tiende a representar a los algoritmos de una forma grafica. De esta manera se hace mas facil la representación de cada uno de los procesos que debe llevar a cabo una computadora para resolver problema.</p>
<p><em>Diagramas de Flujo</em></p>
<p>Sin lugar a duda el lenguaje algorítmico gráfico más común son los Diagramas de Flujo. Éstos pueden definirse como esquemas usados para representar gráficamente un proceso. Pero no sólo se utilizan para representar procesos informaticos, tambien en otras áreas como la economia, la administracion, procesos industriales, etc.</p>
<p>A continuacion explicaremos los símbolos más comunes que se utilizan en la informática para representar diagramas de flujo.</p>
<p><img src="http://www.carlospes.com/curso_de_algoritmos/imagenes/fig_03_03_simbolos_ordinogramas.gif" alt="" width="466" height="417" /></p>
<p>Existen otros simbolos más especificos para otro tipo de procesos, pero en su mayoria ya no se usan porque representaban procesos en dispositivos que hoy en día son obsoletos, como grabar en cinta magnética o leer una tarjeta perforada.</p>
<p><em>No graficos</em></p>
<p>Los lenguajes algoritmicos no graficos generalmente son utilizados para representar procesos informaticos ya mas especificos. Dicho de otra forma, para representar la codificacion de un programa sin la necesidad de conocer un lenguaje de programacion especifico.</p>
<p><em>Pseudocodigo</em></p>
<p>Sin lugar a duda, el pseudocodigo es el lenguaje algoritmico no grafico mas utilizado hasta la fecha. Cualquier persona que se diga que tiene experiencia como programador, alguna vez se ha visto en la necesidad de representar sus programas en pseudocodigo.</p>
<p>El pseudocodigo significa que vas a convertir tu algoritmo en un lenguaje escrito que se entienda sin utilizar la sintaxis y la gramatica de un lenguaje de programacion en especifico. Existen diferencias entre las normas de como debe realizarse correctamente un pseudocodigo debido a que, como no es necesariamente un lenguaje de programacion, debe adaprtarse a las necesidades del algoritmo en si; por eso varios autores definen su propia sintaxis y gramatica de forma diferente.</p>
<p><em>Datos</em></p>
<p>En un pseudocodigo los datos se dan por creados desde el momento en el que son utilizados, asi que no es necesario avisar que variables vamos a ocupar a lo largo de nuestro algoritmo, ni que tipo de datos es el que se va a almacenar dentro de él; pero, una ves que se a utilizado una variable para almacenar cierto tipo de dato debe seguir siendo usada para este tipo. Por ejemplo, si al inicio de nuestro pseudocodigo declaramos que vamos a usar una variable que llamaremos "A" y le asignamos un valor numérico entero como 8, la variable "A" en el resto del algoritmo deberá solamente poder alamacenar datos numéricos enteros.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Asesoria de Algoritmos [4ta Practica]]]></title>
<link>http://blogacademicoccat.wordpress.com/?p=9</link>
<pubDate>Tue, 17 Jun 2008 02:16:23 +0000</pubDate>
<dc:creator>ronaldpc</dc:creator>
<guid>http://blogacademicoccat.wordpress.com/?p=9</guid>
<description><![CDATA[Este es un comunicado a todos los estudiantes que estan llevando el curso de algoritmos, para decirl]]></description>
<content:encoded><![CDATA[<p>Este es un comunicado a todos los estudiantes que estan llevando el curso de algoritmos, para decirles que el dia viernes 27 de este mes se realizara la asesoria para la cuarta practica, en el auditorio.</p>
<p>horario: 6:00p.m-8:00p.m</p>
<p><strong>Asesores:</strong></p>
<ul>
<li>Narcizo Susanibar, Miguel</li>
<li>Pecho Caycho,Ronald</li>
<li>Sinche Castillo, Boris</li>
<li>Villanueva Quinteros, Lenin</li>
<li>Ynocente Castro, Mario</li>
</ul>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Terminologia empleada en algoritmos]]></title>
<link>http://akgm92.wordpress.com/?p=3</link>
<pubDate>Tue, 17 Jun 2008 01:11:28 +0000</pubDate>
<dc:creator>akgm92</dc:creator>
<guid>http://akgm92.wordpress.com/?p=3</guid>
<description><![CDATA[La mayoria de los problemas informaticos tienen la tendencia de ocupar la misma terminologia. De est]]></description>
<content:encoded><![CDATA[<p>La mayoria de los problemas informaticos tienen la tendencia de ocupar la misma terminologia. De esta forma podemos enumerar cronologicamente lo que sucede cuando queramos resolver un problema atraves de recursos informaticos.</p>
<p><em>Identificacion de problemas</em></p>
<p>Generalmente se debe identificar cual es el problema que se pretende resolver atraves de medios informaticos y con que se pretende darle solucion. Los informaticos llaman a este paso analizis.</p>
<p><!--more--></p>
<ul>
<li><em>Datos numericos</em>. Es todo tipo de informacion que se puede expresar por medio de numeros(enteros ejemplos: 8,-3,23, etc), y   (Numeros Reales o de puntos flotantes 1.5, -3.83,etc.)</li>
<li><em>Datos alfanumericos</em>. Son un conjunto de caracteres que representan algun tipo de dato. Estan compuestos por todo el conjunto de caracteres alfabeticos, numericos, y algunos caracteres especiales.</li>
<li><em>Datos Logicos</em>. Son los que podemos representar mediante dos estados falso y verdadero. Tambien se les conoce como datos boleanos.</li>
<li><em>Constantes</em>. Son datos que dentro del problema en si nunca cambiaran por ejemplo, si el problema es calcular el area de un circulo,? = 3.141592 sera una constante para cualquier caso.</li>
<li><em>Variables</em>. Son datos que cambian dependiendo de las condiciones del problema que se decea resolver. Tomando el mismo ejemplo del calculo del area de un circulo, la variable podria ser el radio ya que, dependiendo del tamaño del circulo cambiara ese valor.</li>
<li><em>Expresiones Logicas</em>. Son un conjunto de condiciones que solo pueden tomar  dos estados logicos: falso y verdadero. Estan compuestas por variables constantes operadores logicos y operadores relacionales. Los operadores logiocos son: NOT(no), AND(y) y OR (o). Los relacionales pueden ser: &#60;,&#62;, &#60;=, =&#60;, &#60;&#62;. Dependiendo del elnguaje de programacion que se desee utilizar para resolver el problema puede o no cambiar la forma en que se presentan estos operadores. Por ejemplo, el lenguaje de programacion basados en ANSI como C,C++ y JAVA la negacion se representa por el simobolo de admiracion (!).</li>
<li><em>Expresiones Aritmeticas.</em> Son expresiones que se usan para el calculo de valores aritmeticos. Son muy utilez y faciles de entender ya que se representan de forma muy parecida a las expresiones matematicas. Los operadores aritmeticos son los siguientes: +,-,*,/,^,(,) , etc. Al igual que las expresiones logicas, dependiendo del lenguaje de programacion es la forma en como se representa alguno de los operadores aritmeticos y, en ocasiones, hasta la jerarquia que tienen unos sobre otros.</li>
</ul>
<p><em>Diseño de una Solucion</em></p>
<p>Una ves definido el problema y con que se quieres o se puede resolver, se planea la forma de hacerlo, creando un algoritmo de solucion. Usualmente a este proceso se le llama diseño.</p>
<p><em>Aplicando la Solucion</em></p>
<p>Cuando ya se definio como se va a resolver el problema, todo lo que implica su solucion atraves de diferentes mecanismos, es hora de aplicarlo. Los informaticos le llaman a este proceso implementacion.</p>
<p><em>Supervisar la Solucion</em></p>
<p>Seria excelente que al aplicar una solucion a un problema, este resulte correcta al primer intento. Desafortunadamente no es asi, muchas veces el hecho de aplicar una solucion nos lleva a mas problemas que no estaban preevistos. En la informatica ay que ser muy precisos en los casos que se presentan como problemas y tratar de prever  cualquier tipo de inconveniente o caso especial que se pueda presentar, para ello se lleva acabo un proceso llamado prueba o mantenimiento. Es aqui donde el ciclo se puede llegar a repetir tratando de solucionar los nuevos problemas que intervienen en la solucion nos puede llevar de nuevo al analisis y volver a comenzar el ciclo. Este se rompera caundo el problema sea resuelto satisfactoriamente y todo los casos particulares esten cubiertos.</p>
<p>Dicho de esta forma, podemos ver el proceso de solucion como un ciclo de vida, por eso muchos autores manejan este proceso como el ciclo de vida del software.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Quais RSS eu assino no meu Reader?]]></title>
<link>http://prafalardecoisas.wordpress.com/?p=107</link>
<pubDate>Mon, 16 Jun 2008 15:15:59 +0000</pubDate>
<dc:creator>Manoel Galdino</dc:creator>
<guid>http://prafalardecoisas.wordpress.com/?p=107</guid>
<description><![CDATA[
Eu assino muitos blogs via RSS. O Google tem uma ferramente, Google Reader, que permite que você a]]></description>
<content:encoded><![CDATA[<p><a href="http://prafalardecoisas.files.wordpress.com/2008/06/reader300px-quickrss.gif"><img class="alignnone size-medium wp-image-108" src="http://prafalardecoisas.wordpress.com/files/2008/06/reader300px-quickrss.gif?w=300" alt="" width="300" height="208" /></a></p>
<p>Eu assino muitos blogs via <a href="http://pt.wikipedia.org/wiki/RSS">RSS</a>. O Google tem uma ferramente, Google Reader, que permite que você assine os blogs/sites de que você gosta, para ficar atualizado sempre que atualizarem o blog/site. Funciona da seuinte maneira: você clica em incrição, digita o endereço, e pronto: sempre que o Blog for atualizado, você recebe a atualização na página do google reader. Assim, não precisa ir de blog em blog ver se tem algo útil.</p>
<p>Além disso, o google reader tem uma ferramente típica da web 2.0. Ele compara pessoas com gostos parecidos com o seu (que assinam os mesmos blogs) e procura padrões. Assim, se muita gente que assina um Blog do corinthians também assina um blog de futebol paulista, ele recomenda para você o blogdo futebol paulista. Obviamente tem um algoritmo para isso.</p>
<p>Porém, esse tipo de ferramente, enquanto útil, sempre tem um problema porque o computador (algoritmo) é meio burro. Então, seria melhor se pudéssemos colocar tags nos blogs que assinamos, de forma que aumentasse a eficiência dessa ferramenta.</p>
<p>Enquanto isso não acontece, decidi retornar ao modo antigo e inquirir as pessoas sobre que tipo de blogs elas assinam. Ok, não é exatamente o modo antigo, pré- web, já que quem vem ao meu blog deve compartilhar algum interesse comigo. De todo modo, peço que deixem no comentário, com base no que viram no meu blog, quais RSS vocês assinam e que gostariam de compartilhar comigo.</p>
<p>Abaixo todo os blogs que assino:</p>
<p><!--more--></p>
<p><a href="http://www.againstmonopoly.org/">http://www.againstmonopoly.org/</a></p>
<p><a href="http://www.badscience.net/">http://www.badscience.net/</a></p>
<p><a href="http://ba.stat.cmu.edu/forthcoming.php">http://ba.stat.cmu.edu/forthcoming.php</a></p>
<p><a href="http://ba.stat.cmu.edu/forthcoming.php">http://ba.stat.cmu.edu/forthcoming.php</a></p>
<p><a href="http://cienciaemdia.folha.blog.uol.com.br/">http://cienciaemdia.folha.blog.uol.com.br/</a></p>
<p><a href="http://anand.typepad.com/datawocky/">http://anand.typepad.com/datawocky/</a></p>
<p><a href="http://flowingdata.com/">http://flowingdata.com/</a></p>
<p><a href="http://marcelocoelho.folha.blog.uol.com.br/">http://marcelocoelho.folha.blog.uol.com.br/</a></p>
<p><a href="http://www.monbiot.com/">http://www.monbiot.com/</a></p>
<p><a href="http://outrapolitica.wordpress.com/">http://outrapolitica.wordpress.com/</a></p>
<p><a href="http://sequenciasparisienses.blogspot.com/">http://sequenciasparisienses.blogspot.com/</a></p>
<p><a href="http://www.iq.harvard.edu/blog/sss/">http://www.iq.harvard.edu/blog/sss/</a></p>
<p><a href="http://socialscienceplusplus.blogspot.com/">http://socialscienceplusplus.blogspot.com/</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Gabarito da prova de recuperação de algoritmos T-20081]]></title>
<link>http://leitejr.wordpress.com/?p=337</link>
<pubDate>Mon, 09 Jun 2008 17:49:40 +0000</pubDate>
<dc:creator>leitejr</dc:creator>
<guid>http://leitejr.wordpress.com/?p=337</guid>
<description><![CDATA[algoritmo &#8220;Q1ProvaRecuperacao&#8221;
var
n1,n2:real
inicio
// Seção de Comandos
leia(n1,n2)
]]></description>
<content:encoded><![CDATA[<p>algoritmo "Q1ProvaRecuperacao"</p>
<p>var<br />
n1,n2:real<br />
inicio<br />
// Seção de Comandos</p>
<p>leia(n1,n2)<br />
escreval("a soma é ", n1+n2)</p>
<p>se (n2&#60;&#62;0) entao<br />
escreval("a divisao é ", n1/n2)<br />
fimse</p>
<p>escreval("o quadrado de n1 é ", n1*n1)<br />
escreval("o quadrado de n2 é ", n2*n2)</p>
<p>fimalgoritmo</p>
<p>---------------------------------------------------</p>
<p>algoritmo "q2provarecuperacao"</p>
<p>var<br />
n:inteiro<br />
inicio</p>
<p>leia(n)</p>
<p>se (n % 3 = ) entao<br />
escreval ("divisivel por 3")<br />
fimse</p>
<p>se (n % 17 = ) entao<br />
escreval ("divisivel por 17")<br />
fimse</p>
<p>fimalgoritmo</p>
<p>---------------------------</p>
<p>algoritmo "q3provaRecuperacao"</p>
<p>var<br />
i, maior, menor , n :inteiro<br />
inicio</p>
<p>leia(n)<br />
maior&#60;-n<br />
menor&#60;-n</p>
<p>para i de 2 ate 100 faca<br />
leia(n)<br />
se (n &#62; maior) entao<br />
maior&#60;-n<br />
fimse<br />
se (n &#60; menor) entao<br />
menor&#60;-n<br />
fimse<br />
fimpara<br />
escreval("o menor é ", menor)<br />
escreval("o maior é ", maior)</p>
<p>fimalgoritmo</p>
<p>----------------------</p>
<p>algoritmo "q4provaRecuperacao"</p>
<p>var<br />
nomes: vetor [1..15] de literal<br />
i: inteiro<br />
busca:literal<br />
inicio<br />
//cadastro no vetor<br />
para i de 1 ate 15 faca<br />
leia(nomes[i])<br />
fimpara</p>
<p>leia(busca)</p>
<p>para i de 1 ate 15 faca<br />
se (busca=nomes[i]) entao<br />
escreval("nome encontrado")</p>
<p>fimse</p>
<p>fimpara</p>
<p>fimalgoritmo</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Dicas: pesquisa binária e pesquisa sequêncial]]></title>
<link>http://maleiria.wordpress.com/?p=20</link>
<pubDate>Thu, 05 Jun 2008 11:42:24 +0000</pubDate>
<dc:creator>maleiria</dc:creator>
<guid>http://maleiria.wordpress.com/?p=20</guid>
<description><![CDATA[
/**
 * Pesquisa um numero x num array ordenado.É
 * muito mais eficiente do que a pesquisa sequenc]]></description>
<content:encoded><![CDATA[<pre>
/**
 * Pesquisa um numero x num array ordenado.É
 * muito mais eficiente do que a pesquisa sequencial
 * mas requer que os elementos do array estejam ordenados.
 * Ele repetidamente divide a sequência em dois e em cada
 * vez restringe a pesquisa à metade que contém o elemento.
 *
 * Este algoritmo corre no tempo O(log(n)) o que quer dizer que
 * em média, o tempo de execução é proporcional ao logaritmo
 * do número de elementos no array.
 *
 *
 * @return o indice do numero x ou -1 se não encontrou
 */
public int binarySearch(int[] a, int x){

	int low = 0;
	int high = a.length;

	while(low &#60; high){
		int i = (low + high) / 2;
		if(a[i] == x){
			return i;
		}else if(a[i] &#60; x){
			low = i + 1;
		}else{
			high = i;
		}
	}
	return -1;
}
/**
 * Pesquisa sequencial (ou pesquisa linear) é o algoritmo
 * de pesquisa mais simples mas também é o menos eficiente.
 * Ele examina cada elemento sequencialmente começando
 * pelo primeiro elemento até chegar ao fim do array(se
 * eu estiver à procura de alguém num combóio, utilizo a
 * pesquisa sequencial)
 *
 * Este algoritmo corre no tempo O(n) o que quer dizer que
 * em média, o tempo de execução é proporcional ao número
 * de elementos no array.
 *
 * @return o indice do elemento a pesquisar ou 0 se não
 * o encontrar
 */
public int sequentialSearch(int[] a, int x){
	for(int i = 0, n = a.length; i &#60; n; i++){
		if(a[i] == x){
			return i;
		}
	}
	return -1;
}
/**
 * O algoritmo de binarysearch pode encontrar elementos rapidamente
 * num array que já está ordenado o que sugere que devamos ter os
 * elementos ordenados no array.No entanto, inserir novos elementos
 * num array ordenado é difícil pois temos de transladar os elementos
 * maiores para arranjar espaço para o novo elemento.Podemos faze-lo
 * assim:
 * @param a o array
 * @param n o numero de elementos que já estão ordenados no array
 * @param x o elemento a ser inserido no meio dos elementos
 */
void insert(int[] a, int n, int x){
  /**PreCondicao: a[0] &#60;= ... &#60;= a[n-1], e n &#60; a.length */
  /**PosCondicao: a[0] &#60;= ... &#60;= a[n], e x está entre eles */
  int i = 0;
  while(i &#60; n &#38;&#38; a[i] &#60;= x){
  	i++;
  }
  System.arraycopy(a, i, a, i+1, n-i);
  a[i] = x;
}
</pre>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Trios para Algoritmos : turma 2008.1]]></title>
<link>http://leitejr.wordpress.com/?p=310</link>
<pubDate>Wed, 04 Jun 2008 15:14:44 +0000</pubDate>
<dc:creator>leitejr</dc:creator>
<guid>http://leitejr.wordpress.com/?p=310</guid>
<description><![CDATA[Eis os trios para o trabalho de pascal:
Marcos Vinicius - :Luciene - Glaide
Carina - Josivane - Brun]]></description>
<content:encoded><![CDATA[<p>Eis os trios para o trabalho de pascal:</p>
<p>Marcos Vinicius - :Luciene - Glaide</p>
<p>Carina - Josivane - Bruna</p>
<p>Alessa - Roseane - Luciana Souza</p>
<p>Monira - Patrícia - Arisvaldo</p>
<p>Jorge - Diego - Josué</p>
<p>Aline - Jilcimar - Oliviane</p>
<p>Carla - Juliana - Silvana</p>
<p>Alana - Diego Miranda - Micilene</p>
<p>Wilma - Rodolfo - Cláudia</p>
<p>Robson - Luis Antonio - Ana Cristina</p>
<p>Thais - Camila - Cristiane</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Listão de exercícios de Pascal ]]></title>
<link>http://leitejr.wordpress.com/?p=298</link>
<pubDate>Sun, 01 Jun 2008 21:33:30 +0000</pubDate>
<dc:creator>leitejr</dc:creator>
<guid>http://leitejr.wordpress.com/?p=298</guid>
<description><![CDATA[A lista de exercícios anexada será feita em trios. Cada etapa deverá ser entregue nos seguintes p]]></description>
<content:encoded><![CDATA[<p>A lista de exercícios anexada será feita em trios. Cada etapa deverá ser entregue nos seguintes prazos:</p>
<p>Parte 1 - Estruturas de Decisão: 19/06 (25 exercícios)</p>
<p>Parte 2 - Estruturas de repetição: 08/07 (29 exercícios)</p>
<p>Parte 3 - Vetores : 17/07 (15 exercícios)<br />
-----------------------------&#62; Não haverá adiamento nos prazos</p>
<p><strong>Dia 17/07 será realizada um avaliação final baseada nesses exercícios</strong></p>
<p>Os trios serão definidos na próxima aula.</p>
<p>Arquivo da lista: <a href="http://leitejr.files.wordpress.com/2008/06/listao-pascal.pdf">listao-pascal</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Cartilha de transição do VisuAlg para o Pascal]]></title>
<link>http://leitejr.wordpress.com/?p=280</link>
<pubDate>Wed, 28 May 2008 14:55:53 +0000</pubDate>
<dc:creator>leitejr</dc:creator>
<guid>http://leitejr.wordpress.com/?p=280</guid>
<description><![CDATA[Pessoal,
Elaborei uma cartilha de transição do Visualg para o Pascal. Pode conferir no link ao lad]]></description>
<content:encoded><![CDATA[<p>Pessoal,</p>
<p>Elaborei uma cartilha de transição do Visualg para o Pascal. Pode conferir no link ao lado <a href="http://leitejr.files.wordpress.com/2008/05/cartilhapascal.pdf">cartilhapascal.</a></p>
<p>O compilador a ser usado será o PascalZim, que pode ser baixado no link abaixo:</p>
<p><a href="http://www.ziggi.com.br/downloads/PASCAL-ZIM!.asp">http://www.ziggi.com.br/downloads/PASCAL-ZIM!.asp</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Generando particiones]]></title>
<link>http://drini.wordpress.com/?p=51</link>
<pubDate>Tue, 27 May 2008 21:15:11 +0000</pubDate>
<dc:creator>drini</dc:creator>
<guid>http://drini.wordpress.com/?p=51</guid>
<description><![CDATA[&#8230; o cómo aprendí a amar los generadores en Python y dejé de preocuparme.
En estos días mi ]]></description>
<content:encoded><![CDATA[<p style="text-align:right;"><em>... o cómo aprendí a amar los generadores en Python y dejé de preocuparme.</em></p>
<p>En estos días mi trabajo en el doctorado involucra contar cuántos puntos con coordenadas enteras tienen ciertos "poliedros" en 12 dimensiones. Tales poliedros están determinados por las formas diferentes en que se puede descomponer un número como sumas ordenadas, es decir particiones. Así, dado que 6=3+1+1+1, entonces [3,1,1,1] es una partición de 6.</p>
<p>Las distintas particiones de n=6 son</p>
<pre>[6] [5, 1] [4, 2] [4, 1, 1] [3, 2, 1] [3, 1, 1, 1]
[2, 2, 2] [2, 2, 1, 1] [2, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1]</pre>
<p>En la aplicación particular que estoy trabajando, únicamente nos importan particiones de longitud 3. Entonces de las anteriores sólo se considerarían</p>
<p>[4, 1, 1]<br />
[3, 2, 1]<br />
[2, 2, 2]</p>
<p>Como siempre es mejor usar la computadora para las tareas mecánicas, me propuse elaborar un programa en Python que genere particiones de un número entero.</p>
<p>El esquema básico es el siguiente:<!--more--></p>
<ol>
<li>Recorrer todos los números <em>n</em>, <em>n</em>-1, <em>n</em>-2, .., 3, 2, 1  para ocupar la primera posición</li>
<li>Una vez fija la primera posición <em>k</em>,  el resto se genera "uniendo" esa primera posición con todas las particiones de <em>n-k</em>.</li>
</ol>
<p>Por ejemplo, si <em>n</em>=6,  y <em>k=4</em> entonces todas las particiones que inician con 4 se obtienen de las particiones de 2: [2] y [1,1], dando como resultado [4,2] y [4,1,1], ambas mencionadas arriba.</p>
<p>En particular, una partición es una lista, y el resultado del programa debe ser una lista de listas. Finalmente, aunque en mi aplicación sólo es necesario calcular particiones de longitud 3, me conviene poder calcular particiones de cualquier otra longitud fija.</p>
<p><strong>Bosquejo inicial</strong></p>
<pre><span style="color:#993300;"><span style="color:#333399;"># coding=latin1
def particiones(n):
    if n==1:  </span>                <span style="color:#808000;"> # Esto detiene la recursión, si n=1, la única partición es [1],
                               # por lo que la lista de las particiones es [ [1] ]
</span></span><span><span><span style="color:#993300;"><span style="color:#333399;">    </span></span></span></span><span style="color:#993300;"><span style="color:#333399;">    return [ [1] ]
    elif n&#60;1:
        return [] </span>         <span style="color:#808000;"># Por si acaso atrapar casos "raros". Si n=0, no hay particiones, regresar []
                           # de modo similar para n&#60;0.</span>
<span style="color:#333399;">    listaparticiones=[]</span>        <span style="color:#808000;"># incialmente no tenemos ninguna partición calculada</span><span style="color:#333399;">
    for k in range(n,0,-1):<span style="color:#808000;">      </span></span><span style="color:#808000;"># Aquí recorremos todos los valores k para el primer elemento</span><span style="color:#333399;">
        cola= particiones(n-k)<span style="color:#808000;">     </span></span><span style="color:#808000;"># generamos la lista de particiones de n-l</span><span style="color:#333399;">
        for x in cola:         <span style="color:#808000;">    </span></span><span style="color:#808000;"># y para cada una de ellas...</span><span style="color:#333399;">
</span></span><span><span><span style="color:#993300;"><span style="color:#333399;">    </span></span></span></span><span style="color:#993300;"><span style="color:#333399;">        particion= [k] + x      </span><span style="color:#808000;"># la unimos con el primer elemento</span><span style="color:#333399;">
            listaparticiones.append(particion)  <span style="color:#808000;"> # y la agregamos a la lista
</span>     return listaparticiones       <span style="color:#808000;"># al final devolvemos todas las que hayamos construido</span></span><span style="color:#333399;">

lista=particiones(5)<span style="color:#808000;">        # calcularemos las particiones de n=5...</span>
for p in particiones(5):<span style="color:#808000;">    # y luego las mostraremos</span>
print p</span></span></pre>
<p>Todo listo, corremos y...</p>
<pre><span style="color:#ff9900;">[4, 1]
[3, 1, 1]
[2, 2, 1]
[2, 1, 1, 1]
[1, 3, 1]
[1, 2, 1, 1]
[1, 1, 2, 1]
[1, 1, 1, 1, 1]</span></pre>
<p>Se ha omitido [5] porque la recursión termina cuando n&#60;0 la lista sobre la que se itera es vacía. Esto se soluciona cambiando</p>
<pre><span style="color:#993300;"><span style="color:#333399;">        elif n&#60;1:
                return [] </span></span></pre>
<p><span style="color:#000000;">por</span></p>
<pre><span style="color:#993300;"><span style="color:#333399;">        elif n&#60;1:
                return [ [] ] </span>         </span></pre>
<p>Sin embargo, algo ha salido mal, porque [1,3,1] no es partición. El problema es que el esquema original no contempla que las "colas" que generan las particiones de <em>n-k </em>no pueden iniciar con un entero mayor que la "cabeza" <em>k</em>.</p>
<p>Otro problema menos evidente y mucho más interesante, es que se están efectuando muchísimas recursiones, en cada paso manteniendo en memoria listas muy grandes de particiones de forma innecesaria (por ejemplo, hay 200 000 particiones de n=50, y al efectuar la recursión fácilmente se usarán varios megabytes de memoria para algo tan sencillo). Además, se hace necesario almacenar la lista de particiones en una variable para poder recorrerla, como en:</p>
<pre><span style="color:#993300;"><span style="color:#333399;">lista=particiones(5)
for p in particiones(5):
      print p</span></span></pre>
<p>La solución a ésto es descartar el enfoque rudimentario de hacer recursiones sobre listas y usar <strong>generadores.</strong></p>
<h2>Generadores en python</h2>
<p>Un generador es una forma conveniente de crear funciones que regresan valores pertenecientes a una lista sin tener que calcular toda la lista de antemano. En el ejemplo anterior, es necesario calcular TODA la lista de particiones</p>
<pre><span style="color:#993300;"><span style="color:#333399;">lista=particiones(5)</span></span></pre>
<p>antes de poder mostrar siquiera la primera. Sería mucho más conveniente que particiones() diera cada una de ellas al necesitarlas, sin necesidad de calcularlas todas de antemano, lo cual se obtiene mediante el uso de generadores.</p>
<p>Otro uso de los generadores es devolver los elementos de una lista <strong>infinita</strong>, y como matemáticos esto es muy útil, sobre todo si se quiere modelar series y sucesiones.</p>
<p>Por ejemplo, queremos generar una lista de las primeras <em>t</em> aproximaciones a la suma 1 + (1/2) + (1/3) + ... + (1/n).  La función sería:</p>
<pre><span style="color:#333399;">def armonica():
     suma=0.0        # inicializamos valores
     n=0.0
     while True:   <strong># ciclo infinito!!
</strong>         n=n+1         # aumentamos la variable
         suma = suma + 1/n    # calculamos la nueva suma
         yield suma           # regresamos el nuevo valor</span></pre>
<p>El uso de <strong>yield</strong> en vez de <strong>return</strong> convierte a la función en un generador, que regresa sus valores de uno en uno en vez de todos al mismo tiempo.</p>
<p>Y el siguiente es un ejemplo de su uso:</p>
<pre><span style="color:#333399;">t=6
z=armonica()
for j in range(t):
     print z.next()</span></pre>
<p><span style="color:#000000;">resultando en </span></p>
<pre><span style="color:#ff9900;"><span style="color:#ff6600;">1.0                <span style="color:#808000;"># 1</span>
1.5                <span style="color:#808000;"># 1 + 1/2</span>
1.83333333333</span></span><span><span><span style="color:#ff9900;"><span style="color:#ff6600;">    <span style="color:#808000;">  # 1 + 1/2 + 1/3</span></span></span></span></span><span style="color:#ff9900;"><span style="color:#ff6600;">
2.08333333333      <span style="color:#808000;"># 1 + 1/2 + 1/3 + 1/4
</span>2.28333333333      </span></span><span><span><span style="color:#ff9900;"><span style="color:#ff6600;"><span style="color:#808000;"># 1 + 1/2 + 1/3 + 1/4 + 1/5</span></span></span></span></span><span style="color:#ff9900;"><span style="color:#ff6600;">
2.45               </span></span><span><span><span style="color:#ff9900;"><span style="color:#ff6600;"><span style="color:#808000;"># 1 + 1/2 + 1/3 + 1/4</span></span></span></span></span><span style="color:#ff9900;"><span style="color:#808000;"> + 1/5 + 1/6</span></span></pre>
<p>Siendo clave la línea</p>
<pre><span><span style="color:#333399;">print z.next()</span></span></pre>
<p>en la que calcula el siguiente término, sin necesidad de recalcular los anteriores y sin necesidad de calcular los siguientes (al no saber cuántos se le pedirán).</p>
<p>Por ejemplo, si queremos generar todas las aproximaciones hasta que excedamos 3 podemos usar:</p>
<pre><span style="color:#333399;">for x in armonica():
     print x
     if x &#62;3: break</span></pre>
<p>Este ejemplo es más ilustrativo, porque no sabemos ni siquiera cuántos elementos se calcularán, simplemente se calcula de uno en uno hasta obtener alguno que exceda 3. La línea <strong>for x in armonica(): </strong>está haciendo uso de que armonica() es un iterador, por lo que se puede recorrer de uno en uno como cuando se recorre range().</p>
<h2>De vuelta al problema</h2>
<p>Necesitamos entonces 2 cambios: usar generadores y establecer un tope (opcional) al elemento inicial, tope que es necesario para evitar obtener resultados del tipo [1, 3, 1, 1].</p>
<pre><span style="color:#333399;"><strong>def particiones(n, tope=None):</strong>     # tope es un parámetro opcional
    if tope==None: tope=n          # si no está presente, la cabeza de la partición puede ser
                                   # tan grande como n mismo
    if n==1:
        yield  [1]          # dado que ya no regresamos una "lista de listas"
    elif n&#60;1:               # sino sólo un elemento, ya no necesitamos los corchetes extra
        yield []
    else:                    # necesario pues a diferencia de return, la función no termina al
                             # al llegar a yield, sino que sólo se pausa
        <strong>for k in range(min(n,tope),0,-1): </strong>  # min(n,tope) impide que las cabezas sean mayores topes<strong>
</strong><strong>            for cola in particiones(n-k,tope=k):  #</strong> y cada cabeza es tope de las subllamadas
                particion= [k] + cola
                yield particion</span>
</pre>
<p>Notemos que ya <strong>no</strong> fue necesario usar variables auxiliares como <em>listaparticiones </em>y <em>colas</em> para almacenar las listas temporales, sino que el uso de generadores (yield) permite acceder a las funciones mismas como si fueran listas.</p>
<p>Usamos la función anterior como:</p>
<pre><span style="color:#333399;">for x in particiones(5):
        print x</span></pre>
<p>Obteniendo:</p>
<p><span style="color:#ff6600;">[5]<br />
[4, 1]<br />
[3, 2]<br />
[3, 1, 1]<br />
[2, 2, 1]<br />
[2, 1, 1, 1]<br />
[1, 1, 1, 1, 1]</span></p>
<p>O como en</p>
<pre><span style="color:#333399;">for x in particiones(6,tope=4):
    print x</span></pre>
<p>que resulta en</p>
<pre><span style="color:#ff6600;">[4, 2]
[4, 1, 1]
[3, 3]
[3, 2, 1]
[3, 1, 1, 1]
[2, 2, 2]
[2, 2, 1, 1]
[2, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1]</span></pre>
<p>Las cuales son las particiones de 6 sin elementos mayores a 4.</p>
<h2>Toques finales</h2>
<p>Casi estamos listos, sólo falta ahora filtrar de forma opcional aquellas particiones que tengan una longitud dada. Añadiremos un nuevo parámetro auxiliar "partes" que dirá el número de partes en que se divide n:</p>
<pre><span style="color:#333399;">def particiones(n, tope=None, <strong>partes=-1</strong>):
    # sólo usaremos "partes" cuando sea positiva, por eso el valor inicial de -1
    if tope==None: tope=n
    if n==1:
        yield  [1]
    elif n&#60;1:
        yield []
    else:
        for cabeza in range(min(n,tope),0,-1):
            for cola in particiones(n-cabeza,tope=cabeza,partes=partes-1):  # cada subllamada disminuye las partes en 1
                particion= [cabeza] + cola
                <strong>if (partes&#60;0) or ((partes&#62;0) and (len(particion)==partes) ):   </strong># cuando el número de partes no importa
                                                                                # o coincide con el número de partes requerido
                    yield particion                                # devolver la partición</span>
</pre>
<p>Dado que en cada etapa se filtran las particiones para devolver las que tienen el número de partes necesario, en las etapas más profundas de la recursión se regresan menos particiones y por tanto al construir las particiones totales al salir de las recursiones se hacen muchas menos concatenaciones, de modo que el programa corre mucho más rápido que si directamente se generaran todas y a la salida final se filtraran las que tienen el tamaño deseado.</p>
<p>El resultado de invocar a la función con</p>
<pre><span style="color:#333399;">for x in particiones(6, partes=3):
    print x</span></pre>
<p>es:</p>
<pre><span style="color:#ff6600;">[4, 1, 1]
[3, 2, 1]
[2, 2, 2]</span></pre>
<p>Podemos incluso combinar los parámetros. Así, pedimos las particiones de 10 cuya primera entrada no exceda de 6 y que tengan 4 partes:</p>
<pre><span style="color:#333399;">for x in particiones(10, partes=4, tope=6):
    print x</span></pre>
<p>obteniendo:</p>
<pre><span style="color:#ff6600;">[6, 2, 1, 1]
[5, 3, 1, 1]
[5, 2, 2, 1]
[4, 4, 1, 1]
[4, 3, 2, 1]
[4, 2, 2, 2]
[3, 3, 3, 1]
[3, 3, 2, 2]</span></pre>
<p>Y con eso damos por terminado el trabajo que queríamos.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Cómo funciona el buscador web de Google: la compañía aporta un poco más de información]]></title>
<link>http://portalhispano.wordpress.com/?p=530</link>
<pubDate>Mon, 26 May 2008 00:47:19 +0000</pubDate>
<dc:creator>portalhispano</dc:creator>
<guid>http://portalhispano.wordpress.com/?p=530</guid>
<description><![CDATA[El buscador web de Google es la joya de la corona de la compañía. Es lo que le proporciona el mayo]]></description>
<content:encoded><![CDATA[<p>El <a href="http://google.dirson.com/o.a/google-web/">buscador web de Google</a> es la joya de la corona de la compañía. Es lo que le proporciona el mayor porcentaje de sus multimillonarios ingresos y, sobre todo, su credibilidad como marca. Por ello, en muy raras ocasiones se hacen comentarios sobre su funcionamiento y, de hecho, solamente unos pocos de los 17.000 empleados de Google están autorizados a hablar públicamente sobre qué parámetros se siguen a la hora de valorar la relevancia de una página web dentro de los resultados, qué prácticas se penalizan, o cómo funcionan los servidores que realizan los cálculos.</p>
<p>Uno de estas personas autorizadas es <a href="http://google.dirson.com/post/2287-udi-manber/">Udi Manber</a>, uno de los pioneros de los métodos de búsquedas en la WWW y responsable de calidad del buscador web de Google, que con <a href="http://googleblog.blogspot.com/2008/05/introduction-to-google-search-quality.html">este post oficial</a> inicia una serie de artículos oficiales en los que pretende ofrecer un poco más de transparencia sobre su funcionamiento. El objetivo: seguir contando con el respeto de los webmasters que crean sitios web para posicionarse en Google y, sobre todo, de los millones de usuarios que diariamente lo utilizan para buscar información.</p>
<p>Algunas de las cosas más interesantes del citado post son:</p>
<p>Hay más de 1.000 programadores y científicos destinados exclusivamente a tareas relacionadas con el buscador web de Google.</p>
<p>Uno de los problemas más importantes a la hora de rastrar la información de la WWW es que no las páginas web están en cientos de idiomas diferentes, y que además los webmasters no suelen seguir los estándares a la hora de crear documentos web.</p>
<p>Otro problema es entender las consultas de los usuarios, los cuales suelen utilizar menos de tres palabras por cada búsqueda, lo que complica la tarea. Hace unos meses se publicaron <a href="http://www.onestat.com/html/aboutus_pressbox56-word-phrases-in-search-engines.html">estos datos</a> al respecto: solamente el 26% de los usuarios utilizan cuatro o más términos por búsqueda. Además, hay que recordar que el propio Manber reconocía hace tiempo que <a href="http://google.dirson.com/post/3459-una-cuatro-busquedas-inedita/">una de cuatro búsquedas en Google es inédita</a>, lo que complica aún más la labor de devolver resultados con información útil.</p>
<p>El algoritmo de <a href="http://google.dirson.com/pagerank.php">PageRank</a> se sigue utilizando a día de hoy, pero se ha diluido dentro de un sistema mucho más grande de evaluación de la relevancia de los documentos web. Ahora, además de este parámetro, se tienen en cuenta otros como los modelos del lenguaje (Google procesa ahora las frases que se rastrean, los sinónimos o las palabras mal escritas), o la antigüedad o la frescura del documento web (algunas búsquedas tienen su mejor información en las páginas que se han creado en las últimas horas).</p>
<p>Continuamente se están realizando modificaciones en los algoritmos del buscador, y en concreto en 2007 se lanzaron 450 nuevas mejoras (9 por semana de media).</p>
<p>Se ha implementado recientemente la herramienta de revisión ortográfica (el famoso "Quizás quiso decir") en diferentes idiomas, como el catalán, el serbio o el ucraniano.</p>
<p>Google ha creado una red de personas en varios países del mundo, que se encargan de "ofrecer feedback a Google", en referencia al <a href="http://google.dirson.com/post/1369/">laboratorio 'Rater Hub'</a>, en el que se contrata a usuarios de Internet (también <a href="http://google.dirson.com/post/2029/">de España</a>) para que entrenen a los algoritmos de búsqueda (ver <a href="http://google.dirson.com/post/3913-spam-documento-oficial-detectar/">post sobre documento de uso del laboratorio</a>).</p>
<p>Google cuenta también con un importante grupo de voluntarios dentro de la compañía que les ayuda a mejorar las búsquedas en diferentes idiomas.</p>
<p><strong>Muy pocos usuarios se leen las </strong><a href="http://www.google.es/support/?ctx=web&#38;hl=es"><strong>páginas de ayuda del buscador web</strong></a><strong>, y son mayoría los que desconocen todas las posibilidades que ofrece. Por ello, nos encontramos cada vez más con información proveniente de otras herramientas de Google dentro de los resultados del buscador web. Es lo que se conoce como '</strong><a href="http://google.dirson.com/post/3383-universal-search-pagina-inicial/"><strong>Google Universal Search</strong></a><strong>', presentado por el propio Manber hace justo un año.</strong></p>
<p>Hay diferentes grupos de trabajo dentro del Departamento de Calidad del buscador web, y dos de ellos están relacionados con los webmasters. Uno de ellos, para detectar cualquier intento de engaño por parte de algunos de ellos (el de 'Web Spam'), y otro para abrir un canal de comunicación con Google (el de '<a href="http://google.dirson.com/post/3797-webmasters-tools-analiza-paginas/">Google Webmasters Tools</a>').</p>
<p>Publicado en <a href="http://google.dirson.com/post/3995-como-funciona-buscador-web-google/">Google.dirson.com  </a>el 24 de mayo de 2008</p>
<p><span style='text-align:center; display: block;'><object width='425' height='350'><param name='movie' value='http://www.youtube.com/v/31chyPskxHc'></param><param name='wmode' value='transparent'></param><embed src='http://www.youtube.com/v/31chyPskxHc&rel=0' type='application/x-shockwave-flash' wmode='transparent' width='425' height='350'></embed></object></span></p>
<p><span style='text-align:center; display: block;'><object width='425' height='350'><param name='movie' value='http://www.youtube.com/v/BIEwUxMrJ4Y'></param><param name='wmode' value='transparent'></param><embed src='http://www.youtube.com/v/BIEwUxMrJ4Y&rel=0' type='application/x-shockwave-flash' wmode='transparent' width='425' height='350'></embed></object></span></p>
<p><span style='text-align:center; display: block;'><object width='425' height='350'><param name='movie' value='http://www.youtube.com/v/jFgBgU9CcCQ'></param><param name='wmode' value='transparent'></param><embed src='http://www.youtube.com/v/jFgBgU9CcCQ&rel=0' type='application/x-shockwave-flash' wmode='transparent' width='425' height='350'></embed></object></span></p>
]]></content:encoded>
</item>

</channel>
</rss>
