Programme Addition Lineare Gleichung Sieb des Eratosthenes Plotter
Pfad: Startseite / Fächer / Informatik / Delphi / Programme / Sieb des Eratosthenes
Autor: mk
18.10.2005 19:15:34
16377
Sieb des Eratosthenes

Das Sieb des Eratosthenes

Im Mathematik-Lehrbuch der 6.Klasse (Lambacher-Schweizer 6, Klett-Verlag, 73102) findet man folgende Beschreibung:

  1. Schreibe die Zahlen von 2 bis z.B. 100 auf.
  2. Die erste Zahl ist 2. Streiche alle Vielfachen von 2, außer 2 selbst.
  3. Suche die nächste nicht gestrichene Zahl; streiche alle Vielfachen von ihr, außer der Zahl selbst.
  4. Wiederhole 3., so lange man auf diese Art noch Vielfache streichen kann.

Alle übrig gebliebenen Zahlen sind die Primzahlen. Bei den Zahlen bis 100 kann man schon nach dem Streichen aller Vielfachen von 7 aufhören.

Aufgabe

Schreibe ein Delphi-Programm, das nach obigem Algorithmus Primzahlen sucht.

mögliche Schritte hin zur Lösung
Erste vorläufige Lösung

GUI zu Eratostenes0eratosthenes0.zip

Kritik der Lösung

Es ist typisch, dass man bei der ersten Lösung in Teillösungen gedacht hat und nicht mehr einen klaren Blick für das Ganze hat. Hier sollte man kritisch über die Lösung sehen. Sind die Variablen sinnvoll benannt? Sind die Datentypen sinnvoll gewählt? Braucht man überhaupt alle Variablen oder sind Reste früherer Versuche im Programm-Code enthalten? Wurden Programmiersprachen-abhängige Besonderheiten benutzt?

Folgende Version ist an einigen Stellen verändert. Was bewirken die Änderungen? Ist das Programm 'besser'?

procedure TForm1.bRechneClick(Sender: TObject);
const
  n = 200;
var
  zahl   : array[2..n] of boolean;
  p,i,v  : integer;
  weiter : boolean;
begin
  // Eingabe

  // Verarbeitung
  for i := 2 to n do zahl[i] := true;
  p := 2;
  while p <= n do
  begin
    // es werden die Vielfachen von p getrichen
    v := 2*p; // v ist das 'Vielfache'
    while v <= n do
    begin
      zahl[v] := false;
      v := v+p;
    end;
    // es wird die nächste nicht gestrichene Zahl gesucht
    p := p+1;
    if p <= n then weiter := true;  // 'weiter' ist ein logischer Schalter
    while weiter do
      if (p<=n) and (zahl[p] = false)
      then
        p := p+1
      else
        weiter := false;
  end;

Es folgt eine dritte Version:

  for i := 2 to n do zahl[i] := true;
  for i := 2 to n do
    if zahl[i] = true
    then
    begin
      // es werden die Vielfachen von zahl[i] getrichen
      v := 2*i;
      while v <= n do
      begin
        zahl[v] := false;
        v := v+i;
      end;
    end;

Diese Version entspricht nicht mehr 1:1 der Beschreibung aus dem Mathematikbuch. Wie müsste hier die Beschreibung lauten?

Aufgabe
Lies dir die Beschreibung des Sieb-Algorithmus bei wikipedia durch. Verfolge den Link zu Primzahltest und versuche, das angegebene Programm nach Pascal zu übersetzen. Bist du mit der Darstellung des Algorithmus zufrieden?