Disposizioni semplici (senza ripetizioni) con Excel

posted Mar 22, 2011, 6:28 AM by r   [ updated Feb 11, 2013, 12:49 AM ]
Ho già trattato in altri articoli molti casi del calcolo combinatorio, in particolare avevo già risolto lo sviluppo delle disposizioni semplici senza ripetizioni. La soluzione, però, usava una colonna di appoggio.
Oggi propongo una formula senza colonna di appoggio e che estrae le disposizioni semplici direttamente dalle disposizioni con ripetizioni limitando così il consumo di righe.

Vediamo intanto la definizione:
[...]
Una disposizione semplice di lunghezza k di elementi di un insieme di n oggetti, con k ≤ n, è una presentazione ordinata di k elementi nella quale non si possono avere ripetizioni di uno stesso oggetto.
Ad esempio le disposizioni semplici di lunghezza 2 degli elementi dell'insieme {1,2,3,4,5} sono 5!/(5-2)! = 5!/3! = 120/6 = 20: 12, 13, 14, 15, 21, 23, 24, 25, 31, 32, 34, 35, 41, 42, 43, 45, 51, 52, 53, 54.
Si osserva che le permutazioni sono casi particolari delle disposizioni semplici: le permutazioni di un insieme di n oggetti sono le disposizioni semplici di tali oggetti di lunghezza n.
[...] da
Wikipedia
 


La logica usata nella formula è molto semplice, date le disposizioni con ripetizione si effettuano queste operazioni:
...
121-> 10^1+10^2+10^1 -> 120
122-> 10^1+10^2+10^2 -> 210
123-> 10^1+10^2+10^3 -> 1110
124-> 10^1+10^2+10^4 -> 10110
 
ora basta nei risultati sostituire gli 0 con "" e verificare che il risultato sia uguale a "111" ovvero RIPETI(1;k)

Per comodità definiamo due nomi k e n corrispondenti alle celle dove inseriremo rispettivamente il numero di oggetti della sequenza (k) e il numero dei diversi oggetti presenti nell'insieme (n) [Come nell'esempio del file posizionarsi in A5 e digitare k nella casella del nome, posizionarsi in B5 e digitare n nella casella del nome].

La formula da confermare come matriciale con Ctrl+Maiusc+Invio può essere scritta ovunque nel foglio e poi trascinata verso il basso:

=PICCOLO(SE(SOSTITUISCI(MATR.PRODOTTO(10^(1+RESTO(INT((RIF.RIGA(SCARTO($A$1;;;n^k))-1)/(n^(RIF.COLONNA(SCARTO($A$1;;;;k))-1)));n));RIF.RIGA(SCARTO($A$1;;;k))^0);0;"")=RIPETI(1;k);MATR.PRODOTTO(1+RESTO(INT((RIF.RIGA(SCARTO($A$1;;;n^k))-1)/(n^(RIF.COLONNA(SCARTO($A$1;;;;k))-1)));n);10^(RIF.RIGA(SCARTO($A$1;;;k))-1)));RIF.RIGA(A1))

=SMALL(IF(SUBSTITUTE(MMULT(10^(1+MOD(INT((ROW(OFFSET($A$1,,,n^k))-1)/(n^(COLUMN
(OFFSET($A$1,,,,k))-1))),n)),ROW(OFFSET($A$1,,,k))^0),0,"")=REPT(1,k),MMULT
(1+MOD(INT((ROW(OFFSET($A$1,,,n^k))-1)/(n^(COLUMN(OFFSET($A$1,,,,k))-1))),n),10^(ROW
(OFFSET($A$1,,,k))-1))),ROW(A1))


Per comodità possiamo anche definire il nome disp_1 come:
=1+RESTO(INT((RIF.RIGA(SCARTO($A$1;;;n^k))-1)/(n^(RIF.COLONNA(SCARTO($A$1;;;;k))-1)));n)


e modificare la formula in:
=PICCOLO(SE(SOSTITUISCI(MATR.PRODOTTO(10^(disp_1);RIF.RIGA(SCARTO($A$1;;;k))^0);0;"")=RIPETI(1;k);MATR.PRODOTTO(disp_1;10^(RIF.RIGA(SCARTO($A$1;;;k))-1)));RIF.RIGA(A1))

=SMALL(IF(SUBSTITUTE(MMULT(10^(disp_1),ROW(OFFSET($A$1,,,k))^0),0,"")=REPT(1,k),MMULT
(disp_1,10^(ROW(OFFSET($A$1,,,k))-1))),ROW(A1))

Nel file di esempio troverete entrambe le formule.


Altri argomenti correlati:
Calcolo combinatorio con Excel
Calcolo Combinatorio con Excel - Il caso di Classe 2
Dismutazioni (o sconvolgimenti, o permutazioni complete) con Excel

Ĉ
r,
Mar 22, 2011, 7:00 AM
Comments