100 lines
4.3 KiB
Plaintext
100 lines
4.3 KiB
Plaintext
* Mertens function - 01/05/2023
|
|
MERTENS CSECT
|
|
USING MERTENS,R13 base register
|
|
B 72(R15) skip savearea
|
|
DC 17F'0' savearea
|
|
SAVE (14,12) save previous context
|
|
ST R13,4(R15) link backward
|
|
ST R15,8(R13) link forward
|
|
LR R13,R15 set addressability
|
|
LA R0,1 1
|
|
STH R0,MM m(1)=1
|
|
LA R6,2 i=2
|
|
DO WHILE=(CH,R6,LE,=AL2(NN)) do i=2 to n
|
|
LR R1,R6 i
|
|
SLA R1,1 *2 (H)
|
|
LA R0,1 1
|
|
STH R0,MM-2(R1) m(i)=1
|
|
LA R7,2 j=2
|
|
DO WHILE=(CR,R7,LE,R6) do j=2 to i
|
|
LR R4,R6 i
|
|
SRDA R4,32 ~
|
|
LR R1,R7 j
|
|
DR R4,R1 i/j
|
|
LR R8,R5 d=i/j
|
|
LR R4,R6 i
|
|
SLA R4,1 *2 (H)
|
|
LH R2,MM-2(R4) m(i)
|
|
LR R1,R8 d
|
|
SLA R1,1 *2 (H)
|
|
LH R3,MM-2(R1) m(d)
|
|
SR R2,R3 m(i)-m(d)
|
|
STH R2,MM-2(R4) m(i)=m(i)-m(d)
|
|
LA R7,1(R7) j++
|
|
ENDDO , enddo j
|
|
LA R6,1(R6) i++
|
|
ENDDO , enddo i
|
|
XPRNT =C'the first 99 Mertens numbers are:',34 print buffer
|
|
LA R9,PG @buffer=pg
|
|
MVC PG,=CL80' ' clean buffer
|
|
MVC 0(3,R9),=CL3' ' output ' '
|
|
LA R9,3(R9) @buffer+=3
|
|
LA R7,9 j=9
|
|
LA R6,1 i=1
|
|
DO WHILE=(CH,R6,LE,=AL2(99)) do i=1 to 99
|
|
LR R1,R6 i
|
|
SLA R1,1 *2 (H)
|
|
LH R2,MM-2(R1) m(i)
|
|
XDECO R2,XDEC edit m(i)
|
|
MVC 0(3,R9),XDEC+9 output m(i)
|
|
LA R9,3(R9) @buffer+=3
|
|
BCTR R7,0 j=j-1
|
|
IF LTR,R7,Z,R7 THEN if j=0 then do;
|
|
LA R7,10 j=10
|
|
XPRNT PG,L'PG print buffer
|
|
LA R9,PG @buffer=pg
|
|
ENDIF , endif
|
|
LA R6,1(R6) i++
|
|
ENDDO , enddo i
|
|
SR R10,R10 zero=0
|
|
SR R11,R11 cross=0
|
|
LA R6,1 i=2
|
|
DO WHILE=(CH,R6,LE,=AL2(NN)) do i=2 to n
|
|
LR R1,R6 i
|
|
SLA R1,1 *2 (H)
|
|
LH R2,MM-2(R1) m(i)
|
|
IF LTR,R2,Z,R2 THEN if m(i)=0 then
|
|
LA R10,1(R10) zero=zero+1
|
|
LR R1,R6 i
|
|
BCTR R1,0 i-1
|
|
SLA R1,1 *2 (H)
|
|
LH R2,MM-2(R1) m(i-1)
|
|
IF LTR,R2,NZ,R2 THEN if m(i-1)^=0 then
|
|
LA R11,1(R11) cross=cross+1
|
|
ENDIF , endif
|
|
ENDIF , endif
|
|
LA R6,1(R6) i++
|
|
ENDDO , enddo i
|
|
MVC PG,=CL80' ' clean buffer
|
|
MVC PG(13),=C'm(i) is zero '
|
|
XDECO R10,XDEC edit zero
|
|
MVC PG+13(2),XDEC+10 output zero
|
|
MVC PG+15(7),=C' times.'
|
|
XPRNT PG,L'PG print buffer
|
|
MVC PGI,=H'0'
|
|
MVC PG,=CL80' ' clean buffer
|
|
MVC PG(18),=C'm(i) crosses zero '
|
|
XDECO R11,XDEC edit cross
|
|
MVC PG+18(2),XDEC+10 output cross
|
|
MVC PG+20(7),=C' times.'
|
|
XPRNT PG,L'PG print buffer
|
|
L R13,4(0,R13) restore previous savearea pointer
|
|
RETURN (14,12),RC=0 restore registers from calling save
|
|
NN EQU 1000 n
|
|
PG DS CL80 buffer
|
|
PGI DC H'0' buffer index
|
|
XDEC DS CL12 temp for xdeci xdeco
|
|
MM DS (NN)H m
|
|
REGEQU
|
|
END MERTENS
|