Skip to content

Commit

Permalink
Added Chase's Fortran version of GenPrime
Browse files Browse the repository at this point in the history
Signed-off-by: Eddie Ringle <eddie@eringle.net>
Signed-off-by: Steven Noonan <steven@uplinklabs.net>
  • Loading branch information
EddieRingle authored and tycho committed Nov 15, 2008
1 parent a644de8 commit 33ee5de
Showing 1 changed file with 84 additions and 0 deletions.
84 changes: 84 additions & 0 deletions genprime.f
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
C Genprime.f
C Copyright(c) 2008, ME
C
C You may use this file in any way you like.
C Print it out and use it as nesting material
C for your rabbit, I don't care.
C
C I'm using integer here due to inconsistancies in
C Fortran LOGICAL datatype and Fortran FUNCTIONs.
C
INTEGER FUNCTION ISPRIME(X)
INTEGER*8 LIM, Y, X
IF(X.lt.2) THEN
ISPRIME = 0
RETURN
ENDIF
IF(X.lt.4) THEN
ISPRIME = 1
RETURN
ENDIF
IF(X.eq.5) THEN
ISPRIME = 1
RETURN
ENDIF
IF(MOD(X,2).eq.0) THEN
ISPRIME = 0
RETURN
ENDIF
IF(MOD(X,5).eq.0) THEN
ISPRIME = 0
RETURN
ENDIF
IF(MOD(X + 1, 6) .NE. 0) THEN
IF(MOD(X - 1, 6) .NE. 0) THEN
ISPRIME = 0
RETURN
ENDIF
ENDIF
LIM = INT(SQRT(REAL(X)) + 1.0);
DO Y = 3, LIM, 2
IF(MOD(X,Y).eq.0) THEN
ISPRIME = 0
RETURN
ENDIF
ENDDO
ISPRIME = 1
RETURN
END

FUNCTION GENPRIME(MX)
INTEGER*8 CNT, CUR, MX
CUR = 0
CNT = 0
DO WHILE(CNT.lt.MX)
IF(ISPRIME(CUR).eq.1) THEN
CNT = CNT + 1
ENDIF
CUR = CUR + 1
ENDDO
GENPRIME = CUR - 1;
RETURN
END

C Doesn't have to be MAIN
PROGRAM MAIN
REAL TIMES, TIMET, TIME
INTEGER*8 STRT, STP, X
INTEGER Z

CHARACTER *20 BUFFER
CALL GETARG(1,BUFFER)
READ (BUFFER,*) STRT
CALL GETARG(2,BUFFER)
READ (BUFFER,*) STP

DO X = STRT, STP, STRT
TIMES = SECOND()
Z = GENPRIME(X)
TIMET = SECOND()
TIME = TIMET - TIMES
PRINT *,'Found ',X,' primes in ',TIME,' (last was',Z,')'
ENDDO

END

0 comments on commit 33ee5de

Please sign in to comment.