28
Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Embed Size (px)

Citation preview

Page 1: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Calcolo del Massimo Comun Divisore

di Russo MatteoMatricola: 196493

a.a. 2012/2013

Page 2: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Problema

Calcolare il massimo comun divisore di due numeri.

Page 3: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Studio del problema nel suo dominio specifico

Il massimo comune divisore (M.C.D.) di due numeri interi a e b che non siano entrambi uguali a zero, è il numero naturale più grande per il quale possono entrambi essere divisi.

Page 4: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Algoritmo

• Leggi entrambi i valori• Controlla se sono diversi da 0, se almeno uno lo è richiedi

all’utente di reinserirli• Calcolo il valore assoluto di entrambi i numeri• Trova il minimo fra i due, inizializza i con 2• Dividi entrambi i numeri per il numero i• Se entrambi i numeri sono divisibili per questo numero: mcd i

• Incrementa i• Ripeti l’operazione finché i sia uguale al minimo fra i due

numeri

Page 5: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013
Page 6: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013
Page 7: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Codice Sorgente#include <stdio.h>#include <stdlib.h>

int main(){ int i,n1,n2,MIN,mcd; do{ printf("Inserire due numeri (interi): "); scanf("%d %d",&n1,&n2); } while(n1==0 || n2==0);

n1=abs(n1);n2=abs(n2);

Page 8: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Codice Sorgenteif(n1>n2){ MIN=n2; } else{ MIN=n1; }mcd=1; for(i=1;i<=MIN;i++){ if((n1%i)==0 && (n2%i)==0){ mcd=i; } } printf("MCD: %d",mcd);

return 0;}

Page 9: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Osservazione

Il problema così risolto va bene per numeri relativamente piccoli. Esempio: se noi inseriamo 30 e 27, l’operazione all’interno del secondo ciclo (FOR) si ripeterà per 27 volte! Esiste un secondo algoritmo che permette di calcolare il MCD in modo più veloce: sfruttando il «metodo delle sottrazioni successive» di Euclide.

Page 10: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Studio del problema nel suo dominio specifico (2)

“Considerati due numeri a e b, sostituiamo il maggiore tra essi con la loro differenza, procediamo fino a quando uno dei nuovi numeri della coppia è nullo, si osserva che il Massimo Comun Divisore è il primo numero, ottenuto mediante tali differenze e che sia diverso da zero” (Libro VII degli Elementi di Euclide).

Page 11: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Studio del problema nel suo dominio specifico (2)

f(x,x) = x

f(x,y) = f(x - y, y) se x > y

f(x,y) = f(x, y – x) se y > x

Page 12: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Giustificazione

• Se A e B hanno M come MCD, allora si può porre ( si supponga A > B):

• A = h · M• B = k · M• La differenza A- B = (h – k) · M ha ancora M

come fattore.• Si osserva che A – B < A, per cui se si ripete il

procedimento tra B e la differenza, e così via, si arriva a determinare M.

Page 13: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Algoritmo

• Leggi entrambi i valori• Controlla se sono diversi da 0, se almeno uno

lo è richiedi all’utente di reinserirli• Calcolo il valore assoluto di entrambi i numeri• Sostituire il numero più grande tra i due con la

differenza tra i due• Ripetere l’operazione fino a quando i due

numeri hanno lo stesso valore

Page 14: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Osservazione

Bisogna sempre sostituire il numero più grande con la differenza fra i due, pertanto se la differenza dovesse essere minore del secondo numero, quest’ultimi bisogna scambiarli!

Page 15: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

EsempioPrendiamo in considerazione 100 e 90

Per cui bisogna scambiarli:

Il MCD è 10.

a b

100 90

10 90

ERRORE! /

a b

90 10

80 10

… …

10 10

0 10

Page 16: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013
Page 17: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Codice Sorgente#include <stdio.h>#include <stdlib.h>

int main(){ int i,n1,n2; do{ printf("Inserire due numeri (interi): "); scanf("%d %d",&n1,&n2); } while(n1==0 || n2==0);

n1=abs(n1);n2=abs(n2);

Page 18: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Codice Sorgente

while(n1!=n2){ if(n1>n2){ n1=n1-n2; } else{ n2=n2-n1; } } printf("MCD: %d",n1); return 0;}

Page 19: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Osservazione

Esiste però, un altro metodo che permette di trovare il risultato ancora più velocemente: il «metodo delle divisioni successive».

Page 20: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Studio del problema nel suo dominio specifico (3)

“Il massimo comun divisore di due numeri è uguale al massimo comun divisore tra il minore di essi e il resto della loro divisione” (Euclide).Consideriamo due numeri a e b, sostituiamo il minore di essi con il resto della divisione tra il numero maggiore e quello minore, il procedimento termina quando il resto è uguale a 0 e il MCD è il valore assunto dal valore minore.

Page 21: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Giustificazione• Siano dati A e B e si supponga A > B. Sia M = MCD(A, B), allora• A = h · M• B = k · M• Se effettuo la divisione:• A / B = q con resto r, quindi:• A = q · B + r con r < B (< A). Da cui:• A - q · B = r sostituendo:• h · M - q · k · M = r• (h - q · k) · M = r• da cui si deduce che anche r ha come fattore M.• Iterando l’operazione tra B ed r, e così via, si arriva al resto = 0,

momento in cui si arriva a determinare M.

Page 22: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Esempio

Prendiamo in considerazione 182 e 104:

Il MCD è 26.

a b Resto

182 104 78

104 78 26

78 26 0

Page 23: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Algoritmo

• Leggi entrambi i valori• Controlla se sono diversi da 0, se almeno uno

lo è richiedi all’utente di reinserirli• Calcolo il valore assoluto di entrambi i numeri• Controllare che il primo sia maggiore del

secondo, in caso scambiarli• Calcolare il resto della divisione tra i due

Page 24: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Algoritmo

• Sostituire il valore maggiore con il minore• Sostituire il valore minore con il resto (solo se

il resto è maggiore di 0• Ripetere l’operazione fino a quando il resto è

maggiore di 0

Page 25: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013
Page 26: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013
Page 27: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Codice Sorgente#include <stdio.h>#include <stdlib.h>

int main(){ int i,n1,n2;

do{ printf("Inserire due numeri (interi): "); scanf("%d %d",&n1,&n2); } while(n1==0 || n2==0);

Page 28: Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013

Codice Sorgenten1=abs(n1);n2=abs(n2);

while(n1!=n2){ if(n1>n2){ n1=n1-n2; } else{ n2=n2-n1; } }

printf("MCD: %d",n1); return 0;}