Agradeço comentários, sugestões ou correccões. O meu endereço de correio electrónico é < delfim@mat.ua.pt > . Desde já obrigado.
É bem sabido que quaisquer dois inteiros não nulos a e b admitem um m.d.c. Vamos examinar um dos métodos de cálculo do m.d.c. chamado algoritmo de Euclides.1 Admitiremos, para fixar as ideias, que | a| ³ | b|. Procedemos por etapas.
|
|
|
Iteramos este processo, repetindo sucessivamente as respectivas operações. Em cada estágio o resto obtido será estritamente inferior ao da etapa precedente, isto é,
|
|
É fácil de ver que o último resto distinto do zero, a saber rk-1, será o m.d.c. de a e b que procuramos. De facto, têm lugar as seguintes igualdades:
|
Examinemos o exemplo com a = 858 e b = 253. Encontremos o m.d.c. destes números, sem decompo-los em factores primos, aplicando o algoritmo de Euclides:
|
Um resultado também bem conhecido2 é o de que o número d = m.d.c.(a, b) pode ser escrito como uma combinação linear de a e b:
|
|
|
|
As igualdades que ocorrem ao se encontrar o m.d.c. de dois números a e b mediante o algoritmo de Euclides permitem, pois, resolver em números inteiros qualquer equação do tipo
|
Em geral, qualquer equação da forma
|
Passemos à análise da existência de soluções da equação (ED) no caso geral. Observemos, antes de tudo, que nem toda a equação deste tipo admitirá uma solução. De facto, suponhamos que os inteiros x = x0 e y = y0 satisfazem a equação ( ED) , quer dizer, c = x0 a+y0 b. Neste caso, se d = m.d.c.( a, b) , então o facto de d ser divisor comum de a e b resulta que d dividirá ambos os termos à direita nesta igualdade e que, por conseguinte, dividirá c. Daqui decorre a seguinte afirmação.
Para que uma equação do tipo ( ED) admita uma solução em números inteiros, é necessário que o número c seja divisível pelo m.d.c. dos coeficientes a e b.
A equação
|
|
|
Resolvamos, a título de exemplo, a equação diofantina
|
|
|
mdc(N1,N2,M,L)
onde M é o máximo divisor comum de N1 e N2 e L é uma lista de listas com a informação de todas as etapas do algoritmo. Cada etapa, que consiste numa divisão D1 = Q * D2 + R < = > R = D1 - Q * D2, será representada pela lista [R,[-Q,D2],[1,D1]].
diofantina(A,B,C,X,Y),
que recebe três inteiros A, B e C e retorna uma solução X,Y (caso exista) da equação diofantina A*X + B*Y = C, pelo método acima descrito.
Neste problema não existem outros dados para além do conhecimento acima descrito.
Os predicados mdc(N1,N2,M,L) e diofantina(A,B,C,X,Y) devem produzir resultados consonantes com os exemplos que se seguem.
Exemplo ``mdc''
?-mdc(858,253,M,L). M =11 L = [ [ 11,[-1,44],[1,55] ], [ 44,[-1,55],[1,99] ], [ 55,[-2,99],[1,253] ], [ 99,[-3,253],[1,858] ] ]
Exemplos ``diofantina''
?-diofantina(434,233,3,X,Y). X =-153 Y = 285 ?-diofantina(858,253,33,X,Y). X = -15 Y = 51 ?-diofantina(15,9,7,X,Y). No
% Solu\c c\~ao para o problema DIOFANTO % por Delfim F. Marado Torres, Fev. 1999 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % mdc(N1,N2,M,L) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % M é o máximo divisor comum % de N1 e N2 (supomos ambos estritamente positivos com N1 > N2) % % O método usado para obter M % é o algoritmo de Euclides % % L é uma lista de listas com a informação % de todas as etapas do algoritmo. Cada % etapa consiste numa divisão % D1 = Q * D2 + R <=> R = D1 - Q * D2 % que será representada pela lista % [R,[-Q,D2],[1,D1]] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mdc(N1,N2,M,L) :- integer(N1), integer(N2), N1 > N2, N2 > 0, euclides(N1,N2,M,L). euclides(N1,N2,N2,[]) :- etapa(N1,N2,_,0). euclides(N1,N2,M,L) :- etapa(N1,N2,Q,R), euclides(N2,R,M,L1), concatena(L1,[[R,[-Q,N2],[1,N1]]],L). etapa(D1,D2,Q,R) :- Q is D1 // D2, R is D1 mod D2. concatena([],L,L). concatena([X|R],L,[X|C]) :- concatena(R,L,C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % diofantina(A,B,C,X,Y) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Dado A, B e C, pretendemos resolver uma equação diofantina da % forma % A*X + B*Y = C (supomos A > B) % % Se B = mdc(A,B) Entao se B divide C temos solução trivial: % X = 0, Y = C/B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXEMPLOS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ?- diofantina(434,233,3,X,Y). %% X = -153 %% Y = 285 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ?- diofantina(858,253,33,X,Y). %% X = -15 %% Y = 51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ?- diofantina(15,9,7,X,Y). %% No %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diofantina(A,B,C,X,Y) :- A > B, mdc(A,B,M,L), !, 0 is C mod M, ( M = B, L = [], X = 0, Y is C // B ; expande(L,[M,[Y1,B],[X1,A]]), Mlt is C // M, X is X1*Mlt, Y is Y1*Mlt ). expande([L],L). expande([[A1,[B1,_],[D1,E1]],[_,[B2,E1],[D2,E2]]|R],L) :- B is B1 * B2 + D1, D is B1 * D2, expande([[A1,[B,E1],[D,E2]]|R],L).
1 Este método aparece descrito nos ``Elementos'' de Euclides.
2 Ver, por exemplo, o Cap. I, Teorema 3, do livro Divisão Inexata de A. A. Belsky e L. A. Kalujnin, publicado na colecção Iniciação na Matemática da editora MIR.
3 O termo ``diofantina'' vem de Diofanto, matemático grego da antiguidade (III século a. C.) que na sua ``Aritmética'' estudou equações em números inteiros.