Skip to content

Instantly share code, notes, and snippets.

@marcofarina
Last active April 22, 2023 22:25
Show Gist options
  • Select an option

  • Save marcofarina/f91214b7dc401a647f750f1037859a80 to your computer and use it in GitHub Desktop.

Select an option

Save marcofarina/f91214b7dc401a647f750f1037859a80 to your computer and use it in GitHub Desktop.
Verifica dell'entropia di due file di testo
import random
import string
import zipfile
import os
import math
# Definisci la dimensione del file in byte
file_size = 1024 * 1024 # 1MB
# Genera una stringa di caratteri ASCII stampabili casuali
characters = string.ascii_letters + string.digits + string.punctuation
random_string = ''.join(random.choice(characters) for _ in range(file_size))
# Scrivi la stringa in un file di testo
with open('random.txt', 'w') as f:
f.write(random_string)
# Calcola l'entropia del primo file di testo
char_count = dict.fromkeys(characters, 0)
for char in random_string:
char_count[char] += 1
entropy = -sum((count / file_size) * math.log(count / file_size, 2) for count in char_count.values() if count)
# Crea una stringa di soli caratteri 'a'
a_string = 'a' * file_size
# Scrivi la stringa in un secondo file di testo
with open('just_a.txt', 'w') as f:
f.write(a_string)
# Calcola l'entropia del secondo file di testo
char_count = dict.fromkeys(characters, 0)
for char in a_string:
char_count[char] += 1
entropy2 = -sum((count / file_size) * math.log(count / file_size, 2) for count in char_count.values() if count)
# Crea un archivio zip contenente il primo file di testo
with zipfile.ZipFile('random.zip', 'w', compression=zipfile.ZIP_DEFLATED) as myzip:
myzip.write('file.txt')
# Crea un secondo archivio zip contenente il secondo file di testo
with zipfile.ZipFile('just_a.zip', 'w', compression=zipfile.ZIP_DEFLATED) as myzip:
myzip.write('just_a.txt')
# Calcola la percentuale di compressione per entrambi i file
original_size = file_size
compressed_size = os.path.getsize('random.zip')
compression_percent = (1 - (compressed_size / original_size)) * 100
original_size2 = file_size
compressed_size2 = os.path.getsize('just_a.zip')
compression_percent2 = (1 - (compressed_size2 / original_size2)) * 100
expected_entropy = math.log(94)/math.log(2)
# Stampa le dimensioni dei file originali e compressi, le entropie dei file e la percentuale di compressione
print("Numero di simboli presenti nell'insieme:", len(characters))
print(f"Dimensione del file 'random.txt' originale: {original_size} byte")
print(f"Dimensione del file 'random.zip' compresso: {compressed_size} byte")
print(f"Entropia attesa: H=log(𝝨)/log(2)={expected_entropy} bit")
print(f"Entropia misurata del file 'random.txt': {entropy:.10f} bit")
print(f"Percentuale di compressione del file 'random.txt': {compression_percent:.2f}%\n")
print(f"Dimensione del file 'just_a.txt' originale: {original_size2} byte")
print(f"Dimensione del file 'just_a.zip' compresso: {compressed_size2} byte")
print(f"Entropia del file 'just_a.txt': {entropy2:.4f}")
print(f"Percentuale di compressione del file 'just_a.txt': {compression_percent2:.2f}%\n")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment