%%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
       DUP A + SWAP + DUP 'A' STO    
       LIST\-> \->ARRY B LIST\-> 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 ARRY\-> 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 * -
      IF DUP 0 == THEN
          DROP 1 1
      ELSE
          6 PICK 6 PICK * 5 PICK 9 PICK * - OVER /
          4 PICK 9 PICK * 8 PICK 7 PICK * - ROT /
      END
      DUP 'S' STO+              
      SWAP DUP 'R' 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
