Een priemgetal is een natuurlijk getal verschillend van 1 dat enkel maar deelbaar is door 1 en zichzelf. Zo zijn 2, 5 en 101 bijvoorbeeld priemgetallen, maar 1, 6 en 100 bijvoorbeeld niet. Het is een wiskundig feit dat elk natuurlijk getal \(n \in \mathbb{N}\) geschreven kan worden als een product van machten van priemgetallen:
$$ n = p_1^{a_1} \dots p_k^{a_k}. $$
Dit noemen we een priemfactorisatie of ontbinding in priemfactoren. Het getal 2020 kan bijvoorbeeld ontbonden worden in de volgende priemfactoren:
$$ 2020 = 2^2 \times 5 \times 101. $$
Het simpelste algoritme om priemfactorisaties te bepalen, is trial division. Hierbij ga je voor een getal \(n\) als volgt te werk:
We kunnen dit bijvoorbeeld toepassen op 2020:
We hebben dus twee keer 2 geteld, één keer 5 en één keer 101.
Schrijf een Python-programma dat een lijst van getallen neemt als invoer en hun priemfactorisatie uitschrijft als uitvoer. De invoer aan het programma is een lijst van getallen die gefactoriseerd moeten worden. Als uitvoer moet het programma voor elk getal een lijst van koppels teruggeven die de priemfactorisatie beschrijven. Zo moet het getal 2020 bijvoorbeeld volgende lijst opleveren als uitvoer:
[(2, 2), (5, 1), (101, 1)]
Dit is een lijst van koppels \( [(p_1, a_1), (p_2, a_2), (p_3, a_3)] \) waar \(p_1, p_2, p_3\) de priemgetallen zijn uit de factorisatie van 2020 (hier dus 2, 5 en 101) en \(a_1, a_2, a_3\) zijn de overeenkomstige exponenten (2, 1 en 1). Zorg ervoor dat deze lijst gesorteerd is zodat de priemgetallen in stijgende volgorde staan.
Invoer:
2020
1994
1998
1830
Uitvoer:
[(2, 2), (5, 1), (101, 1)]
[(2, 1), (997, 1)]
[(2, 1), (3, 3), (37, 1)]
[(2, 1), (3, 1), (5, 1), (61, 1)]