Fortran Small FORTRAN code for combinations. BUG

AI Thread Summary
The discussion revolves around a small FORTRAN program designed to generate combinations. The initial code contains a bug that results in extra lines being printed when generating combinations for specific values of n and r. Specifically, for n=4 and r=2, the program prints duplicate combinations, with the issue becoming more pronounced when r is increased. The solution to the bug involves moving the WRITE statement to only execute when the current combination length equals r, ensuring that only complete combinations are printed. The corrected code is provided for generating combinations of numbers from 1 to 9 in sets of r. Additionally, a note is included about using appropriate formatting tags for code in future posts.
jajabinker
Messages
8
Reaction score
1
small FORTRAN code for combinations. BUG!

Code:
PROGRAM test
implicit double precision(a-h,o-z)

INTEGER :: r=2,n=4,k=1
INTEGER,allocatable :: comb(:)           !array to hold a set of combinations
        allocate(comb(r))
        comb(1)=1
        CALL iterate(1,n-r+1,1)
CONTAINS

RECURSIVE SUBROUTINE iterate(s,e,j)
INTEGER,INTENT(IN) :: s,e
        DO i=s,e
         comb(j)=i
         if(j.LT.r) then
          CALL iterate(i+1,e+1,j+1)
         END IF
         WRITE(*,*)comb
        END DO
END SUBROUTINE iterate

END PROGRAM test

for n=4,r=2
prints
1 2
1 3
1 4
1 4 <-here
2 3
2 4
2 4 <-here
3 4
3 4 <-here

For any n it prints and extra line once for r=2.

For r=3 it prints extra twice.

can anyone help?
 
Last edited by a moderator:
Technology news on Phys.org


NVM solved it, Silly :smile:

put the WRITE(*,*)comb statement under the following IF condition.

IF(j.EQ.r) WRITE(*,*)comb

Just for reference this is the working code to print all combinations of 1-9 in sets of r.
Code:
PROGRAM combinations

INTEGER :: r=4,n=32
INTEGER,allocatable :: comb(:)

	allocate(comb(r))
	CALL iterate(1,n-r+1,1)
CONTAINS

RECURSIVE SUBROUTINE iterate(s,e,j)
INTEGER,INTENT(IN) :: s,e	
	DO i=s,e
         comb(j)=i
         IF(j.LT.r) CALL iterate(i+1,e+1,j+1)
	 IF(j.EQ.r) WRITE(*,*)comb
	 END IF
	END DO
END SUBROUTINE iterate

END PROGRAM test
 
Last edited by a moderator:


For future reference, use [noparse]
Code:
...
[/noparse] tags around your code, not quote tags. I did this in your posts.
 
Thread 'Is this public key encryption?'
I've tried to intuit public key encryption but never quite managed. But this seems to wrap it up in a bow. This seems to be a very elegant way of transmitting a message publicly that only the sender and receiver can decipher. Is this how PKE works? No, it cant be. In the above case, the requester knows the target's "secret" key - because they have his ID, and therefore knows his birthdate.

Similar threads

Replies
12
Views
2K
Replies
6
Views
3K
Replies
4
Views
2K
Replies
3
Views
2K
Replies
12
Views
3K
Replies
12
Views
3K
Replies
2
Views
1K
Back
Top