Operaciones Binarias en Python

viernes, 15 de agosto de 2008

En Python podemos operar con numeros binarios también. Primero recordemos un poco:
por temas de simplificacion vamos a trabajar hasta con cuatro bits.

Decimal

Binario

0

0000

1

0001

2

0010

3

0011

4

0100

5

0101

6

0110

7

0111

8

1000

9

1001

10

1010

11

1011

12

1100

13

1101

14

1110

15

1111


Es un poco complicado trabajar con numeros binarios, en Python simulamos trabajar con ellos pero se trabaja con numero decimales. Esto es así:

Operador AND
>>> 14 & 5
4

internamente esto opera:


14 = 1110
AND
5 = 0101
------
4 = 0100

De izquierda a derecha:
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
1 AND 0 = 0


>>> 9 & 3
1

Internamente:

9 = 1001
AND
3 = 0011
--------
1 = 0001

De derecha a izquierda:
1 AND 1 = 1
0 AND 1 = 0
0 AND 0 = 0
1 AND 0 = 0

Operador OR
>>> 14 | 5
15


14 = 1110
OR
5 = 0101
--------
15 = 1111


De derecha a izquierda:
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
1 OR 0 = 1

>>> 9 | 3
11


9 = 1001
OR
3 = 0011
--------
1 = 0001


De derecha a izquierda:
1 OR 1 = 1
0 OR 1 = 0
0 OR 0 = 0
1 OR 0 = 0


Operador XOR
>>> 14 ^ 5
11

14 =     1110

XOR
5 = 0101
--------
15 = 1011
De derecha a izquierda:
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 0
1 OR 0 = 1


>>> 9 ^ 3

10

9 =      1001

XOR
3 = 0011
--------
1 = 1010

1 XOR 1 = 0
0 XOR 1 = 1
0 XOR 0 = 0
1 XOR 0 = 1


Conjuntos en Python

miércoles, 25 de junio de 2008

Como en Python todo es un objeto, los conjuntos no son la excepcion. A traves de métodos, podremos operar entre conjuntos.

Todo lo que esté con el símbolo indica que no es necesario leerlo, pero puede resultar interesante para aquellos que no saben en que consiste cada operacion.

Declaración

Primero, ¿como declaramos un conjunto?
En python, cualquier objeto iterable lo podemos "transformar" en un conjunto.

>>> T = (1,2,3,4,5,5)
>>> conjuntoT = set(T) #Con set() definimos el conjunto
>>> conj
untoT
set([1, 2, 3, 4, 5])

>>> L = [1,2,3,4,5,5]
>>> conjuntoL = set(L)
>>> conjuntoL

set([1, 2, 3, 4, 5])


>>> C = 'Hola Mundo'
>>> conjuntoC = set(C)

>>> conjuntoC

set([
'a', ' ', 'd', 'H', 'M', 'l', 'o', 'n', 'u'])


Por definicion de la teoría de conjuntos los elementos perteneciente a un conjunto no se re repiten, fijense en los dos primeros casos en T y L se repite el 5 y en conjuntoT y conjuntoL, solo hay un 5. Lo mismo pasa en el tercer ejemplo.


Unión
>>> A = set([1,2,3,4,5])
>>> B = set([3,4,5,6,7])
>>> A|B
set([1, 2, 3, 4, 5, 6, 7])


Definicion: Dado un conjuto A y un conjuto B cualquiera. La unión de conjuntos A y B (se denota A∪B)consiste en un nuevo conjunto el cual contiene todos los elementos A y B.

Tambien podría haberse hecho A.union(B)

Interseccion
>>> A = set([1,2,3,4,5])
>>> B = set([3,4,5,6,7])
>>> A&B

set([3, 4, 5])


Definicion: Dado un conjuto A y un conjuto B cualquiera. La intersección de conjuntos A y B (se denota A ∩ B) consiste en un nuevo conjunto el cual contiene todos los elementos que tengan en común A y B.

Tambien podría haberse hecho A.intersection(B)

Diferencia
>>> A = set([1,2,3,4,5])
>>> B = set([3,4,5,6,7])

>>> A-B
set([1, 2])


Definicion: Dado un conjuto A y un conjuto B cualquiera. La diferencia entre un conjuntos A y B (se denota A-B) consiste en un nuevo conjunto el cual contiene todos los elementos de A y que no pertenezcan a B.

Tambien podría haberse hecho A.difference(B)


Diferencia Simétrica
>>> A = set([1,2,3,4,5])
>>> B =
set([3,4,5,6,7])
>>> A^B

set([1, 2, 6, 7, 8])


Definición: Dado un conjuto A y un conjuto B cualquiera. La diferencia simétrica de conjuntos A y B (se denota A Δ B) consiste en un nuevo conjunto el cual contiene todos los elementos de A y B que no tengan en comun.

Tambien podría haberse hecho A.symmetric_difference(B)

¿Es subconjunto?
>>> B = set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> A = set([1,2,3,4,5])
>>> A.issubset(B)
True
>>> B.issubset(A)
False


Definición: Un conjuto A es subconjunto de B cuando todos los elementos de A tambien pertenecen a B.


¿Es superconjunto?
>>> B = set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> A = set([1,2,3,4,5])
>>> B.issuperset(A)
True
>>> A.issuperset(B)
False


Definición: Un conjunto B es superconjunto de A si y solo si A es subconjunto de B


Pertenencia
>>> A = set([1,2,3,4,5])
>>> 1 in A
True
>>> 1 not in A
False
>>> 10 in A
False
>>> 10 not in A
True


Definición: Matemáticamente no tiene una definición, pero podemos decir que es un termino que usamos para saber si un elemento está o no dentro de un conjunto.


Las operaciones las hicimos entre dos conjuntos, pero podemos operar con la cantidad de conjuntos que querramos.
Hasta acá las operaciones definidas por la teoría conjuntista, pero tambien existen otras en Python para hacer mas fácil la programación.

Agregar un elemento al conjunto
>>> A = set([1,2,3,4,5])
>>> A.add(0)
>>> A
set([0, 1, 2, 3, 4, 5])


Quitar un elemento al conjunto
>>> A = set([0,1,2,3,4,5])
>>> A.discard(2)
>>> A
set([0, 1, 3, 4, 5])


Quitar todos los elementos de un conjunto
>>> A = set([0,1,2,3,4,5])
>>> A.clear()
>>> A
set([])


Copiar un conjunto
>>> B = A #acá decimos que B es igual a A, por lo que cualquier cambio en A tambien se producirá en B y viceversa
>>> B
set([1, 2, 3, 4, 5])
>>> A
set([1, 2, 3, 4, 5])
>>> B.add(987)
>>> B
set([1, 2, 3, 4, 5, 987])
>>> A
set([1, 2, 3, 4, 5, 987])


Probablemente no querramos que pase eso, para resolver este problema existe el método .copy()
-----------------------------------------------

>>> A = set([1,2,3,4,5])
>>> B=A.copy()
>>> B
set([1, 2, 3, 4, 5])
>>> A
set([1, 2, 3, 4, 5])
>>> B.add(987)
>>> B
set([1, 2, 3, 4, 5, 987])
>>> A
set([1, 2, 3, 4, 5])


.update
A.intersection_update(B) equivale a hacer A = A & B o A &= B

A.defference_update(B) equivale a hacer A = A -B o A -= B

A.symmetric_difference_update(B) equivale a hacer A = A ^B o A^=B

A.update(B) equivale a hacer A = A | B o A |= B

Matemática Discreta

viernes, 13 de junio de 2008

Muchos tal vez se estén preguntando que es la matemática discreta y hayan hechos chistes fáciles con eso, no se preocupen es natural, todos lo hemos hecho.
Recuerdo que en mi primera clase de matemática discreta en la facultad la profesora inició la clase diciendo: "Bueno, es difícil definir lo que es discreto..." [todos estábamos silenciosos esperado que era lo que iba a decir] "y lo verán con el tiempo" dijo la profesora, y creanme que nunca supimos en realidad lo que era. Como matemática discreta es una materia que me encantó, decidí averiguar por mi mismo.
Como ustedes, quise ponerme a buscar en Internet y me encontré con una sorpresa, tampoco había información muy clara sobre la definición. En wikipedia dice:
"Matemática discreta es la parte de la matemática encargada del estudio de los conjuntos discretos: finitos o infinitos numerables." bueno, es un poco redundante que una palabra se explique con la misma.
mas abajo:
"La matemática discreta estudia estructuras cuyos elementos pueden contarse uno por uno separadamente, sin dar lugar a números decimales ni procesos infinitos. Es decir, los procesos en matemática discreta son finitos y contables." Tal vez un poco mas claro para mí, pero no me aclara del todo el panorama. Esto es interesante: "la matemática discreta es la base de todo lo relacionado con los procesos digitales, y por tanto, se constituye en parte fundamental de la ciencia de la computación, una de las ramas de estudio impartidas en los estudios de Ingeniería Informática." además de Ingeniería Informática, también Ingeniería en Software e Ingeniería en sistemas de Información.

Lo realmente interesante de la matemática discreta mas allá de las definiciones es que tiene un gran contenido lógico que, si realmente se entiende cuando se la estudia, permite ver las cosas mucho mas racionalmente, que es lo que se busca en gran medida en las ingenierías, y mas hacen uso de la lógica las carreras que ya se nombraron debido a que en en estas ingenierías es necesario ser estructurado en los pensamientos, racional y con un buen poder de abstracción para el diseño de algoritmos. En las ingenierías dedicadas en cierta medida a la informática siempre se están trabajando en territorios de poco conocimiento en el cual es necesario ser estructurado con un buen grado de abstracción para poder entender los problemas a los que se enfrentan.

Esta disciplina estudia:

  • Lógica proposicional: Las proposiciones son enunciados los cuales podemos decir si son verdaderos o falsos. Por ejemplo:
    "el sol es amarillo" puedo decir si es V o F.
    "el sol es azul" también puedo decir si es V o F. "la flor" no puedo decir nada al respecto. "lloverá mañana" es una proposición pero habrá que esperar hasta mañana
    para saber si es V o F. "silla" tampoco es una proposición ya que no podemos determinar su valor de verdad o falsedad.
  • Conjuntos: Un conjunto es una colección de elementos (de cualquier tipo), por definirlo de alguna manera, aunque los que saben dicen que no tiene definición. Aquí se estudia las propiedades que tienen los conjuntos, como se puede operar entre dos o mas conjuntos.
  • Álgebra de Boole: esta se ocupa de las proposiciones y su valor de verdad, difiere del álgebra común.
  • Razonamientos.
  • Combinatoria
  • Grafos.
  • Relaciones binarias.
Entre muchas de otras cosas.

La matemática decreta en otro orden de cosas, te hace entender la matemática "convencional", la que todos conocemos.