Problema di ottimizzazione in $NN$

gygabyte017
Ciao a tutti, pensavo a questo problema:

Ho a disposizione solo l'$1$ e il $+$. Partendo da questi elementi, posso creare tutti gli altri numeri, ad esempio $2=1+1$, $3=1+2$, $5=2+3$.
Ora, dato per esempio $5$, posso arrivarci facendo appunto $2=1+1$, $3=1+2$, $5=2+3$, che sono 3 operazioni, oppure anche $2=1+1$, $3=2+1$, $4=3+1$, $5=4+1$, ma mi sono servite 4 operazioni.

Problema: dato $n>1$, $n in NN$,
a) Quante operazioni servono per costruire $n$ col minor numero di operazioni possibile?
b) Quale algoritmo si può seguire per generare appunto tale successione ottimale?


Per quanto riguarda la a), ad occhio mi verrebbe da dire che: tutti i numeri del tipo $2^m$ hanno bisogno di $m$ operazioni almeno (facendo sempre la divisione per $2$, $1+1=2$, $2+2=2^2$, $2^2+2^2=2^3$ ecc), quindi preso $2^m <= n <= 2^(m+1)$ allora $op(2^m) <= op(n) <= op(2^(m+1)) " " => m <= op(n) <= m+1$, quindi concluderei che $[log_2 n] <= op(n) <= [log_2 n] + 1$. Però sarei interessato al numero ESATTO di operazioni necessarie...
Per la questione b) non saprei da dove partire

Idee? Grazie!

Risposte
Rggb1
a) L'asserto che hai messo
"se $2^m <= n <= 2^(m+1)$ allora $op(2^m)<=op(n)<=op(2^m+1)$"
non sono sicuro sia sempre vero. Esempio per "fare" 16 puoi arrivarci con 1+1=2 2+2=4 ecc con sole 4 operazioni, per "fare" 32 con 5 operazioni, ma per "fare" 30 per esempio? Io non sono riuscito ad arrivarci con cinque operazioni (ma forse sono scarso).

Comunque vedo che assumi di poter memorizzare i numeri e di poter fare qualunque somma con ciò che è stato precedentemente calcolato, ho capito bene?

vict85
A me sembra più un problema di informatica. E' trattato perché è utilizzato per trovare l'esponenziale con meno moltiplicazioni. L'uso del metodo binario, seppur non sia ottimale, è il metodo più usato.
Knuth nel suo the art of computer programming analizza il problema nella sezione 4.6.3. del secondo volume.

http://en.wikipedia.org/wiki/Addition_chain
http://en.wikipedia.org/wiki/Addition-c ... nentiation
http://wwwhomes.uni-bielefeld.de/achim/ ... chain.html

Ti rimando comunque all'ottimo manuale di Knuth per approfondimenti.

vict85
"Rggb":
a) L'asserto che hai messo
"se $2^m <= n <= 2^(m+1)$ allora $op(2^m)<=op(n)<=op(2^m+1)$"
non sono sicuro sia sempre vero. Esempio per "fare" 16 puoi arrivarci con 1+1=2 2+2=4 ecc con sole 4 operazioni, per "fare" 32 con 5 operazioni, ma per "fare" 30 per esempio? Io non sono riuscito ad arrivarci con cinque operazioni (ma forse sono scarso).

Comunque vedo che assumi di poter memorizzare i numeri e di poter fare qualunque somma con ciò che è stato precedentemente calcolato, ho capito bene?


Infatti non si può... Il numero ottimale per 30 è 6...

Il suo calcolo ha ignorato un po' di somme... Il calcolo per sommare 2^n+1 fa ad ogni passaggio 2 somme. Consideriamo 7 per esempio.

Memorizzi in A=1 e B=1
1) A=A+A (2) e B=B+A (3)
2) A=A+A (4) e B=B+A (7)
E B è il tuo risultato.

In totale fa 4 somme contro le 3 di produrre 8. Ovviamente si può fare 7 . Tra l'altro il numero di somme è anche minimale in questo caso.

Una più corretta disequazione sarebbe quindi:
$|__ log_2(n) __| \le op(n) \le 2 |__ log_2(n) __|$
Considerando il metodo descritto sopra si può fare di meglio nel senso che se $|__ log_2(n) __|=m$ allora si sa che il numero ottimale è compreso tra m e m più il numero di 1 nella scrittura decimale ad esclusione del primo.

gygabyte017
Avete ragione mi sbagliavo, comunque non aveva la pretesa di essere una dimostrazione, era solo un'osservazione "a occhio" che mi era venuta :D
Si è vero il problema ha a che fare anche con l'informatica, nel senso che mi serve di sommare punti su una curva ellittica, ma non essendoci una formula "chiusa" per calcolare $[n]P = P+...+P$, avevo provato a fare semplicemente proprio $P+P+P...+P$ ma il tempo che impiega l'algoritmo è enorme, e quindi cercavo un'ottimizzazione, che a quanto pare è più difficile di quello che pensavo! :-D

Grazie per i link di wiki, ci stanno degli algoritmi interessanti che ora mi leggo...

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.