%%HP: T(3)A(D)F(.);
DIR
POLY
\<< IF DEPTH                            
  THEN
    IF DUP TYPE 3 ==                    
    THEN
      DUP 'XY' STO SIZE 1 GET 'N' STO   
      CLLCD                             
      LijCAL                            
      KCAL                              
    ELSE EMESS                          
    END
    {CST POLY VIEWK Fx}                 
    ORDER                              
  ELSE
    EMESS                              
  END
\>>
CST
{                                     
  {"POLY" POLY}                       
  {"VIEW" VIEWK}                       
  {"Fx" Fx}                          
  {}                         
  {}                                 
  { "X-Y" XY}                          
}
Cab
\<< 
  IF DUP2 ==
  THEN DROP2 1                          
  ELSE
    0 1 \-> a b SUM Index
    \<<
      { 1 }                             

      DO  
        WHILE 
          Index a b - <                
        REPEAT
          DUP Index GET 1 + 1 \->LIST +  
          Index 1 + 'Index' STO
        END

        DO  
          FETCH                         
          SUM + 'SUM' STO               
          DUP Index GET 1 + Index SWAP
          DUP 4 ROLLD PUT               
        UNTIL SWAP b Index + >          
        END

        IF Index 1 >  
        THEN                            
          DO
            Index 1 - 'Index' STO       
            1 Index SUB                 
            DUP Index GET 1 + Index SWAP
            DUP 4 ROLLD PUT             
          UNTIL
            SWAP b Index + \<=         
            Index 1 == OR               
          END
        END
      UNTIL
        DUP Index GET b Index + >
        Index 1 == AND
      END
      DROP                              
      SUM
      -1 a b - ^ *                      
    \>>
  END                                   
\>>
EMESS
\<< 
  CLLCD
  "Input array not found." 1 DISP
  "Use Matrix Writer to " 3 DISP
  "enter your X Y values" 4 DISP
  "into an array on the" 5 DISP
  "stack.  Then start" 6 DISP
  "POLY again." 7 DISP
  7 FREEZE
\>>
EQ
Y.EQ                                    
FETCH
\<< 
  DUP SIZE 1 \-> lst n product          
  \<<
    XY
    1 n
    FOR i
      DUP lst i GET 1 XYindex GET       
      product * 'product' STO           
    NEXT
    DROP                                
    lst product                         
  \>>
\>>
Fx
\<<  
  K N GET                               
  N 1 - 1
  FOR i                                
    OVER *                              
    K i GET +                           
    -1
  STEP
  SWAP DROP                             
\>>
KCAL
\<< 
  1 N
  START                          
    0
  NEXT
  N \->ARRY 'K' STO                    

  1 N
  FOR i                                
    "DOING K" STD i \->STR + 1 DISP     
    0                                 
    i 1 - N 1 -
    FOR j                              
      @ Ki = Ki + Lj1 * C(j)(i-1) @
      L j 1 Lindex GET                  
      j i 1 - Cab                       
      * +                               
    NEXT
    K i 3 ROLL PUT 'K' STO              
    "K" i \->STR + "=" + K i GET \->STR + 3 DISP
  NEXT
\>>
LijCAL
\<<
  "DOING L:" 1 DISP
  1 TMAX                                
  START                                 
    0
  NEXT
  TMAX \->ARRY                          
  1 N                                  
  FOR j                                 
                                       
    j                                   
    XY j 2 * GET                       
    PUT                                 
  NEXT
                                        
  1 N 1 -
  FOR i                                 
    1 N i -
    FOR j                               
      DUP DUP i 1 - j 1 + Lindex GET    
      SWAP i 1 - j Lindex GET -         
      XY DUP i j + 1 XYindex GET        
      SWAP j 1 XYindex GET -            
      / i j Lindex SWAP PUT             
    NEXT
  NEXT
  'L' STO                              
\>>
Lindex
\<<
  \-> i j                             
  \<<
    i 1 - N i 2 / - * N + j +          
  \>>
\>>
PPAR
{
  (-6.5,-3.1)                          
  (6.5,3.2)                             
  X                                     
  0                                     
  (0,0)                                 
  FUNCTION                              
  Y                                    
}
TMAX

\<<
  N DUP 1 + * 2 /                       
\>>
VIEWK
\<< 
  STD CLLCD "Hit VIEW to cont..." 1 DISP
  N 1
  FOR i                                
    "K" i \->STR + "=" +
    K i GET \->STR + "*x^" + i 1 -
    \->STR + 3 DISP 0 WAIT DROP
    -1
  STEP
  CLLCD                                 
                                        
  KILL                                  
\>>
XYindex

\<<
  \-> i j                              
  \<<
    i 1 - 2 * j +                      
  \>>
\>>
Y.EQ
\<< 
  
  X Fx
\>>
