C---------------------------------------------------------------------- C SIEVE7.FOR C C Simple implementation of Sieve of Eratosthenes search for primes. C C 18/04/2020 C---------------------------------------------------------------------- C Version with direct loop limits to avoid overflow C---------------------------------------------------------------------- SUBROUTINE FINDP5(nkfac, kfac, kmax, kprimes, nprimes, kkmax, + iFAIL) IMPLICIT NONE INTEGER*4 nkfac ! vector length INTEGER*4 kfac(1:nkfac) ! vector of already-known primes INTEGER*4 kmax ! vector length INTEGER*4 kprimes(1:kmax) INTEGER*4 nprimes ! always less than kmax INTEGER*4 kkmax INTEGER*4 iFAIL C INTEGER*4 ii, jj, kk INTEGER*4 NVBOOL PARAMETER (NVBOOL=100000000) INTEGER*4 vbool(1:NVBOOL) C iFAIL = 0 C-----Check that supplied vector length for kprimes is allowable IF(kmax .GT. NVBOOL) THEN iFAIL = 1 GOTO 80 ENDIF C-----Check that incoming kfac contains just integers of 2 or above... DO 10 jj = 1, nkfac IF(kfac(jj) .LT. 2) THEN iFAIL = 2 GOTO 80 ENDIF 10 CONTINUE DO 20 jj = 1, kmax vbool(jj) = 1 kprimes(jj) = 0 20 CONTINUE kkmax = 0 DO 32 jj = 1, nkfac ! integer divide drops the fractional part... DO 30 ii = 2, kmax/kfac(jj) kk = ii*kfac(jj) vbool(kk) = 0 ! kkth is not a prime IF( kk .GT. kkmax ) kkmax = kk 30 CONTINUE 32 CONTINUE C jj = 0 DO 40 ii = 2, kmax IF(vbool(ii) .EQ. 1) THEN jj = jj+1 kprimes(jj) = ii ! vector of primes ENDIF 40 CONTINUE nprimes = jj ! the number of primes up to kmax C 80 jj = jj END ! FINDP