Probleemstelling
Een pythagorees drietal bestaat uit drie positieve gehele getallen
waarvoor
![]()
Zo vormen 3, 4 en 5 een voorbeeld, want
.
Er is precies één dergelijk drietal met
. Bepaal het product
.
Bron: Project Euler, opgave 9.
Eerste analyse
We kunnen mogelijke waarden van
,
en
proberen, maar drie lussen doen veel overbodig werk. Zodra
en
gekozen zijn, ligt
vast.
Omdat
, geldt
. We hoeven dus alleen
te onderzoeken. Voor
geldt
![]()
want
betekent
. Zo blijven 82.834 kandidaatparen over: een kleine zoekruimte voor Python.
Gekozen programmeeraanpak en algoritme
We gebruiken twee lussen en rekenen uitsluitend met gehele getallen.
- Kies achtereenvolgens waarden van
en
met twee lussen. - Bereken
en controleer
. - Geef met
returnhet eerste gevonden drietal terug. - Toon het drietal, het product en de uitvoeringstijd.
Deze compacte versie stopt bij de eerste oplossing. Ze controleert de gevonden tripel, maar bewijst niet de uniciteit. De opgave vermeldt dat de oplossing uniek is.
Voor een algemene som
heeft deze aanpak tijdscomplexiteit
en extra geheugencomplexiteit
. Door algebraïsch
af te leiden kan een programma met één lus worden gemaakt. De twee lussen houden de programmeercontrole eenvoudig en onafhankelijk van de parameterformule.
Python-programma
Het programma werkt zelfstandig met Python 3. // betekent gehele deling met afronding naar beneden. De eindgrens van range is niet inbegrepen. Deze compacte grenzen volstaan voor het gezochte drietal bij som 1000, maar kunnen voor andere sommen grensgevallen overslaan. Met return verlaat de functie beide lussen zodra een oplossing gevonden is.
from time import perf_counter
def zoek_tripel(som):
for a in range(1, som // 3):
for b in range(a + 1, (som - a) // 2):
c = som - a - b
if a**2 + b**2 == c**2:
return a, b, c
start = perf_counter()
a, b, c = zoek_tripel(1000)
print(a, b, c)
print("Product:", a * b * c)
print("Tijd:", perf_counter() - start)
Wiskundige oplossing
De formule voor een pythagorees drietal
Voor gehele getallen
gebruiken we het drietal
![]()
Dit voldoet aan de stelling van Pythagoras, want
![Rendered by QuickLaTeX.com \[\begin{aligned} (m^2-n^2)^2+(2mn)^2 &=m^4-2m^2n^2+n^4+4m^2n^2\\ &=m^4+2m^2n^2+n^4\\ &=(m^2+n^2)^2. \end{aligned}\]](https://usercontent.one/wp/www.wiskundemagie.be/wp-content/ql-cache/quicklatex.com-107c7782bc42bf9a5abe68e3fd81218b_l3.png?media=1789935901)
Alle drie de getallen zijn positief. Bovendien is
groter dan elk van de twee andere: de verschillen zijn
en
. De twee rechthoekszijden moeten eventueel nog van plaats wisselen om
te verkrijgen.
De somvoorwaarde gebruiken
De som van de drie uitdrukkingen is
![]()
We zoeken dus gehele getallen
met
![]()
Hieruit volgt dat
een deler van 500 is en dat
![]()
Uit
volgt
. Vermenigvuldigen met
geeft
![]()
Daarom komt alleen
in aanmerking. Omdat
, is 20 de enige deler van 500 in dat interval. Dus
![]()
Het drietal en het product
Invullen levert
![]()
Na ordenen krijgen we
![]()
We controleren rechtstreeks:
![]()
![]()
Het gevraagde product is bijgevolg
![]()
Wiskundige verdieping: primitieve drietallen en uniciteit
Een drietal heet primitief wanneer zijn drie getallen geen gemeenschappelijke deler groter dan 1 hebben. Het gevonden drietal is niet primitief:
![]()
De primitieve tripel ontstaat met
en
; onze keuze
,
vermenigvuldigt beide parameters met 5 en daardoor alle zijden met
.
Voor het vormen van een geldig drietal hoeven
en
dus niet onderling ondeelbaar te zijn. Voor een primitief drietal vraagt men wel dat
en
onderling ondeelbaar zijn en een verschillende pariteit hebben.
De ongeschaalde formule alleen beschrijft niet alle gehele pythagorese drietallen. Voor een volledige parametrisering gebruikt men ook een positieve gehele schaalfactor
:
![]()
Het vinden van één parameterpaar in onze ongeschaalde formule is daarom op zichzelf geen volledig uniciteitsbewijs. Het compacte Python-programma vindt onafhankelijk hetzelfde drietal, maar stopt bij de eerste oplossing. Het levert daarom geen afzonderlijk uniciteitsbewijs.
Controle met Python en resultaat
Een uitvoering van het compacte programma gaf:
200 375 425
Product: 31875000
Tijd: 0.009028022001075442
Het antwoord is 31875000. De gemeten uitvoeringstijd was 0,009028022001075442 seconden. De meting omvat de zoekopdracht en het afdrukken van het drietal en het product. De tijd kan verschillen naargelang de computer, Python-versie en systeembelasting.
Besluit
De formule
herleidt de somvoorwaarde tot
. Met
en
vinden we na ordenen
. Het compacte Python-programma vindt onafhankelijk hetzelfde drietal. Het product bedraagt 31875000.