Operaciones a bit a bit: NOT, AND, OR y XOR

Seguimos con la racha de entradas encadenadas. Si la entrada de los tipos de configuración RAID nos llevó a definir el concepto de información de paridad ahora a raíz de esa entrada vamos a hablar de las operaciones bit a bit.

Hablamos de operaciones a nivel de bit porque con ellas trabajamos directamente sobre los bits, dígitos binarios, a nivel individual. Este tipo de operaciones son muy utilizadas en computación, a la hora de cifrar datos o, como comentábamos en el otro artículo, para realizar los cálculos de paridad. Es posible que te suenen los nombres de estas operaciones, pues son operaciones lógicas que ya vimos en su día en un artículo sobre LibreOffice Calc o también en la entrada sobre el álgebra booleana.

NOT: La operación NOT también podría ser llamada complemento y es un operador unario. Realiza la negación lógica de cada bit, es decir, invierte su valor. Por ejemplo, la operación NOT 1010 daría como resultado 0101.

AND: La operación AND, o conjunción lógica, funciona de forma similar a una multiplicación: sólo nos devolverá 1 si todas las entradas son 1, en el resto de casos devolvería 0. Es decir 0 AND 0 es igual a 0, 1 AND 0 es igual 0 y solo 1 AND 1 es igual a 1. Por ejemplo: 100111001011010100111010 AND 010110100001101111011000 = 000110000001000100011000. Cuando hacemos la operación AND la secuencia que dará como resultado no puede ser más larga que la mayor de las secuencias operadas.

OR: La operación OR, o disyunción lógica, dará como salida 1 siempre que una o más de sus entradas sean 1. Es decir, 1 OR 1 es igual a 1, 1 OR 0 es igual a 1 y solo 0 OR 0 es igual a 0. Por ejemplo: 1000 OR 0011 = 1011. Cuando hacemos la operación OR la secuencia que dará como resultado no puede ser más corta que ninguna de las secuencias operadas.

XOR: La operación XOR, u OR exclusivo, dará como salida 1 siempre que solo una de las dos entradas sea 1. Es decir, que 0 XOR 0 será igual a 0, 1 XOR 1 será igual a 0 pero 1 XOR 0 o 0 XOR 1 serán igual a 1. Por ejemplo 1010 XOR 1001 = 0011 Dado que es complicado revertir su resultado es muy utilizada en algoritmos de cifrado.

Problema de Parada (o problema de Halting)

Vamos con un poco de teoría de la computación ¿Qué es el problema de paro, de parada o de Halting? Consiste en determinar si existe una máquina de Turing capaz de determinar si cualquier Máquina de Turing se va a detener o no. Dada una máquina de Turing M y una palabra w se determinará si M acabará en un número finito de pasos usando w como dato de entrada.

El problema es indecidible, según el propio Turing ninguna máquina de Turing puede resolverlo. Es decir, no puede existir un programa genérico que demuestre que todos los programas del mundo terminan, se puede hacer para un programa concreto pero no existe la solución general.

Existen varias demostraciones de por qué es indecidible, vamos a ver una demostración escrita en javascript.

Imaginemos que alguien escribe una función f que recibe como parámetros una función y sus argumentos, y que tiene un código capaz de comprobar si esta se detendrá o no.

var f = function (funcion, argumentos) { ... }; // Aquí iría un código correcto que supuestamente calcularía si la máquina para o no

Vamos a suponer que esa función está correcta, funciona y nos devuelve true si el programa termina, y false si caería en un bucle infinito. Entonces podríamos usarla como subrutina dentro de otra función más grande llamada g como la que viene a continuación:

var g = function (funcion) {
//Pasamos en el parámetro funcion la función y sus argumentos 
  if (f(funcion,funcion)) {
    while (true); //esto provoca un bucle infinito
  }
  else {
    return false;
  }
}

Esto vendría a decir que g(funcion) termina siempre y cuando funcion(funcion) nunca termina.

Entonces ¿qué ocurre si la pasásemos a la función g como parámetro su propio código? Es decir ¿qué pasa si g evalúa a g? Pues que llegamos a una contradicción: g(g) termina siempre y cuando g(g) nunca termina. Por tanto, al llevarnos a una paradoja dicho algoritmo no puede existir.

Orden de operaciones aritméticas (PEMDAS) y su aplicación en lenguajes de programación.

Todo un clásico en las redes sociales es que alguien comparta la operación 5+4/3-1*2 y que se monte un gallinero tremendo en los comentarios con distintas soluciones. Esto se debe a que mucha gente no tiene claro cómo va la jerarquía de las operaciones y el orden de evaluación de las mismas.

Si hablamos de operaciones básicas, y de la mayoría de lenguajes de programación (Javascript, PHP, Python, Ruby, C,Visual Basic, Java…), nos regiremos por el orden de operaciones conocido por el acrónimo inglés PEMDAS, que en castellano podríamos traducir como PAPOMUDAS (PAréntesis, POtencias, MUltiplicación, División, Adición, Sustracción). En base a esto el orden de operaciones en lenguajes de programación como Python, PHP, Ruby o Javascript sería:

  1. Paréntesis
  2. Potencias y radicales
  3. Multiplicación, división, división entera y módulo.
  4. Suma y resta.

En este enlace puedes comprobar los resultados de distintas operaciones realizados en distintos lenguajes de programación. Puedes copiar los siguientes ejemplos para comprobar que el resultado es el mismo.

Aquí el código en Javascript:

var resultado = 5+4/3-1*2;
console.log(resultado);

Aquí el código en Python:

resultado = 5+4/3-1*2
print(resultado)

Aquí en Java:

public class Test {
  public static void main(String[] args){
    System.out.println(5.0+4.0/3.0-1.0*2.0);
  }
}

Y aquí en C:

void main(void) {
   double resultado;
   resultado = 5.0+4.0/3.0-1.0*2.0;
   printf("%f",resultado);
}

Como puedes comprobar, en todos el resultado es 4.333333 ya que todos usan el mismo orden para las operaciones.

Cálculo del logaritmo y logaritmo neperiano en Javascript.

Ayer me mandaban este chiste por Whatsapp:

Y como soy así de tocahuevos, que hasta llevo un reloj calculadora Casio, les mandé de vuelta el resultado del logaritmo neperiano de 1437. Y sí, estoy escribiendo esto para cuando me lo vuelvan a mandar, para contestar con este enlace, que me vale tanto para la sección de programación como para la de ciencia.

El elcálculo de logaritmos es la operación inversa a la exponenciación de la base del logaritmo. El desarrollo de calculadoras y ordenadores ha hecho que las tablas de logaritmos, que se usaban hace años para simplificar operaciones complejas, hayan perdido mucha importancia para los estudiantes de matemáticas en la actualidad. Este blog nos da una entrada muy intersante sobre el uso de los logaritmos.

La clase Math de Javascript tiene varias funciones para calcular un logaritmo. Para el logaritmo natural (logaritmo cuya base es el número e, un número irracional cuyo valor aproximado es 2,7182818284590452353602874713527):

//vamos a calcular el logaritmo de 5
var logaritmo = Math.log(5);

¿Y para obtener el logaritmo en base 10?

//vamos a calcular el logaritmo de 5
//pero con base decimal
var logaritmo = Math.log10(5);

¿Y para obtener el logaritmo en base 2?

//vamos a calcular el logaritmo de 5
//pero con base binaria
var logaritmo = Math.log2(5);

¿Y el logaritmo neperiano? Bueno, en lenguaje coloquial suele llamarse logaritmo neperiano al logaritmo natural, pero si nos ponemos precisos son dos conceptos disintos. El logaritmo neperiano, nombrado en honor del matemático John Napier, se calcularía con la fórmula -107*ln(x/-107):

//vamos a calcular el logaritmo neperiano
//de 5.
var logaritmo = Math.pow(-10,7)*Mat.log(5/Math.pow(-10,7))

Como puedes ver los logaritmos neperianos son esencialmente logaritmos naturales con la coma desplazada siete posiciones hacia la derecha y el signo invertido.

Diferencia entre muestra y población.

Población y Muestra son dos términos usados en estudios de estadística, similares y relacionados. Por dicha similitud tienden a ser confundidos, por lo que es importante que sepamos diferenciarlos para no tomar, literalmente, la parte por el todo.

La población, también llamada universo, es un conjunto de elementos sobre los que se realizan estudios y observaciones. Se trata de una variable o magnitud aleatoria con unas determinadas características comunes. Es, en resumen, el conjunto formado por todos los elementos a estudiar. Pero hay casos en los que el total de la población adquiere una magnitud demasiado extensa para ser estudiada. Por ejemplo, si queremos hacer un estudio sobre la salud cardiovascular en la Unión Europea no podemos pretender usa datos de todos los ciudadanos con historiales médicos.

La muestra es una selección abarcable de parte de una población para su estudio. Por definición, la muestra se siempre una parte de la población. Esta debe ser representativa, por lo que el método de selección debe ser adecuado (preferiblemente aleatorio) para evitar acabar teniendo un muestra sesgada que nos de un resultado irreal (decía un catedrático en estadística que un muestreo suficientemente torturado puede demostrar cualquier cosa). Siguiendo el ejemplo anterior, si hacemos el estudio sobre salud cardiovascular eligiendo solo a gente de entre 20 y 30 años y lo repetimos después con gente de más de 70, el resultado obtenido será radicalmente distinto.

Si la selección del muestreo es adecuada el resultado del estudio sobre una muestra será más preciso que al realizarlo sobre el total de la población, dado que trabajamos sobre un conjunto de datos más pequeño y esto nos permitirá minimizar errores.

En resumen: La población es el total de individuos o elementos que queremos estudiar y la muestra es una selección aleatoria de elementos de esa población que utilizaremos para trabajar de forma más precisa.

Diferencia entre media, mediana y moda

La media, la mediana y la moda son términos estadísticos que se usan para la comprensión de tendencias centrales cuando analizamos un conjunto de valores.

La media aritmética o promedio es especialmente útil cuando tratamos con distribuciones regulares. Se calcula mediante la suma de todos los valores observados dividida entre el número de observaciones. Pierde utilidad cuando se trata de distribuciones muy irregulares, con mucha diferencia. El ejemplo clásico de esto: si yo me como un pollo y tú no comes nada la media es que nos hemos comido medio pollo por cabeza.

La mediana es el valor numérico central de un conjunto de números, y es más útil cuando tratamos con distribuciones irregulares. Para su cálculo necesitamos ordenar toda la serie de valores de menor a mayor. Tras esto, en caso de que el número total de valores sea par, la mediana se calcula sacando el promedio de los dos valores centrales. En el caso de que sea una cantidad impar de valores la mediana será directamente el valor central.

Finalmente la moda es la incidencia más repetida en un conjunto de valores. Esto implica que puede haber más de una moda. Es útil cuando lo relevante es conocer el valor más común.

Veamos un ejemplo: imaginemos que tenemos un grupo de cinco amigas y vamos a calcular la media, mediana y moda de sus salarios anuales. Una cobra 12.000 euros, otra 15.000, otra 300.000 y hay dos que cobran 18.000.

La media sería el resultado de (12.000+15.000+300.000+18.000+18.000)/5, que es 72.600 euros. Como ves, al haber un valor tan alejado del resto dispara la media muchísimo.

Para la mediana vamos a ordenar los valores: 12.000|15.000|18.000|18.000|300.000. Al ser impar ya nos quedamos con el valor central, que sería 18.000 euros.

Finalmente para la moda miramos cual es el valor más repetido, que son también 18.000 euros ya que está dos veces en la lista.

Si crees que esto no es útil para el día a día piénsalo mejor, comprender bien estos conceptos nos permite abordar de forma más crítica muchas informaciones económicas que nos dan desde la prensa o desde los gobiernos.

Youtube de calidad: canales con contenidos interesantes (Volumen 2)

 

Hace unas semanas os presentaba una entrada que titulé Youtube de Calidad, donde recomendaba varios canales con contenidos educativos o técnicos. Material que va más allá de lo que la mayoría de canales que solo aportan contenidos irrelevantes. Hoy vamos a ver una segunda entrega de este Youtube de calidad viendo una serie de nuevos canales:

Narraciones de la historia: Realmente los contenidos de este canal serían más adecuados para el formato podcast que para el de Youtube, pues como su nombre indica se trata de una recopilación de narraciones realizadas sobre una imagen fija recogiendo el material de un programa de radio. La filósofa colombiana Diana Uribe, especializada en divulgación histórica, es quien se encarga de realizar estos contenidos. El canal lleva abandonado un par de años, pero Uribe ha seguido activa subiendo sus vídeos al canal Casa De La Historia y en el de Historia del Mundo.

Snag Films: Se trata de una iniciativa veterana que lleva funcionando desde 2008. Snag Films es un sitio web que ofrece documentales y películas independientes respaldados por publicidad. Además del canal de Youtube que os adjunto arriba tienen una web con todavía más material. Hay todo tipo de documentales: naturaleza, deporte, ciencia, literatura, música…

Educatina: Se definen a si mismo como “El Canal de educación más grande de América Latina“. Si bien su plataforma educativa es de pago en su canal de Youtube encontrarás vídeos educativos sobre distintas materias.

Terminal Root: En la entrega anterior algunas personas se quejaron de que hubiera puesto una página con vídeos en portugués (no les indignó que hubiera también alguna con vídeos en inglés, curiosamente). He tomado buena nota de sus quejas, después he impreso dicha nota en papel y la he depositado en el triturador de documentos. Terminal Root es un canal de Youtube brasileño dedicado a Linux, con vídeos en portugués donde podréis encontrar tutoriales prácticos dedicados al sistema operativo del pingüino. También, en su página oficial, ofrecen cursos de Linux.

Lasmatematicas.es: Vamos a acabar con un canal español donde un abnegado profesor de matemáticas ofrece lecciones on-line de esta materia, realizando también emisiones en directo de vez en cuando (por ejemplo, antes de la selectividad para repasar el temario). Útil tanto para estudiantes de la ESO y de Bachillerato como para todo aquel que quiera mejorar sus habilidades con las matemáticas.