home *** CD-ROM | disk | FTP | other *** search
- (*--------------------------------------------------------*)
- (* PRIMTEST.PAS *)
- (* (c) 1991 R.Fischer & TOOLBOX *)
- (* Compiler: Microsoft Pascal 4.0 *)
- (* Primzahlen erzeugen mit Merkfunktion *)
- (*--------------------------------------------------------*)
-
- PROGRAM Primtest(Output);
-
- TYPE
- UNSIGNED = 0..MaxInt;
- IntStream = SUPER ARRAY [1..*] OF UNSIGNED;
-
- (* ----------------- Primes(PList) -------------------- *)
- (* Auffüllen von plist mit Primzahlen. Die aktuelle Größe *)
- (* von plist muß kleiner als SQR(MemoPrimes) sein! *)
-
- CONST
- MemoPrimes = 400;
-
- PROCEDURE Primes(VAR PList: IntStream);
- VAR Lfd_Nr : UNSIGNED;
- VAR PMemo[STATIC] : ARRAY[2..MemoPrimes] OF UNSIGNED;
- { gemerkte P-Zahlen }
- VAR [STATIC] PLetzt: UNSIGNED;
- VALUE PLetzt := 1;
-
-
- (* -------------------- NextPrime ----------------------- *)
- (* Berechnen der nächsten, nicht gemerkten Primzahl. *)
-
- FUNCTION NextPrime : UNSIGNED;
- VAR [STATIC] i, LastPrime : UNSIGNED;
- VALUE
- LastPrime := 1; { "Versuchs-P-Zahl" }
- BEGIN { NextPrime }
- LastPrime := LastPrime + 2;
- FOR i := 2 TO PLetzt - 1 DO BEGIN
- IF Sqr(PMemo[i]) > LastPrime THEN BEGIN
- { LastPrime nicht teilbar }
- NextPrime := LastPrime; RETURN
- END;
- IF LastPrime MOD PMemo[i] = 0 THEN BEGIN
- { LastPrime teilbar }
- NextPrime := NextPrime; RETURN
- END
- END;
- NextPrime := LastPrime
- END { NextPrime };
-
- BEGIN { Primes }
- FOR Lfd_Nr := 1 TO UPPER(PList) DO BEGIN
- { Berechne Primzahl Lfd_Nr }
- IF Lfd_Nr > MemoPrimes THEN
- PList[Lfd_Nr] := NextPrime
- ELSE IF Lfd_Nr > 1 THEN BEGIN { Zugriff über PMemo }
- IF Lfd_Nr > PLetzt THEN BEGIN
- { Zahl noch nicht in PMemo }
- PLetzt := Succ(PLetzt);
- PMemo[PLetzt] := NextPrime
- END; { Jetzt ist Zahl in PMemo! }
- PList[Lfd_Nr] := PMemo[Lfd_Nr]
- END ELSE
- PList[Lfd_Nr] := 2 { Die 1. Primzahl ist immer 2 }
- END
- END { Primes };
-
- VAR
- s1 : IntStream(5);
- s2 : IntStream(9);
- i : INTEGER;
-
- BEGIN { Hauptprogramm - 'Primes' testen }
- Primes(s1); Primes(s2);
- FOR i := 1 TO UPPER(s2) DO Write(s2[i]);
- END.