2520 ist das kleinste gemeinsame Vielfache der Zahlen 1 bis 10.
Was ist das kleinste gemeinsame Vielfache der Zahlen 1 bis 20?
Lösung
Möglichkeit 1
Um das kleinste gemeinsame Vielfache der Zahl
zu bestimmen, führen wir für jeden Teiler
eine Primfaktorzerlegung durch. Dabei wird die Anzahl
der vorkommenden Primfaktoren
bestimmt. Für jede Primzahl
wird ihr häufigstes Vorkommen
gespeichert. Das kleinste gemeinsame Vielfache
ist dann:

In Matlab wird dies durch drei Schleifen realisiert. Die erste Schleife stellt den Vektor mit Primzahlen auf, die zweite führt die Primfaktorzerlegung durch und die dritte berechnet das kleinsge gemeinsame Vielfache:
grenze = 20;
primVec = 2;
for prim = 3 : grenze
wurzel = floor(sqrt(prim));
istPrim = 1;
if mod(prim, 2) == 0
istPrim = 0;
end
for teiler = 3 : 2 : wurzel
if mod(prim, teiler) == 0
istPrim = 0;
end
end
if istPrim == 1
primVec = [primVec prim];
end
end
primVec
primMax = zeros(1, length(primVec));
for teiler = 2 : grenze
primAct = zeros(length(primVec));
for primNummer = 1 : length(primVec)
while mod(teiler, primVec(primNummer)) == 0
teiler = teiler / primVec(primNummer);
primAct(primNummer) = primAct(primNummer) + 1;
end
end
for primNummer = 1 : length(primVec)
if primMax(primNummer) < primAct(primNummer)
primMax(primNummer) = primAct(primNummer);
end
end
end
primMax
kgv = 1;
for primNummer = 1 : length(primVec)
for primAnzahl = 1 : primMax(primNummer)
kgv = kgv * primVec(primNummer);
end
end
kgv
Ergebnis: 232792560
Rechenzeit: 0.000313 Sekunden
Möglichkeit 2
Der oben beschriebene Ansatz funktioniert schon sehr gut, er kann aber optimiert werden.
Der erstellte Vektor mit Primzahlen lautet:
2 3 5 7 11 13 17 19
Die jeweiligen Exponenten sind:
4 2 1 1 1 1 1 1
Wir suchen nun nach einer Berechnungsvorschrift für die Exponenten, die es uns erspart, die Primfaktorzerlegung durchzuführen.
Als erstes betrachten wir den Primfaktor 2. Es gilt:

16 ist die größte Zweierpotenz im Intervall [1,20]. Der Exponent für 2 muss also 4 sein. Analog gilt für den Primfaktor 3:

Der Exponent für 3 ist daher 2. Als Gleichung aufgeschrieben:

Wir lösen nach dem gesuchten Exponenten auf:

Da die Koeffizienten
natürliche Zahlen sein müssen, runden wir nach unten ab:

Beispiel:

Um das Verfahren noch weiter zu optimieren, nutzen wir die Information, dass

Dies setzen wir nun alles in Matlab um:
grenze = 20;
primVec = 2;
for prim = 3 : grenze
wurzel = floor(sqrt(prim));
istPrim = 1;
if mod(prim, 2) == 0
istPrim = 0;
end
for teiler = 3 : 2 : wurzel
if mod(prim, teiler) == 0
istPrim = 0;
end
end
if istPrim == 1
primVec = [primVec prim];
end
end
primVec
primMax = ones(1, length(primVec));
kgv = 1;
it = 1;
while primVec(it) < sqrt(grenze)
primMax(it) = floor(log(grenze) / log(primVec(it)));
it = it + 1;
end
primMax
for it = 1 : length(primMax)
kgv = kgv * primVec(it) ^ primMax(it);
end
kgv
Rechenzeit: 0.000262 Sekunden


