Calcolatore Resto della Divisione e Funzione di Eulero
Guida Completa al Calcolo del Resto della Divisione e della Funzione di Eulero
La matematica discreta offre strumenti fondamentali per la crittografia, la teoria dei numeri e l’informatica teorica. Tra questi, il resto della divisione (operatore modulo) e la funzione di Eulero φ(n) giocano ruoli chiave. Questa guida esplora entrambi i concetti con esempi pratici, applicazioni reali e una spiegazione dettagliata degli algoritmi sottostanti.
1. Resto della Divisione (Operatore Modulo)
L’operatore modulo, indicato con a mod b, restituisce il resto della divisione intera di a per b. Formalmente:
a = b × q + r, dove 0 ≤ r < b
Dove q è il quoziente e r è il resto.
Proprietà Fondamentali:
- Distributività: (a + b) mod m = [(a mod m) + (b mod m)] mod m
- Compatibilità con la moltiplicazione: (a × b) mod m = [(a mod m) × (b mod m)] mod m
- Periodicità: a mod m produce sempre un risultato in [0, m-1]
Applicazioni Pratiche:
- Crittografia: Usato in algoritmi come RSA per generare chiavi pubbliche/private.
- Hashing: Le funzioni hash spesso utilizzano l’operatore modulo per distribuire uniformemente i valori.
- Generazione di numeri pseudo-casuali: Gli algoritmi LCG (Linear Congruential Generators) si basano su operazioni modulo.
| Linguaggio | Sintassi | Comportamento con numeri negativi | Esempio: -5 mod 3 |
|---|---|---|---|
| Python | a % b |
Segue il segno del divisore | 1 (corretto matematicamente) |
| JavaScript | a % b |
Segue il segno del dividendo | -2 (non corretto) |
| Java | a % b |
Segue il segno del dividendo | -2 |
| Matematica | a mod b |
Sempre non negativo | 1 |
2. Funzione di Eulero φ(n)
La funzione totiente di Eulero, φ(n), conta il numero di interi positivi fino a n che sono coprimi con n (ovvero il loro MCD con n è 1). Questa funzione è cruciale in:
- Teorema di Eulero: Se
aensono coprimi, alloraaφ(n) ≡ 1 mod n - Algoritmo RSA: La sicurezza si basa sulla difficoltà di fattorizzare
n = p × qdove φ(n) = (p-1)(q-1) - Teoria dei gruppi: φ(n) rappresenta l’ordine del gruppo moltiplicativo degli interi modulo n
Formula per φ(n):
Se la fattorizzazione in primi di n è:
n = p1k₁ × p2k₂ × … × pmkₘ
Allora:
φ(n) = n × (1 – 1/p1) × (1 – 1/p2) × … × (1 – 1/pm)
| n | φ(n) | Fattorizzazione | Numeri coprimi ≤ n |
|---|---|---|---|
| 1 | 1 | 1 | {1} |
| 2 | 1 | 2 | {1} |
| 3 | 2 | 3 | {1, 2} |
| 4 | 2 | 2² | {1, 3} |
| 5 | 4 | 5 | {1, 2, 3, 4} |
| 6 | 2 | 2 × 3 | {1, 5} |
| 7 | 6 | 7 | {1, 2, 3, 4, 5, 6} |
| 8 | 4 | 2³ | {1, 3, 5, 7} |
| 9 | 6 | 3² | {1, 2, 4, 5, 7, 8} |
| 10 | 4 | 2 × 5 | {1, 3, 7, 9} |
| 11 | 10 | 11 | {1, 2, …, 10} |
| 12 | 4 | 2² × 3 | {1, 5, 7, 11} |
| 13 | 12 | 13 | {1, 2, …, 12} |
| 14 | 6 | 2 × 7 | {1, 3, 5, 9, 11, 13} |
| 15 | 8 | 3 × 5 | {1, 2, 4, 7, 8, 11, 13, 14} |
| 16 | 8 | 2⁴ | {1, 3, 5, 7, 9, 11, 13, 15} |
| 17 | 16 | 17 | {1, 2, …, 16} |
| 18 | 6 | 2 × 3² | {1, 5, 7, 11, 13, 17} |
| 19 | 18 | 19 | {1, 2, …, 18} |
| 20 | 8 | 2² × 5 | {1, 3, 7, 9, 11, 13, 17, 19} |
3. Relazione tra Modulo e Funzione di Eulero
Il Piccolo Teorema di Fermat (caso speciale del Teorema di Eulero) afferma che per un primo p:
ap-1 ≡ 1 mod p, se p non divide a
Questo è generalizzato dal Teorema di Eulero:
aφ(n) ≡ 1 mod n, se MCD(a, n) = 1
Questa relazione è alla base:
- Della generazione di chiavi in RSA (dove
d ≡ e-1 mod φ(n)) - Dei test di primalità probabilistici (come il test di Miller-Rabin)
- Della crittografia a curva ellittica (ECC)
4. Algoritmi Efficienti per il Calcolo
Calcolo del Modulo:
L’operazione modulo è nativa nella maggior parte dei linguaggi, ma per numeri molto grandi (centinaia di cifre) si utilizzano:
- Algoritmo di divisione binaria: O(n²) per numeri a n bit
- Algoritmo di Barrett: Ottimizzazione per divisioni ripetute con lo stesso divisore
- Algoritmo di Montgomery: Usato in crittografia per operazioni modulo senza divisioni costose
Calcolo di φ(n):
Per calcolare φ(n) efficientemente:
- Fattorizzare
nin primi:n = p₁^k₁ × ... × p_m^k_m - Applicare la formula:
φ(n) = n × Π (1 - 1/p_i)
La complessità dipende dall’algoritmo di fattorizzazione:
- Trial division: O(√n) nel caso peggiore
- Pollard’s Rho: O(n^(1/4)) per fattori non banali
- Quadratic Sieve: Sub-esponenziale, usato per numeri > 100 cifre
5. Applicazioni Avanzate
Crittografia RSA:
Nel sistema RSA:
- Scegli due primi grandi
peq - Calcola
n = p × qeφ(n) = (p-1)(q-1) - Scegli
ecoprimo conφ(n)(tipicamente 65537) - Calcola
d ≡ e-1 mod φ(n)usando l’algoritmo esteso di Euclide - La chiave pubblica è
(e, n), quella privata(d, n)
La sicurezza si basa sulla difficoltà di:
- Fattorizzare
n(problema RSA) - Calcolare φ(n) senza conoscere
peq - Risolvere
c ≡ me mod nperm(testo in chiaro)
Generatori Pseudo-Casuali:
Gli LCG (Linear Congruential Generators) usano:
Xn+1 = (a × Xn + c) mod m
Dove:
mè il modulo (spesso 232 o 264)aè il moltiplicatore (scelto con cura per massimizzare il periodo)cè l’incremento (spesso 0)X₀è il seed
Il periodo massimo è m se:
cemsono coprimia ≡ 1 mod pper ogni primopche dividem- Se
mè una potenza di 2,a ≡ 3 or 5 mod 8
6. Errori Comuni e Best Practices
Errori nel Calcolo del Modulo:
- Segno sbagliato: In JavaScript,
-5 % 3restituisce-2invece di1. Soluzione:function mod(a, b) { return ((a % b) + b) % b; } - Overflow: Con numeri grandi, usare librerie come BigInt in JavaScript o
gmpin Python. - Divisione per zero: Sempre verificare che
b ≠ 0.
Errori nel Calcolo di φ(n):
- Fattorizzazione incompleta: Dimenticare un fattore primo porta a un φ(n) errato. Usare algoritmi deterministici per numeri < 264.
- Numeri non primi: Applicare erroneamente
φ(p) = p-1a numeri composti. - Potenza di primi: Dimenticare di applicare
φ(p^k) = p^k - p^(k-1).
Best Practices:
- Per φ(n), usare la fattorizzazione in primi con algoritmi efficienti (es. Pollard’s Rho per numeri > 1018).
- Per operazioni modulo con numeri grandi, preferire librerie specializzate (es.
bn.jsin JavaScript). - In crittografia, usare sempre primi “forti” (es. primi sicuri dove
p = 2q + 1conqprimo). - Validare sempre gli input per evitare eccezioni (es. divisione per zero).