* Hailstone sequence 16/08/2015 HAILSTON CSECT USING HAILSTON,R12 LR R12,R15 ST R14,SAVER14 BEGIN L R11,=F'100000' nmax LA R8,27 n=27 LR R1,R8 MVI FTAB,X'01' ftab=true BAL R14,COLLATZ LR R10,R1 p XDECO R8,XDEC n MVC BUF1+10(6),XDEC+6 XDECO R10,XDEC p MVC BUF1+18(5),XDEC+7 LA R5,6 LA R3,0 i LA R4,BUF1+25 LOOPED L R2,TAB(R3) tab(i) XDECO R2,XDEC MVC 0(7,R4),XDEC+5 LA R3,4(R3) i=i+1 LA R4,7(R4) C R5,=F'4' BNE BCT LA R4,7(R4) BCT BCT R5,LOOPED XPRNT BUF1,80 print hailstone(n)=p,tab(*) MVC LONGEST,=F'0' longest=0 MVI FTAB,X'00' ftab=true LA R8,1 i LOOPI CR R8,R11 do i=1 to nmax BH ELOOPI LR R1,R8 n BAL R14,COLLATZ LR R10,R1 p L R4,LONGEST CR R4,R10 if longest
1)
BNH ELOOPP
CLI FTAB,X'01' if ftab
BNE NONOK
C R6,=F'1' if p>=1
BL NONOK
C R6,=F'3' & p<=3
BH NONOK
LR R1,R6 then
BCTR R1,0
SLA R1,2
ST R7,TAB(R1) tab(p)=m
NONOK LR R4,R7 m
N R4,=F'1' m&1
LTR R4,R4 if m//2=0 (if not(m&1))
BNZ ODD
EVEN SRA R7,1 m=m/2
B EIFM
ODD LA R3,3
MR R2,R7 *m
LA R7,1(R3) m=m*3+1
EIFM CLI FTAB,X'01' if ftab
BNE NEXTP
MVC TAB+12,TAB+16 tab(4)=tab(5)
MVC TAB+16,TAB+20 tab(5)=tab(6)
ST R7,TAB+20 tab(6)=m
NEXTP LA R6,1(R6) p=p+1
B LOOPP
ELOOPP LR R1,R6 end p; return(p)
BR R14 end collatz
*
RETURN L R14,SAVER14 restore caller address
XR R15,R15 set return code
BR R14 return to caller
SAVER14 DS F
IVAL DS F
LONGEST DS F
N DS F
TAB DS 6F
FTAB DS X
BUF1 DC CL80'hailstone(nnnnnn)=nnnnn : nnnnnn nnnnnn nnnnnn ...*
... nnnnnn nnnnnn nnnnnn'
BUF2 DC CL80'longest