Inhoud
- Voorwoord
- Priemgetallen?
- Ontbinden in priemfactoren?
- De code
- Afsluiting
Voorwoord
Als eerste wil ik zeggen dat deze tutorial niet alleen PHP is maar ook een stukje algebra / logica / wiskunde. Ik ga er van uit dat je voor deze tutorial wel op zijn minst een basis kennis hebt van PHP. Voor het stukje met priemgetallen en ontbinden heb je verden geen kennis nodig, dat leg ik voor je uit.
Priemgetallen?
Priemgetallen zijn gehele getallen met een bijzondere eigenschap: Deze getallen zijn alleen deelbaar door 2 verschillende getallen, door 1 en door zichzelf. Dat wil dus zeggen dat 1 geen priem getal is. Ook al is het deelbaar door 1 en door zichzelf (1), het is niet deelbaar door 2 verschillende getallen. 2 is echter wel een priem getal. Het is alleen deelbaar door 1 en door zichzelf (2). De eerste 30 priemgetallen zijn:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113
Ontbinden in priemgetallen?
Ontbinden in priemfactoren betekent dat we een getal gaan schrijven als een vermenigvuldiging (factoren) van priemgetallen. Ieder (heel) getal kun je ontbinden in priemfactoren. Om de factoren te vinden deel je het getal net zo lang door priemgetallen (vanaf de kleinste) tot je 1 als uitkomst krijgt. De delers zijn nu je factoren. Als voorbeeld gaan we het getal 1260 in ontbinden in priemfactoren.
We kijken of 1260 deelbaar is door 2 (het eerste priemgetal).
Ja, en de uitkomst is 630. (2)
Nu kijken we of 630 ook deelbaar is door 2.
Ja, en de uitkomst is 315. (2 * 2)
Nu kijken we of 315 ook deelbaar is door 2.
Nee, dan kijken we of 315 deelbaar is door 3 (het volgende priemgetal).
Ja, en de uitkomst is 105. (2 * 2 * 3)
Nu kijken we of 105 ook deelbaar is door 3.
Ja, en de uitkomst is 35. (2 * 2 * 3 * 3)
Nu kijken we of 35 ook deelbaar is door 3.
Nee, dan kijken we of 35 deelbaar is door 5 (het volgende priemgetal).
Ja, en de uitkomst is 7. (2 * 2 * 3 * 3 * 5)
Nu kijken we of 7 ook deelbaar is door 5.
Nee, dan kijken we of 7 deelbaar is door 7 (het volgende priemgetal).
Ja, en de uitkomst is 1. (2 * 2 * 3 * 3 * 5 * 7)
De uitkomst: 1260 = 2.2.3.3.5.7
Dit kan je eventueel met je rekenmachine controleren.
De code
Zoals je hierboven in het voorbeeld hebt gezien is het ontbinden in priemfactoren niets meer dan een herhaling van handelingen waarin de variabele (het priemgetal waardoor je deelt en het getal zelf.) steeds veranderen.
We beginnen met het maken van een functie genaamd “Solve”. Deze functie heeft ook een variabele nodig, namelijk het getal wat we willen ontbinden in priemgetallen.
<?php
function solve($number) {
}
We hebben nu een functie die nog niks doet. Maar voordat we kunnen gaan ontbinden hebben we eerst nog een aantal priemgetallen nodig.
Je zou hier ook een script voor kunnen schrijven maar gezien het feit dat ik hierboven de eerste 30 priemgetallen al cadeau heb gegeven gebruiken we die gewoon. We gaan nu dus binnen onze functie de eerste 30 priemgetallen in een array zetten. Ook maken we een variabele ($i)
aan die gaat dienen als een counter. Als laatste maken we nog een lege variabele aan waar we het antwoord in opslaan.
<?php
function solve($number) {
$prime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, ... ];
$i = 0;
$answer = "";
}
Om de factoren te vinden deel je het getal net zo lang door priemgetallen (vanaf de kleinste) tot je 1 als uitkomst krijgt. Oftewel, zolang $number niet gelijk is aan 1 is het antwoord ook nog niet goed. Dus we voegen een while loop toe. We hebben nu dus een functie met een lege while loop die in princiepe altijd door blijft gaan omdat er nog niks in gebeurd. We moeten dus kijken of een getal deelbaar is door een priem getal en anders door gaan naar het volgende getal.Hiervoor gebruiken we een if statement.
<?php
function solve($number) {
$prime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, ... ];
$i = 0;
$answer = "";
while ($number != 1) {
if ($number % $prime[$i] == 0) {
// Do stuff
} else {
$i++;
}
}
}
We hebben onze $number en we hebben een priem getal uit de array $prime[$i]
. Wat het % teken doet is de rest waarde berekenen. Ook wel bekend als “Modulo”. Als de rest waarde van de gedeelde getallen 0 is dan is het getal dus deelbaar, anders niet. Vervolgens komen we alweer toe aan het laatste stukje van ons programma. Als het getal deelbaar is door het priemgetal moeten we 2 dingen doen:
$number
moet aangepast worden naar de uitkomst van de deling.$answer
moet bijgewerkt worden met het nieuwe priem getal.
Na de while loop voegen we ook nog een echo toe omdat we ook de uitkomst willen zien. Ook voegen we nog een nieuwe $sum toe die de waarde van $number krijgt zodat je bij een groot aantal sommen niet in de war raakt. We hebben nu onze code af. Om onze functie aan te roepen hoeven we nu alleen maar solve($number);
te typen.
<?php
function solve($number) {
$prime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, ... ];
$i = 0;
$answer = "";
$sum = $number;
while ($number != 1) {
if ($number % $prime[$i] == 0) {
$number = $number / $prime[$i];
$answer .= " " . $prime[$i];
} else {
$i++;
}
}
echo $sum . " = ". $answer. "<br>";
}
solve(12);
solve(210);
solve(6300);
solve(147);
solve(2133);
solve(30030);
solve(5265);
solve(137350);
solve(3016);
Dit geeft als uitkomst op je scherm:
12 = 2 2 3
210 = 2 3 5 7
6300 = 2 2 3 3 5 5 7
147 = 3 7 7
2133 = 3 3 3 79
30030 = 2 3 5 7 11 13
5265 = 3 3 3 3 5 13
137350 = 2 5 5 41 67
3016 = 2 2 2 13 29
Je hebt nu de som met het antwoord waar alle priemgetallen zijn gescheiden door een spatie.
Afsluiting
Dit was mijn tutorial over hoe je kan ontbinden in priemgetallen in PHP. Hopelijk heb je er iets van geleerd. Vragen en opmerkingen zijn natuurlijk altijd welkom.