home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 03 / review / primtest.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1990-12-17  |  2.3 KB  |  77 lines

  1. (*--------------------------------------------------------*)
  2. (*                      PRIMTEST.PAS                      *)
  3. (*               (c) 1991 R.Fischer & TOOLBOX             *)
  4. (*             Compiler: Microsoft Pascal 4.0             *)
  5. (*           Primzahlen erzeugen mit Merkfunktion         *)
  6. (*--------------------------------------------------------*)
  7.  
  8. PROGRAM Primtest(Output);
  9.  
  10. TYPE 
  11.   UNSIGNED  = 0..MaxInt;
  12.   IntStream = SUPER ARRAY [1..*] OF UNSIGNED;
  13.  
  14. (* -----------------   Primes(PList) -------------------- *)
  15. (* Auffüllen von plist mit Primzahlen. Die aktuelle Größe *)
  16. (* von plist muß kleiner als SQR(MemoPrimes) sein!        *)
  17.  
  18. CONST 
  19.   MemoPrimes = 400;
  20.  
  21. PROCEDURE Primes(VAR PList: IntStream);
  22.   VAR Lfd_Nr         : UNSIGNED;
  23.   VAR PMemo[STATIC]  : ARRAY[2..MemoPrimes] OF UNSIGNED;
  24.                        { gemerkte P-Zahlen }
  25.   VAR [STATIC] PLetzt: UNSIGNED;
  26.   VALUE PLetzt := 1; 
  27.  
  28.  
  29. (* -------------------- NextPrime ----------------------- *)
  30. (*    Berechnen der nächsten, nicht gemerkten Primzahl.   *)
  31.  
  32.   FUNCTION NextPrime : UNSIGNED;
  33.   VAR [STATIC] i, LastPrime : UNSIGNED;
  34.   VALUE 
  35.     LastPrime := 1; { "Versuchs-P-Zahl" }
  36.   BEGIN { NextPrime }
  37.     LastPrime := LastPrime + 2;
  38.     FOR i := 2 TO PLetzt - 1 DO BEGIN
  39.       IF Sqr(PMemo[i]) > LastPrime THEN BEGIN 
  40.         { LastPrime nicht teilbar }
  41.         NextPrime := LastPrime; RETURN
  42.       END;
  43.       IF LastPrime MOD PMemo[i] = 0 THEN BEGIN 
  44.         { LastPrime teilbar }
  45.         NextPrime := NextPrime; RETURN
  46.       END
  47.     END;
  48.     NextPrime := LastPrime
  49.   END { NextPrime };
  50.  
  51.   BEGIN { Primes }
  52.     FOR Lfd_Nr := 1 TO UPPER(PList) DO BEGIN 
  53.       { Berechne Primzahl Lfd_Nr }
  54.       IF Lfd_Nr > MemoPrimes THEN
  55.         PList[Lfd_Nr] := NextPrime
  56.       ELSE IF Lfd_Nr > 1 THEN BEGIN   { Zugriff über PMemo }
  57.         IF Lfd_Nr > PLetzt THEN BEGIN 
  58.       { Zahl noch nicht in PMemo }
  59.           PLetzt := Succ(PLetzt);
  60.           PMemo[PLetzt] := NextPrime
  61.         END; { Jetzt ist Zahl in PMemo! }
  62.         PList[Lfd_Nr] := PMemo[Lfd_Nr]
  63.       END ELSE 
  64.         PList[Lfd_Nr] := 2   { Die 1. Primzahl ist immer 2 }
  65.     END
  66.   END { Primes };
  67.  
  68. VAR 
  69.   s1 : IntStream(5); 
  70.   s2 : IntStream(9);
  71.   i  : INTEGER;
  72.  
  73. BEGIN { Hauptprogramm - 'Primes' testen }
  74.   Primes(s1); Primes(s2);
  75.   FOR i := 1 TO UPPER(s2) DO Write(s2[i]);
  76. END.
  77.