PARTIZIONI DI UN INTERO relazione per il laboratorio di combinatorica Daniele P. Morelli 283938 :: Introduzione :: Definiamo partizione di un numero intero positivo n una scomposizione (indipendente dall'ordine) in cui si può esprimere n come somma di interi positivi. Per poter visualizzare una singola partizione di un certo numero in modo immediato, si possono utilizzare i diagrammi di Ferrers, ossia raffigurazioni del tipo seguente OOOO OOO O L'esempio riportato corrisponde alla partizione 8=4+3+1 Ancora a titolo d'esempio, possiamo vedere che le possibili partizioni di 4 sono: 4=1+1+1+1 4=2+1+1 4=2+2 4=3+1 4=4 Indicato con p(n) il numero di partizioni di n, abbiamo qui che p(4)=5. La seguente sequenza (avendo convenzionalmente posto p(0)=1) è data dai primi valori di p(n) per n che va da 0 a 15: 1, 1, 2, 3, 5, 7, 11, 15, 22, 30, 42, 56, 77, 101, 135, 176.... Studieremo dunque tale funzione e, nel farlo, richiameremo anche diverse sue applicazioni e proprietà, nonchè alcuni risultati ottenuti da vari matematici nel corso della storia. La questione di trovare il numero di partizioni di un insieme di oggetti può essere intesa in vari modi. A seconda che si decida di considerare distinguibili gli oggetti e/o le parti in cui si raggruppano tali oggetti, si ottengono problemi diversi. Più in generale il problema può essere quella di partizionare, ad esempio: A - n oggetti indistinguibili in parti indistinguibili; B - n oggetti distinguibili in parti indistinguibili; C - n oggetti indistinguibili in parti distinguibili; D - n oggetti distinguibili in parti distinguibili; E - n oggetti distinguibili in un numero fissato m di parti indistinguibili; etc... Se gli elementi sono distinguibili, parleremo di partizioni “etichettate” (inglese labeled). In questo scritto ci occuperemo principalmente del problema A. I problemi B ed E sono notevoli in quanto danno origine a sequenze “celebri” di numeri interi (interi di Bell e di Stirling). :: Come calcolare p(n) :: Esistono vari algoritmi per calcolare la funzione p(n). Interessante dal punto di vista combinatorico è l'utilizzo di una funzione ausiliaria p'(n,r), che conta il numero di partizioni di n in cui l'addendo maggiore vale r.[1] Possiamo osservare, dal confronto con l'esempio visto in precedenza, che: p ' 4,1=1 p ' 4,2=2 Si noti anche che p ' 4,3=1 p ' 4,4=1 p 4 = 5 = 1211 = p ' 4,1 p ' 4,2 p ' 4,3 p ' 4,4 Costruiamo ora una sorta di funzione ricorsiva che restituisca il valore p(n) per ogni n. Per convenzione, poniamo p'(n,0)=1, e teniamo inoltre conto che risulta p'(n,1)=1 (quest'ultima uguaglianza individua infatti l'unica partizione di n come somma di n addendi unitari). Vogliamo dunque calcolare il generico valore p'(n,r) dove 0≤r ≤n . Teniamo inizialmente conto del fatto che, per definizione della funzione p'(n,r), esiste almeno un addendo di valore r: rimane dunque da calcolare solo la rimanente parte (n-r), tenendo però presente che non dovranno essere considerate le partizioni di n-r con addendi maggiori di r. Questo ci consente di ricondurre il calcolo di p'(n,r) al calcolo dei vari p'(n-r,k) nei quali si abbia 0≤k ≤r . Le formule cercate sono dunque n p n=∑r−1 p ' n , r r p ' n , r =∑k−1 p ' n−r , k La prima formula indica semplicemente che p(n) è data come sommatoria delle varie p'(n,r), come già spiegato. La seconda definisce ricorsivamente il valore della funzione ausiliaria p' seguendo il ragionamento testé descritto. :: Proprietà della funzione p(n) :: Per meglio visualizzare il comportamento della funzione p', possiamo mostrare in un grafico discreto i valori che essa assume al variare dei due argomenti: Sull'asse orizzontale scorre n, su quello verticale r. Una casella vuota è da considerarsi di valore nullo. Stando alla definizione ricorsiva da noi trovata, per calcolare p(n) è sufficiente sommare i valori dell'n-esima colonna. Il valore nelle coordinate (n,r) si calcola sommando gli elementi nella (n-r)-esima colonna, aventi ordinata minore o uguale a r. Questo triangolo, ad un esame approfondito, è molto interessante: le varie righe, considerate partendo da quella più in basso (e lette da sinistra) cominciano da punti diversi, ma convergono all'aumentare di r. La prima riga è una sequenza infinita di uno (per definizione). La seconda linea è la sequenza dei naturali dove ogni termine appare due volte di fila. Appare sempre più evidente una convergenza delle linee verso la forma 1, 2, 3, 5, 7, 11... ossia verso la successione stessa delle partizioni! E' anche possibile vedere che la stessa convergenza si riscontra leggendo le linee dall'alto verso il basso. Possiamo quindi intuire che per ogni n esiste un m0 tale che, per ogni m maggiore di m0, valgono le due relazioni A: p n= p ' nm , n B: p n= p ' m , m−n La dimostrazione della prima proprietà è abbastanza immediata: basta tenere a mente la definizione di p'(n+m,n): il calcolo del valore della 'casella' di coordinate (n+m,n) andrà a sommare i valori della colonna ennesima di ordinata minore di m. Ma se m>n, in tale somma finiranno tutti i valori positivi (gli zeri essendo ininfluenti). La tesi è dunque dimostrata trovando esplicitamente m0 = n . Per brevità ometteremo la verifica della proprietà 'simmetrica' B. Considerando gli elementi posti sulla 'bisettrice' di questo triangolo, vediamo che anche questi coincidono con i termini della successione di partizione. Questa proprietà (che si ricava immediatamente dalla dimostrazione della prima relazione ponendo m=n+1) si traduce nella formula C: pn = p ' 2n1, n :: Applicazioni :: Ricorderemo solo alcune tra le applicazioni in cui si rende necessaria la funzione precedentemente introdotta. Teoria dei gruppi: Un risultato fondamentale in teoria dei gruppi riguarda l'enumerazione dei diversi gruppi abeliani. Partendo dal noto teorema secondo cui il prodotto diretto di due gruppi ciclici di ordine h e k è isomorfo al gruppo ciclico di ordine hּk se e solo se h e k sono primi tra loro, e ricordando che ogni gruppo abeliano è isomorfo ad un prodotto diretto di gruppi ciclici, si giunge abbastanza agilmente ad una comoda formula per l'enumerazione delle classi di isomorfismo di gruppi abeliani di ordine n. Si consideri la fattorizzazione n = a1b1 a2b2 .... asbs , dove i vari ai sono primi distinti. Allora il numero di gruppi abeliani non isomorfi di ordine n è dato dal prodotto delle partizioni degli esponenti bi. Ad esempio, 432=24ּ33 , e risulta p(4)ּp(3) = 5ּ3 = 15, dunque ci sono 15 gruppi abeliani non isomorfi di ordine 432. Non è invece nota alcuna regola efficiente per trovare il numero delle classi di isomorfismo dei gruppi (non necessariamente abeliani) di un certo ordine. Analisi Matematica: Una notevole formula, trovata da Francesco Faà di Bruno, descrive lo sviluppo dell'n-esima derivata di una composizione di funzioni. Per semplicità limitiamoci ad esaminare il caso per n=4. (f(g(x))'''' = + + + + f''''(g(x)) g'(x)4 6 f'''(g(x)) g''(x) g'(x)2 3 f''(g(x)) g''(x)2 4 f''(g(x)) g'''(x) g'(x) f'(g(x)) g''''(x) Prendiamo in esame i fattori all'esterno della funzione f: g'(x)4 corrisponde alla partizione 1+1+1+1, g''(x) g'(x)2 alla partizione 2+1+1, eccetera. I coefficienti numerici sono invece collegati al numero di possibili “etichettature” delle relative partizioni: ad esempio il coefficiente 6 che compare nel secondo addendo è collegato al fatto che vi sono 6 possibili partizioni “etichettate” di un insieme {a,b,c,d} di 4 elementi aventi la forma (2+1+1): {a,b} {c} {d} {a,d} {b} {c} {b,d} {a} {c} {a,c} {b} {d} {b,c} {a} {d} {c,d} {a} {b} Teoria dei numeri: Si deve a Leonard Euler (Eulero) il sorprendente risultato: p n= p n−1 pn−2 p n−5 – p n−7.... Oppure, più formalmente: p n=∑ −1i−1 p n−qi dove la sommatoria scorre su tutti i valori interi di i (anche negativi) e dove qi indica l'i-esimo numero pentagonale generalizzato. Si ponga p(0)=1 e p(n)=0 per n negativo. I numeri pentagonali sono interi positivi rappresentabili in forma pentagonale. La formula generica è n= ½ k (3k-1) per valori positivi di k. Ammettendo anche valori di k negativi si ottengono i numeri pentagonali generalizzati. Il teorema di Eulero nella sua forma più nota prova che (quando si ha convergenza) 1−x 1−x 2 1−x 3 ....=1− x−x 2 x 5x 7− x12.... dove gli esponenti nel membro a destra dell'uguale sono numeri pentagonali generalizzati, e dove i segni si alternano - - + + - - + + etc. A partire da questo risultato è possibile provare la formula di Eulero per la funzione di partizione sopra riportata. Effettivamente, si può dare una interpretazione combinatorica al teorema di Eulero in termini di partizioni di un certo intero, prendendo in esame la differenza tra il numero di partizioni aventi pari parti distinte, e il numero di partizioni aventi dispari parti distinte. Volendo fare un esempio, il coefficiente di x5 è +1, poiché vi sono due modi di partizionare 5 in un numero pari di parti distinte (5=1+4 e 5=2+3) e un solo modo per partizionare 5 in un numero dispari di parti distinte (5=5). Visto tale sorprendente risultato, soffermiamoci su un veloce e intuitivo approfondimento: esiste un modo per calcolare questa differenza? Poiché vogliamo considerare solo partizioni composte da parti distinte, possiamo introdurre una operazione 1-aria su tali particolari partizioni. L'operazione consiste nello spostare l'ultima “diagonale” del diagramma di Ferrers in una nuova riga, come nell'esempio seguente: OOOOOOO OOOOOO OOOO OOO diventa OOOOOO OOOOO OOOO OOO OO Nel caso più comune, compiendo l'operazione inversa (spostando l'ultima riga in una nuova diagonale), si torna al punto di partenza. Questa operazione cambia la parità della partizione. Sia a il numero di elementi della diagonale, e b il numero di elementi nell'ultima riga. Poiché il risultato di Eulero prende in considerazione solo la differenza tra numero di partizioni (in parti distinte) pari e dispari, le coppie di partizioni riconducibili l'una all'altra attraverso l'operazione descritta possono essere eliminate dal conteggio. Rimane da considerare solo l'insieme delle particolari partizioni “patologiche” sulle quali tale operazione non può essere compiuta. Questo caso si presenta se solo se: a=b, e vi è un elemento in comune tra la diagonale e l'ultima riga. OOOOO OOOO OOO b=a+1, e vi è un elemento in comune tra la diagonale e l'ultima riga. OOOOOO OOOOO OOOO In entrambi i casi, il grafico di Ferrers è composto da righe ognuna delle quali è di lunghezza minore di uno rispetto alla precedente. Inoltre, compiere l'operazione di scambio porta a risultati non accettabili (le parti cessano di essere distinte, oppure la parità non cambia). Si dimostra che gli unici interi per i quali esiste una partizione “patologica” del tipo descritto (e qui sopra esemplificato) sono i numeri pentagonali generalizzati. Osservando questi diagrammi di Ferrers, possiamo in effetti trovare uno dei due seguenti risultati, a seconda del caso. n=bb1b2..... 2b−1 n=bb1b2..... 2b−2 In entrambi i risultati, la somma a destra dell'uguale può essere portata ad assumere le sembianze della succitata formula per i numeri triangolari generalizzati. :: Funzione Generatrice per p(n) :: Possiamo definire intuitivamente una funzione generatrice di una certa successione infinita di numeri come una funzione sviluppabile in un “polinomio” di grado infinito. In altre parole, la sequenza di numeri che interessa può essere codificata in termini di una serie formale di potenze, i cui coefficienti corrispondono ai singoli elementi della successione. La funzione generatrice della sequenza p(n) è il reciproco della funzione di Eulero: ∞ ∞ 1 ∑n=0 p n x n=∏k=0 1−x k Il secondo membro è sviluppabile nel seguente prodotto: 1x x 2x 3....1x 2x 4 x 6...1x 3x 6 x 8....... Sebbene questo sia un prodotto contenente infiniti fattori (ognuno contenente infiniti addendi), è possibile ricavarne una serie di potenze calcolando il coefficiente del termine ennesimo xn , grazie al fatto che da un certo punto in poi vi sono solo fattori unitari che possono essere ignorati. Questi coefficienti risultano proprio essere i valori di p(n). Ad esempio, il coefficiente di x4 è 5: infatti vi sono cinque modi di ottenere x4 ”scegliendo” un addendo per ogni fattore: x4ּ1ּ1ּ1ּ1ּ...... xּ1ּx3ּ1ּ1ּ...... x2ּx2ּ1ּ1ּ1ּ...... 1ּx4ּ1ּ1ּ1ּ1ּ..... 1ּ1ּ1ּx4ּ1ּ1ּ1...... :: Algoritmo per il calcolo di p(n) :: Il seguente programma (scritto in C++) mette in pratica il metodo utilizzato all'inizio di questa relazione per il calcolo di p(n).[2] #include <iostream.h> #include <stdlib.h> #include <stdio.h> double min (double n, double r) { if (n>=r) return r; else return n; } double partmax (double n, double r) { if (r>n) {cout << "error: the upper limit can't be greater than n"; return 0;} double sol,i; sol=0; if (r==n) { return 1; } if (r==1) { return 1; } for(i=1; i<=min(n-r,r); i++) { sol = sol + partmax(n-r,i) } return sol; } ; int main() { double r; double n; double sol; double temp; cout << "insert your number"; cout << endl; cin >> n; sol=0; for(r=1; r<=n; r++) { temp=partmax(n,r); cout << "p'("; cout << n; cout << ","; cout << r; cout << ") = "; cout << temp; cout << endl; sol+=temp; } cout << endl; cout << "p("; cout << n; cout << ") = "; cout << sol; cout << endl; system("PAUSE"); return 0; } :: Note :: [1] – E' possibile interpretare il problema in maniere diverse, ad esempio considerando una differente funzione intermedia p''(n,r), dove le singole parti sono maggiori o uguali a r.. L'articolo sulle partizioni della sezione inglese di Wikipedia utilizza questo approccio alternativo. [2] – Questo algoritmo non costruisce alcuna matrice di valori di p'(n,r): questo significa che per calcolare la funzione partizione di un certo numero, il programma calcola ogni volta tutti i valori necessari di p(n,r). E' possibile (e molto consigliabile, soprattutto se si desidera modificare il programma in modo da fargli calcolare tutti i valori di p(n) per n da 1 a un valore M precedente fissato) implementare una procedura che 'prenda nota', in una matrice, dei valori di p'(n,r) nel momento in cui vengono calcolati: in questo modo è possibile far riferimento direttamente alla matrice nel caso un certo valore di p'(n,r) sia già stato trovato in precedenza.