Appendice I sistemi trattati da Fibonacci e da Abu Kamil (risolti al computer) Franco Ghione - Sandro Moriggi |
|
|||||||||||||||||||||||||||
Fibonacci tratta il caso x4=70 e analizza possibili soluzioni per valori grandi di x4. Noi usiamo il suo metodo e il calcolatore per risolvere il problema in generale.
Poniamo T=100-x4, e, prima di tutto, andiamo a risolvere l’equazione omogenea
6x1 + 4x2 + x3 = 2(x1 + x2 + x3)
Seguendo la “cultura delle monete” troviamo le due soluzioni particolari P=(1,0,4) e S=(0,1,2) e dunque ogni soluzione razionale dell’equazione omogenea si ottiene come combinazione lineare di P ed S: .
(x1, x2, x3) =
a(1, 0, 4) + b(0, 1, 2) =
(a, b, 4a+2b)
da cui
Poiché cerchiamo le soluzioni intere e positive a e b devono essere numeri interi positivi. In generale, come vedremo nei problemi successivi, le cose potrebbero complicarsi quando pur essendo le x intere a e b possono essere rotti. Fibonacci, come vedremo più avanti, fa esempi via via più complicati nei quali esamina anche questi casi o ulteriori altre complicazioni.
A questo punto trovate tutte le soluzioni dell’equazione omogenea si impone a queste soluzioni l’ulteriore condizione sulla somma:
x1 + x2 + x3 = T
ovvero
5a+3b = T
equazione della quale cerchiamo soluzioni a e b intere positive.
|
|||||||||||||||||||||||||||
Abbiamo due modi per risolvere questo problema: uno diretto che richiede moltissimi calcoli e l’altro “intelligente” che richiede più matematica. Entrambi i metodi si possono applicare facilmente servendosi di un programma e di un calcolatore che lo esegue. Presentiamo i due metodi scrivendo nel modo più elementare possibile i programmi necessari a trovare le soluzioni.
Cominciamo dal metodo “intelligente” che presenta minori difficoltà algoritmiche e che si serve di un procedimento generale col quale risolvere con numeri interi equazioni lineari. Presentiamo questo metodo, probabilmente noto, almeno in qualche caso, ai matematici cinesi, indiani e arabi nei casi particolari coinvolti dai problemi di Fibonacci.
Prima di tutto si devono trovare due numeri a0, b0 interi (positivi o negativi) per i quali
5a0+3b0 = 1
questa identità è nota come identità di Bezout ed è sempre possibile, se i due coefficienti sono primi tra loro come lo sono 5 e 3, calcolare a0 e b0 usando l’algoritmo euclideo delle divisioni successive col quale si trova il Massimo comun divisore tra i due coefficienti [bezout.py]. Nel nostro caso si vede immediatamente che a0 = -1 e b0 = 2 infatti
5(-1) + 3(2) = 1
a questo punto per ogni numero u abbiamo
5(-T+3u) + 3(2T-5u) = T
proprio perché 5(-T) + 3(2T) = T e, per ogni numero u, 5×(3u) = 3×(5u). Dunque
Non è difficile dimostrare che, essendo 5 e 3 primi tra loro, queste sono le sole soluzioni a e b intere (positive e negative) dell’equazione 5a+3b = T. Poiché noi cerchiamo solo soluzioni intere positive si dovrà avere -T+3u > 0 e 2T-5u > 0 e quindi avremo una soluzione intera per ogni u compreso nell’intervallo aperto
13T < u <
25T
|
|||||||||||||||||||||||||||
A questo punto entrano in gioco le nostre capacità con il calcolatore. Per programmare il computer utilizzeremo il linguaggio Python che ci sembra il più semplice e diretto. Prima di tutto introduciamo un contatore n a partire da 1 per contare le soluzioni che via via troveremo; fissiamo x4 =1; e T=100-x4. In questo modo possiamo usare lo stesso programma cambiando solo il valore di x4; scriviamo poi il primo valore di u nell’intervallo di variabilità: u = int(T/3)+1 (ricordiamo che int(X) indica la parte intera del numero X).
Calcoliamo ora a=3*u-T , b=2*T-5*u , x1=a , x2=b , x3=4*a+2*b, e stampiamo la soluzione ottenuta seguendo la grammatica di stampa del linguaggio che abbiamo scelto. Eseguiamo tutte queste istruzioni fino a quando u è minore di 2*T/5. Infine incrementiamo di una unità u e n. Ecco il nostro programma che trova tutte le soluzioni al nostro problema con x4 =1:
Eseguendo il programma troviamo le seguenti 6 soluzioni:
[Nota]
le colonne dell'output sono ottenute sostituendo l'istruzione print(.. con le istruzioni:
if (n-1)%3==0: print() print('soluzione',n,'(',x1,x2,x3,x4,')',end="\t"))) Se vogliamo ora risolvere il problema iniziale non dobbiamo far altro che eseguire queste stesse operazioni per ogni possibile scelta di x4 da 1 a 99. Ovviamente la cosa da fare a mano è sconsigliabile ma il calcolatore non si annoia mai e per ottenere i risultati che cerchiamo basta aggiungere una riga di programma per dirgli di fare queste operazioni per ogni valore intero nell’intervallo [1,100). Ecco il nuovo programma che trova tutte (sono 304) le soluzioni corrette. | |||||||||||||||||||||||||||
Per trovare le soluzioni al problema trattato da Fibonacci
basterà scrivere nel programma invece di T=100-x4 , T=31-x4 , e chiedere di non stampare x4 ma di stampare T per sapere le soluzioni nei diversi casi. Ecco il programma adattato con le sue soluzioni
[Nota]
le colonne dell'output sono ottenute sostituendo l'istruzione print(.. con le istruzioni:
che naturalmente confermano i calcoli di Fibonacci
if (n-1)%4==0: print() print( '(',x1,x2,x3,T,')',end="\t" )) Vediamo ora il metodo diretto per risolvere con numeri interi positivi una semplice equazione lineare probabilmente utilizzato da Fibonacci e da Abu Kamil. Cominciamo con l’equazione 5a+3b = T. Il procedimento è molto semplice: diamo ad a tutti i valori interi positivi fino a quando 5a<T e se T-5a è divisibile per 3 ((T-5a)%3==0), poniamo b = (T-5a)/3 , x1=a, x2=int(b) , x3=int(4a+2b) e diamo l’istruzione di stampa per scrivere (x1 , x2 , x3) e T, altrimenti aggiorniamo a e infine aggiorniamo n. Ecco il programma Gli esempi successivi riportano tutti il problema ad una equazione lineare in due incognite da risolvere con numeri interi positivi [eqlin2int.py] e saranno risolti con il metodo “intelligente” che penso debba essere patrimonio della cultura matematica di uno studente delle superiori. Ovviamente, come abbiamo fatto in questo caso, non sarà difficile scrivere un programma usando il metodo diretto. |
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
L’equazione omogenea he le due soluzioni indipendenti P=(3,0,4) e S=(1,2,0) dunque la soluzione generale sarà data da
(x1, x2 , x3 ) = a(3,0,4) + b(1,2,0) = (3a+b, 2b, 4a)
questa relazione non implica che a e b sono interi ma solamente che
b = x22
a = x34
x1 = 3 x34 +
x22
da cui 4x1=3x3 + 2x2, dunque x3=2p è pari (p intero) e 2x1=3p + x2 . Sommando le x otteniamo
7a + 3b = 7 p2 +
3 x22 = 12 ovvero 7p + 3x2 = 24
dove ora le incognite p e x3 sono tutte intere e positive. L’identità di Bezout fornisce la relazione
7(1)+3(-2)=1 quindi 7(24-3u)+3(-48+7u) = 24 per ogni
487 < u <
243ovvero 6 < u < 8 Otteniamo dunque una sola soluzione per u=7, p=24-21=3 e x3 =6, x2 = 49-48=1 e x1 =
3p + x22 = 5. Risulta infatti 5+1+6=12 e 10 +
12 +
64 = 12.
Disponendo di un computer possiamo risolvere il problema di Fibonacci nel caso che gli uccelli siano A invece di 12. Basterà risolvere l’equazione 7p+3x2=2A Ecco il nostro programma per A=100 che fornisce le 9 soluzioni del problema [Nota]
le colonne dell'output sono ottenute sostituendo l'istruzione print(.. con le istruzioni:
.
if (n-1)%3==0: print() print('sol',n,'(',x1,x2,x3,')',end="\t\t")) |
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
L’equazione omogenea diventa
12x1 + 8x2 + 2x3 + x4 = 4(x1 + x2 + x3 + x4)
e il problema è più complicato degli altri perché ci sono “2 monete” (da 12 e da 8) di valore maggiore del valore della moneta da 4 che si vuole formare. Per fare una “lega” con le monete da 12 e da 8 dobbiamo usare numeri negativi. Con x3 = x4 = 0 abbiamo infatti la soluzione T=(-1,2,0,0). Altre due soluzioni si ottengono come in Fibonacci: P=(0,1,2,0) S=(0,3,0,4). Ogni soluzione razionale si ottiene come combinazione lineare a coefficienti razionali di queste tre soluzioni. Abbiamo dunque
(x1, x2, x3, x4 ) = aT+bP+cS = (-a, 2a+b+3c, 2b, 4c)
da cui
x2 = -2x1 + x32 +
34x4 cioè 4x2 = -8x1+2x3+3x4
dove x1, x2, x3, x4 sono numeri interi positivi. Questa relazione tra interi (positivi e negativi) ci dice che x4 è pari . Poniamo allora
Imponiamo ora la condizione sulla somma:
a + 3p2 +
7q2 = 30 cioè 2a+3p+7q = 60 ovvero
3p+7q = 60+2x1
con p e q interi positivi e x1 tale che
4x1 < p+3q.
|
|||||||||||||||||||||||||||
Possiamo ora scrivere il nostro programma ponendo A=60+x1 . Le soluzioni intere positive p e q si ottengono come di consueto a partire dalla identità di Bezout: 3(-2)+7(1)=1
3(2A-7u) + 7(-A+3u) = A per ogni u tale che
2A7 <
A3
| |||||||||||||||||||||||||||
Dunque p = 2A-7u, q = -A+3u e le soluzioni x2, x3, x4 come indicato. Nel programma fissiamo in partenza T=30 e x1 e aggiorniamo l’istruzione u=u+1 solo se p+3q-4x1 >0. Ecco il programma
l'output è ottenuto sostituendo
n=1 e print('sol.'+str(n)+': (',x1,x2,x3,x4,')') con if (n-1)%3 == 0: print() print(' sol.',n,': (',x1,x2,x3,x4,')',end="\t") Le soluzioni trovate da Fibonacci sono la 10 e la 19, quella col valore x1 maggiore. Se lanciamo il programma per 100 uccelli invece di 30 [T=100], troviamo 238 soluzioni |
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
Una soluzione.
Si può fare facilmente a mano: la soluzione è (19,80,1) . |
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
Le soluzioni dell’equazione omogenea sono generate da a(2,3,0)+b(1,0,2) con a e b interi positivi. L’equazione è 5a+3b=100 che si risolve facilmente a mano dando ad a i valori per i quali 100-5a è divisibile per 3.
6 soluzioni. |
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
Poniamo T=100-x4.
Usando il metodo di Fibonacci abbiamo due soluzioni indipendenti dell’equazione omogenea 40x1+x2+5x3 = 10(x1+x2+x3): P=(3,10,0) e S=(1,0,6) e quindi ogni soluzione intera si scrive come
(x1, x2, x3) = a P+bS
cioè
Imponiamo ora la condizione x1 + x2 + x3 + x4 = 100. Essa, sommando le componenti, equivale a 13p + 7q = 2T Per trovare tali soluzioni si deve, usando l’identità di Bezout, scrivere 13×(-1) + 7×(2) = 1 da cui ricaviamo 13×(-2T) + 7×(4T) = 2T e quindi per ogni intero u abbiamo
13(-2T+7u) + 7(4T-13u) = 2T
e le soluzioni intere positive date da
si ottengono dando a u tutti i valori interi positivi per i quali 2T > 7u e 13u > 4T cioè 2T7 < u < 4T13 Ecco il programma: Abu Kamil trova 96 soluzioni mentre il problema ne ammette 98 |
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
Poniamo T=100-x4.
Usando il metodo di Fibonacci abbiamo due soluzioni indipendenti dell’equazione omogenea 12x1+3x2+2x3 = 6(x1+x2+x3) : P=(1,2,0) e S=(2,0,3) e quindi ogni soluzione intera si scrive come (x1, x2, x3) = aP+bS. Ragionando come nel caso precedente si trova x2=2a, x3=3b con a e b interi positivi. La somma =T fornisce l’equazione
3a + 5b = T
ha le soluzioni a=2T-5u e b=3u-T con
T3 < u <
2T5
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
Usando il metodo di Fibonacci abbiamo due soluzioni indipendenti dell’equazione omogenea
120 x1+3x2+20x3 = 60(x1+x2+x3) : P=(57, 120, 0) e S=(1, 0, 3) e quindi ogni soluzione intera si scrive come
(x1, x2, x3) = aP+bS =(57a+b, 120a, 3b)
dove a=x2120, b=x330
e
x1= 57120x2+13x3
cioè 120x1=19*9x2+40x3, da questo si deduce che x2 =40p è divisibile per 40 e semplificando abbiamo 3x1=19*9p+x3, x3=3q è quindi un multiplo di 3 dividendo per 3 abbiamo x1=57p+q dove p e q sono interi positivi. p è al massimo 1 perché x1<100 e per p=1 abbiamo x2=40, x3=3q>3 e x1>57 e la loro somma è maggiore di 40+3+57>100 il che è impossibile.
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
Poniamo subito T=100-x5 e dunque
x1 + x2 + x3 + x4 = T
e l’equazione omogenea diventa
2x1 + 12x2 + 13x3 + 14x4 = x1 + x2 + x3 + x4
ovvero
24x1 + 6x2 + 4x3 + 3x4 = 12(x1 + x2 + x3 + x4)
Risolviamo subito l’equazione omogenea con metodo di Fibonacci: abbiamo tre soluzioni indipendenti P=(1, 2, 0, 0); S=(2, 0, 3, 0), Q=(3, 0, 0, 4). Ogni soluzione dell’equazione omogenea si ottiene come combinazione lineare a coefficienti razionali di queste soluzioni particolari
(x1 + x2 + x3 + x4) = aP+bS+cQ = (a+2b+3c, 2a, 3b, 4c)
dove x1, x2, x3, x4 sono numeri interi positivi e a, b, c numeri razionali. Abbiamo dunque
a=12x2 ,
b=13x3 ,
c=14x4 ,
x1=12x2+23x3+34x4
dove l’ultima equazione ovvero
12x1 = 6x2 + 8x3 + 9x4
coinvolge solo numeri interi positivi. Da questa ricaviamo che 9x4 è pari e dunque
x4 = 2q con q intero positivo.
Dividendo per 2 abbiamo 6x1 = 3x2 + 4x3 + 9q e quindi 4x4 è divisibile per 3 e dunque
x3 = 3p con p intero positivo.
Dividendo per 3 troviamo che x2+4p+3q deve essere pari e
x1 = x2+4p+3q 2
Imponiamo (solo ora) la condizione sulla somma:
x2+4p+3q 2 + x2 + 3p + 2q = T
ovvero
10p+7q = A = 200-2x5-3x2
(1)
Ogni soluzione intera positiva p, q, x2 , x5 dell’equazione (1) fornisce una soluzione intera positiva X del sistema iniziale data da
(2)
viceversa ogni soluzione intera del sistema mi da una soluzione intera di (1). |
|||||||||||||||||||||||||||
Fissiamo un valore per x5 (da 1 a 99) risolviamo le equazioni 10p+7q = A = 200-2x5-3x2 dando a x2 tutti i valori da 1 a 99 e poi facciamo lo stesso dando a x5 tutti i valori da 1 a 99.
Vediamo intanto come si risolve con numeri interi positivi l’equazione 10p+7q = A
Abbiamo, usando l’identità di Bezout,
10(-2A+7u) + 7(3A-10u) = A.
e le soluzioni intere positive di (2) si trovano in corrispondenza ai valori u interi per i quali 27A < u < 310A per ogni tale u abbiamo p=7u-2A e q=3A-10u e la corrispondente soluzione data da (2). Ecco il programma che fornisce le 2678 soluzioni Queste poche righe di programma descrivono un processo col quale calcolare le soluzioni. É un modo molto efficiente per compattare una informazione di grandi dimensioni: anziché elencare esplicitamente le 2678 cinquine si trasmette, a un ipotetico fruitore dotato di un calcolatore elettronico, solo il modo di costruirle. |
|||||||||||||||||||||||||||