QR Code e Correzione degli Errori: Come Funzionano i Codici Reed-Solomon

Algoritmi e programmazione
Liceo , Tecnico

I QR code (da Quick Response code) sono un tipo di codice a barre bidimensionale inventato nel 1994 dalla società giapponese Denso Wave. A differenza dei codici a barre tradizionali (quelli con le linee verticali), il QR code usa quadrati neri e bianchi disposti su una griglia e può contenere molte più informazioni, essere letto da qualsiasi angolazione, resistere a graffi e danni grazie alla correzione degli errori e poter memorizzare URL, testi, contatti o pagamenti.
Rispetto ai codici a barre hanno però dimensioni maggiori, necessitano di scanner o smartphone moderni, la stampa è più complessa e la lettura meno veloce in applicazioni ad alto volume (come le casse dei supermercati o i magazzini).
 

Come funziona un QR code

Un QR code codifica informazioni trasformandole in bit, cioè sequenze di 0 e 1.
Il processo è questo:

1. Codifica dei dati
Il contenuto (es. un link) viene convertito in codice binario.

2. Organizzazione nella griglia
I bit vengono distribuiti nei piccoli quadratini bianchi e neri.

3. Elementi di orientamento
Tre grandi quadrati agli angoli aiutano lo scanner a capire:

  • dove si trova il codice
  • come è orientato
  • la dimensione della griglia 

4. Lettura con una fotocamera
Quando lo scanner (per esempio la fotocamera dello smartphone) legge il QR code:

  • riconosce i quadrati di riferimento
  • ricostruisce la griglia
  • traduce i quadratini in dati digitali
  • mostra il contenuto (per esempio apre un sito).

Perché funzionano anche se rovinati?

Una delle caratteristiche più interessanti è la correzione degli errori.
I QR code usano un sistema matematico chiamato codice di correzione (in particolare basato sull’algoritmo Reed-Solomon error correction).
Questo significa che:

  • una parte dei dati è ridondante
  • il sistema può ricostruire le parti mancanti

A seconda del livello di correzione scelto, il QR code può essere letto anche se fino al 30% dell’immagine è danneggiata.
È per questo che:

  • funzionano anche se sono graffiati
  • si leggono anche se un po’ sporchi
  • a volte funzionano anche se coperti parzialmente.

Generare QR Code

Generare un QR code oggi è molto semplice e ci sono diversi modi, sia online che con programmi o linguaggi di programmazione. Un sito che offre gratuitamente un servizio di base è ad esempio https://www.qr-code-generator.com/

Attività pratica n.1

Quanto puoi rovinare un QR code prima che smetta di funzionare?

Obiettivo
Dimostrare che i QR code contengono ridondanza e sistemi di correzione degli errori. È un esperimento molto semplice e sorprendente da fare in classe per mostrare perché i QR code funzionano anche se sono rovinati. Gli studenti lo capiscono subito perché lo vedono succedere davvero. È possibile utilizzare un qualsiasi QR code esistente o generato dagli studenti.

1. Test iniziale
Gli studenti scansionano il QR code. Funziona normalmente.

2. Primo danneggiamento
Coprire una piccola parte del QR code (usare un pennarello se stampato o modificare l’immagine). Qui il QRCode di hubscuola.it in cui sono state alterate due parti una in nero e una in bianco.

Chiedi alla classe: “Secondo voi funziona ancora?”
Gli studenti lo scannerizzano. Di solito funziona ancora.

3. Danneggiamento maggiore
Colora una zona del codice oppure copri 10-20% della superficie. Qui il QRCode di hubscuola.it in cui, oltre al danno precedente, sono stati colorati dei punti e aggiunto un ulteriore deterioramento in rosso.

Scansione di nuovo. Spesso funziona ancora.

4. Sfida finale
Chiedi agli studenti di:

  • coprire sempre più parti
  • testare quando smette di funzionare.

Diventa quasi un gioco scientifico.

Discussione con la classe
Fai riflettere su due idee chiave:

1. Ridondanza
Il QR code non contiene solo i dati essenziali: contiene anche informazioni extra per correggere gli errori.
2. Ricostruzione matematica
Lo scanner può ricostruire parti mancanti grazie a tecniche matematiche di correzione degli errori come quelle usate nei sistemi digitali.

Molto stimolante:
“Perché secondo voi i tre grandi quadrati del QR code non possono essere coperti?”
Gli studenti scoprono che servono per orientamento e riconoscimento del codice.

Trucco didattico divertente:
puoi anche stampare un QR code e incollarci sopra un piccolo logo o disegno al centro. Spesso continua a funzionare. È il motivo per cui molti QR code pubblicitari hanno loghi dentro.

Codici Reed-Solomon

L’algoritmo di Reed-Solomon error correction è un metodo matematico usato per ricostruire dati che sono stati danneggiati o persi durante una trasmissione o una lettura. È proprio uno dei sistemi che permette ai QR code di funzionare anche se sono graffiati o parzialmente coperti.

Il metodo di Reed-Solomon error correction è molto utilizzato anche in altre situazioni come ad esempio: CD e DVD, trasmissioni satellitari, memorie digitali, ecc. Serve ovunque i dati possano rovinarsi durante la trasmissione e non è possibile o conveniente la loro ritrasmissione.

Vediamo un piccolo esempio reale di come funziona l’idea matematica dietro a Reed-Solomon error correction usando Python.
Non sarà una libreria completa (quelle usate nei QR code sono molto più complesse), ma mostra il principio matematico fondamentale: ricostruire i dati usando un polinomio anche se alcuni punti sono sbagliati o mancanti.

L’idea alla base dell’algoritmo è questa:

1. si rappresenta il messaggio come coefficiente di un polinomio
2. si calcolano alcuni punti della curva (ridondanza), più di quelli necessari a definire il polinomio
3. se alcuni punti si perdono, si ricostruisce il polinomioa partire dai punti rimanenti.

Attività pratica n. 2

Esempio algoritmo Reed-Solomon semplificato in Python

Supponiamo che il messaggio sia rappresentato da questo polinomio:


P(x)=x2+3x+2

Ora calcoliamo alcuni punti della curva.

import numpy as np

# polinomio: P(x) = 2 + 3x + x^2
def P(x):
    return 2 + 3*x + x**2

# punti trasmessi (ridondanza)
x_values = [0,1,2,3,4]
y_values = [P(x) for x in x_values]

print("Punti trasmessi:")
for x,y in zip(x_values,y_values):
    print(x,y)

Output tipico:

Punti trasmessi:
0 2
1 6
2 12
3 20
4 30


Questi sono i dati inviati.
Immaginiamo che durante la trasmissione un punto si rovini. Ora i dati ricevuti sono:

[2, 6, 999, 20, 30]


Usiamo solo alcuni punti corretti per ricostruire il polinomio originale (ne servono almeno N+1 per ricostruire perfettamente un polinomio di grado N).

import numpy as np

# prendiamo solo 3 punti corretti
x_sample = [0,1,3]
y_sample = [2,6,20]

coeff = np.polyfit(x_sample, y_sample, 2)

print("Coefficienti ricostruiti:", coeff)

Output:

Coefficienti ricostruiti: [1. 3. 2.]


che corrisponde a

x2+3x+2

cioè il polinomio originale.

Come facciamo a sapere quali sono i punti errati da scartare?

Questa è la parte davvero geniale dell’algoritmo Reed-Solomon error correction: non solo ricostruisce i dati, ma riesce anche a capire dove sono gli errori.

Quando il sistema riceve i dati, fa una verifica matematica. Prende la sequenza ricevuta e la inserisce in alcune equazioni di controllo. I risultati di questi controlli si chiamano sindromi.

Se tutte le sindromi sono uguali a 0 non c’è nessun errore, se alcune sindromi sono ≠ 0 ci sono errori nei dati. È come fare un controllo ortografico matematico.

Se le sindromi indicano che ci sono errori, l’algoritmo costruisce una funzione speciale chiamata polinomio localizzatore degli errori.

Questo polinomio ha una proprietà particolare: le sue radici indicano esattamente le posizioni degli errori. Per trovare queste radici si usa una procedura chiamata ricerca di Chien (Chien search). In pratica il computer prova i possibili valori finché trova dove il polinomio diventa zero. Quando succede: quella posizione è un errore.

Indice

Stampa Articolo