Inleiding In dit artikel wordt beschreven hoe mijn programma "Euclides" x en y oplost in de vergelijking Ax + By = C, waarbij A,B,C,x,y gehele getallen zijn. Dit type hoort tot de Diophantische vergelijkingen. Download het programma door op het download (bliksem) logo bovenaan deze pagina te klikken. Dit soort vergelijkingen ontstaat bijvoorbeeld uit de puzzel:
Jan: 40% van de wagens is voor jou. Schenk 5 andere aan een museum. Heleen: 40% van de overgebleven wagens is voor jou. Schenk 3 andere aan een museum. Emiel: 40% van de overgebleven wagens is voor jou. Schenk 1 andere aan een museum. Roderick : de resterende wagens zijn voor jou. als de verzameling uit x voeruigen bestaat, dan moet:
216x - 1000y = 4600 De kern van de oplossing is het gebruik van het theorema van Euclides. Dat behandelen we dus eerst. Daarna zullen we zien hoe het theorema wordt toegepast om de oplossing te berekenen. Het theorema van Euclides Uit de losse pols komt het theorema van Euclides hierop neer:
ggd(56,35) = ggd(21,35) = ggd(35,21) = ggd(14,21) = ggd(21,14) = ggd(7,14) = ggd(14,7) = ggd(7,7) = 7. Het bewijs bestaat uit twee onderdelen:
A = ad en B = bd dan: A - B = ad - bd = d(a - b) en (A - B)/d = a - b wat een geheel getal is. Dus (A - B) heeft ook een factor d.
A heeft geen factor d. B heeft wel een factor d en B = bd te bewijzen: ggd(A-B,B) = d is niet mogelijk stel: A - B heeft een factor d, dan A - B = A - bd = kd, waarbij k een geheel getal is. delen door d : A/d - b = k A/d = k + b b en k zijn gehele getallen, A/d is een breuk, dus dit is onmogelijk. A - B kan nooit een factor d hebben. In het geval A > B levert herhaalde toepassing :
B wordt afgetrokken van A totdat geldt: A - kB < B. Daarbij is A > B en A,B zijn positief en bezitten geen gemeenschappelikjke factoren. Met het resultaat van deze oplossing wordt dan de originele vergelijking opgelost. De vergelijking standaardiseren. terug naar de oorspronkelijke vergelijking 216x - 1000y = 4600 216, 1000 en 4600 bezitten een gezamenlijke factor 8. Deling door 8 vereenvoudigt de vergelijking tot :
Als A,B,C een gezamenlijke factor bezitten, dan kan die eruit worden gedeeld om de vergelijking te versimpelen. Vanaf dit punt nemen we aan, dat A,B en C geen gemeenschappelikke factor (meer) hebben. Als alleen A en B een gemeenschappelijke factor hebben, bijvoorbeeld d, en A = ad, B = bd, dan
ax + by = C/d C/d is dan een breuk maar (ax + by) is een geheel getal. Conclusie: er is dan geen oplossing. Vanaf dit punt nemen we aan, dat A en B geen gemeenschappelikjke factor hebben, dus ggd(A,B) = 1. Ook nemen we aan dat in Ax + By =C
27x - 125y = 575 ..........wordt daarom veranderd in 27x + 125y = 575........... (verander later het teken van y) en verder 125x + 27y = 575........... (verwissel x en y later). Als geldt C = 0 dan heeft Ax + By = 0 de oplossingen:
stel (x1 , y1) is een oplossing van Ax + By = C en (x0 , y0) is een oplossing van Ax + By = 0 ...............dan combinerend:
waarbij k een geheel getal is dus ...-2,-1,0,1,2,3....... Conclusie: Ax + By = C heeft geen oplossing of oneindig veel oplossingen. Grote getallen Terug naar 125x + 27y = 575 Eerst moet worden opgelost 125x + 27y = 1. Als x1,y1 een oplossing is dan is x = 575x1, y = 575y1 het antwoord waar we naar zochten. Maar deze werkwijze is niet slim, want x en y worden dan heel groot, mogelijk te groot, wat de mogelijkheden beperkt. Het is beter om C zo dicht mogelijk bij 0 (of 1 ) te houden. Dat kan door van C een getal A+B, A, B or (A-B) af te trekken en hiervoor x en y te corrigeren. Inplaats van Ax + By = C lossen we op
dan trekken we A van C af en verhogen xcorr, dan trekken we B van C af en tenslotte trekken we (A-B) van C af waarna we xcorr verhogen en ycorr verlagen. Zodoende wordt de kleinst mogelijke waarde van C verkregen. Kijk opnieuw naar 125x + 27y = 575 27 + 125 = 152, dus 125(x-3) + 27(y-3) = 575 - 3*152 = 119 onthoud dat xcorr = 3, ycorr = 3 we lossen op 125x+ 27y = 119 trek nu 4*27 af van 119: ycorr = 3+4 = 7 en we lossen op 125x + 27y = 119 - 4*27 = 11. En eindelijk, als laatste stap, gebruiken we het theorema van Euclides om 125x + 27y = 1 op te lossen. Het antwoord vermenigvuldigen we met 11 om x en y te bepalen. Daarna moet, voor het dfinitieve antwoord, de correctie voor x en y, de verwisseling van x en y en de tekenwisselingen worden uitgevoerd. De oplossing van Ax + By = 1 Met het theorema van Euclides berekenen we ggd(A,B).
B - q2r1 = r2 r1 - q3r2 = r3 r2 - q4r3 = r4 Het proces stopt met r = 1, de ggd, want A en B hadden geen gemeenschappelijke factoren. Uit het bovenstaande kunnen we het stelsel vergelijkingen schrijven: (als r4 = 1) Door te "vegen" kunnen we de kolommen 2, 3, 4 op nul zetten. Daarna ontstaat het vectorproduct:
Ax + By = 1 plus eventuele verwisseling van x en y en hun tekens. Om de originele vergelijking op te lossen moeten we intikken:
Druk op knopje "volgende" totdat een oplossing verschijnt met positieve waarden van x en y. De uitwerking: Hiermee besluit ik de beschrijving. Hieronder staat de code voor de kern van het programma, waar Ax + By = 1 wordt opgelost. Q[..] is een array met de quotienten van de delingen. r is de rest van een deling.
Interesse in de hele source code? Klik [hier] om het hele Delphi-3 project te downloaden. Henrik Carlsen heeft dit project omgezet naar Delphi-10 en de stijl aangepast aan OOP Klik [hier] om het hele Delphi-10 project te downloaden. |
||||||||||||||||||||||||||||||||||||