home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l291 / 6.ddi / SIEVE.FO$ / SIEVE.bin
Encoding:
Text File  |  1989-01-18  |  2.2 KB  |  85 lines

  1. CC  SIEVE.FOR - Prime number sieve program (INTEGER*4 version)
  2. CC
  3. CC  References:  A High-Level Language Benchmark,
  4. CC               Byte Magazine, September, 1981
  5. CC
  6.  
  7.       INTEGER*4 i, n_iterate, count, largest
  8.       REAL*8    begin_time, end_time, dif_time, secnds
  9.  
  10.       WRITE (*,9000) ' Enter number of iterations:  '
  11.       READ  (*,*) n_iterate
  12.       begin_time = secnds()
  13.  
  14.       DO i = 1, n_iterate
  15.          CALL sieve( count, largest )
  16.       END DO
  17.  
  18.       end_time = secnds()
  19.       dif_time = end_time - begin_time
  20.       WRITE (*,9100) count
  21.       WRITE (*,9200) largest
  22.       WRITE (*,9300) dif_time
  23.       WRITE (*,9400) n_iterate / dif_time
  24.  
  25.  9000 FORMAT( // A \ )
  26.  9100 FORMAT( '0Primes calculated: ', I10 )
  27.  9200 FORMAT( ' Largest prime:     ', I10 )
  28.  9300 FORMAT( ' Elapsed time:      ', F12.1, ' seconds' )
  29.  9400 FORMAT( ' Average time:      ', F12.1, ' iterations per second' )
  30.       END
  31.  
  32.  
  33.  
  34. CC  SIEVE - Determines prime numbers between 0 and 2*SIZE.
  35. CC          Uses prior knowledge that:
  36. CC          -  0, 1, 2, and 3 are first four prime numbers
  37. CC          -  All other even numbers are not prime
  38. CC          -  All multiples of prime numbers are not prime
  39. CC
  40. CC  Params:  count   -  number of primes found
  41. CC           largest -  largest prime
  42. CC
  43.  
  44.       SUBROUTINE sieve( count, largest )
  45.       INTEGER*4  count, largest
  46.  
  47.       INTEGER*4  SIZE, i, prime, k
  48.       PARAMETER  ( SIZE = 8191 )
  49.       LOGICAL    flags (SIZE)
  50.  
  51.       DO i = 1, SIZE
  52.          flags (i) = .TRUE.
  53.       END DO
  54.  
  55.       count = 0
  56.       DO i = 1, SIZE
  57.          IF( flags (i) ) THEN
  58.             prime = i + i + 1
  59.             DO k = i + prime, SIZE, prime
  60.                flags(k) = .FALSE.
  61.             END DO
  62.             count = count + 1
  63.          END IF
  64.       END DO
  65.  
  66.       largest = prime
  67.       RETURN
  68.       END
  69.  
  70.  
  71.  
  72. CC  SECNDS - Calls GETTIM function to find current time.
  73. CC
  74. CC  Return:  Number of seconds since midnight.
  75. CC
  76.  
  77.       REAL*8 FUNCTION  secnds()
  78.  
  79.       INTEGER*2 hour, minute, second, hundredth
  80.  
  81.       CALL GETTIM( hour, minute, second, hundredth )
  82.       secnds = ((DBLE( hour ) * 3600.0) + (DBLE( minute) * 60.0) +
  83.      +           DBLE( second) + (DBLE( hundredth ) / 100.0))
  84.       END
  85.