hp41programs

SYMPOL

Elementary Symmetric Polynomials for the HP-41


Overview
 

 1°)  Program#1
 2°)  Program#2
 

-Given n real numbers  p1 , ............... , pn , these programs calculate the sums:

   s1 = p1 + .............. + pn = SUM1<=i<=n pi
   s2 = SUM1<=i1<i2 <=n pi1 pi2
   s3 = SUM1<=i1<i2<i3 <=n pi1 pi2 pi3
   .......................................................

   sn = p1 .............. pn
 

1°)  Program#1
 
 

Data Registers:   R00 to R2n+8: temp
Flags: /
Subroutine:  "PRO"  product of 2 polynomials ( cf "Polynomials for the HP-41" ) & "LCO" ( cf "Short routines for the HP-41" )

-Line 13 is   append  ?
 
 

 01  LBL "SYMP"
 02  8.008
 03  STO 04        
 04  1
 05  STO 05
 06  STO 06
 07  STO 08
 08  LBL 01
 09  " P"
 10  FIX 0
 11  CF 29
 12  ARCL 05     
 13  "~?"
 14  FIX 4
 15  SF 29
 16  PROMPT
 17  FC?C 22
 18  GTO 00
 19  STO 07        
 20  6.007
 21  RCL 04
 22  RCL 04
 23  FRC
 24   E3
 25  *
 26  1
 27  +
 28  XEQ "PRO"
 29  8
 30  XEQ "LCO"
 31  STO 04        
 32  ISG 05
 33  CLX
 34  GTO 01
 35  LBL 00
 36  RCL 04
 37  1
 38  +
 39  STO 04        
 40  END

 
   ( 79 bytes / SIZE 2n+9 )
 
 

      STACK        INPUT      OUTPUT
           X             /       bbb.eee

  where   bbb.eee  is the control number of the results  ( Rbb = s1 , .............. , Ree = sn )

Example:    We have 4 numbers pi      3   5   7   12

    XEQ "SYMP"   >>>   " P1?"
               3            R/S    " P2?"
               5            R/S    " P3?"
               7            R/S    " P4?"
              12           R/S    " P5?"                           Press R/S without any digit entry when all the numbers are keyed in:
                             R/S     >>>>    9.012

-And we get:         R09 = s1 = 27  ;   R10= s2 = 251  ;   R11 = s3 = 957  ;  R12 = s4 = 1260
 

Notes:

-The delay between 2 successive PROMPTs increases with the number of data.
-If possible, replace  XEQ "LCO"  ( line 30 )  by the M-Code routine  LCO.
 

2°)  Program#2
 

-In this variant, you store n into R00 and p1 into R01 , ............... , pn into Rnn
-Moreover, the products of polynomials are performed directly,  without calling "PRO"
-Thus, the routine is both shorter and faster.
 

Data Registers:           •  R00 = n                 ( Registers R00 thru Rnn are to be initialized before executing "SYMP" )

                                      •  R01 = p1     •  R02 = p2   .......................   •  Rnn = pn

              >>>>  When the program stops,   Rn+2 = s1 ,  Rn+3 = s2 , ................... , R2n+1 = sn           ( and Rn+1 = 1 )

Flags: /
Subroutines: /

-Line 28 is a synthetic TEXT0
-It may be replaced by another NOP instruction like  STO X  ,   LBL 00  ...
 
 

 01  LBL "SYMP"
 02  RCL 00        
 03  STO M
 04  1
 05  ST+ Y
 06  STO IND Y
 07  CLX
 08  .1
 09  %
 10  +
 11  LBL 01
 12  ENTER^
 13  ENTER^
 14  SIGN
 15  +
 16  STO N        
 17  RCL IND M
 18  SIGN
 19  CLX
 20  STO IND Y
 21  LBL 02        
 22  CLX
 23  RCL IND Z
 24  LASTX
 25  *
 26  ST+ IND Y
 27  DSE Z
 28  ""
 29  DSE Y
 30  GTO 02
 31  X<> N
 32  DSE M
 33  GTO 01        
 34  INT
 35   E3
 36  /
 37  2
 38  +
 39  RCL 00        
 40  +
 41  CLA
 42  END

 
     ( 67 bytes / SIZE 2n+2 )
 
 

      STACK        INPUT      OUTPUT
           X             /       bbb.eee

  where   bbb.eee  is the control number of the results  ( Rbb = s1 , .............. , Ree = sn )

Example:    With the same 4 numbers pi =  3   5   7   12

    4  STO 00         3  STO 01   5  STO 02   7  STO 03   12  STO 04

    XEQ "SYMP"   >>>   6.009                     ---Execution time = 5s---

-And we get:

     R06 = s1 = 27  ,   R07 = s2 = 251  ,   R08 = s3 = 957  ,  R09 = s4 = 1260

Notes:

-With n = 10 ,  execution time =  21s
-With n = 50 ,  execution time = 7m41s