 The Museum of HP Calculators

Creating a Matrix for the HP-41

This program is by Jean-Marc Baillard and is used here by permission.

This program is supplied without representation or warranty of any kind. Jean-Marc Baillard and The Museum of HP Calculators therefore assume no responsibility and shall have no liability, consequential or otherwise, of any kind arising from the use of this program material or any part thereof.

Overview

1°)  Main Program
2°)  Pascal's Matrices
3°)  nxn Magic Squares ( where n is odd )
4°)  nxn Panmagic Squares ( where n is neither a multiple of 2 nor a multiple of 3 )
5°)  Random Matrices   ( new )
6°)  Random Symmetric Matrices   ( new )

1°) Main program

-A real matrix [ai,j]    ( 1 <= i <= n ; 1 <= i <= m )  is an array of n.m real numbers

a1,1 a1,2 ........... a1,m
a2,1 a2,2 ........... a2,m
.    .    ............   .                         ( ai,j   is in the i-th row of the j-th column ).
.    .    ............   .
an,1 an,2 ........... an,m

-n is the number of rows and m is the number of columns.
-"MATRIX"  computes and stores these elements into contiguous registers ( in column order )
if they can be defined by  ai,j = f ( i ; j )  where f is a function of 2 variables.

-To create a matrix  [ai,j]  and store its elements into contiguous registers from Rbb to Ree   (  ee = bb + n.m -1 and  bb > 00 ):

1°) Load the function f into program memory ( global label, 6 characters or less )
2°) Store its name into register R00
3°) Place the control number of the matrix  bbb.eeenn  in X-register  ( n = the number of rows ) and XEQ "MATRIX"

a1,1 a1,2 ........... a1,m                                                  Rbb        Rbb+n                             Rbb+n.m-n
a2,1 a2,2 ........... a2,m                                                  Rbb+1    Rbb+n+1                        Rbb+n.m-n+1
.     .    ...........  .                will be stored into                  .           .......................................................                       respectively.
.     .    ...........  .
an,1 an,2 ........... an,m                                                 Rbb+n-1  Rbb+2n-1                      Rbb+n.m-1 = Ree

Data Registers:   �  R00 = function name          ( Register R00 is to be initialized before executing "MATRIX" )

and the registers containing the matrix elements ( no other register is used )

Flags: /
Subroutine:      The function f  ( assuming i is in X-register and j is in Y-register upon entry )
If needed, you have also 1 in L-register,
n = the number of rows in N-register and
k = the pointer value of the current element in M-register ( from 1 to n.m , counted in column order )

N.B:   Synthetic registers M N O can be replaced by R01 R02 R03 but, in this case, delete line 31,
replace line 02 with 0 STO 01 RDN in the following listing and choose bb > 03.

01  LBL "MATRIX"
02  CLA
03  ENTER^
04  FRC
05  ISG X
06  INT
07  STO N
08  1
09  -
10   E5
11  /
12  -
13  STO O
14  LBL 01
15  RCL M
16  STO Y
17  RCL N
18  /
19  INT
20  X<>Y
21  RCL N
22  MOD
23  1
24  ST+ Z
25  ST+ M
26  +
27  XEQ IND 00
28  STO IND O
29  ISG O
30  GTO 01
31  CLA
32  END

( 57 bytes )

Example:   Store the elements of the 3x4 matrix  [ai,j]  where  ai,j = i2 + j3  into registers R01 thru R12.

01  LBL "T"      defines the function  f(i;j) = i2 + j3
02  X^2
03  X<>Y
04  3
05  Y^X
06  +
07  RTN

"T"    ASTO 00
1.01203  XEQ "MATRIX"   and 13 seconds later,

2   9   28  65                                        R01  R04  R07  R10
the 12 numbers:        5  12  31  68          are stored into        R02  R05  R08  R11       respectively
10 17  36  73                                        R03  R06  R09  R12

Note:  If your matrix is actually a vector ( only one row )  you can key in  bbb.eee  instead of  bbb.eee01

2°) Pascal's Matrices

-These matrices [ai,j]  are defined by  ai,j = Ci+j-2i-1    where  Cnp = n! / ( p! ( n-p)! )  are the binomial coefficients.
-The following program calculates ( and stores ) these numbers without any roundoff error.

01  LBL "PSL"
02  SIGN
03  X=Y?
04  RTN
05  LASTX
06  X=Y?
07  RTN
08  CLX
09  RCL O
10  ST- Y
11  RCL N
12  -
13  RCL IND Y
14  RCL IND Y
15  +
16  END

( 29 bytes )

Example:    Create the 4x4 Pascal's matrix in register R11 thru R26

"PSL"  ASTO 00
11.02604  XEQ "MATRIX" and 14 seconds later, the 16 numbers

1   1   1   1                                              R11    R15   R19   R23
1   2   3   4          will be in registers         R12    R16   R20   R24       respectively
1   3   6  10                                             R13    R17   R21   R25
1   4  10 20                                             R14    R18   R22   R26

3°) nxn Magic Squares ( where n is odd )

-The elements of this matrix are  1 , 2 , ............. , n2  and it has the following property:
All its row sums, column sums and both diagonal sums are equal to the magic constant   M = n.(n2 + 1)/2

01  LBL "MAG"
02  RCL Y
03  X<>Y
04  -
05  ST+ Y
06  RCL N
07  DSE X
08  2
09  /
10  +
11  RCL N
12  X<=Y?
13  ST- Y
14  X<>Y
15  X<0?
16  +
17  STO Y
18  R^
19  RCL N
20  ST* T
21  X<=Y?
22  ST- Y
23  X<>Y
24  X<=0?
25  +
26  R^
27  +
28  END

( 46 bytes )

Example:     Create a 3x3 magic matrix in registers  R04 thru R12

"MAG"  ASTO 00
4.01203  XEQ "MATRIX"  yields ( in 13 seconds )

4    9    2                          R04   R07   R10
3    5    7     in registers     R05   R08   R11     respectively    ( all the rows, columns and main diagonals sum to 15 )
8    1    6                          R06   R09   R12

Note:   This program doesn't work if n is even

4°)  nxn Panmagic Squares ( where n is a neither a multiple of 2 nor a multiple of 3 )

-A panmagic square ( also called pandiagonal square ) is a magic square where all broken diagonal sums are also equal to the magic constant  M = n.(n2 + 1)/2

01  LBL "PMAG"
02  LASTX
03  ST- Z
04  -
05  STO Z
06  X<>Y
07  ENTER^
08  ST+ X
09  ST+ Y
10  R^
11  ST+ Z
12  +
13  RCL N
14  MOD
15  LASTX
16  *
17  X<>Y
18  LASTX
19  MOD
20  +
21  1
22  +
23  END

( 38 bytes )

Example:   Create a 5x5 panmagic matrix in registers R01 thru R25

"PMAG"   ASTO 00
1.02505    XEQ "MATRIX"   produces  ( in 30 seconds )

1    14    22    10    18                                 R01    R06    R11    R16    R21
7    20     3     11    24                                 R02    R07    R12    R17    R22
13   21     9     17     5          in registers        R03    R08    R13    R18    R23       respectively.
19    2     15    23     6                                  R04    R09    R14    R19    R24
25    8     16     4     12                                 R05    R10    R15    R20    R25

-Each row sum, column sum, main diagonal sum and "broken" diagonal sum is equal to 65  ( for instance  19 + 8 + 22 + 11 +  5  = 65
...   1  + 8 + 15 + 17 + 24 = 65  ... etc ... )

Notes:

1-If  n > 17 there are not enough registers to store nxn numbers, but if you replace line 28 of the "MATRIX" listing by VIEW X,
the successive elements of the panmagic square will be displayed. ( and if you set flag F21 the program will stop at each VIEW X ).
2-If  31 < n < 100   add also CLX after line 29 and, for instance:

"PMAG"  ASTO 00
1.10097   XEQ "MATRIX"   will display     1  99  197  295  393  491  ........    which are the 9409 elements of a 97x97 pandiagonal square.

5°)  Random Matrices

-This short routine stores pseudo-random integers ( between 1 and N )
into registers Rbb , ........ , Ree
-No other register is used.

01  LBL "RANM"
02  LBL 01
03  R-D
04  FRC
05  RCL X
06  X<> Z
07  ST* Z
08  X<> Z
09  INT
10  ISG X
11  CLX
12  STO IND T
13  RDN
14  ISG Z
15  GTO 01
16  END

( 33 bytes )

 STACK INPUTS OUTPUTS Z bbb.eee(ii) / Y N N X seed /

where bbb.eee(ii) is the control number of the array

Example:    Store random integers between 1 and 12 into registers   R01 , R02 , ........ , R07  with seed = 1

1.007  ENTER^
12     ENTER^
1      XEQ "RANM"  and in 3 seconds,   R01 = 4   R02 = 12   R03 = 4   R04 = 7   R05 = 12   R06 = 2   R07 = 5

Notes:

-Do not choose seed = PI
-The random number generator ( R-D  FRC )  may be replaced by a better one.

6°)  Random Symmetric Matrices

-To get a random symmetric matrix, we could create a random matrix A and add A to its transpose.
-"RANSM" directly stores a nxn symmetric matrix in registers  R01 thru  Rnn
-No other register is used.

01  LBL "RANSM"
02  STO N
03  RDN
04  STO O
05  CLX
06   E3
07  /
08  STO M
09  1
10  %
11  LASTX
12  ST+ Z
13  +
14  LBL 02
15  RCL N
16  R-D
17  FRC
18  STO N
19  RCL O
20  *
21  INT
22  ISG X
23  CLX
24  STO IND Y
25  STO IND Z
26  RDN
27  ISG X
28  CLX
29  ISG Y
30  GTO 02
31  FRC
32  RCL M
33  ST+ Z
34  SIGN
35  ST+ M
36  +
37  RCL Y
38  INT
39  +
40  ISG Y
41  GTO 02
42  CLA
43  END

( 73 bytes / SIZE n2+1 )

 STACK INPUTS OUTPUTS Z n / Y N / X seed /

Example:   Store a random symmetric matrix of order 5 - elements between 1 and 12 - in registers R01 thru R25 with seed = 2

5    ENTER^
12   ENTER^
2    XEQ "RANSM"  it yields, in 10 seconds

R01   R06   R11   R16   R21                8    11    3     3     6
R02   R07   R12   R17   R22               11   12   12    7    12
R03   R08   R13   R18   R23      =        3    12    9     6    10
R04   R09   R14   R19   R24                3     7     6     5     5
R05   R10   R15   R20   R25                6    12   10    5    10