MODULE genprim; (**************************************************************************** * * Module creant un fichier "supfact.pri" contenant les nombre premiers * inferieurs a 65536. * ****************************************************************************) FROM MYINOUT IMPORT CloseOutput, WriteCard, WriteString, WriteLn, ReadCard, OpenAsOutput; FROM MYSTR IMPORT CharSet, DefineCharSet, CharSetUnion, bits, words, s0; CONST SetSize = 1024; MaxElement = 1023; (* Si a Modifier, Modifier DefineCharSet ci-bas *) SetPart = 32; Fichier = "supfact.pri"; MaxPrime = 65536; VAR TSet, S : CharSet; NextPrime : RECORD Part, Element : CARDINAL; END; NewPrime, Multiple,i : CARDINAL; P, N : CARDINAL; Empty : BOOLEAN; Sieve, Primes : ARRAY [0..SetPart] OF CharSet; prime : CARDINAL; ErrorNumber: CARDINAL; PROCEDURE InCardSet (C:CARDINAL; S: CharSet): BOOLEAN; VAR ActPosition: [0..bits-1]; ActGroup : [0..words-1]; Membership : BOOLEAN; BEGIN ActGroup := C DIV bits; ActPosition := C MOD bits; Membership := (ActPosition IN S[ActGroup]); RETURN Membership END InCardSet; BEGIN DefineCharSet ('[0]..[1023]', TSet, ErrorNumber); (* [0]..[MaxElement] *) OpenAsOutput (Fichier); FOR P := 0 TO SetPart DO Sieve[P] := TSet; Primes[P]:= s0; (* initialisation->s0 empty set *) END; EXCL (Sieve[0][0], 0); (* EXCL (Sieve[0],0) *) Empty := FALSE; NextPrime.Part := 0; NextPrime.Element := 1; WITH NextPrime DO REPEAT WHILE NOT (InCardSet (Element,Sieve[Part])) DO INC(Element);END; INCL (Primes[Part][Element DIV bits], Element MOD bits); (* INCL (Primes[Part], Element *) NewPrime := 2*Element +1; Multiple := Element; P := Part; WHILE P <= SetPart DO EXCL (Sieve[P][Multiple DIV bits], Multiple MOD bits); (* EXCL (Sieve[P], Multiple *) INC (P,Part*2); INC (Multiple,NewPrime); WHILE Multiple > MaxElement DO INC(P); DEC(Multiple,SetSize); END; END; Empty := TRUE; FOR i:=0 TO words-1 DO IF NOT (Sieve[Part][i] = {}) THEN Empty := FALSE; END; END; IF Empty THEN Element := 0 END; WHILE Empty AND (Part < SetPart) DO INC(Part,1); FOR i:=0 TO words-1 DO IF NOT (Sieve[Part][i] = {}) THEN Empty := FALSE; END; END; END; UNTIL Empty; END; WriteCard (2,6); WriteLn; FOR P := 0 TO SetPart DO FOR N := 0 TO MaxElement DO IF InCardSet (N , Primes[P]) THEN prime := 2*N + 1 + P*SetSize*2; IF prime < MaxPrime THEN WriteCard (prime, 6); WriteLn; END; END; END; END; CloseOutput; END genprim.