annotate src/collatz.f @ 0:307a81e46071 tip

initial committ
author Robert McIntyre <rlm@mit.edu>
date Tue, 18 Oct 2011 01:17:49 -0700
parents
children
rev   line source
rlm@0 1 program collatz
rlm@0 2 implicit none
rlm@0 3 character (len = 100) :: file_name
rlm@0 4 integer, parameter :: big = selected_int_kind(11)
rlm@0 5 integer :: n
rlm@0 6 call getarg( 1, file_name )
rlm@0 7 OPEN(unit = 7, file = file_name)
rlm@0 8 read (7,*) n
rlm@0 9 write (unit = *, fmt = "(I0)") search_collatz(n)
rlm@0 10
rlm@0 11 contains
rlm@0 12
rlm@0 13 function collatz_next (n) result (r)
rlm@0 14 implicit none
rlm@0 15 integer (kind = big) :: r,n
rlm@0 16 if (0 == mod(n,2)) then
rlm@0 17 r = n/2
rlm@0 18 else
rlm@0 19 r = 1 + 3*n
rlm@0 20 end if
rlm@0 21 end function collatz_next
rlm@0 22
rlm@0 23 function collatz_length (n) result (r)
rlm@0 24 implicit none
rlm@0 25 integer (kind = big) :: t
rlm@0 26 integer :: n,r
rlm@0 27 r = 1
rlm@0 28 t = n
rlm@0 29 do
rlm@0 30 if (1 == t) then
rlm@0 31 exit
rlm@0 32 end if
rlm@0 33 r = r + 1
rlm@0 34 t = collatz_next(t)
rlm@0 35 end do
rlm@0 36 end function collatz_length
rlm@0 37
rlm@0 38 function search_collatz (n) result (r)
rlm@0 39 implicit none
rlm@0 40 integer n,r,i,max,max_val,temp_val
rlm@0 41 integer (kind = big) :: t
rlm@0 42 t = n
rlm@0 43 do i = 1,n-1
rlm@0 44 temp_val = collatz_length(i)
rlm@0 45 if (temp_val > max_val) then
rlm@0 46 max = i
rlm@0 47 max_val = temp_val
rlm@0 48 end if
rlm@0 49 end do
rlm@0 50 r = max
rlm@0 51 end function search_collatz
rlm@0 52 end program collatz