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.
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
Go back to the HP-41 software library
Go back to the general software library
Go
back to the main exhibit hall