72 lines
3.2 KiB
Plaintext
72 lines
3.2 KiB
Plaintext
* Semiprime 14/03/2017
|
|
SEMIPRIM CSECT
|
|
USING SEMIPRIM,R13 base register
|
|
B 72(R15) skip savearea
|
|
DC 17F'0' savearea
|
|
STM R14,R12,12(R13) save previous context
|
|
ST R13,4(R15) link backward
|
|
ST R15,8(R13) link forward
|
|
LR R13,R15 set addressability
|
|
LA R10,PG pgi=0
|
|
LA R8,0 m=0
|
|
L R6,=F'2' i=2
|
|
DO WHILE=(C,R6,LE,=F'100') do i=2 to 100
|
|
ST R6,N n=i
|
|
LA R9,0 f=0
|
|
LA R7,2 j=2
|
|
LOOPJ EQU * do j=2 while f<2 and j*j<=n
|
|
C R9,=F'2' if f<2
|
|
BNL EXITJ then exit do j
|
|
LR R5,R7 j
|
|
MR R4,R7 *j
|
|
C R5,N if j*j<=n
|
|
BH EXITJ then exit do j
|
|
LOOPK EQU * do while n mod j=0
|
|
L R4,N n
|
|
SRDA R4,32 ~
|
|
DR R4,R7 /j
|
|
LTR R4,R4 if n mod <>0
|
|
BNZ EXITK then exit do j
|
|
ST R5,N n=n/j
|
|
LA R9,1(R9) f=f+1
|
|
B LOOPK enddo k
|
|
EXITK LA R7,1(R7) j++
|
|
B LOOPJ enddo j
|
|
EXITJ L R4,N n
|
|
IF C,R4,GT,=F'1' THEN if n>1 then
|
|
LA R2,1 g=1
|
|
ELSE , else
|
|
LA R2,0 g=0
|
|
ENDIF , endif
|
|
AR R2,R9 +f
|
|
IF C,R2,EQ,=F'2' THEN if f+(n>1)=2 then
|
|
XDECO R6,XDEC edit i
|
|
MVC 0(5,R10),XDEC+7 output i
|
|
LA R10,5(R10) pgi=pgi+10
|
|
LA R8,1(R8) m=m+1
|
|
LR R4,R8 m
|
|
SRDA R4,32 ~
|
|
D R4,=F'16' m/16
|
|
IF LTR,R4,Z,R4 THEN if m mod 16=0 then
|
|
XPRNT PG,L'PG print buffer
|
|
MVC PG,=CL80' ' clear buffer
|
|
LA R10,PG pgi=0
|
|
ENDIF , endif
|
|
ENDIF , endif
|
|
LA R6,1(R6) i++
|
|
ENDDO , enddo i
|
|
XPRNT PG,L'PG print buffer
|
|
MVC PG,=CL80'..... semiprimes' init buffer
|
|
XDECO R8,XDEC edit m
|
|
MVC PG(5),XDEC+7 output m
|
|
XPRNT PG,L'PG print buffer
|
|
L R13,4(0,R13) restore previous savearea pointer
|
|
LM R14,R12,12(R13) restore previous context
|
|
XR R15,R15 rc=0
|
|
BR R14 exit
|
|
N DS F n
|
|
PG DC CL80' ' buffer
|
|
XDEC DS CL12 temp
|
|
YREGS
|
|
END SEMIPRIM
|