%%HP: T(3)A(R)F(.);

DIR
  FCTP
\<<
   IF DUP SIZE 3 > THEN 
        DUP
     BAIRS
     SWAP OVER PDIV DROP
        FCTP
   END
\>>

RT
\<< DUP SIZE \-> n
   \<<
      IF n 3 > THEN 
     DUP
        BAIRS
     SWAP OVER PDIV DROP
        \-> A B \<< A RT B RT \>>
      ELSE
        IF n 2 > THEN 
           QUD
        ELSE
           LIST\-> DROP NEG SWAP /
        END
      END
   \>>
\>>

PMUL 
\<< DUP2 SIZE SWAP SIZE \-> A B nB nA
    \<< { } 2 nB
       START
       0 +
       NEXT [next line dies at SWAP - jkh]
       DUP 'A' STO+ SWAP 'A' STO+  
       A OBJ\-> \->ARRY B OBJ\-> DROP
       2 nB
       FOR J       
      J ROLL
       NEXT
       3 nA nB +
       START
      0
       NEXT
       nA nB 1 - 2 * + \->ARRY          
       2 nA nB +
       START
      DUP2 DOT      
      3 ROLLD OBJ\-> SWAP nA nB 1 - 2 * + 1 + ROLLD \->ARRY
       NEXT
       DROP2
       nA nB + 1 - \->LIST   
   \>>
\>>

PDIV
\<<
   DUP SIZE 3 ROLLD LIST\-> \->ARRY SWAP LIST\-> \->ARRY \-> c b a
   \<<
     a b
     WHILE OVER SIZE 1 GET c \>= REPEAT
       DIVV
     END
     DROP \-> d 
     \<<
       a SIZE 1 GET c 1 - - \->LIST 
       d ARRY\-> LIST\-> DROP \->LIST
     \>>
 \>>
\>>

BAIRS
\<< LIST\-> 1 1 \-> n R S
  \<<
    DO 
      0 n 1 + PICK 0 0 0 4 PICK 5 n + 7 
      FOR J 
        J PICK R 7 PICK * + S 8 PICK * + 7 ROLL DROP DUP 6 ROLLD
     R 3 PICK * + S 4 PICK * + 5 ROLL DROP 
      -1 STEP 
      3 PICK SQ 3 PICK 6 PICK * - 
      6 PICK 6 PICK * 5 PICK 9 PICK * - OVER / DUP 'R' STO+
      4 PICK 9 PICK * 8 PICK 7 PICK * - ROT / DUP 'S' STO+
    UNTIL R\->C ABS .000000001 < 7 ROLLD 6 DROPN
    END 
    n DROPN 1 R NEG S NEG 3 \->LIST
  \>>
\>>

QUD
\<< LIST\-> \->ARRY DUP 1 GET / ARRY\->
    DROP ROT DROP SWAP
    2 / NEG DUP SQ ROT
    - \v/ DUP2 + 3 ROLLD -      
\>>

DIVV     
\<<
   DUP 1 GET \-> a b c
   \<<
      a 1 GET c / DUP b * a SIZE RDM a SWAP - ARRY\-> 1 GETI 1 - PUT 
      \->ARRY SWAP DROP b
   \>>
\>>

END
