Help si Numerare le combinazioni, algortmo.

Il forum di Base5, dove è possibile postare problemi, quiz, indovinelli, rompicapo, enigmi e quant'altro riguardi la matematica ricreativa e oltre.

Moderatori: Gianfranco, Bruno

Admin
Amministratore del sito
Amministratore del sito
Messaggi: 870
Iscritto il: mer apr 20, 2005 3:47 pm
Località: Benevento

Messaggio da Admin »

Grazie giobimbo,
non avevo pensato alla formula di pigi76 per la verifica.

Purtroppo, la complessità cresce esponenzialmente al crescere del numero dei numeri della combinazione.

Admin
Pietro Vitelli (Amministratore del Forum)
"Un matematico è una macchina che converte caffè in teoremi" Paul Erdös
www.pvitelli.net

Bruno
Livello 10
Livello 10
Messaggi: 2020
Iscritto il: lun nov 21, 2005 6:07 pm
Località: Bologna

Messaggio da Bruno »

Admin ha scritto:(...) in ogni caso, mi sono bloccato di nuovo di fronte ad una sommatoria;
questa volta, la sommatoria è la seguente:

$\sum_{i=1}^{c} \frac{i\cdot(i+1)\cdot(i+2)\cdot(i+3)}{4!}$

ossia la somma dei primi $c$ termini della serie

$\frac{1\cdot2\cdot3\cdot4}{4!}+\frac{2\cdot3\cdot4\cdot5}{4!}+...+\frac{c\cdot(c+1)\cdot(c+2)\cdot(c+3)}{4!}+...$


quanto vale? (...)
Non so se ti serva ancora, Pietro, comunque esiste un'identità
che senz'altro può aiutarti:

$1\cdot 2\cdot 3 \cdot\cdot\cdot m\,+\,2\cdot 3\cdot 4\cdot\cdot\cdot(m+1)\,+\,\cdot\cdot\cdot\,+\,n\cdot (n+1) \cdot (n+2)\cdot\cdot\cdot(n+m-1) = \frac{n\cdot (n+1) \cdot (n+2)\cdot\cdot\cdot(n+m) }{m+1}$

e che è verificabile facilmente per induzione.
Purtroppo ho poco tempo e mi tocca correre :D

A presto!

Bruno
(Bruno)

...........................
Invisibile un vento
l'ha apena sfioragia
sospension d'un momento;
e la bola iridessente gera 'ndagia.
{Biagio Marin}
................................................................
Meglio soluzioni sbagliate che risposte esatte.
{Rudi Mathematici}

Admin
Amministratore del sito
Amministratore del sito
Messaggi: 870
Iscritto il: mer apr 20, 2005 3:47 pm
Località: Benevento

Messaggio da Admin »

Grazie mille Bruno!

Ciao
Admin
Pietro Vitelli (Amministratore del Forum)
"Un matematico è una macchina che converte caffè in teoremi" Paul Erdös
www.pvitelli.net

Admin
Amministratore del sito
Amministratore del sito
Messaggi: 870
Iscritto il: mer apr 20, 2005 3:47 pm
Località: Benevento

Messaggio da Admin »

Dunque,
dividendo i membri dell'identità di Bruno per $m!$ si ottiene la seguente:

$\frac{1\cdot2\cdot3\cdot\cdot\cdot m}{m!}+\frac{2\cdot3\cdot4\cdot\cdot m+1}{m!}+\,\cdot\cdot\cdot\,+\frac{n\cdot(n+1)\cdot(n+2)\cdot\cdot(n+m-1)}{m!}=\frac{n\cdot(n+1)\cdot(n+2)\cdot\cdot\cdot(n+m)}{(m+1)!}$

che è proprio quella che serve per l'algoritmo.

Utilizzando tale identità è facile estendere l'algoritmo trovato per le combinazioni di 3 numeri, alle combinazioni di 5 numeri.

Calcolo del 1° numero

Anzitutto le possibili combinazioni di 90 numeri a gruppi di 5 sono

${90 \choose 5} = \frac{90!}{5!85!}=\frac{90\cdot89\cdot88\cdot87\cdot86}{5!}=43949268$

Utilizzando lo stesso procedimento dell'algoritmo valido per le combinazioni di 3 numeri e sfruttando l'identità di cui sopra si ricava la seguente espressione per calcolare il 1° numero della combinazione di 5 numeri:

$43949268-\frac{c(c+1)(c+2)(c+3)(c+4)}{5!}=p$

ossia, più sinteticamente

${90 \choose 5}-{c+4 \choose 5}=p$

dove $p$ è la posizione in esame.
Per uniformare l'algoritmo poniamo $d_1={90 \choose 5}-p$
per cui l'espressione diventa $d_1={c+4 \choose 5}$;
conoscendo $p$ ci calcoliamo $d_1$ e dall'espressione ci ricaviamo $c$;
lo approssimiamo per eccesso all'intero più vicino ($\lceil c\rceil$);

il 1° numero della combinazione è $n_{\small1}=87-\lceil c\rceil$

2° numero

Ci calcoliamo $d_2$ dall'espressione sintetizzata:

$d_2=d_1-{\lfloor c \rfloor+4 \choose 5}$

conoscendo $c$ e $d_1$ ci ricaviamo $d_2$;
lo andiamo a sostituire nell'espressione:

$d_2=\frac{c_2(c_2+1)(c_2+2)(c_2+3)}{4!}={c_2+3 \choose 4}$

e ci ricaviamo $c_2$;
lo approssimiamo per eccesso all'intero più vicino ($\lceil c_{\small2}\rceil$);

il 2° numero della combinazione è $n_{\small2}=88-\lceil c_{\small2}\rceil$


3° numero

Si ha $d_3=d_2-{\lfloor c_2 \rfloor+3 \choose 4}$

conoscendo $c_2$ e $d_2$ ci ricaviamo $d_3$;
lo andiamo a sostituire nell'espressione:

$d_3=\frac{c_3(c_3+1)(c_3+2)}{3!}={c_3+2 \choose 3}$

e ci ricaviamo $c_3$;
lo approssimiamo per eccesso all'intero più vicino ($\lceil c_{\small3}\rceil$);

il 3° numero della combinazione è $n_{\small3}=89-\lceil c_{\small3}\rceil$

4° numero

Si ha $d_4=d_3-{\lfloor c_3 \rfloor+2 \choose 3}$

conoscendo $c_3$ e $d_3$ ci ricaviamo $d_4$;
lo andiamo a sostituire nell'espressione:

$d_4=\frac{c_4(c_4+1)}{2!}={c_4+1 \choose 2}$

e ci ricaviamo $c_4$;
lo approssimiamo per eccesso all'intero più vicino ($\lceil c_{\small4}\rceil$);

il 4° numero della combinazione è $n_{\small4}=90-\lceil c_{\small4}\rceil$

5° numero

Si ha $d_5=d_4-{\lfloor c_4 \rfloor+1 \choose 2}$

conoscendo $c_4$ e $d_4$ ci ricaviamo $d_5$;

il numero della combinazione ci è dato da $n_{\small5}=90-d_{\small5}$.

In definitiva, i passi dell'algoritmo sono i seguenti:
  • $d_1={90 \choose 5}-p$
    conoscendo $p$ ci ricaviamo $d_1$.

    $d_1={c+4 \choose 5}$
    conoscendo $d_1$ ci ricaviamo $c$;

    il 1° numero della combinazione è $n_{\small1}=87-\lceil c\rceil$
  • $d_2=d_1-{\lfloor c \rfloor+4 \choose 5}$
    conoscendo $d_1$ e $c$ ci ricaviamo $d_2$;

    $d_2={c_2+3 \choose 4}$
    conoscendo $d_2$ ci ricaviamo $c_2$;

    il 2° numero della combinazione è $n_{\small2}=88-\lceil c_{\small2}\rceil$
  • $d_3=d_2-{\lfloor c_2 \rfloor+3 \choose 4}$

    conoscendo $c_2$ e $d_2$ ci ricaviamo $d_3$;

    $d_3={c_3+2 \choose 3}$

    conoscendo $d_3$ ci ricaviamo $c_3$;

    il 3° numero della combinazione è $n_{\small3}=89-\lceil c_{\small3}\rceil$
  • $d_4=d_3-{\lfloor c_3 \rfloor+2 \choose 3}$
    conoscendo $c_3$ e $d_3$ ci ricaviamo $d_4$;

    $d_4={c_4+1 \choose 2}$

    conoscendo $d_4$ ci ricaviamo $c_4$;

    il 4° numero della combinazione è $n_{\small4}=90-\lceil c_{\small4}\rceil$
  • $d_5=d_4-{\lfloor c_4 \rfloor+1 \choose 2}$

    conoscendo $c_4$ e $d_4$ ci ricaviamo $d_5$;

    il numero della combinazione ci è dato da $n_5=90-d_5$.
SE&O

Domani posto la generalizzazione.

Ciao
Admin
Ultima modifica di Admin il mar giu 06, 2006 8:00 pm, modificato 1 volta in totale.
Pietro Vitelli (Amministratore del Forum)
"Un matematico è una macchina che converte caffè in teoremi" Paul Erdös
www.pvitelli.net

Pasquale
Livello 12
Livello 12
Messaggi: 2854
Iscritto il: mer mag 25, 2005 2:14 am

Messaggio da Pasquale »

Vogliamo sapere che posizione occupa la combinazione 10-20-30
quindi facciamo:

[(90-10)*(90-10-1)*(90-10-2) / 3! ] +
[(90-20)*(90-20-1)/2!]+
[(90-30)]

quindi la combinazione 10-20-30 è in posizione 84635.
Così ha detto Pigi76, ma a me risulta che la suddetta combinazione si trovi in posizione 32845 e d'altra parte, se tutte le combinazioni sono 117.480, il valore di 84.635 appare eccessivo a prima vista, mentre il procedimento utilizzato non so quale giustificazione possa trovare.

Ad ogni modo, quella che segue è la formula generale per risalire alla posizione occupata da una combinazione nel senso richiesto, che a suo tempo fu postata su questo forum da Eugenio (Gegè), dopo lunghi studi:

$\text Posizione = \sum_{L=1}^{V(1)}\( N-L\\N+1-K-L\) - \sum_{J=2}^{K} \sum_{I=0}^{P}\(K+I-J\\ I\)$

dove:

N e K sono gli elementi della combinazione $\(N\\K\)$

V(1) è il primo elemento della combinazione di cui si cerca la posizione
V(J) sono gli altri elementi della combinazione secondo l'ordine crescente di scrittura
P = N+J-1-K-V(J)

Poiché all'epoca la formula non fu illustrata nei suoi particolari, ne ho effettuato un test, con esito positivo, attraverso il seguente programma in Decimal Basic:

INPUT PROMPT "Inserisci il numero di elementi totali da mettere in combinazione: ":N
INPUT PROMPT "Inserisci il numero di elementi che formano una combinazione: ":K
DIM V(k)
FOR m=1 TO k
INPUT PROMPT "Inserisci il "&STR$(m)&"° elemento della combinazione: ":V(m)
NEXT M

LET x=0
FOR L = 1 TO V(1)
LET P=N+1-K-L
LET x=x+comb(N-L,P)
NEXT L
FOR J=2 TO K
LET P=N+J-1-K-V(J)
FOR I=0 TO P
LET x=x-comb(K+I-J,I)
NEXT I
NEXT J

PRINT
PRINT "La combinazione ";
FOR m=1 TO K
PRINT STR$(V(m));
NEXT M
PRINT " si trova in posizione";x
END

Poniamo che 2,4,7, 8,10 sia la combinazione di 13 elementi a cinque a cinque: il programma chiederà di inserire il numero totale di elementi (13), il numero degli elementi in combinazione (5), i singoli numeri (in ordine crescente) della combinazione (2), (4), (7), (8 ), (10); quindi restituirà la posizione cercata.

Non mi ritrovo il problema opposto, ma mi pare di ricordare che anch'esso fu trattato.
Ultima modifica di Pasquale il gio giu 01, 2006 3:37 pm, modificato 2 volte in totale.
_________________

$\text { }$ciao Immagine ciao
E' la somma che fa il totale (Totò)

Admin
Amministratore del sito
Amministratore del sito
Messaggi: 870
Iscritto il: mer apr 20, 2005 3:47 pm
Località: Benevento

Messaggio da Admin »

Ciao Pasquale,
anzitutto mi fa piacere risentirti, era parecchio che non ti si vedeva!

dunque, le combinazioni di 90 elementi a gruppi di 3 sono $117480$ per cui $84635$ è proprio la posizione della combinazione $10-20-30$;

Come fatto notare da giobimbo qualche post più sopra, la formula di pigi76 non da direttamente la posizione;
per avere la posizione bisogna sottrarre dal numero di combinazioni totali il risultato della formula; per cui indicando con $r_1$ il risultato della formula e con $p$ la posizione, si ha:

$p= {90 \choose 3}-r_1$

Non ho avuto modo di analizzare fino in fondo la formula da te postata, ma mi sembra eccessivamente complessa;
infatti parte di quelle sommatorie possono essere espresse con un unico fattoriale.

La formula generale che ho trovato, per ricavarci la posizione $p$, essendo nota la combinazione $n_{\small1}-n_{\small2}-n_{\small3}-\,\cdot\cdot\cdot\,-n_{\small k}$ è la seguente:

$p={90 \choose k}-\left[{90-n_{\small1} \choose k}+{90-n_{\small2} \choose k-1}+\,\cdot\cdot\cdot\,+{90-n_{\small k-1} \choose 2}+{90-n_{\small k} \choose 1}\right]={90 \choose k}-\displaystyle\sum_{i=1}^{k}{90-n_{\small i} \choose k-i+1}$

per $k=3$, la sommatoria $\sum_{i=1}^{k}{90-n_{\smalli} \choose k-i+1}$ corrisponde alla formula di pigi76.

SE&O

Ciao
Admin
Ultima modifica di Admin il mar giu 06, 2006 7:48 pm, modificato 1 volta in totale.
Pietro Vitelli (Amministratore del Forum)
"Un matematico è una macchina che converte caffè in teoremi" Paul Erdös
www.pvitelli.net

Admin
Amministratore del sito
Amministratore del sito
Messaggi: 870
Iscritto il: mer apr 20, 2005 3:47 pm
Località: Benevento

Messaggio da Admin »

Ed ecco la Generalizzazione dell'algoritmo, ossia l'algoritmo per trovare una combinazione di $90$ numeri a gruppi di $k$ a partire dalla sua posizione $p$ (supponendo una enumerazione progressiva delle combinazioni da destra a sinistra):

anzitutto la posizione $p$ deve essere ovviamente tale che

$1\le p\le{90 \choose k}$.

Poi indichiamo $n_{\small1}$,$n_{\small2}$,$n_{\small3}$,...,$n_{\small k}$ i numeri della combinazione

Questi i passi dell'algoritmo:
  • Passo 1 (id=1):

    $d_{\small1}={90 \choose k}-p$
    conoscendo $p$ ed $k$ ci ricaviamo $d_{\small1}$.

    $d_{\small1}={c_{\small1}+k-1 \choose k}$
    conoscendo $d_{\small1}$ ci ricaviamo $c_{\small1}$;
    lo approssimiamo per eccesso all'intero più vicino ($\lceil c_{\small1}\rceil$);

    il 1° numero della combinazione è $n_{\small1}=90-k+id+1-\lceil c_{\small1}\rceil$ (l'id è il numero del passo)
  • Passo 2 (id=2):

    $d_{\small2}=d_{\small1}-{\lfloor c_{\small1} \rfloor+k-1 \choose k}$
    conoscendo $d_{\small1}$ e $c_{\small1}$ e $k$ ci ricaviamo $d_{\small2}$;

    $d_{\small2}={c_{\small2}+k-2 \choose k-1}$
    conoscendo $d_{\small2}$ ed $k$ ci ricaviamo $c_{\small2}$;
    lo approssimiamo per eccesso all'intero più vicino ($\lceil c_{\small2}\rceil$);

    il 2° numero della combinazione è $n_{\small2}=90-k+id+1-\lceil c_{\small2}\rceil$
  • Passo ...:

    ...
  • Passo k-1 (id=k-1):

    $d_{\small k-1}=d_{\small k-2}-{\lfloor c_{\small k-2} \rfloor+2 \choose 3}$

    conoscendo $c_{\small k-2}$ e $d_{\small k-2}$ e $k$ ci ricaviamo $d_{\small k-1}$;

    $d_{\small k-1}={c_{\small k-1}+1 \choose 2}$

    conoscendo $d_{\small k-1}$ ci ricaviamo $c_{\small k-1}$;
    lo approssimiamo per eccesso all'intero più vicino ($\lceil c_{\small k-1}\rceil$);

    il (k-1)-numero della combinazione è $n_2=90-\lceil c_{\small k-1}\rceil$
  • Passo k (id=k):

    $d_{\small k}=d_{\small k-1}-{\lfloor c_{\small k-1} \rfloor+1 \choose 2}$

    conoscendo $c_{\small k-1}$ e $d_{\small k-1}$ ed $k$ ci ricaviamo $d_{\small k}$;

    il k-esimo numero della combinazione ci è dato da $n_{\small k}=90-d_{\small k}$.
(ho apportato modifiche sostanziali al messaggio; mi scuso con gli eventuali rilettori del post)

SE&O

Admin
Ultima modifica di Admin il mar giu 06, 2006 7:43 pm, modificato 1 volta in totale.
Pietro Vitelli (Amministratore del Forum)
"Un matematico è una macchina che converte caffè in teoremi" Paul Erdös
www.pvitelli.net

Pasquale
Livello 12
Livello 12
Messaggi: 2854
Iscritto il: mer mag 25, 2005 2:14 am

Messaggio da Pasquale »

Uhé Admin, spesso la mia tastiera mi lascia dentro una delle doppie lettere battute, per cui ho già aggiustato il 17480 con 117480, ma io a questo mi riferivo ed evidentemente mi sa che stiamo parlando di due diversi criteri di ordinamento.
Il mio e quello di Eugenio, per fare un esempio su combinazioni di 7 elementi a 4 a 4, è questo:

..1 ) 1 2 3 4
..2 ) 1 2 3 5
..3 ) 1 2 3 6
..4 ) 1 2 3 7
..5 ) 1 2 4 5
..6 ) 1 2 4 6
..7 ) 1 2 4 7
..8 ) 1 2 5 6
..9 ) 1 2 5 7
10 ) 1 2 6 7
11 ) 1 3 4 5
12 ) 1 3 4 6
13 ) 1 3 4 7
14 ) 1 3 5 6
15 ) 1 3 5 7
16 ) 1 3 6 7
17 ) 1 4 5 6
18 ) 1 4 5 7
19 ) 1 4 6 7
20 ) 1 5 6 7
21 ) 2 3 4 5
22 ) 2 3 4 6
23 ) 2 3 4 7
24 ) 2 3 5 6
25 ) 2 3 5 7
26 ) 2 3 6 7
27 ) 2 4 5 6
28 ) 2 4 5 7
29 ) 2 4 6 7
30 ) 2 5 6 7
31 ) 3 4 5 6
32 ) 3 4 5 7
33 ) 3 4 6 7
34 ) 3 5 6 7
35 ) 4 5 6 7

Su questo tipo di ordinamento, che poi mi sembra quello indicato da Pigi76, la formula di Eugenio funziona.

esempio:

1,2,3,4 si trova in posizione 1 e la formula restituisce 1 (lanciare il programma in Decimal Basic)
3,4,5,6 si trova in posizione 31 ed effettivamente la formula dà 31
4,5,6,7 si trova in posizione 35 e la formula dà 35

Su 90 elementi a 3 a 3:

1,2,3 si trova in posizione 1
1,2,90 in posizione 88
88,89,90 in posizione 117480

e la formula li restituisce esatti.

Ad ogni buon fine riporto l'algoritmo di ordinamento utilizzato, su cui funziona la formula implementata nel programmino in Decimal:

FOR a=1 TO 88
FOR b=a+1 TO 89
FOR c=b+1 TO 90
LET cont=cont+1
PRINT USING "###### )":cont;
PRINT USING "## ": a;
PRINT USING "## ": b;
PRINT USING "## ": c
NEXT C
NEXT B
NEXT A
END



e l'ordinamento che ne deriva nei dintorni di 10,20,30:

.
.
.
32836) 10 20 21
32837) 10 20 22
32838) 10 20 23
32839) 10 20 24
32840) 10 20 25
32841) 10 20 26
32842) 10 20 27
32843) 10 20 28
32844) 10 20 29
32845) 10 20 30
32846) 10 20 31
32847) 10 20 32
32848) 10 20 33
32849) 10 20 34
32850) 10 20 35
32851) 10 20 36
32852) 10 20 37
32853) 10 20 38
32854) 10 20 39
32855) 10 20 40
.
.
.

Adesso vado: ho avuto da fare ed ho da fare (approfondirò alla prima occasione).
_________________

$\text { }$ciao Immagine ciao
E' la somma che fa il totale (Totò)

giobimbo
Livello 5
Livello 5
Messaggi: 343
Iscritto il: sab nov 19, 2005 5:14 pm
Località: Biella

Messaggio da giobimbo »

Mi ricordavo anch'io che un problema simile era già stato trattato, difatti andai a vedere sul vecchio voy.forum ma senza trovarvi traccia. Ora che Pasquale lo ha riesumato, sì, in ambedue l'ordinamento è lo stesso, rimane da vedere se il programma in Decimal Basic riesce a gestire 5 combinazioni invece di 3.

Pasquale, il numero di pigi76 devi sottrarlo da 117.480, allora:
117.480 - 84.635 = 32.845
come da te trovato.

Admin
Amministratore del sito
Amministratore del sito
Messaggi: 870
Iscritto il: mer apr 20, 2005 3:47 pm
Località: Benevento

Messaggio da Admin »

Pasquale,
l'ordinamento è lo stesso, e la formula di Eugenio funziona:
solo che non è il massimo della semplicità.
Come già detto, parte delle sommatorie della formula di Eugenio possono essere scritte come un unico fattoriale utilizzando l'identità postata da Bruno;
si perviene così alla formula che ho calcolato poco più su.

Ciao
Admin
Pietro Vitelli (Amministratore del Forum)
"Un matematico è una macchina che converte caffè in teoremi" Paul Erdös
www.pvitelli.net

Pasquale
Livello 12
Livello 12
Messaggi: 2854
Iscritto il: mer mag 25, 2005 2:14 am

Messaggio da Pasquale »

OK Pietro, adesso mi è tutto più chiaro ed effettivamente la tua formula, tradotta nel programma che segue, è molto più semplice:

'Input e inizializzazioni:

INPUT PROMPT "Inserisci il numero di elementi totali da mettere in combinazione: ":N
INPUT PROMPT "Inserisci il numero di elementi che formano una combinazione: ":K
DIM c(k)
FOR m=1 TO k
INPUT PROMPT "Inserisci il "&STR$(m)&"° elemento della combinazione: ":c(m)
NEXT M

'Programma di calcolo:

LET x=comb(n,k)
FOR i = 1 TO k
LET x=x-comb(n-c(i),k-i+1)
NEXT i

'Stampa risultato:

PRINT
PRINT "La combinazione ";
FOR m=1 TO K
PRINT STR$(c(m));" ";
NEXT M
PRINT " si trova in posizione";x
END
Ultima modifica di Pasquale il sab giu 03, 2006 4:33 pm, modificato 1 volta in totale.
_________________

$\text { }$ciao Immagine ciao
E' la somma che fa il totale (Totò)

Pasquale
Livello 12
Livello 12
Messaggi: 2854
Iscritto il: mer mag 25, 2005 2:14 am

Messaggio da Pasquale »

Il caso contrario: data la posizione, risalire alla combinazione.

Si dimostra facilmente che:

1) $\text \(n\\k\)=\(n-1\\k-1\)+\(n-1\\ k\)$

infatti, sviluppando il secondo membro, si ottiene:

$\frac {n!}{k!(n-k)!}=\(n\\k\)$

Applicando la stessa formula al secondo termine del secondo membro della 1), abbiamo che:

$\text \(n-1\\ k\)=\(n-2\\k-1\)+\(n-2\\ k\)$

e così procedendo, abbiamo che:

2) $\text \(n\\k\)=\(n-1\\k-1\)+\(n-2\\k-1\)+\(n-3\\k-1\)+....+\(k-1\\k-1\) \[+ \(k-1\\ k\)\]$

e qui mi fermo, poiché trattandosi di combinazioni semplici, l'ultimo termine nella parentesi quadra vale zero e può essere omesso.

Adesso, a titolo di esempio, osserviamo lo sviluppo di una combinazione semplice C(7,4):



01 ) 1 2 3 4
02 ) 1 2 3 5
03 ) 1 2 3 6
04 ) 1 2 3 7
05 ) 1 2 4 5
06 ) 1 2 4 6
07 ) 1 2 4 7
08 ) 1 2 5 6
09 ) 1 2 5 7
10 ) 1 2 6 7
11 ) 1 3 4 5
12 ) 1 3 4 6
13 ) 1 3 4 7
14 ) 1 3 5 6
15 ) 1 3 5 7
16 ) 1 3 6 7
17 ) 1 4 5 6
18 ) 1 4 5 7
19 ) 1 4 6 7
20 ) 1 5 6 7

21 ) 2 3 4 5
22 ) 2 3 4 6
23 ) 2 3 4 7
24 ) 2 3 5 6
25 ) 2 3 5 7
26 ) 2 3 6 7
27 ) 2 4 5 6
28 ) 2 4 5 7
29 ) 2 4 6 7
30 ) 2 5 6 7

31 ) 3 4 5 6
32 ) 3 4 5 7
33 ) 3 4 6 7
34 ) 3 5 6 7

35 ) 4 5 6 7


A riguardo del primo elemento della combinazione, possiamo notare che questo può essere 1,2,3 o 4 e che l'ordinamemto è tale che le quantità degli 1, dei 2, dei 3 e dei 4 (in prima posizione) sono:

$\(6\\3\)+\(5\\3\)+\(4\\3\)+\(3\\3\)=\(7\\4\)$

A questo punto appare chiaro che se la posizione prescelta è ad esempio 14, questa si trova all'interno delle prime 20 e quindi il primo numero della combinazione deve essere 1; se fosse stata 28, è solo una questione di conteggi, il primo numero della combinazione sarebbe stato il 2.
Restiamo con questo secondo caso: fatto qualche semplice conteggio, la posizione 28, nell'ambito della serie dei 2, occupa l'ottava posizione e possiamo notare che sempre nell'ambito dei dieci 2, i secondi numeri della combinazione sono 6 tre, 3 quattro e 1 cinque, cioé:

$\(4\\2\)+\(3\\2\)+\(2\\2\)=\(5\\3\)$

In sostanza, vediamo sempre applicata la formula 2) iniziale.

Non starò a tirarla per le lunghe, ma fatti i debiti conteggi e le debite elucubrazioni, ne scaturisce il seguente semplice programmino in Decimal Basic, che generalizza il problema della posizione p.
Per chiarezza, definisco p la posizione prescelta nell'elenco di tutte le possibili combinazioni semplici $\(n\\k\)$, disposte in ordine crescente, di cui si vuole conoscere la corrispondente combinazione.
Nel programma sarà necessario "inputtare" i dati della combinazione (n e k) e la posizione p.



'Input e inizializzazioni:

PRINT "Devi inserire i dati che identificano la combinazione C(n,k)"
INPUT PROMPT "Inserisci n: ":n
INPUT PROMPT "Inserisci k: ":k
DIM c(k)
LET j=k
LET combinazioni = comb(n,k)
10 INPUT PROMPT "Inserisci la posizione p: ":p
LET ps=p
PRINT
IF p>combinazioni THEN
PRINT "La posizione non può superare la quantità delle combinazioni totali"
PRINT "Inserisci nuovamente la posizione"
GOTO 10
END IF

'Programma vero e proprio:

FOR r=1 TO j
LET x=0
FOR s=n-1 TO k-1 STEP -1
LET a=x
LET cont=cont+1
LET x=x+comb(s,k-1)
IF p<=x THEN
LET c(r)=cont
LET p=p-a
LET n=s
LET k=k-1
EXIT FOR
END IF
NEXT S
NEXT R

'Stampa della soluzione:

PRINT "La combinazione corrispondente è: ";
FOR m=1 TO j
PRINT STR$(c(m));
IF m<j THEN PRINT ",";
NEXT M
Ultima modifica di Pasquale il sab dic 06, 2008 5:09 pm, modificato 4 volte in totale.
_________________

$\text { }$ciao Immagine ciao
E' la somma che fa il totale (Totò)

Admin
Amministratore del sito
Amministratore del sito
Messaggi: 870
Iscritto il: mer apr 20, 2005 3:47 pm
Località: Benevento

Messaggio da Admin »

Ciao Pasquale,
sto scrivendo un programmino grafico in java sul problema, ed il tuo algoritmo mi sembra molto veloce, sicuramente è più veloce della "brute force" che ho intenzione di utilizzare per l'enumerazione delle combinazioni.

Vedo se riesco ad inserirlo nel programma in modo da confrontare i tempi di esecuzione dei vari algoritmi.

P.S.: comb(int,int) è la funzione per il calcolo del fattoriale? è predefinita?

Ciao
Admin
Pietro Vitelli (Amministratore del Forum)
"Un matematico è una macchina che converte caffè in teoremi" Paul Erdös
www.pvitelli.net

Pasquale
Livello 12
Livello 12
Messaggi: 2854
Iscritto il: mer mag 25, 2005 2:14 am

Messaggio da Pasquale »

Si Pietro, è una funzione implementata in Decimal Basic e non v'è bisogno d'altre subroutine: puoi provarla.
Scrivi "PRINT comb(5,2)" e Decimal ti restituisce 10: funziona anche con la precisione 10/1000.

Nel programma precedente, ho apportato una piccola modifica, scambiando fra loro j e k, per rendere più leggibile il programma rispetto alla formula 2).
_________________

$\text { }$ciao Immagine ciao
E' la somma che fa il totale (Totò)

Pasquale
Livello 12
Livello 12
Messaggi: 2854
Iscritto il: mer mag 25, 2005 2:14 am

Messaggio da Pasquale »

Excuse me, non avevo letto tutto il lavoro fatto precedentemente da Admin ed ho visto che la formula che credevo di avere "inventato" era stata già adottata da Pietro nel suoi primi interventi; quindi ho visto tutto il lavoro cui si è sobbarcato per restare nei canoni di un discorso matematico, piuttosto che informatico.
Quindi complimenti a Pietro, perché devo confessare che la parte matematica che ho studiato era orientata alla scrittura di un programma di calcolo, dal momento che non mi era riuscito in prima istanza a trovare una formula risolutrice.
Tuttavia, la natura del problema non permette di trovare un procedimento circoscrivibile ad una sola formula, come nel caso contrario da combinazione a posizione, ma richiede una serie di procedimenti, dovendosi individuare i k elementi della combinazione: nel primo caso abbiamo più dati per trovarne uno, mentre nel secondo caso abbiamo un solo dato per trovarne molti.
Se dovessimo ad esempio individuare la combinazione in CENTOMILIARDESIMA posizione fra tutte quelle di $\(150\\100\)$, tanto per dirne una, la cosa sarebbe leggermente faticosa, mentre un programmino ti dice sedutastante che tale combinazione è la successione dei numeri naturali da 1 a 91, seguita da 94,100,109,112,115,122,128,129,135,150 (forse impensabile a prima vista).

---------------------------
---------------------------

Pietro, ne sai niente di tutte le crocette al posto delle immagini, che la fanno nuovamente da padrone?
Se non vado a cliccarvi sopra con "Mostra Immagine", hai voglia di aspettare, ché non si apre!
Vale solo per me o anche per gli altri? Posso io fare qualcosa, o dipende dal sito?

---------------------------
---------------------------
_________________

$\text { }$ciao Immagine ciao
E' la somma che fa il totale (Totò)

Rispondi