Here a SYS version for 49G/50g, only deals with the +1 case.
49G (1.19-6) takes
124 s
to process 1026061 correctly.
Code:
pell
Size: 257.
CkSum: # A5BAh
::
CK1&Dispatch
# FF
::
DUP
ID x003
DUP
FPTR2 ^ZABS
ZINT 4
EQUAL
IT
::
ZINT 4
FPTR2 ^ZQUOText
3PICK
FPTR2 ^ZSQ_
2DUPSWAP
ZINT 3
FPTR2 ^QMul
FPTR2 ^QSub
ZINT 2
FPTR2 ^ZQUOText
5ROLL
FPTR2 ^QMul
SWAP3PICK
FPTR2 ^QSub
ZINT 2
FPTR2 ^ZQUOText
4ROLL
FPTR2 ^QMul
ROT
;
FPTR2 ^ZIsNeg?
IT
::
OVER
FPTR2 ^QMul
DUP
FPTR2 ^QAdd
SWAP
FPTR2 ^ZSQ_
DUP
FPTR2 ^QAdd
ZINT 1
FPTR2 ^QAdd
SWAP
;
2DUP
BEGIN
DUP
7PICK
FPTR2 ^ZMod
ZINT 0
EQUALNOT
WHILE
ID x004
REPEAT
6ROLL
FPTR2 ^ZQUOText
TWO{}N
4UNROLL3DROP
;
;
x003
Size: 456.
CkSum: # 4883h
::
FPTR2 ^MZSQFF
#2/
ZINT 1
DUPROT
ZERO_DO
ROT
COERCE
BINT2
#/
5PICK
SWAP
FPTR2 ^PPow#
4ROLL
FPTR2 ^QMul
3UNROLL
4ROLLSWAP
FPTR2 ^PPow#
FPTR2 ^QMul
LOOP
DUP
ZINT 5
EQUALcase
::
ZINT 1
ZINT 1
ZINT -4
;
DUP
TRUE
SWAPDUP
::
DUP
ZINT 2
Z<
?SEMI
ZINT 2
OVER
FPTR2 ^Z>ZH
FPTR2 ^ZBits
SWAPDROP
#2/
#1+
FPTR2 ^PPow#
BEGIN
DUP
3PICKOVER
FPTR2 ^ZQUOText
FPTR2 ^QAdd
ZINT 2
FPTR2 ^ZQUOText
2DUP
Z>
WHILE
SWAPDROP
REPEAT
DROPSWAPDROP
;
DUPUNROT
FPTR2 ^ZSQ_
FPTR2 ^QSub
ZINT 1
3PICK
ZINT 1
OVER
ZINT 0
ZINT 1
'
NULLLAM
BINT8
NDUPN
DOBIND
BEGIN
7GETLAM
FPTR2 ^DupZIsOne?
NOT
SWAP
ZINT 4
EQUALNOT
AND
WHILE
::
5GETLAM
8GETLAM
FPTR2 ^QAdd
7GETLAM
FPTR2 ^ZQUOText
DUP
7GETLAM
FPTR2 ^QMul
5GETLAM
FPTR2 ^QSub
5GETLAM
SWAPDUP
5PUTLAM
FPTR2 ^QSub
OVER
FPTR2 ^QMul
6GETLAM
FPTR2 ^QAdd
7GETLAM
6PUTLAM
7PUTLAM
3GETLAM
2DUPSWAP
FPTR2 ^QMul
4GETLAM
FPTR2 ^QAdd
3PUTLAM
4PUTLAM
1GETLAM
DUPUNROT
FPTR2 ^QMul
2GETLAM
FPTR2 ^QAdd
1PUTLAM
2PUTLAM
NOT
;
REPEAT
3GETLAM
1GETLAM
7GETLAM
ABND
4ROLL
NOT?SEMI
FPTR2 ^RNEGext
;
x004
Size: 69.5
CkSum: # CC0Dh
::
OVER
5PICK
FPTR2 ^QMul
OVER
5PICK
FPTR2 ^QMul
7PICK
FPTR2 ^QMul
FPTR2 ^QAdd
SWAP
5PICK
FPTR2 ^QMul
ROT
4PICK
FPTR2 ^QMul
FPTR2 ^QAdd
;