Ir al contenido principal

Criptografía (CCLVII): Cálculo de la Entropía (H) en Excel

Ya puse una entrada con un script en python para calcular la Entropía (H) de un texto, y en ésta pongo el código Visual Basic para aplicaciones (VBA) para automatizar en Excel esa misma tarea.

Antes de poner el código y un ejemplo de su funcionamiento, recordar qué es y cómo se calcula.

la Entropía (H) mide la incertidumbre de una fuente de información y puede ser considerada como la cantidad de información promedio que contienen los símbolos usados.

Donde:
H: Entropía.
M: mensaje o texto.
mi: carácter i-ésimo del mensaje o texto.
p(mi): probabilidad de aparición del carácter i-ésimo en el mensaje o texto.
n: número de caracteres o tamaño del mensaje o texto.

El código es el siguiente:

' ENTROPÍA (H):
'
' Cálculo de la Entropía (H) de un texto.
'
' http://mikelgarcialarragan.blogspot.com/

Option Explicit
Public TEXTO As Range
Public H As Range
Public Sub Calcular_H()
    Dim Alfabeto As String
    Dim Caracter As Integer
    Dim FrecuenciasRelativas As New Collection, FrecuenciaRelativa As Variant
    Dim H As Double

    Alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Range("TEXTO").Value = A_Z(UCase(Replace(Range("TEXTO").Value, " ", "")))
    
    If Len(Range("TEXTO").Value) = 0 Then
        MsgBox "Introduzca el texto del que se desea calcular la Entropía (H). Sólo caracteres alfabéticos [A-Z], 'Ñ' excluida.", vbOKOnly + vbCritical, "¡Error!"
    Else
        For Caracter = 1 To Len(Alfabeto)
            If Len(Range("TEXTO").Value) - Len(Replace(Range("TEXTO").Value, Mid(Alfabeto, Caracter, 1), "")) <> 0 Then
                FrecuenciasRelativas.Add Len(Range("TEXTO").Value) - Len(Replace(Range("TEXTO").Value, Mid(Alfabeto, Caracter, 1), ""))
            Else
                FrecuenciasRelativas.Add 0
            End If
        Next
        H = 0
        For Each FrecuenciaRelativa In FrecuenciasRelativas
            If FrecuenciaRelativa <> 0 Then
                H = H + FrecuenciaRelativa / Len(Range("TEXTO").Value) * Log(Len(Range("TEXTO").Value) / FrecuenciaRelativa) / Log(2)
            End If
        Next
        Range("H").Value = H
    End If

End Sub
Function A_Z(Cadena As String) As String
    Dim Caracter As Integer

    For Caracter = 1 To Len(Cadena)
        Select Case Asc(Mid(Cadena, Caracter, 1))
            Case 65 To 90:
                A_Z = A_Z & Mid(Cadena, Caracter, 1)
        End Select
    Next

End Function


Ejemplo de funcionamiento:

Quizás también te interese:

Comentarios

Entradas populares de este blog

Criptografía (I): cifrado Vigenère y criptoanálisis Kasiski

Hace unos días mi amigo Iñaki Regidor ( @Inaki_Regidor ), a quien dedico esta entrada :), compartió en las redes sociales un post titulado "Criptografía: el arte de esconder mensajes"  publicado en uno de los blogs de EiTB . En ese post se explican ciertos métodos clásicos para cifrar mensajes , entre ellos el cifrado de Vigenère , y , al final del mismo, se propone un reto consistente en descifrar un mensaje , lo que me ha animado a escribir este post sobre el método Kasiski  para atacar un cifrado polialfabético ( conociendo la clave descifrar el mensaje es muy fácil, pero lo que contaré en este post es la forma de hacerlo sin saberla ). El mensaje a descifrar es el siguiente: LNUDVMUYRMUDVLLPXAFZUEFAIOVWVMUOVMUEVMUEZCUDVSYWCIVCFGUCUNYCGALLGRCYTIJTRNNPJQOPJEMZITYLIAYYKRYEFDUDCAMAVRMZEAMBLEXPJCCQIEHPJTYXVNMLAEZTIMUOFRUFC Como ya he dicho el método de Vigenère es un sistema de sustitución polialfabético , lo que significa que, al contrario que en un sistema...

¿Qué significa el emblema de la profesión informática? (I)

Todas o muchas profesiones tienen un emblema que las representa simbólicamente y en el caso de la  informática: " es el establecido en la resolución de 11 de noviembre de 1977  para las titulaciones universitarias superiores de informática, y  está constituido por una figura representando en su parte central  un  núcleo toroidal de ferrita , atravesado por  hilos de lectura,  escritura e inhibición . El núcleo está rodeado por  dos ramas : una  de  laurel , como símbolo de recompensa, y la otra, de  olivo , como  símbolo de sabiduría. La  corona  será la  de la casa real  española,  y bajo el escudo se inscribirá el acrónimo de la organización. ". Veamos los diferentes elementos tomando como ejemplo el emblema del COIIE/EIIEO (Colegio Oficial de Ingenieros en Informática del País Vasco/ Euskadiko Informatikako Ingeniarien Elkargo Ofiziala ) . Pero no sólo el COIIE/EIIEO adopta el emblem...

Los cuadrados mágicos de El Pueyo de Jaca

Hace poco he pasado unos días en   El Pueyo de Jaca ; un precioso pueblo del pirineo oscense en pleno valle de Tena, en la comarca aragonesa del Alto Gállego. Un valle que es  una verdadera joya en lo que se refiere a sus pueblos (el propio El Pueyo de Jaca, Panticosa, Tramacastilla,...) y a sus parajes naturales (montañas, bosques, ibones, ríos,...),  y  un sitio ideal para practicar senderismo , montañismo, bicicleta de montaña, escalada, etc., sin olvidarme de la gastronomía tensina (migas con uvas, patatas encebolladas,...). El Pueyo de Jaca. Pero no escribo esta entrada para alabar los maravillosos paisajes y otros muchos encantos de este lugar, sino porque antes de ir, un amigo mío, sabiendo que soy un poco o bastante  'freaky'  (yo diría que muy)  y me gustan temas como la criptografía, el simbolismo, etc., me comento que  en El Pueyo de Jaca hay una fachada decorada con hasta 10   cuadrados mágicos . Posiblemente, el cuadrado má...