Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Note that the following implementation is a faithful reproduction of the NEXPER algorithm in the book Combinatorial Algorithms For Computers and Calculators by Nijenhuis & Wilf. However, the implementation given in the text has been updated to Fortran 95.
SUBROUTINE NEXPER(N, A, MTC, EVEN)INTEGER NINTEGER, DIMENSION(N) :: AINTEGER S, D, NM3, IA, I1, LLOGICAL MTC, EVEN IF (MTC) GOTO 10 NM3 = N-3 DO 1 I=1,N1 A(I)=I MTC=.TRUE.5 EVEN=.TRUE. IF(N .EQ. 1) GOTO 86 IF(A(N) .NE. 1 .OR. A(1) .NE. 2+MOD(N,2)) RETURN IF(N .LE. 3) GOTO 8 DO 7 I=1,NM3 IF(A(I+1) .NE. A(I)+1) RETURN7 CONTINUE8 MTC=.FALSE. RETURN10 IF(N .EQ. 1) GOTO 27 IF(.NOT. EVEN) GOTO 20 IA=A(1) A(1)=A(2) A(2)=IA EVEN=.FALSE. GOTO 620 S=0 DO 26 I1=2,N25 IA=A(I1) I=I1-1 D=0 DO 30 J=1,I30 IF(A(J) .GT. IA) D=D+1 S=D+S IF(D .NE. I*MOD(S,2)) GOTO 3526 CONTINUE27 A(1)=0 GOTO 835 M=MOD(S+1,2)*(N+1) DO 40 J=1,I IF(ISIGN(1,A(J)-IA) .EQ. ISIGN(1,A(J)-M)) GOTO 40 M=A(J) L=J40 CONTINUE A(L)=IA A(I1)=M EVEN=.TRUE. RETURNENDSUBROUTINE TESTNEXPER INTEGER, DIMENSION(5) :: IN LOGICAL MTC LOGICAL EVEN DO 10 I = 1, 5 IN(I) = I10 CONTINUE MTC = .FALSE.20 CONTINUE CALL NEXPER (5, IN, MTC, EVEN) DO 30 I = 1, 5 WRITE (*,"(I2), ",advance="no") IN(I)30 CONTINUE PRINT * IF (MTC) GOTO 20END
A C# implementation of the above algorithm will be published soon.