hp41programs

dot&cross Dot Product and Cross Product for the HP-41
 

Overview
 

 1°)  Dot Product

  1-a)  Focal Program
  1-b)  M-Code Routine

 2°)  Cross-Product

  2-a)  3D-Vectors
  2-b)  7D-Vectors
  2-c)  n-dimensional Vectors
 

>>> The latest addition is paragraph 2-b)

-Synthetic registers M N O P may be replaced by any unused data registers.
 

1°) Dot Product
 

     a) Focal Program
 

-The following program calculates the dot-product U.V of 2 vectors  U(x1,x2,....,xn)  and  V(y1,y2,....,yn) ,
  the norms  || U || , || V ||  and the angle µ defined by these vectors  ( between 0 and 180° )
 

Formula:         cos µ = U.V / ( || U || . || V || )
 

Data Registers:    •   Rbb = x1 ,  •   Rbb+1 = x2 , .......... ,  •   Ree = xn     ( These 2n registers are to be initialized before executing  "DOT" )
                               •   Rbb' = y1 , •   Rbb'+1 = y2 , .......... , •   Ree' = yn                                 ee - bb = ee' - bb' = n - 1
Flags: /
Subroutines: /

-If you use registers  R01 and R02 instead of registers N and O, replace line 02 by  0  STO 01  STO 02  RDN
 
 
 

01  LBL "DOT"
02  CLA
03  STO M
04  CLX
05  LBL 01 
06  RCL IND M
07  X^2
08  ST+ N
09  X<> L
10  RCL IND Z 
11  X^2
12  ST+ O 
13  X<> L
14  *
15  +
16  ISG Y
17  ""
18  ISG M
19  GTO 01       
20  STO Y
21  RCL O
22  SQRT
23  ST/ Z
24  RCL N        
25  SQRT
26  ST/ T
27  R^
28  ACOS
29  X<> T         
30  CLA
31  END

 
   ( 55 bytes )
 
 

      STACK        INPUTS      OUTPUTS
           T             /             µ
           Z             /          || U ||
           Y     bbb.eee(U)          || V ||
           X     bbb.eee(V)          U.V
           L            /         cos µ

 
Example:      U(2,3,7,1)   V(3,1,4,6)

 -For instance,

   2  STO 01   3  STO 02   7  STO 03   1  STO 04    ( control number = 1.004 )
   3  STO 06   1  STO 07   4  STO 08   6  STO 09    ( control number = 6.009 )

   1.004  ENTER^
   6.009  XEQ "DOT"  >>>>     U.V = 43
                                      RDN   || V || = 7.874007874
                                      RDN   || U || = 7.937253933
                                      RDN      µ    = 46.52626239°   ( if the HP-41 is set in DEG mode )
 

     b)  M-Code Routine
 

-"DOTN"  takes the control numbers of 2 vectors  bbb.eee(ii)1 and bbb.eee(ii)2 in registers Y and X  and returns the dot-product in X-register
-bbb.eee(ii)1 is unchanged in Y-register, bbb.eee(ii)2 is saved in L-register
-The "alpha" register is unused but synthetic register Q is altered.

-If  ii = 01 , it may be replaced by 00

Warning:

-This routine does not check for alpha data.
 

08E  "N"
014  "T"
00F  "O"
004  "D"
248   SETF 9
0B8  READ 2(Y)
128   WRIT 4(L)
2A0  SETDEC
084   CLRF 5                   C
0ED  ?NCXQ                   =
064   193B                      frc(C)
226   C=C+1 S&X           C
226   C=C+1 S&X           =
226   C=C+1 S&X       1000 C
070   N=C ALL
013   JNC +02
3B3  JNC -10d=-0Ah
088   SETF 5                    C
0ED  ?NCXQ                   =
064   193B                     int(C)
260   SETHEX
38D  ?NCXQ
008   02E3
106   A=C S&X
378   READ 13(c)
03C  RCR 3
146   A=A+C S&X
130   LDI S&X
200   200h                          this value is for an HP-41CV , CX or C with a Quad memory module or 4 memory modules
306   ?A<C S&X               if you have an HP-41C without memory modules, replace 200 by 100
381   ?NC GO
00A   02E0                        if register Ree1 or Ree2 doesn't exist, the routine stops after displaying "NONEXISTENT"
0A6   A<>C S&X
268   WRIT 9(Q)
0B0   C=N ALL
2A0   SETDEC
084   CLRF 5                   C
0ED  ?NCXQ                   =
064   193B                      frc(C)
226   C=C+1 S&X          C=
226   C=C+1 S&X        100 C
260   SETHEX
38D  ?NCXQ
008   02E3
2E6   ?C#0 S&X
017   JC+02
226   C=C+1 S&X
106   A=C S&X
278   READ 9(Q)
1BC  RCR 11
0A6  A<>C S&X
268   WRIT 9(Q)
138   READ 4(L)
2A0  SETDEC
088   SETF 5                    C
0ED  ?NCXQ                   =
064   193B                     int(C)
260   SETHEX
38D  ?NCXQ
008   02E3
106   A=C S&X
378   READ 13(c)
03C  RCR 3
146   A=A+C S&X
278   READ 9(Q)
1BC  RCR 11
0A6  A<>C S&X
24C  ?FSET 9
043   JNC+ 08
244   CLRF 9
10E   A=C ALL
0F8   READ 3(X)
0AE  A<>C ALL
0E8   WRIT 3(X)
0AE  A<>C ALL
22B  JNC -59d=-3Bh
268   WRIT 9(Q)
0F8   READ 3(X)
070   N=C ALL
04E   C=0 ALL
0E8   WRIT 3(X)
278   READ 9(Q)
106   A=C S&X
17C  RCR 6
0A6  A<>C S&X
306   ?A<C S&X
360   ?C RTN                               the routine stops when the last register of one vector has been used.
270   RAMSLCT
038   READDATA
0EE  C<>B ALL
0B0  C=N ALL
106   A=C S&X
17C  RCR 6
0A6  A<>C S&X
306   ?A<C S&X
360   ?C RTN                               the routine stops when the last register of one vector has been used.
270   RAMSLCT
038   READDATA
10E   A=C ALL
046   C=0 S&X
270   RAMSLCT
2A0  SETDEC
0EE  C<>B ALL
135   ?NCXQ                                C=
060   184D                                  A*C
10E   A=C ALL
0F8   READ 3(X)
01D  ?NCXQ                                C=
060   1807                                   A+C
0E8   WRIT 3(X)
260   SETHEX
0B0   C=N ALL
106   A=C S&X
03C  RCR 3
146   A=A+C S&X
1BC  RCR 11
0A6  A<>C S&X
070   N=C ALL
278   READ 9(Q)
106   A=C S&X
03C  RCR 3
146   A=A+C S&X
1BC  RCR 11
0A6  A<>C S&X
268   WRIT 9(Q)
2AB  JNC -43d=-2Bh
 

-The dot product of two vectors of 100 components is returned in 6.5 seconds.
 

2°) Cross Product
 

        a) 3-Dimensional Vectors
 

-The cross product of 2 vectors  U(x,y,z) and V(x',y',z')  is a vector defined by  UxV ( yz'-y'z , x'z-xz' , xy'-x'y )
-Since the stack has less than 6 registers, we have to store x , y , z  into 3 data registers.
 

Data Registers:     •  Rbb = x   •  Rbb+1 = y  •  Rbb+2 = z      ( These 3 registers are to be initialized before executing "CROSS" )
Flags: /
Subroutines: /
 
 

01  LBL "CROSS"
02  STO M 
03  RDN
04  STO N
05  X<>Y
06  STO O
07  RCL IND Z    
08  ST* Z
09  *
10  ISG Z
11  "" 
12  RCL IND Z    
13  ST* O
14  X<> M 
15  ST* M
16  X<> M 
17  ST- Z
18  ISG T
19  CLX
20  CLX
21  RCL IND T    
22  ST* N
23  RCL M 
24  *
25  X<>Y
26  -
27  RCL O           
28  RCL N
29  -
30  CLA               
31  END 

 
   ( 59 bytes )
 
 

      STACK        INPUTS      OUTPUTS
           T     bbb.eee(U)             /
           Z             z'             z"
           Y             y'             y"
           X             x'             x"

 
Example:        U(2,3,7)   V(3,1,4)     Compute the cross product  UxV

 -For instance,   2  STO 01   3  STO 02   7  STO 03    ( control number = 1.003 )

    1.003  ENTER^
       4      ENTER^
       1      ENTER^
       3      XEQ "CROSS"   >>>>    5
                                           RDN   13
                                           RDN   -7      whence    UxV(5,13,-7)

Notes:

-In fact, this program will work as well if you place bbb in T register ( instead of  bbb.eee )
-You may also store  x , y , z  in non-contiguous registers like  R01  R03  R05  but in this case, place  1.00502 ( or 1.00002 ) in T

-The cross product is anticommutative:    VxU = -UxV

-Alternatively, you can also use the following program that is essentially similar to the M-Code routine CROSS
-It requires that you store  x'  y'  z'  into synthetic registers  M  N  O
 ( assign STO M   STO N  STO O  to 3 keys or use it in a program )
 

Data Registers: /
Flags: /
Subroutines: /
 
 

 01  LBL "CROSS"
 02  STO P
 03  RCL N
 04  *
 05  X<>Y
 06  STO Q
 07  RCL M
 08  *
 09  -
 10  X<>Y
 11  RCL M
 12  *
 13  RCL O
 14  ST* P
 15  ST* Q
 16  X<> P
 17  -
 18  RCL N
 19  R^
 20  *
 21  ST- Q
 22  X<> Q
 23  END

 
( 45 bytes / SIZE 000 )
 
 

      STACK        INPUTS      OUTPUTS
           T     bbb.eee(U)             /
           Z             z'             z"
           Y             y'             y"
           X             x'             x"

 
Example:        U(2,3,7)   V(3,1,4)     Compute the cross product  UxV

 -For instance,   2  STO M   3  STO N   7  STO O

       4      ENTER^
       1      ENTER^
       3      XEQ "CROSS"   >>>>    5
                                           RDN   13
                                           RDN   -7      whence    UxV(5,13,-7)

Notes:

-The 3 components  x'  y'  z'  are still in  M  N  O  at the end.
-If you don't need to save these values, add  CLA  before the end.
 

        b) 7-Dimensional Vectors
 

- U(x1,x2,....,x7)   and  V(y1,y2,....,y7)  are two 7D-vectors.

-"U*V7" calculates the cross product  W(z1,z2,....,z7) by the formula given   here

-You store the components of U in R01 thru R07 and the components of V in R08 thru R14.
-"U*V7" stores the result in R15 thru R21
 

Data Registers:              R00 = temp          ( Registers R01 thru R14 are to be initialized before executing "U*V7" )

                                      •  R01 = x1           •  R08 = y1                                                    R15 = z1
                                      •  R02 = x2           •  R09 = y2                                                    R16 = z2
                                         .............               ............          When the program stops:        ...........

                                      •  R07 = x7           •  R14 = y7                                                    R21 = z7
Flags: /
Subroutines: /

-Synthetic register M may be replaced by  R22
 
 

 01  LBL "U*V7"
 02  15.021
 03  STO 00
 04  7
 05  STO M
 06  LBL 01
 07  RCL 02       
 08  RCL 11
 09  *
 10  RCL 04
 11  RCL 09
 12  *
 13  -
 14  RCL 03
 15  RCL 14
 16  *
 17  +
 18  RCL 07       
 19  RCL 10
 20  *
 21  -
 22  RCL 05
 23  RCL 13
 24  *
 25  +
 26  RCL 06
 27  RCL 12
 28  *
 29  -
 30  STO IND 00
 31  RCL 07       
 32  X<> 06
 33  X<> 05
 34  X<> 04
 35  X<> 03
 36  X<> 02
 37  X<> 01
 38  STO 07
 39  RCL 14
 40  X<> 13       
 41  X<> 12
 42  X<> 11
 43  X<> 10
 44  X<> 09
 45  X<> 08
 46  STO 14
 47  ISG 00
 48  CLX
 49  DSE M
 50  GTO 01  
 51  RCL 00       
 52  7
 53  -
 54  END

 
         ( 85 bytes / SIZE 022 )
 
 

      STACK        INPUT      OUTPUT
           X             /        15.021

 
Example:    U( 6  2  4  7  10  13  12 )    V( 4  6  3  2  5  7  8 )

-Store these 14 numbers in R01 thru R14

    XEQ "U*V7"  >>>>   15.021                          ---Execution time = 10s---

-And you get in R15 thru R21

    W( -37  26  73  59  -40  33  -47 )

Notes:

-Registers R01 to R14 are modified during execution, but their contents is restored at the end.
-If n > 3 & n # 7 , the cross-product cannot be defined as a vector:
 

        c) n-Dimensional Vectors
 

- U(x1,x2,....,xn)   and  V(y1,y2,....,yn)  are 2 vectors.

- In n-dimensional spaces, the cross product is actually an antisymmetric Tensor  P = [Pi,j]   where  Pi,j = xi.yj - xj.yi         i , j = 1 , 2 , ...... , n
-"U*V" computes and stores the  n2  components of this tensor   ( in column order )
 

Data Registers:               R00 = n                              ( Rbb thru Ree & Rbb' thru Ree' are to be initialized before executing  "U*V" )

                                      •   Rbb = x1 ,   •   Rbb+1 = x2 , .......... ,  •   Ree = xn                     ee - bb = ee' - bb' = n - 1
                                      •   Rbb' = y1 ,  •   Rbb'+1 = y2 , .......... , •   Ree' = yn

                 >>>>  When the program stops,    Rbb" to Ree" contain the n2 coefficients of the product  ( in column order )                 ee" - bb" = n2 - 1
Flags: /
Subroutines: /
 
 

01  LBL "U*V"
02  STO M 
03  RDN
04  STO O
05  X<>Y
06  STO N       
07  INT
08  CHS
09  LASTX
10  FRC
11   E3
12  *
13  +
14  1
15  +
16  STO 00 
17  X^2
18  1
19  -
20  .1
21  %
22  STO P 
23  LBL 01
24  RCL P
25  INT
26  STO Y
27  RCL 00       
28  ST/ Z
29  MOD
30  X<>Y
31  INT
32  RCL X
33  RCL O
34  +
35  RDN
36  RCL IND T
37  RCL N 
38  R^
39  ST+ Y
40  R^
41  R^
42  RCL IND T
43  *
44  RCL O       
45  ST+ T
46  CLX
47  RCL IND T
48  RCL N
49  ST+ T
50  CLX
51  RCL IND T
52  *
53  -
54  STO IND M
55  ISG M
56  CLX
57  ISG P
58  GTO 01
59  RCL N 
60  RCL M
61  ENTER^
62  DSE X
63   E3
64  /
65  +
66  RCL 00
67  X^2
68  -
69  RCL 00        
70   E5
71  /
72  +
73  RCL O 
74  X<>Y
75  CLA
76  END

 
   ( 115 bytes )
 
 

      STACK        INPUTS      OUTPUTS
           Z      bbb.eee(U)      bbb.eee(U)
           Y      bbb.eee(V)      bbb.eee(V)
           X          bbb(P)   bbb.eee,nn(P)

 
Example1:     U(2,3,7,1)   V(3,1,4,6)     Calculate the 16 coefficients of  P = UxV

 -For instance,

  2  STO 01   3  STO 02   7  STO 03   1  STO 04    ( control number = 1.004 )
  3  STO 06   1  STO 07   4  STO 08   6  STO 09    ( control number = 6.009 )

-If we choose register R12 as the first register for the product:

   1.004  ENTER^
   6.009  ENTER^
     12     XEQ "U*V"   >>>>   12.02704   ( in 17 seconds )   and we get:

              0   -7   -13   9                    R12   R16   R20   R24
              7    0     5    17        =        R13   R17   R21   R25      respectively.
             13  -5    0    38                   R14   R18   R22   R26
             -9  -17 -38   0                    R15   R19   R23   R27

-There are only  n(n-1)/2  independent coefficients  ( 6 in this example ) and the diagonal elements are always zeros.
 

Example2:     U(2,3,7)   V(3,1,4)     Compute   UxV

    2  STO 01   3  STO 02   7  STO 03      ( control number = 1.003 )
    3  STO 06   1  STO 07   4  STO 08      ( control number = 6.008 )

-If we choose again register R12 as the first register for the product:

   1.003  ENTER^
   6.008  ENTER^
     12        R/S     >>>>   12.02003   ( in 10s ) , we get:

              0   -7  -13                  R12   R15   R18
              7    0     5         =       R13   R16   R19     respectively.
             13  -5    0                   R14   R17   R20

Note:

-If  n = 3 , there are only 3 independent coefficients and p23 ,  p31 ,  p12   ( in this order )
  form the components of the usual cross product   ( which is actually a pseudo-vector )
-In this example, we recognize  UxV = (5,13,-7)