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

det
\<< DUP SIZE \-> A B
    \<<
       IF B 1 ==                   
       THEN A 1 GET 1 GET
       ELSE
         IF B 2 ==
         THEN A DET2               
         ELSE 0
          1 B  FOR I
             A 1 GET I GET
             \-> E \<< IF E 0 SAME THEN ELSE
             A 1  I MINOR det E    
             * -1 1 I + ^ * +
          END \>> 
          NEXT
         END
       END
     \>>
  \>>

DET2        
\<<  \-> A
    \<< A 1 GET 1 GET
        A 2 GET 2 GET *
        A 1 GET 2 GET
        A 2 GET 1 GET * -
    \>>
 \>>

MINOR        
\<< \-> A B C
  \<< A SIZE \-> S
     \<< 1 S FOR I
          IF B I \=/ THEN A I GET
       \-> D
     \<< 1 S FOR J
           IF J C \=/ THEN D J GET
           END NEXT
           S 1 - \->LIST
     \>>
      END NEXT S 1 - \->LIST
    \>>
  \>>
\>>

inv
\<<  DUP SIZE \-> A B
  \<< 1 B FOR I
       1 B FOR J
         A J I MINOR det
         -1 I J + ^ *
       NEXT B \->LIST
     NEXT B \->LIST
     A det
  \>>
\>>

MMUL
\<< \-> A B
  \<< A SIZE B SIZE B 1 GET SIZE
     \-> L C R
    \<< 1 L FOR I A I GET
       \-> LI
       \<< 1 R FOR J 0
            1 C FOR K LI K GET
                 B K GET J GET
                 * +
            NEXT
          NEXT R \->LIST
        \>>
        NEXT L \->LIST
     \>>
   \>>
\>>

SCMUL 
\<< DUP SIZE \-> M A S
  \<< 1 S FOR I A I GET \-> C
    \<< 1 S FOR J C J GET M *
       NEXT
    \>> S \->LIST
    NEXT S \->LIST
  \>>
\>>

DIVP
\<< \-> P K R
  \<< P 'S' R - / 'S' K 1 - TAYLR \>>
\>>

eigf        
\<< DUP SIZE \-> A B
  \<< B '-S' SIDN A
     add det
  \>>
\>>

add
\<<  DUP SIZE \-> B A S
  \<< 1 S FOR I A I GET B I GET
     \-> C D
      \<< 1 S FOR J C J GET
             D J GET +
         NEXT
      \>> S \->LIST
     NEXT S \->LIST
  \>>
\>>

SIDN
\<< \-> K S
  \<< 1 K FOR I
       1 K FOR J
          I J == S *
       NEXT K \->LIST
     NEXT K \->LIST
  \>>
\>>

EIGV        
\<< \-> A
  \<< A eigf STEQ A SIZE
     1 FOR I RCEQ 'S' 0 ROOT
         RCEQ I 3 PICK DIVP
         STEQ
     -1 STEP { S EQ } PURGE
  \>>
\>>



