jueves, 20 de septiembre de 2012

[AUTOMATIZACIÓN] Función de Transferencia (laboratorio)

Para esta semana en el laboratorio nos repartimos los problemas del libro y seleccione el 3.22:

Obtenga la función de transferencia Eo(s)/Ei(s) del circuito con amplificador operacional.

Se tienen dos impedancias, Z1 que corresponde a R1+1/Cs y Z2 que corresponde a R2.

La función de transferencia se puede escribir así:

Eo(s) queda de la siguiente manera:

Y Ei(s) queda así:

La función de transferencia queda de la siguiente manera:

[CRIPTOGRAFÍA] RSA-Based Digital Signatures

Para esta semana hicimos un servicio web de autenticación de usuarios, la cual guarda las claves públicas.

Para esto se hicieron 3 códigos, 2 en python con la ayuda de la librería CGI (Interfaz de entrada común) de python y un ultimo código en HTML simple que le envía los datos al script que autentifica el usuario. Todo esto corriendo en el servidor local.

La página es así:

Y el código es un simple HTML:

<form method = "get" action="http://localhost/cgi-bin/main.py">

<table border=0>
<tr>
    <td><font face="arial">Challenge</font></td>
    <td>
    <input type=text name="x">
    </td>
</tr>

<tr>
    <td><font face="arial">Usuario</font></td>
    <td>
    <input type=text name="user">
    </td>
</tr>

<tr>
        <td><font face="arial">Respuesta</font></td>
        <td>
        <input type=text name="r">
        </td>
</tr>

<tr>
    <td></td>
    <td colspan=2>
    <input type="submit" value="Enviar">
    </td>
</tr>
<tr>
    <td></td>
    <td colspan=2>
    <font face="arial"><a href="http://localhost/respuesta.py" target="_blank">Descargar Script</a></font>
    </td>
    </tr>
</table>
</form>

Al colocar los datos redirecciona a el script que autentifica al usuario, el código es así:

#!/usr/bin/python

import cgi 

def f(x):
    return x*2

def fastmodexp(x, y, mod):
    p = 1
    aux = x
    while y > 0:
        if y % 2 == 1:
            p = (p * aux) % mod
        aux = (aux * aux) % mod
        y = y >> 1
    return p

def public_key(user):
  keys = open("usuarios", "r")
  for line in keys:
      usuario, e, n = line.split(" ")
      if usuario == user:
          return int(e), int(n)

print "Content-type: text/html"
print
print "<html><head><title>Respuesta</title></head><body>"
form = cgi.FieldStorage()
x = int(form.getvalue("x"))
user = form.getvalue("user")
r = int(form.getvalue("r"))
e, n = public_key(user)
y = fastmodexp(r, e, n)
z = f(x)
if y == z:
      print "Si es "+ user
else:
      print "No es "+ user
print "</body></html>"

El programa anterior lo que hace es recibir los datos del html, despues comprueba que el usuario que hace referencia tiene su clave correcto, esto lo hace con un "y" que es "fastmodexp" que en si es [(r ^ e) mod n] para calcular f(x) con los datos del usuario al que se hace referencia y se usa "z" para calcular directamente f(x).

Al final se hace una comparacion, si ambas "y" y "z" son iguales se trata de el usuario correcto.

El usuario que esta en duda descarga el siguiente script:

#!/usr/bin/python

def f(x):
  return x*2

def fastmodexp(x, y, mod):
    p = 1
    aux = x
    while y > 0:
        if y % 2 == 1:
            p = (p * aux) % mod
        aux = (aux * aux) % mod
        y = y >> 1
    return p


def main():
   x = int(raw_input("x:"))
   d = int(raw_input("d:"))
   n = int(raw_input("n:"))
   y = f(x)
   res = fastmodexp(y, d, n)
   print "Respuesta = %s"%res
main()

El script genera una respuesta para "x" utilizando fastmodexp que es [(y ^ d) mod n] la cual el usuario entrega en el chat para quien quiere autentificar que realmente es el.

Ahora se muestra un ejemplo para una "x" = 79, quiero saber que el usuario Victor cuya clave públca es (e = 2903, n = 5917) y su clave privada es (d= 1127, n= 5917).

"Victor" descarga el script y lo ejecuta, como el es el único que sabe su clave privada estara seguro de su respuesta.


Por chat envia 229 y el otro usuario comprueba en la página:


La respuesta es:


En caso de una respuesta por parte de "Victor" que no sea 229:


lunes, 17 de septiembre de 2012

[VERIFICACIÓN Y VALIDACIÓN] Lógica predicativa 2

Esta vez se nos encargó realizar un ejercicio del documento proporcionado en clase, del cual yo escogí el siguiente:


Rephrase “x ≤ y ^ y ≤ z” in predicate logic, using binary relations < for “less than” and = for “equal”.

Reformule “x ≤ y ^ y ≤ z” en lógica predicativa, usando relaciones binarias < para "menor que" y = para "igual".

La expresión es:
x ≤ y ^ y ≤ z

Y dice que "x" es menor o igual a "y", y que "y" es menor o igual a "z".

Por lo que quedan las siguientes relaciones binarias:
(x < y), (x = y), (y < z), (y = z)

Al unirlas según la expresión se pueden escribir de la siguiente manera:
[(x < y) v (x = y)] ^ [(y < z) v (y = z)]

O de la siguiente manera:
[(x < y) ^ (y < z)] v [(x = y) ^ (y = z)]

Y de estas podemos reordenarlas de la siguiente manera:
(x < y < z) v (x = y = z)

O bien:
 y  z


martes, 11 de septiembre de 2012

[AUTOMATIZACIÓN] Función de Transferencia

En esta semana elaboramos la función de transferencia para nuestro proyecto, en este caso el proyecto consiste en controlar la velocidad de un ventilador en función a la temperatura del ambiente.

Para mi modelo utilizaré la ley de enfriamiento de Newton como entrada, que consiste en lo siguiente:

"Cuando la diferencia de temperaturas entre un cuerpo y su medio ambiente no es demasiado grande, el calor transferido en la unidad de tiempo hacia el cuerpo o desde el cuerpo por conducción, convección y radiación es aproximadamente proporcional a la diferencia de temperatura entre el cuerpo y el medio externo".

La ecuación queda de la siguiente manera:

Aplicando transformadas de Laplace:
Para la salida utilicé la ley de Kirchhoff para voltajes, que se define así:

"En un lazo cerrado, la suma de todas las caídas de tensión es igual a la tensión total suministrada. De forma equivalente, la suma algebraica de las diferencias de potencial eléctrico en un lazo es igual a cero".

Y matemáticamente se escribe de la siguiente manera:
Y aplicando la transformada de Laplace queda de la siguiente manera:
Y por último nuestra función de transferencia queda de la siguiente manera:

[VERIFICACIÓN Y VALIDACIÓN] Lógica predicativa

Para esta tarea, nos tocó seleccionar una proposición del libro Symbolic Logic de Lewis Carroll.

Yo seleccioné la siguiente:

"All soldiers march well;


Some babies are not soldiers"

La traducción directa es "Todos los soldados marchan bien; Algunos bebés no son soldados".

Ahora hay que expresar lo anterior en terminos de lógica predicativa usando cuantificadores.


∀ - Es el cuantificador universal. Una proposición es universal cuando el concepto o clase que constituye su sujeto está considerado en toda su extensión.


∃ - Es el cuantificador existencial. Una proposición es existencial cuando el concepto o clase que constituye su sujeto está considerado en parte de su extensión.


Analizando la sentencia, podemos definir cada parte de la siguiente manera:


S(x) - Son aquellos que son soldados.

M(x) - Son aquellos que marchan bien.
B(x) - Son aquellos que son bebés.
x - Es alguien.

Ahora podemos escribir:

x S(x→ M(x)
"Todo soldado marcha bien"

x B(x) → (¬S(x))
"Algunos bebés no son soldados"

Con esto podemos definir otras formas de escribir la sentencia:

x B(x) → (¬M(x))
"Algunos bebés no marchan bien"

x M(x) → B(x)
"Algunos que marchan bien son bebés"

x B(x)M(x) → S(x)
"Algunos bebés que marchan bien son soldados"

x S(x→ B(x)M(x)
"Todos los soldados son bebés que marchan bien"




jueves, 6 de septiembre de 2012

[AUTOMATIZACIÓN] Transformadas de Laplace

Tomé el ejercicio 2.21 que dice: Obtenga la solución para ls ecuación diferencial:





a y b son constantes
A es una matriz
x' es la derivada de tiempo

Se aplica la siguiente propiedad:
ademas de la propiedad de linealidad.

Se resuelve:


















Ahora para X(s):















Se aplica la transformada inversa a X(s):


[CRIPTOGRAFÍA] Diffie–Hellman key exchange

En grupos de 3 personas, nos dimos a la tarea de realizar un ejercicio en el que utilizaríamos el protocolo Diffie–Hellman, así los roles de mi compañeros René y Emmanuel fueron de Alice y Bob, y el mio de Eve, ellos compartieron datos públicamente:

Como Eve, traté de obtener la llave "K" mediante fuerza bruta, osea, checar todas las combinaciones posibles.

Para esto utilicé las formulas siguientes:

X = g^x % p

Y = g^y % p

K = X^y % p = Y^x % p

Así tendría que sustituir "x" y "y" en la fórmula por cualquier número hasta obtener "X" y "Y".

Realicé a mano los problemas ya que era parte de la tarea hacerlos a mano, cosas como elevar un número grande a una potencia grande lo realicé con calculadora.


Obtuve x = 4 y y = 7, cabe mencionar que la "x" de René era x = 13, pero no afecta ya que 4 o 13 ambos resultan en la misma "K", de hecho esto es repetitivo, cada cierto numero de veces encontraremos una "x" o una "y" que resultan en la misma "K", esto se debe a que el generador "g" no es muy eficiente, al menos si cada 9 números hay una "x" o una "y" como en mi caso.


Al final obtuve una K = 5 y lo comprobé:

martes, 4 de septiembre de 2012

[VERIFICACIÓN Y VALIDACIÓN] Diagrama de Decisión Binario

Se encargó para esta entrada:
  • Inventar una expresión Booleana.
    • Usando por mínimo 3 variables y 4 conectivos básicos.
  • Construir y dibujar el BDD.
  • Reducir el BDD resultante a un ROBDD. 
  • Dibujar el ROBDD resultante.
Primero iniciamos con la expresión booleana, utilizé la siguiente:


Y esta es la tabla de verdad:

El arbol binario de desición queda de la siguiente manera:
Las lineas punteadas marcan falso y las otras verdadero, quitare los valores para mejor visualización.

Si observamos, las B que son verdaderas son iguales, ya que en ambos casos, la C es verdadera o falsa, así que juntamos ambas. Ahóra reducire el arbol a un BDD (Diagrama de Desición Binario):
El siguiente paso es dejar todo unido a un par de nodos 0 y 1:
Y finalmente, ya que en B falsa, los valores de C pueden ser o verdaderos o falsos, eliminamos las C de los falsos de B y las unimos directamente a los nodos que apuntaban: