(* Prim - wurde im Jahre 1990 von Marcus Schießer geschrieben
   Das Programm ist Freeware. Das Kopierrecht liegt allein beim Autor.
   Das Programm dient zur Berrechnung von Primzahlen *)

MODULE Prim;

FROM InOut IMPORT
  WriteLn,WriteCard,WriteString,ReadLongCard;
FROM Arts IMPORT
  Assert;
FROM MathLib0 IMPORT
  sqrt;
FROM SYSTEM IMPORT
  ADR;

VAR
  zahl,teiler,anzahl,zahlI,zahlII: LONGCARD;
  dummy: CARDINAL;
  flag: BOOLEAN;
  realzahl: REAL;

BEGIN
  WriteLn;
  WriteString("Prim - © 1990 by Marcus Schießer");
  WriteLn;
  WriteString("Zahlen müssen >= 5 und ungerade sein");
  WriteLn;
  WriteString("Von: ");
  ReadLongCard(zahlI);
  WriteString("Bis: ");
  ReadLongCard(zahlII);
  WriteLn;
  IF (zahlI = 5) THEN
    WriteString("2,3,");
  END;
  dummy:= zahlI MOD 2;
  Assert(zahlI>=5,ADR("Zahl ist kleiner als 5!"));
  Assert(dummy#0,ADR("Zahl ist gerade!"));
  flag:=TRUE;
  FOR zahl := zahlI TO zahlII BY 2 DO
  realzahl:=FLOAT(zahl);
    FOR teiler := 3 TO TRUNC(sqrt(realzahl)) BY 2 DO
      dummy:= zahl MOD teiler;     (* Speichere Rest der Division *)
      IF (dummy=0) THEN            (* Rest Null ? *)
        flag:=FALSE;               (* ja, dann mehr als zwei Teiler *)
      END;                         (* nein, dann weiter suchen *)
    END;
    IF flag THEN                   (* 2 Teiler ? *)
      INC(anzahl);                 (* ja, dann Primzahl *)
      WriteCard(zahl,0);
      WriteString(",");
    END;
    flag:=TRUE;
  END;

  WriteLn;
  WriteCard(anzahl,0);
  WriteString(" Primzahlen gefunden.");
  WriteLn;

END Prim.
