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.