Last active
April 22, 2023 22:25
-
-
Save marcofarina/f91214b7dc401a647f750f1037859a80 to your computer and use it in GitHub Desktop.
Verifica dell'entropia di due file di testo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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