C PERMUTE2.F OF N.TAJIMA'S FORTRAN BENCH-MARK TESTS (VER.2) C REPEATS "N*M" TIMES SWAPPING TWO ELEMENTS OF INTEGER*4 ARRAY OF C DIMENSION "N" TO MEASURE THE SPEED OF RANDOM ACCESSES TO MEMORY. C HISTORY: 97/3/21,98/6/22-26 C NB) WHEN MOD(A,4)=1, MOD(C,2)=1, AND N=2**L, THE PERIOD OF MAPPING C I -> MOD(A*I+C,N) IS N. PROGRAM PERMUT IMPLICIT INTEGER (A-Z) A1=4*37+1 A2=4*73+1 CALL PERM(A1,A2) END C SUBROUTINE PERM(A1C,A2C) IMPLICIT INTEGER (A-Z) C PARAAMETER(N=1024,M=262144) PARAMETER(N=32768,M=8192) C PARAMETER(N=1048576,M=256) DIMENSION P(0:N-1) MXINT=(2**30-1)+2**30 IF(MXINT.LE.M) STOP 'PERM:1' WRITE(6,900) N,M,A1C,A2C 900 FORMAT(' INT*4 ARRAY_SIZE=',I9,' #PERMUTATIONS/ARRAY_SIZE=',I9 & ,' A=',2I6) DO 10 I=0,N-1 10 P(I)=I AMX=MIN(N,((MXINT/(4*N))*4)) DC1=(N/29)*2 DC2=(N/11)*2 C1=1 C2=1 DO 30 K2=0,M-1 A1=MOD(A1C-(MOD(K2,19)-9)*4+N,AMX) A2=MOD(A2C+(MOD(K2,17)-8)*4+N,AMX) C1=MOD(C1+DC1,N) C2=MOD(C2-DC2+N,N) I=0 J=MOD(K2,N) DO 20 K1=0,N-1 I=MOD(I*A1+C1,N) J=MOD(J*A2+C2,N) X=P(I) P(I)=P(J) P(J)=X 20 CONTINUE 30 CONTINUE E=0 DO 50 I=0,N-2 50 IF(P(I).LE.P(I+1)) E=E+1 WRITE(6,'(I10,7I9)') E,(P(L),L=0,6) END