The Museum of HP Calculators

# Geometric Transformations for the HP-41

This program is Copyright © 2004 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

-These programs deal with the most usual geometric transformations Tf, essentially projections, symmetries, rotations ( and a few similarities ).
-In the first 4 paragraphs, we compute the coordinates of M' = Tf(M) assuming the coordinates of M ( and Tf itself ) are known:

1°)  Orthogonal Projection and Symmetry ( Reflexion )

a)  2-dimensional spaces:   Orthogonal Projection and Symmetry / Line
b)  3-dimensional spaces
1- Orthogonal Projection and Symmetry / Plane
2- Orthogonal Projection / Line
c)  n-dimensional spaces
1- Orthogonal Projection and Symmetry / Hyperplane
2- Orthogonal Projection and Symmetry / Line

2°) Projection and Symmetry

a)  2-dimensional spaces:   Projection and Symmetry / Line // Vector
b)  3-dimensional spaces
1- Projection and Symmetry / Plane // Vector
2- Projection / Line // Vectorial Plane
c)  n-dimensional spaces
1- Projection and Symmetry / Hyperplane // Vector
2- Projection and Symmetry / Line // Vectorial Hyperplane

3°)  Rotations

a)  2-dimensional spaces
b)  3-dimensional spaces
c)  n-dimensional spaces

4°)  Similarity ( Only 3 examples )

a)  2-dimensional spaces
b)  3-dimensional spaces
c)  n-dimensional spaces

-The other programs deal with the link between Matrices and Transformations.

5°)  Transformation >>>> Matrix

a)  2-dimensional spaces
b)  3-dimensional spaces
c)  n-dimensional spaces

6°)  Product ( Composition ) of 2 Transformations

7°)  Reciprocal of a Transformation

8°)  A Few Tests ( up to 17x18 Matrices )

a)  Projection ? Symmetry ?
b)  Isometry ?
c)  Similarity ?

9°)  Matrix >>>> Transformation

a)  2-dimensional spaces
b)  3-dimensional spaces
c)  n-dimensional spaces  ( One example only )

Remarks:   -Some of these programs use synthetic registers  M  N  O  P  Q  a  ( do not confuse O and Q in the listings )
-Don't stop a running program if registers P and Q are used ( it could alter their contents - without any "crash" however )
-When register "a" is used, the program must not be called as more than a first level subroutine ( however, an alternative is suggested in this case )
-If you're not familiar to synthetic programming, these 6 registers may be replaced by any unused standard registers,
( for example:  R39  R40  R41  R42  R43  R44 which are unused in all the following examples )

-The basis is assumed to be orthonormal.
-In the "rotation" programs, the basis must be direct orthonormal,
and the sign of the rotation angle is determined by the right-hand rule.

1°) Orthogonal Projection and Symmetry

a-1) 2-Dimensional Space  ( Program#1 )

M(x;y)
|
|
------------|M'(x';y')-----------------   ( L ) : y = mx + p
|
|
M"(x";y")

-Given   m , p and  M(x,y) , the following program computes  M'(x',y') and M"(x",y")   where  ( MM' ) is perpendicular to ( L ) and  M' is the midpoint of [MM"]

Data Registers: /
Flags: /
Subroutines: /

01  LBL "OPS2A"
02  STO M
03  RDN
04  STO N
05  RDN
06  ST- T
07  RDN
08  ST* Z
09  RDN
10  +
11  R^
12  X^2
13  SIGN
14  ST+ L
15  X<> L
16  /
17  STO Z
18  R^
19  *
20  +
21  ENTER^
22  ST+ Y
23  X<> N
24  -
25  R^
26  ST+ X
27  RCL M
28  -
29  RCL N
30  R^
31  CLA
32  END

( 54 bytes / SIZE 000 )

 STACK INPUTS OUTPUTS T m y" Z p x" Y y y' X x x' L / x

Example:    Line (L) is defined by   y = 3x - 7  and  M(1;2)  ; find M' and M"

3  ENTER^
-7  ENTER^
2  ENTER^
1  XEQ "OPS2A"   >>>>   RDN  2.8  RDN  1.4  RDN  4.6  RDN  0.8    whence   M'(2.8;1.4)  and  M"(4.6;0.8)

Note:     If (L) // (Oy) , the program doesn't work but you can use "OPS2"  below
In this case however, the formulas are trivial.

a-2) 2-Dimensional Space  ( Program#2 )

M(x;y)
|
|
------------|M'(x';y')-----------------   ( L ) :  ax + by = c
|
|
M"(x";y")

Data Registers:     • R00 = c        • R01 = a    • R02 = b  ( these 3 registers are to be initialized before executing "PS2" )
Flags: F01    CF01 = projection
SF01 = reflexion
Subroutines: /

01  LBL "OPS2"
02  STO Z
03  RCL 01
04  *
05  X<>Y
06  RCL 02
07  X<>Y
08  ST* Y
09  RDN
10  +
11  RCL 00
12  X<>Y
13  -
14  FS? 01
15  ST+ X
16  RCL 01
17  X^2
18  SIGN
19  CLX
20  RCL 02
21  ST* X
22  ST+ L
23  X<> L
24  /
25  RCL 02
26  X<>Y
27  *
28  ST+ Z
29  X<> L
30  RCL 01
31  *
32  X<>Y
33  +
34  END

( 52 bytes / SIZE 003 )

 STACK INPUTS OUTPUTS Y y y' or y" X x x' or x" L / x

(x';y')   if Flag F01 is clear
(x";y")  if Flag F01 is set

Example:    (L): 3x + 4y = 9     M(1;2)    Find  M' and M"

9  STO 00    3  STO 01    4  STO 02

CF 01   2  ENTER^   1   XEQ "OPS2"  >>>>   0.76   X<>Y   1.68    whence   M'(0.76;1.68)
SF 01    2  ENTER^   1       R/S   >>>>   0.52   X<>Y   1.36    whence   M"(0.52;1.36)

b) 3-Dimensional Space

b-1) Orthogonal Projection ( and Symmetry ) onto ( with respect to ) a Plane.

M(x;y;z)
|
|
/  ----------|----------------------------- /
/                   | M'(x';y';z')                          /
/                                                               /
/-P----------------------------------------/       The plane (P) is defined by its equation  ax + by + cz = d
|                                                ( MM' ) is perpendicular to ( P ) and  M' is the midpoint of [MM"]    ( M' belongs to (P) )
|
M"(x";y";z")

Data Registers:     • R00 = d        • R01 = a    • R02 = b   •  R03 = c   ( these registers are to be initialized before executing "OPS3" )
Flags: F01    CF01 for the projection
SF01 for the reflexion
Subroutines: /

01  LBL "OPS3"
02  STO M
03  RCL 01
04  *
05  X<>Y
06  STO N
07  RCL 02
08  *
09  +
10  X<>Y
11  STO O
12  RCL 03
13  *
14  +
15  RCL 00
16  X<>Y
17  -
18  FS? 01
19  ST+ X
20  RCL 01
21  X^2
22  RCL 02
23  X^2
24  RCL 03
25  X^2
26  +
27  +
28  /
29  RCL 03
30  RCL 02
31  RCL 01
32  R^
33  ST* Z
34  ST* T
35  *
36  RCL O
37  ST+ T
38  X<> N
39  ST+ Z
40  X<> M
41  +
42  CLA
43  END

( 64 bytes / SIZE 004 )

 STACK INPUTS OUTPUTS Z z z' or z" Y y y' or y" X x x' or x" L / x

(x';y';z')   if Flag F01 is clear
(x";y";z")  if Flag F01 is set

Example:    (P): 3x + 4y + 5z = 1    M(2;6;7)   Find M' and M"

1  STO 00    3  STO 01   4  STO 02   5  STO 03

CF 01
7  ENTER^
6  ENTER^
2  XEQ "OPS3"  >>>>   -1.84   RDN  0.88   RDN   0.6   whence  M'(-1.84;0.88;0.6)

SF 01
7  ENTER^
6  ENTER^
2     R/S             >>>>   -5.68   RDN   -4.24   RDN   -5.8    whence  M"(-5.68;-4.24;-5.8)

b-2) Orthogonal Projection onto a Line.

-Line (L) is now defined by one of its points, say  A(xA;yA;zA)  and one vector  U(a;b:c)

M(x;y;z)
|
A                        |
----|------->U -------|------------ (L)                  (MM') perpendicular to (L)
M'(x';y';z')

Data Registers:      R00  unused                           ( registers R01 to R06 are to be initialized before executing "OPL3" )
• R01 =  xA      • R04 = a
• R02 =  yA      • R05 = b
• R03 =  zA      • R06 = c
Flags: /
Subroutines: /

01  LBL "OPL3"
02  RCL 01
03  -
04  RCL 04
05  *
06  X<>Y
07  RCL 02
08  -
09  RCL 05
10  *
11  +
12  X<>Y
13  RCL 03
14  -
15  RCL 06
16  *
17  +
18  RCL 04
19  X^2
20  RCL 05
21  X^2
22  RCL 06
23  X^2
24  +
25  +
26  /
27  RCL 03
28  RCL 06
29  RCL Z
30  *
31  +
32  RCL 05
33  R^
34  *
35  RCL 02
36  +
37  RCL 04
38  R^
39  *
40  RCL 01
41  +
42  END

( 52 bytes / SIZE 007 )

 STACK INPUTS OUTPUTS Z z z' Y y y' X x x'

Example:    A(2;3;7)   U(3;4;5)      Find M' if M(9;4;1)

2  STO 01     3  STO 04
3  STO 02     4  STO 05
7  STO 03     5  STO 06

1  ENTER^
4  ENTER^
9  XEQ "OPL3"  >>>>   1.7   RDN   2.6   RDN   6.5    Thus,  M'(1.7;2.6;6.5)

Note:   The axial symmetry is equivalent to a rotation by 180° around the (L) axis  ( cf 3°) b) below )

c) n-Dimensional Space

c-1) Orthogonal Projection ( and Symmetry ) onto ( with respect to ) an Hyperplane.

M(x1;...;xn)
|
|
/  ----------|------------------------------/
/                   | M'(x'1;...;x'n)                      /
/                                                               /
/-H ---------------------------------------/       The hyperplane (H) is defined by its equation    a1x1 + ......... +  anxn = b
|                                                ( MM' ) is perpendicular to ( P ) and  M' is the midpoint of [MM"]    ( M' belongs to (P) )
|
M"(x"1;...;x"n)

Data Registers:    • R00 = b                        ( Registers R00 thru Rnn and Rdd thru Rff  are to be initialized before executing "OPSN" )
• R01 = a1      • R02 = a2  ..................  • Rnn = an
• Rbb = x1      • Rbb+1 = x2   ............   • Ree  = xn                                            (  ee - bb = ee' - bb' = n-1 )
and when the program stops:      Rbb' = x'1   ;    Rbb'+1 = x'2   ;............;    Ree'  = x'n      ( These 2 blocks of registers can't overlap )
Flags: F01          CF 01 means projection
SF 01 means reflexion.
Subroutines: /

01  LBL "OPSN"
02  STO N
03  X<>Y
04  STO M
05  INT
06  CHS
07  LASTX
08  FRC
09   E3
10  *
11  +
12  1
13  +
14  STO O
15  CLX
16  STO P
17  LASTX
18  RCL 00
19  LBL 01
20  RCL IND Y
21  X^2
22  ST+ P
23  X<> L
24  RCL IND M
25  *
26  -
27  ISG Y
28  CLX
29  ISG M
30  GTO 01
31  FS? 01
32  ST+ X
33  RCL P
34  /
35  RCL O
36  ST- M
37  SIGN
38  LBL 02
39  RCL IND X
40  RCL Z
41  *
42  RCL IND M
43  +
44  STO IND N
45  CLX
46  SIGN
47  ST+ N
48  +
49  ISG M
50  GTO 02
51  RCL M
52  RCL N
53  ENTER^
54  DSE X
55   E3
56  /
57  +
58  RCL O
59  ST- Z
60  -
61  CLA
62  END

( 101 bytes )

 STACK INPUTS OUTPUTS Y bbb.eee(M) bbb.eee(M) X bbb' bbb.eee(M') L / n

Example:    (H):  x + 2y + 3z + 6t = 10      Find the coordinates of M' and M"   if  M(4;7;1;9)

10  STO 00
1   STO 01   2  STO 02   3  STO 03   6  STO 04

and if we choose registers R05 thru R08 for M ,    4  STO 05  7  STO 06  1  STO 07  9  STO 08   ( control number = 5.008 )
-If we want to get M' in registers R09 thru R12 and M" in R13 thru R16

CF 01
5.008  ENTER^
9      XEQ "OPSN"  yields ( in 5 seconds )   9.012
RCL 09  >>>>  2.7
RCL 10  >>>>  4.4
RCL 11  >>>> -2.9
RCL 12  >>>>  1.2     whence   M'(2.7;4.4;-2.9;1.2)

-Likewise,  SF 01    5.008  ENTER^
13        R/S        gives   13.016   and  we recall registers  R13 thru R16 to get   M"(1.4;1.8;-6.8;-6.6)

c-2) Orthogonal Projection ( and Symmetry ) onto ( with respect to ) a Line.

-Line (L) is determined by one of its points  A(a1;a2;.....;an)   and one vector   U(u1;u2;....;un)

M(x1;...;xn)
|
|
A                        |
----|------->U -------|-M'(x'1;...;x'n)----------------------------- (L)                 (MM") perpendicular to (L) ;   MM' = M'M"
|
|
|
M"(x"1;...;x"n)

Data Registers:      R00 unused                        ( Registers R01 thru R2n and Rbb thru Ree  are to be initialized before executing "OPSLN" )
• R01 = a1      • R02 = a2  ..................  • Rnn = an
• Rn+1 = u1    • Rn+2 = u2  ................  • R2n = un
• Rbb = x1      • Rbb+1 = x2   ............   • Ree  = xn
and when the program stops:      Rbb' = x'1   ;    Rbb'+1 = x'2   ;............;    Ree'  = x'n      ( These last 2 blocks of registers can't overlap )
Flags: F01          CF 01 = projection
SF 01 = reflexion.
Subroutines: /

01  LBL "OPSLN"
02  STO N
03  X<>Y
04  STO M
05  INT
06  CHS
07  LASTX
08  FRC
09   E3
10  *
11  +
12  1
13  +
14  STO O
15  LASTX
16  +
17  STO P
18  LASTX
19  ENTER^
20  CLX
21  STO Q
22  LBL 01
23  RCL IND M
24  RCL IND Z
25  -
26  RCL IND P
27  X^2
28  ST+ Q
29  X<> L
30  *
31  +
32  ISG Y
33  CLX
34  ISG P
35  CLX
36  ISG M
37  GTO 01
38  RCL Q
39  /
40  RCL O
41  ST- P
42  PI
43  INT
44  10^X
45  /
46  ISG X
47  LBL 02
48  RCL IND P
49  RCL Z
50  *
51  RCL IND Y
52  +
53  STO IND N
54  CLX
55  SIGN
56  ST+ N
57  ST+ P
58  RDN
59  ISG X
60  GTO 02
61  FC? 01
62  GTO 04
63  RCL O
64  ST- M
65  ST- N
66  LBL 03
67  RCL IND N
68  ST+ X
69  RCL IND M
70  -
71  STO IND N
72  ISG N
73  CLX
74  ISG M
75  GTO 03
76  LBL 04
77  RCL M
78  RCL N
79  ENTER^
80  DSE X
81   E3
82  /
83  +
84  RCL O
85  ST- Z
86  -
87  CLA
88  END

( 143 bytes )

 STACK INPUTS OUTPUTS Y bbb.eee(M) bbb.eee(M) X bbb' bbb.eee(M') L / n

Example:     A(2;4;7;8)  U(1;2;3;6)    M(4;7;1;9)   Find M' and M"

2  STO 01     1  STO 05       and, for instance,      4  STO 09
4  STO 02     2  STO 06                                       7  STO 10
7  STO 03     3  STO 07                                       1  STO 11
8  STO 04     6  STO 08                                       9  STO 12        ( control number = 9.012 )

CF 01   9.012  ENTER^
13    XEQ "OPSLN"   >>>>   13.016  ( in 5 seconds )   and recalling registers R13 to R16, we get:   M'(1.92;3.84;6.76;7.52)

SF 01   9.012  ENTER^
13      R/S                   >>>>    13.016  ( in 7 seconds )  -------------------------------------------   M"(-0.16;0.68;12.52;6.04)

2°) Projection and Symmetry

a) 2-Dimensional Space

-The direction of projection and symmetry is now determined by a vector V(a';b')

M(x;y)           V
\                     \
\                     \
------------\ M'(x';y')-----------------   ( L ) : ax + by = c              (MM') //  V  and  MM' = M'M"
\
\
M"(x";y")

Data Registers:     • R00 = c        • R01 = a    • R02 = b
• R03 = a'    • R04 = b'    ( these 5 registers are to be initialized before executing "PS2" )
Flags: F01    CF01 = projection
SF01 = symmetry
Subroutines: /

01  LBL "PS2"
02  STO M
03  RCL 01
04  *
05  X<>Y
06  STO N
07  RCL 02
08  *
09  +
10  RCL 00
11  X<>Y
12  -
13  FS? 01
14  ST+ X
15  RCL 01
16  RCL 03
17  *
18  RCL 02
19  RCL 04
20  *
21  +
22  /
23  RCL 04
24  RCL 03
25  RCL Z
26  ST* Z
27  *
28  RCL N
29  ST+ Z
30  X<> M
31  +
32  CLA
33  END

( 50 bytes / SIZE 005 )

 STACK INPUTS OUTPUTS Y y y' or y" X x x' or x" L / x

(x';y')   if Flag F01 is clear
(x";y")  if Flag F01 is set

Example:    (L): 2x + 3y = 7  ; V(4;-3)  ;  M(1;2)   Find M' and M"

7  STO 00   2  STO 01    3  STO 02
4  STO 03   -3  STO 04

CF 01
2  ENTER^
1  XEQ "PS2"  >>>>  5  X<>Y  -1   whence  M'(5;-1)

SF 01
2  ENTER^
1     R/S           >>>>  9  X<>Y  -4  whence  M"(9;-4)

b) 3-Dimensional Space

b-1) Projection ( and Symmetry ) onto ( with respect to ) a Plane.

-The direction of the projection is determined by a vector V(a';b';c')

M(x;y;z)        V
\                    \
\                    \
/  --------\------------------------------- /
/                  \  M'(x';y';z')                          /
/                                                               /
/-P----------------------------------------/       The plane (P) is defined by its equation  ax + by + cz = d
\                                           ( MM' ) //  V  and  MM' = M'M"    ( M' belongs to (P) )
\
M"(x";y";z")

Data Registers:     • R00 = d        • R01 = a    • R02 = b   •  R03 = c
• R04 = a'    • R05 = b'  •  R06 = c'    ( these 7 registers are to be initialized before executing "PS3" )
Flags: F01    CF01 for the projection
SF01 for the symmetry
Subroutines: /

01  LBL "PS3"
02  STO M
03  RCL 01
04  *
05  X<>Y
06  STO N
07  RCL 02
08  *
09  +
10  X<>Y
11  STO O
12  RCL 03
13  *
14  +
15  RCL 00
16  X<>Y
17  -
18  FS? 01
19  ST+ X
20  RCL 01
21  RCL 04
22  *
23  RCL 02
24  RCL 05
25  *
26  +
27  RCL 03
28  RCL 06
29  *
30  +
31  /
32  RCL 06
33  RCL 05
34  RCL 04
35  R^
36  ST* T
37  ST* Z
38  *
39  RCL O
40  ST+ T
41  X<> N
42  ST+ Z
43  X<> M
44  +
45  CLA
46  END

( 66 bytes / SIZE 007 )

 STACK INPUTS OUTPUTS Z z z' or z" Y y y' or y" X x x' or x" L / x

(x';y';z')   if Flag F01 is clear
(x";y";z")  if Flag F01 is set

Example:    (P): 2x + 3y + 7z = 4   ;   V(6;1;-2)    M(1;4;5)    Find M' and M"

4  STO 00    2  STO 01   3  STO 02   7  STO 03
6  STO 04   1  STO 05  -2  STO 06

CF 01
5  ENTER^
4  ENTER^
1  XEQ "PS3"  >>>>   -269   RDN  -41   RDN   95   whence  M'(-269;-41;95)

SF 01
5  ENTER^
4  ENTER^
1     R/S             >>>>   -539   RDN   -86   RDN   185    whence  M"(-539;-86;185)

b-2) Projection ( and Symmetry ) onto ( with respect to ) a Line.

-Line (L) is defined by one of its points  A(xA;yA;zA)  and a vector  U(a;b;c)
-The direction of projection is determined by a ( vectorial ) plane (P): a'x + b'y + c'z = 0

A(xA;yA;zA)
\
\   U
\
M(x;y;z)-----------M'(x';y';z')---------M"(x";y";z")
\
/---------------------\--------------------/
/                                   \                           /
/                                                               /
/-P----------------------------------------/                     ( MM' ) //  (P)  and  MM' = M'M"
\
\ (L)

Data Registers:    R00 unused      • R01 = xA   • R02 = yA •  R03 = zA
• R04 = a     • R05 = b   •  R06 = c
• R07 = a'    • R08 = b'  •  R09 = c'    ( these 9 registers are to be initialized before executing "PS3" )
Flags: F01    CF01 = projection
SF01 = symmetry
Subroutines: /

01  LBL "PS3L"
02  STO M
03  RCL 01
04  -
05  RCL 07
06  *
07  X<>Y
08  STO N
09  RCL 02
10  -
11  RCL 08
12  *
13  +
14  X<>Y
15  STO O
16  RCL 03
17  -
18  RCL 09
19  *
20  +
21  RCL 04
22  RCL 07
23  *
24  RCL 05
25  RCL 08
26  *
27  +
28  RCL 06
29  RCL 09
30  *
31  +
32  /
33  RCL 03
34  RCL 06
35  RCL Z
36  *
37  +
38  RCL 05
39  R^
40  *
41  RCL 02
42  +
43  RCL 04
44  R^
45  *
46  RCL 01
47  +
48  FC? 01
49  GTO 01
50  2
51  ST* T
52  ST* Z
53  *
54  RCL O
55  ST- T
56  X<> N
57  ST- Z
58  X<> M
59  -
60  LBL 01
61  CLA
62  END

( 84 bytes / SIZE 010 )

 STACK INPUTS OUTPUTS Z z z' or z" Y y y' or y" X x x' or x"

(x';y';z')   if Flag F01 is clear
(x";y";z")  if Flag F01 is set

Example:    A(4;6;-1)  U(2;3;7)    (P): 6x + y - 2z = 0   ;    M(1;4;2)    Find M' and M"

4  STO 01   6  STO 02   -1  STO 03
2  STO 04   3  STO 05    7  STO 06
6  STO 07   1  STO 08   -2  STO 09

CF 01
2  ENTER^
4  ENTER^
1  XEQ "PS3L"  >>>>   -48   RDN  -72   RDN   -183   whence  M'(-48;-72;-183)

SF 01
2  ENTER^
4  ENTER^
1     R/S             >>>>   -97   RDN   -148   RDN   -368    whence  M"(-97;-148;-368)

c) n-Dimensional Space

c-1) Projection ( and Symmetry ) onto ( with respect to ) an Hyperplane.

-The direction of projection is defined by a vector  V(v1;v2;....;vn)

M(x1;...;xn)      V
\            \
\            \
/  ---------\-------------------------------/
/                   \ M'(x'1;...;x'n)                      /
/                                                               /
/-H ---------------------------------------/           The hyperplane (H) is defined by its equation    a1x1 + ......... +  anxn = b
\                                               ( MM' ) // V  and  M' is the midpoint of [MM"]    ( M' belongs to (P) )
\
M"(x"1;...;x"n)

Data Registers:    • R00 = b                        ( Registers R00 thru R2n and Rdd thru Rff  are to be initialized before executing "PSN" )
• R01 = a1      • R02 = a2  ..................  • Rnn = an
• Rn+1 = v1    • Rn+2 = v2  ................  • R2n = vn
• Rbb = x1      • Rbb+1 = x2   ............   • Ree  = xn                                            (  ee - bb = ee' - bb' = n-1 )
and when the program stops:      Rbb' = x'1   ;    Rbb'+1 = x'2   ;............;    Ree'  = x'n      ( These 2 blocks of registers can't overlap )
Flags: F01          CF 01 = projection
SF 01 = symmetry.
Subroutines: /

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

( 112 bytes )

 STACK INPUTS OUTPUTS Y bbb.eee(M) bbb.eee(M) X bbb' bbb.eee(M') L / n

Example:    (H):  x + 2y + 3z + 6t = 10  and  V(2;4;7;-5)    Find the coordinates of M' and M"   if  M(4;7;1;9)

10  STO 00   1  STO 01            2  STO 05         and, for instance:       4  STO 09
2  STO 02            4  STO 06                                          7  STO 10
3  STO 03            7  STO 07                                          1  STO 11
6  STO 04           -5  STO 08                                          9  STO 12        ( control number = 9.012 )

CF 01   9.012  ENTER^
14    XEQ "PSN"  >>>>  14.017   and we recall registers  R14 thru R17 to get   M'(-126;-253;-454;334)

SF 01   9.012  ENTER^
14      R/S             >>>>  14.017   --------------------------------------------   M"(-256;-513;-909;659)

c-2) Projection ( and Symmetry ) onto ( with respect to ) a Line.

-Line (L) passes through  A(a1;a2;.....;an)   and is parallel to a vector   U(u1;u2;....;un)
-The direction of projection is given by a ( vectorial ) hyperplane (H):   a'1x1 + ......... +  a'nxn = 0

A(a1;a2;.....;an)
\
\
\
M(x1;...;xn)-----------M'(x'1;...;x'n)---------M"(x"1;...;x"n)
\
/---------------------\--------------------/
/                                   \                           /
/                                                               /
/-H----------------------------------------/                     ( MM' ) //  (H)  and  MM' = M'M"
\
\ (L)

Data Registers:      R00 unused                        ( Registers R01 thru R3n and Rbb thru Ree  are to be initialized before executing "PSLN" )
• R01 = a1      • R02 = a2  ..................  • Rnn = an
• Rn+1 = u1    • Rn+2 = u2  ................  • R2n = un
• R2n+1 = a'1 • R2n+2 = a'2  .............  • R3n = a'n
• Rbb = x1      • Rbb+1 = x2   ............   • Ree  = xn
and when the program stops:      Rbb' = x'1   ;    Rbb'+1 = x'2   ;............;    Ree'  = x'n      ( These last 2 blocks of registers can't overlap )
Flags: F01          CF 01 = projection
SF 01 = symmetry.
Subroutines: /

01  LBL "PSLN"
02  STO N
03  X<>Y
04  STO M
05  INT
06  CHS
07  LASTX
08  FRC
09   E3
10  *
11  +
12  1
13  +
14  ENTER^
15  STO O
16  ST+ X
17  ST+ Y
18  .1
19  %
20  ST+ Z
21  CLX
22  STO Q
23  RDN
24  LBL 01
25  RCL IND Y
26  RCL IND Y
27  *
28  ST+ Q
29  CLX
30  SIGN
31  -
32  DSE Y
33  GTO 01
34  ST+ X
35  STO P
36  SIGN
37  ST+ P
38  ENTER^
39  CLX
40  LBL 02
41  RCL IND M
42  RCL IND Z
43  -
44  RCL IND P
45  *
46  +
47  ISG Y
48  CLX
49  ISG P
50  CLX
51  ISG M
52  GTO 02
53  RCL Q
54  /
55  RCL O
56  ST- P
57  ST- P
58  PI
59  INT
60  10^X
61  /
62  ISG X
63  LBL 03
64  RCL IND P
65  RCL Z
66  *
67  RCL IND Y
68  +
69  STO IND N
70  CLX
71  SIGN
72  ST+ N
73  ST+ P
74  RDN
75  ISG X
76  GTO 03
77  FC? 01
78  GTO 05
79  RCL O
80  ST- M
81  ST- N
82  LBL 04
83  RCL IND N
84  ST+ X
85  RCL IND M
86  -
87  STO IND N
88  ISG N
89  CLX
90  ISG M
91  GTO 04
92  LBL 05
93  RCL M
94  RCL N
95  ENTER^
96  DSE X
97   E3
98  /
99  +
100  RCL O
101  ST- Z
102  -
103  CLA
104  END

( 168 bytes )

 STACK INPUTS OUTPUTS Y bbb.eee(M) bbb.eee(M) X bbb' bbb.eee(M') L / n

Example:      A(2;8;1;3)  ;  U(2;4;7;-5)  and  (H):  x + 2y + 3z + 6t = 0      Find the coordinates of M' and M"   if  M(4;7;1;9)

2  STO 01            2  STO 05         1  STO 09    and, for instance:       4  STO 13
8  STO 02            4  STO 06         2  STO 10                                     7  STO 14
1  STO 03            7  STO 07         3  STO 11                                     1  STO 15
3  STO 04           -5  STO 08         6  STO 12                                     9  STO 16        ( control number = 13.016 )

CF 01   13.016  ENTER^
17    XEQ "PSLN"  >>>>  17.020   and we recall registers  R17 thru R20 to get   M'(74;152;253;-177)

SF 01   13.016  ENTER^
17        R/S             >>>>  17.020   --------------------------------------------   M"(144;297;505;-363)

3°) Rotation

a) 2-Dimensional Space

-Given  a point  A(xA;yA)  and an angle µ , "ROT2"  calculates  M'(x';y') if we know M(x;y)
-This program works in all angular modes.

M'(x';y')
/
/
/
/  µ
A /-------------- M(x;y)              AM = AM'  and  ( AM;AM' ) = µ

Data Registers:     • R00 = µ        • R01 =  xA   • R02 = yA     ( these registers are to be initialized before executing "ROT2" )
Flags: /
Subroutines: /

01  LBL "ROT2"
02  RCL 01
03  -
04  RCL 00
05  RCL 02
06  R^
07  -
08  P-R
09  RCL 00
10  R^
11  P-R
12  X<> Z
13  -
14  RCL 02
15  +
16  X<> Z
17  +
18  RCL 01
19  +
20  END

( 31 bytes / SIZE 003 )

 STACK INPUTS OUTPUTS Y y y' X x x'

Example:    A(6;7)   µ = 21°   Find  M' if  M(4;3)

21  STO 00   6  STO 01   7  STO 02   Set the HP-41 in DEG mode

3  ENTER^
4  XEQ "ROT2"  >>>>   5.566310945   X<>Y   2.548942395      whence    M'( 5.566310945 ; 2.548942395 )

b) 3-Dimensional Space

-Given  M(x;y;z)  this program computes M'(x';y';z') = r(M)
where  r is the rotation by an angle µ around an axis (L) passing through a point A(xA;yA;zA)  and parallel to a vector  U(a;b;c)

U
|
| A
|
|
|    M'(x';y';z')                                     The vectors  NM and NM'  are both orthogonal to U  and lengths  NM and NM' are equal.
|                                                       The angle ( NM ; NM' ) = µ
|  /  µ
|/-------------- M(x;y;z)
N

Data Registers:    • R00 = µ                                    ( registers R00 to R06 are to be initialized before executing "ROT3" )
• R01 =  xA      • R04 = a
• R02 =  yA      • R05 = b             R07 to R12: temp
• R03 =  zA      • R06 = c
Flags: /
Subroutine: "OPL3"  ( cf  1°) b-2) Orthogonal projection onto a line )

01  LBL "ROT3"
02  STO 07
03  RDN
04  STO 08
05  X<>Y
06  STO 09
07  X<>Y
08  R^
09  XEQ "OPL3"
10  STO 10
11  ST- 07
12  RDN
13  STO 11
14  ST- 08
15  X<>Y
16  STO 12
17  ST- 09
18  RCL 07
19  RCL 00
20  COS
21  *
22  ST+ 10
23  RCL 08
24  LASTX
25  *
26  ST+ 11
27  RCL 09
28  LASTX
29  *
30  ST+ 12
31  RCL 00
32  SIN
33  RCL 04
34  X^2
35  RCL 05
36  X^2
37  RCL 06
38  X^2
39  +
40  +
41  SQRT
42  /
43  RCL 05
44  RCL 09
45  *
46  RCL 06
47  RCL 08
48  *
49  -
50  *
51  ST+ 10
52  CLX
53  RCL 06
54  RCL 07
55  *
56  RCL 04
57  RCL 09
58  *
59  -
60  *
61  ST+ 11
62  CLX
63  RCL 04
64  RCL 08
65  *
66  RCL 05
67  RCL 07
68  *
69  -
70  *
71  RCL 12
72  +
73  RCL 11
74  RCL 10
75  END

( 97 bytes / SIZE 013 )

 STACK INPUTS OUTPUTS Z z z' Y y y' X x x'

Example:     µ = 24°    A(2;3;7)    U(4;6;9)     Find M' = r(M)   if  M(1;4;8)

24  STO 00     2  STO 01      4  STO 04
3  STO 02      6  STO 05
7  STO 03      9  STO 06         Set the HP-41 in DEG mode

8  ENTER^
4  ENTER^
1  XEQ "ROT3"  >>>>  1.009250426   RDN   3.497956694   RDN   8.330584237

whence   M'( 1.009250426 ; 3.497956694 ; 8.330584237 )

c) n-Dimensional Space

-Though the word "rotation" has a more general meaning in n-dimensional spaces, "ROTN" computes  M' = r(M)
where  r is the rotation by an angle µ in the plane (P) defined by a point A(a1;...;an) and 2 non-colinear vectors U(u1;...;un) , V(v1;...;vn)

|
|
|    M'(x'1;...;x'n)                                     The vectors  NM and NM'  are both parallel to the plane  (A;U;V)  and lengths  NM and NM' are equal.
|                                                           The angle ( NM ; NM' ) = µ
|  /  µ
|/-------------- M(x1;...;xn)
N
|
|
|    M'1
|    /
|  /  µ                                                      M1 , M'1 are the orthogonal projections of  M , M' onto (P).
A  |/-------------- M1                                 The vectors U , V , AM1 , AM'1 are in the plane (P)
/   \                                                           The angle ( AM1 ; AM'1 ) = µ
/       \ V
/ U

-The vertical dotted line actually symbolizes the (n-2) dimensional subspace (S) passing through A and orthogonal to (P).
-r may also be called a rotation by an angle µ "around" the subspace (S).

Data Registers:    • R00 = µ                        ( Registers R00 thru R3n and Rbb thru Ree  are to be initialized before executing "ROTN" )
• R01 = a1      • R02 = a2  ..................  • Rnn = an
• Rn+1 = u1    • Rn+2 = u2  ................  • R2n = un
• R2n+1 = v1  • R2n+2 = v2  ..............  • R3n = vn
• Rbb = x1      • Rbb+1 = x2   ............   • Ree  = xn
and when the program stops:      Rbb' = x'1   ;    Rbb'+1 = x'2   ;............;    Ree'  = x'n      ( These last 2 blocks of registers can't overlap )
Flags: /
Subroutines: /

01  LBL "ROTN"
02  X<>Y
03  STO M
04  INT
05  CHS
06  LASTX
07  FRC
08   E3
09  *
10  +
11  STO T
12  +
13   E3
14  /
15  +
16  STO N
17  SIGN
18  +
19  ENTER^
20  ST+ X
21  STO O
22  .1
23  %
24  +
25  +
26  0
27  STO P         ( synthetic )
28  LBL 01
29  RCL IND O
30  X^2
31  ST+ P
32  X<> L
33  RCL IND Z
34  *
35  -
36  DSE O
37  DSE Y
38  GTO 01
39  RCL P
40  ST/ Y
41  CLX
42  STO Q
43  SIGN
44  RCL O
45  +
46  STO O
47  LASTX
48  +
49  LBL 02
50  RCL IND O
51  RCL Z
52  *
53  RCL IND Y
54  +
55  STO IND N
56  X^2
57  ST+ Q
58  SIGN
59  ST+ O
60  +
61  ISG N
62  GTO 02
63  DSE X
64  PI
65  INT
66  /
67  ST- N
68  ST- O
69  RCL N
70  LASTX
71  SIGN
72  X<> Q
73  SQRT
74  LBL 03
75  ST/ IND Y
76  ISG Y
77  GTO 03
78  CLST
79  LBL 04
80  RCL IND M
81  RCL IND Q
82  -
83  RCL IND O
84  X<>Y
85  *
86  ST+ Y
87  X<> L
88  RCL IND N
89  *
90  ST+ Z
91  CLX
92  SIGN
93  ST+ M
94  ST+ O
95  ST+ Q
96  RDN
97  ISG N
98  GTO 04
99  RCL P
100  SQRT
101  /
102  RCL Q
103  DSE X
104  ST- M
105  ST- N
106  ST- O
107  CLX
108  RCL 00
109  X<>Y
110  P-R
111  LASTX
112  -
113  RCL 00
114  R^
115  P-R
116  ST- L
117  X<> L
118  ST- T
119  RDN
120  -
121  RCL P
122  SQRT
123  /
124  LBL 05
125  RCL IND O
126  RCL Y
127  *
128  RCL IND N
129  R^
130  ST* Y
131  RDN
132  +
133  RCL IND M
134  +
135  STO IND N
136  CLX
137  SIGN
138  ST+ M
139  ST+ O
140  RDN
141  ISG N
142  GTO 05
143  RCL M
144  RCL N
145  RCL O
146  DSE X
147  2
148  /
149  ST- Z
150  -
151  CLA
152  END

( 235 bytes )

 STACK INPUTS OUTPUTS Y bbb.eee(M) bbb.eee(M) X bbb' bbb.eee(M') L / n

Example:     µ = 24°    A(1;2;4;7;6)    U(3;1;4;2;5)   V(2;7;3;1;4)        Find M' = r(M)   if  M(4;6;1;2;3)

24  STO 00   1  STO 01             3  STO 06          2  STO 11        and, for instance:     4  STO 16
2  STO 02             1  STO 07          7  STO 12                                      6  STO 17
4  STO 03             4  STO 08          3  STO 13                                      1  STO 18
7  STO 04             2  STO 09          1  STO 14                                      2  STO 19
6  STO 05             5  STO 10          4  STO 15                                      3  STO 20         ( control number = 16.020 )

16.020  ENTER^
21     XEQ "ROTN"   >>>>  ( in 15 seconds )  21.025   and we recall registers R21 to R25 to get:

M'( 3.515304126 ; 4.098798832 ; 0.262179052 ; 1.768429201 ; 2.009053978 )

4°) Examples of a more complex Transformation:  Similarity

-A similarity preserves the ratios of distances:
Tf is a similarity iff , for all points M , N      M'N' = k.MN  where  M' = Tf(M) ; N' = Tf(N) and k is a constant = ratio of magnification.
-In the 3 following examples, Tf is the product of an homothecy h ( homothetic center = the origin O  ;   M1 = h(M)  iff  OM1 = k.OM  ( vectorial identity )  )
and an isometry Is:   Tf = hoIs

a) 2-Dimensional Space

-Here,  k = 3 ( line 09 )
Is = Rot            where R is the reflexion with respect to line (L): ax + by = c
and t is the translation defined by vector U(a';b')              ( a translation consists of a constant offset )

Data Registers:     • R00 = c        • R01 = a    • R02 = b
• R03 = a'    • R04 = b'    ( these 5 registers are to be initialized before executing "PS2" )
Flag: F01
Subroutine:  "OPS2"

01  LBL "SIM2"
02  SF 01
03  XEQ "OPS2"
04  RCL 04
05  ST+ Z
06  CLX
07  RCL 03
08  +
09  3                          the ratio of magnification may of course be stored into any unused data register.
10  ST* Z
11  *
12  END

( 29 bytes / SIZE 005 )

 STACK INPUTS OUTPUTS Y y y' X x x'

Example:    (L): 3x + 4y = 9  U(4;-3)   Calculate  M'  if  M(6;1)

9  STO 00   3  STO 01   4  STO 02   4  STO 03   -3  STO 04

1  ENTER^
6  XEQ "SIM2"   >>>>   20.64   RDN  -18.48    whence   M'(20.64;-18.48)

b) 3-Dimensional Space

-Now,  Tf = hoIs  with  k = 2 ( line 11 ) , Is = rot
where  r is the rotation by an angle µ around an axis (L) passing through a point A(xA;yA;zA)  and parallel to a vector  U(a;b;c)
and t is the translation defined by the same vector U

Data Registers:    • R00 = µ                                    ( registers R00 to R06 are to be initialized before executing "ROT3" )
• R01 =  xA      • R04 = a
• R02 =  yA      • R05 = b             R07 to R12: temp
• R03 =  zA      • R06 = c
Flags: /
Subroutine:  "ROT3"

01  LBL "SIM3"
02  XEQ "ROT3"
03  RCL 06
04  ST+ T
05  CLX
06  RCL 05
07  ST+ Z
08  CLX
09  RCL 04
10  +
11  2                          the ratio of magnification may be stored into any unused data register.
12  ST* T
13  ST* Z
14  *
15  END

( 33 bytes / SIZE 013 )

 STACK INPUTS OUTPUTS Z z z' Y y y' X x x'

Example:    µ = 49°   A(2,3,4)   U(2,4,8)      Compute  M'  if  M(1,4,7)

49  STO 00   2  STO 01      2  STO 04
3  STO 02      4  STO 05
4  STO 03      8  STO 06

7  ENTER^
4  ENTER^
1  XEQ "SIM3"  >>>>   7.772478150   RDN   13.85810556   RDN   30.62782768    whence   M'( 7.772478150 ; 13.85810556 ; 30.62782768 )

c) n-Dimensional Space

-The following program calculates  M'(x'1;...;x'n)  = Tf ( M(x1;...;xn)  )  where  Tf = hotoR  is the product ( composition ) of 3 transformations:

h  is an homothecy  ( ratio = k ; homothetic center = the origin O )
t  is a translation defined by a vector  V(v1;v2;....;vn)
R  is the reflection with respect to an hyperplane  (H):  a1x1 + ......... +  anxn = b

Data Registers:    • R00 = b                        ( Registers R00 thru R2n+1  and  Rbb thru Ree  are to be initialized before executing "SIMN" )
• R01 = a1      • R02 = a2  ..................  • Rnn = an
• Rn+1 = v1    • Rn+2 = v2  ................  • R2n = vn    • R2n+1 = k
• Rbb = x1      • Rbb+1 = x2   ............   • Ree  = xn
and when the program stops:      Rbb' = x'1   ;    Rbb'+1 = x'2   ;............;    Ree'  = x'n      ( These last 2 blocks of registers can't overlap )
Flag: F01
Subroutine: "OPSN"

01  LBL "SIMN"
02  SF 01
03  XEQ "OPSN"
04  LASTX
05  ISG X
06  CLX
07  STO M
08  LASTX
09  +
10  RDN
11  RCL IND T
12  STO T
13  LBL 01
14  CLX
15  RCL IND M
16  ST+ IND Y
17  R^
18  ST* IND Z
19  RDN
20  ISG M
21  CLX
22  ISG Y
23  GTO 01
24  X<> L
25  -
26  CLA
27  END

( 53 bytes )

 STACK INPUTS OUTPUTS Y bbb.eee(M) bbb.eee(M) X bbb' bbb.eee(M') L / n

Example:    (H):  x + 2y + 3z + 6t = 10      V(2;5;2;-3)     k = 4     Find the coordinates of M'   if  M(4;7;1;9)

10  STO 00
1   STO 01   2  STO 02   3  STO 03   6  STO 04
2   STO 05   5  STO 06   2  STO 07  -3  STO 08    4  STO 09

For instance,    4  STO 10   7  STO 11   1  STO 12   9  STO 13    ( control number = 10.013 )
and if we want to get M' in registers  R14 to R17:

10.013  ENTER^
14     XEQ "SIMN"   >>>>   14.017   ( in 6 seconds )   and recalling registers R14 to R17  we find:   M'( 13.6 ; 27.2 ; -19.2 ; -38.4 )

Note:   If registers R2n+1 to R3n are already used by one of the transformations ( for instance: "ROTN" or "PSN" )
you may wish to store k into register R3n+1 instead of R2n+1.
In this case, simply add   LASTX  +   after line 09

-The last 3 programs are only 3 examples among numerous other geometric transformations ...

5°) Transformation >>>> Matrix

a) 2-Dimensional Space

M'(x';y')  may be calculated from M(x;y) by means of linear formulas:

x' = ax + by + c
y' = a'x + b'y + c'

-The following program computes and stores these 6 coefficients in registers R05 thru R10

Data Registers: Those used by the transformation itself which are to be initialized before executing "TM2"

and when the program stops:    R05 = a ; R07 = b ; R09 = c
R06 = a' ; R08 = b' ; R10 = c'      ( R11: temp )

Flags: ?  ( for example: CF 01 for a projection , SF 01 for a reflexion ... )
Subroutines: The transformation itself

01  LBL "TM2"
02  ASTO 11
03  CLST
04  SIGN
05  XEQ IND 11
06  STO 05
07  X<>Y
08  STO 06
09  CLST
10  SIGN
11  X<>Y
12  XEQ IND 11
13  STO 07
14  X<>Y
15  STO 08
16  CLST
17  XEQ IND 11
18  STO 09
19  ST- 05
20  ST- 07
21  X<>Y
22  STO 10
23  ST- 06
24  ST- 08
25  5.01002
26  END

( 48 bytes / SIZE 012 )

Example:    Find the matrix of the projection onto line (L) 2x + 3y = 7 in the direction of the vector U(4;-3)

1°) We store the elements of the transformation into the proper registers:   7  STO 00   2  STO 01   3  STO 02   4  STO 03   -3  STO 04    CF 01 ( projection )
2°) We place the name of the corresponding program in the alpha register:  [alpha] "PS2" [alpha]
3°)  XEQ "TM2" >>>>  5.01002  = the control number of the matrix, and we get

[ [   9      12    -28  ]          in registers      R05    R07   R09          respectively.     Thus:   x' = 9x + 12y -28   defines this projection.
[  -6     -8      21   ] ]                              R06    R08   R10                                            y' = -6x -8y + 21

Note:   Do not use "OPS2A" which requires different inputs.

b) 3-Dimensional Space

M'(x';y';z')  may be calculated from M(x;y;z) by means of linear formulas:

x' = ax + by + cz + d
y' = a'x + b'y + c'z + d'
z' = a"x + b"y + c"z + d"

-The following program computes and stores these 12 coefficients in registers R13 thru R24

Data Registers: Those used by the transformation itself which are to be initialized before executing "TM3"

and when the program stops:    R13 = a ; R16 = b ; R19 = c ; R22 = d
R14 = a' ; R17 = b' ; R20 = c' ; R23 = d'
R15 = a" ; R18 = b" ; R21 = c" ; R24 = d"     ( R25: temp )

Flags: ?  ( for example: CF 01 for a projection , SF 01 for a reflexion ... )
Subroutines: The transformation itself

01  LBL "TM3"
02  ASTO 25
03  CLST
04  SIGN
05  XEQ IND 25
06  STO 13
07  RDN
08  STO 14
09  X<>Y
10  STO 15
11  CLST
12  SIGN
13  X<>Y
14  XEQ IND 25
15  STO 16
16  RDN
17  STO 17
18  X<>Y
19  STO 18
20  CLST
21  SIGN
22  X<> Z
23  XEQ IND 25
24  STO 19
25  RDN
26  STO 20
27  X<>Y
28  STO 21
29  CLST
30  XEQ IND 25
31  STO 22
32  ST- 13
33  ST- 16
34  ST- 19
35  RDN
36  STO 23
37  ST- 14
38  ST- 17
39  ST- 20
40  X<>Y
41  STO 24
42  ST- 15
43  ST- 18
44  ST- 21
45  13.02403
46  END

( 85 bytes / SIZE 026 )

Example:    Find the matrix defining the symmetry with respect to the plane (P) 2x + 3y + 7z = 4 in the direction of the vector U(-2;4;-1)

1°)  4  STO 00   2  STO 01   3  STO 02   7  STO 03   -2  STO 04   4  STO 05   -1  STO 06     SF 01 ( symmetry )
2°)  [alpha] "PS3" [alpha]
3°)  XEQ "TM3"  >>>>  13.02403  = control number of the matrix and we get:

[ [   9    12    28   -16  ]                                       R13   R16   R19   R22                                       x' =   9x + 12y + 28z -16
[ -16  -23  -56    32  ]              in registers         R14   R17   R20   R23      respectively, and        y' = -16x -23y -56z + 32   defines this symmetry.
[   4      6    15    -8   ] ]                                     R15   R18   R21   R24                                       z' =   4x + 6y + 15z -8

c) n-Dimensional Space

-M'(x'1,....,x'n)  may be computed from  M(x1,....,xn)   by the formulas:

x'1 = a11.x1 + a12.x2 + ......... + a1n.xn + b1
x'2 = a21.x1 + a22.x2 + ......... + a2n.xn + b2
.................................................................
x'n = an1.x1 + an2.x2 + ......... + ann.xn + bn

-"TMN" calculates and stores these n(n+1) coefficients into registers  R4n+3 thru Rn2+5n+2 ( in column order )

Data Registers:  R00 thru R3n  are used by the subroutine ( at least most of them , which are to be initialized before executing "TMN" )
R3n+1 = Tf name   R3n+2: temp   ;    R3n+3 to R4n+2 contain successively ( 1,0,....,0 ) .......( 0,......,0,1) ( 0,........,0)

and when the program stops:          R4n+3 = a11  ................... Rn2+3n+3 = a1n      Rn2+4n+3 = b1
.........................................................................................
R5n+2 = an1  ................... Rn2+4n+2 = ann      Rn2+5n+2 = bn
Flags: ?   ( perhaps SF 01 for a reflexion , .... )
Subroutine:   The transformation itself ( "OPSN" "OPSLN" "PSN" "PSLN" "ROTN" ... )

-If you don't have an HP-41CX,
replace line 51 by the 7 instructions:   STO Z   0   LBL 04   STO IND T   ISG T   GTO 04   RDN
and line 25  -------------------     STO Z   0   LBL 00   STO IND T   ISG T   GTO 00   RDN

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

( 122 bytes / SIZE n2+5n+3 )

 STACK INPUTS OUTPUTS X n bbb.eeenn

where  bbb = 4n+3 ;  eee = n2+5n+2  ;  n = the dimension of the space = the number of rows of the matrix.
bbb.eeenn  is the control number of the matrix.

Example:   Tf is the symmetry with respect to (H):  x + 2y + 3z + 6t = 10  parallel to the vector  V(2;4;7;-5)

1°)  10  STO 00    1  STO 01    2  STO 02    3  STO 03    6  STO 04    2  STO 05   4  STO 06    7  STO 07   -5  STO 08
( these numbers are used by "PSN" )
2°)  We place the name of the subroutine in the "alpha" register   [alpha]  PSN  [alpha]
3°)  We set flag F01 ( Tf is a symmetry )   SF 01
3°)  4  XEQ "TMN"  >>>>   24.04304    ( in 36 seconds )   and we get the matrix in registers R24 thru R43:

-3     -8     -12    -24     40                                      R24   R28   R32   R36   R40
-8    -15    -24    -48     80              in registers        R25   R29   R33   R37   R41           respectively.
-14   -28    -41    -84    140                                     R26   R30   R34   R38   R42
10     20     30      61   -100                                     R27   R31   R35   R39   R43

x' = -3x - 8y - 12z - 24t + 40
-Thus, this symmetry may be defined by:          y' = -8x - 15y - 24z - 48t + 80
z' = -14x - 28y - 41z - 84t + 140
t' =  10x + 20y + 30z + 61t - 100

Note:   "TMN" may of course be used with other subroutines than those listed above ( "OPSN" "PSN" ...etc... )
but they must do the same modifications in the stack, i-e:

 STACK INPUTS OUTPUTS Y bbb.eee(M) bbb.eee(M) X bbb' bbb.eee(M') L / n

-However, it doesn't matter if they modify registers R3n+3 to R4n+2
-If you need, say 1, extra register:   R3n+1,   ( for instance to store a ratio of magnification ),  simply replace line 05  by  2
----------------- 2 -------------s:   R3n+1 and R3n+2 , replace line 05 by 3
-If you need n extra registers:  R3n+1 to R4n ( for instance to store the coordinates of a vector defining a translation ), replace line 03 by 4
------------2n -------------:  R3n+1 to R5n, replace line 03 by 5   ... and so on ...

6°) Product ( Composition ) of 2 Transformations

-If 2 mappings Tf1 and Tf2   are defined by their matrices, the following program computes the matrix of the product  Tf1oTf2
-The coefficients of the 1st matrix are to be stored into consecutive registers  in column order  and likewise for the 2nd matrix.

-These 2 arrays are represented by control numbers of the form:  bbb.eeenn1 and  bbb.eeenn2
where  bbb is the first register , eee is the last register of the block and  nn = the number of rows     ( all bbb > 0   ;   eee - bbb + 1 = n(n+1)  )

-You also have to specify the first register of the product:   Rbbb3

Data Registers:   R00: temp    and  the  3n(n+1) registers of the 3 matrices.
Flags:  F10
Subroutines: /

-If you don't want to use register a, replace lines 56 and 40 with the 4 lines   RCL M   FRC   ISG X   INT   and delete line 14

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

( 120 bytes )

 STACK INPUTS OUTPUTS Z bbb.eeenn1 / Y bbb.eeenn2 / X bbb3 bbb.eeenn3

Example1:   Find the matrix of the composition of  s1  defined by  x' = 0.8 x - 0.6 y + 0.4    and  s2  defined by    x' = -0.8 x - 0.6 y - 1.2
y' = -0.6 x - 0.8 y + 1.2                                   y' = -0.6 x + 0.8 y - .4

-Let's store these 12 coefficients, for instance:

[ [  0.8  -0.6   0.4 ]    into  R01   R03   R05     and    [ [ -0.8   -0.6   -1.2 ]    into  R07   R09   R11    respectively.
[ -0.6  -0.8   1.2 ] ]         R02   R04   R06                [ -0.6     0.8   -0.4 ] ]         R08   R10   R12
( control number = 1.00602 )                                       ( control number = 7.01202 )

-Then,       1.00602  ENTER^
7.01202  ENTER^
13      XEQ "COMP" >>>>  13.01803  ( in 9 seconds )  and we get the coefficients of  s1os2  in registers R13 to R18

[ [ -0.28  -0.96  -0.32 ]          in registers     R13  R15  R17     respectively
[  0.96  -0.28    2.24 ] ]                             R14  R16  R18

-Actually,    s1 is the reflexion with respect to (L): x + 3y = 2  and   s2  is the reflexion with respect to  (L'): 3x + y = -2
-Therefore, s1os2  is the rotation r by the angle 2µ around the point A(-1;1)
where µ = 53.1301024° = the angle between (L) and (L') and  A = the point of intersection of (L) and (L') as states a well known theorem.

Example2:    This program may also be used to compute the coordinates of M' = Tf (M)

-For example, if M(2;5) and r is the rotation above ( its coefficients in registers R13 thru R18 )   Let's store  2 and 5 into registers R21 R22 respectively and:

13.01802  ENTER^
21.02202  ENTER^
25        XEQ "COMP"  >>>>  25.02602    and we find in registers R25 and R26    M'( -5.68 ; 2.76 )

-Remark that the control number of M  must be  21.02202 and not  21.022   ( bbb.eeenn and not bbb.eee  )

-In general, this product is not commutative.

7°) Reciprocal of a Transformation

-  Tf is defined by the formulas:       x'1 = a11.x1 + a12.x2 + ......... + a1n.xn + b1
x'2 = a21.x1 + a22.x2 + ......... + a2n.xn + b2
.................................................................
x'n = an1.x1 + an2.x2 + ......... + ann.xn + bn

-"INVTF" computes a'i,j and  b'i  with   x1 = a'11.x'1 + a'12.x'2 + ......... + a'1n.x'n + b'1     i-e the coefficients of   Tf -1
x2 = a'21.x'1 + a'22.x'2 + ......... + a'2n.x'n + b'2
.................................................................
xn = a'n1.x'1 + a'n2.x'2 + ......... + a'nn.x'n + b'n

Data Registers:        R00: temp       ( Registers R01 thru Rn2+n  are to be initialized before executing "INVTF" )
•  R01 = a1,1      •  Rn+1 = a1,2   .......................................   •  Rn2-n+1 = a1,n  •  Rn2+1 = b1
•  R02 = a2,1      •  Rn+2 = a2,2   .......................................   •  Rn2-n+2 = a2,n  •  Rn2+2 = b2
.....................................................................................................................................
•  Rnn = an,1      •  R2n  =  an,2   ........................................   •  Rn2 = an,n         •  Rn2+n = bn

and when the program stops,  R00 = det A  and  R01 thru Rn2+n  contain the coefficients of the reciprocal ( in column order )
( Rn2+n+1 to R2n2+n are used for temporary data storage: in fact a'i,j are also stored in these registers )

Flag:  ( F01 )
Subroutine:  "LS"  ( cf "Linear and non-linear systems for the HP-41" )

01  LBL "INVTF"
02  ENTER^
03  X^2
04  ENTER^
05  ST+ X
06  LASTX
07  ST+ Z
08  +
09   E3
10  /
11  +
12  ISG X
13  CLRGX          If you don't have an HP-41CX,  replace line 13 by   0   LBL 00   STO IND Y   ISG Y   GTO 00   CLX   RCL Z   X^2   -   ( 9 lines )
14  X<>Y
15  1
16  +
17   E5
18  /
19  +
20  SIGN
21  LBL 01
22  STO IND L
23  ISG L
24  GTO 01
25  LASTX
26  FRC
27   E-5
28  -
29  1
30  +
31   E-7
32  XEQ "LS"
33  LASTX
34  FRC
35  ENTER^
36  ISG X
37  INT
38  STO Z
39  X^2
40  X<>Y
41   E3
42  *
43  INT
44  LBL 02
45  RCL IND X
46  STO IND Z
47  RDN
48  DSE X
49  DSE Y
50  GTO 02
51  1
52  CHS
53  LBL 03
54  ST* IND Y
55  DSE Y
56  DSE T
57  GTO 03
58  END

( 96 bytes / SIZE 2n2+n+1 )

 STACK INPUTS OUTPUTS X n -1

x' = x + y + z + 4
Example:      Tf is defined by     y' = x + 2y +3z + 1       Find  the reciprocal transformation.
z' = x + 3y + 6z + 8

1   1   1   4                               R01   R04   R07   R10
-Store      1   2   3   1       into registers     R02   R05   R08   R11      respectively
1   3   6   8                               R03   R06   R09   R12

3   -3   1  -17
-Then    3  XEQ "INVTF"   >>>>  ( 28 seconds )  -1   and we get    -3   5  -2   23    in the same registers   ( and R00 = det A = 1 )
1  -2   1   -10
x =  3x' - 3y + z - 17
-Thus,       y = -3x' + 5y' -2z' + 23   define  the reciprocal.
z =   x' - 2y' + z' - 10

Notes:   -Meaningless results will be obtained if the matrix A = [ ai,j ]  has no inverse ( check that  det A is significantly different from 0 in register R00 )
-We must have n < 13.

8°) A Few Tests

a) Projection ? Symmetry ?

-Let  Tf  defined by the formulas:       x'1 = a11.x1 + a12.x2 + ......... + a1n.xn + b1
x'2 = a21.x1 + a22.x2 + ......... + a2n.xn + b2
.................................................................
x'n = an1.x1 + an2.x2 + ......... + ann.xn + bn

-"PS?" tests if this transformation is a projection or a symmetry

Data Registers:        R00: temp       ( Registers R01 thru Rn2+n  are to be initialized before executing "PS?" )
•  R01 = a1,1      •  Rn+1 = a1,2   .......................................   •  Rn2-n+1 = a1,n  •  Rn2+1 = b1
•  R02 = a2,1      •  Rn+2 = a2,2   .......................................   •  Rn2-n+2 = a2,n  •  Rn2+2 = b2
.....................................................................................................................................
•  Rnn = an,1      •  R2n  =  an,2   ........................................   •  Rn2 = an,n         •  Rn2+n = bn
Flags:  F00 and F03:    If flag F00 is still set when the program stops, Tf is a projection or a constant mapping.
If flag F03 --------------------------------- , Tf is a symmetry.
Subroutines:  /

-If you don't want to use register a, replace lines 78 , 55 and 20 with the 5 lines   RCL M   FRC   ISG X   CLX   INT   and delete line 06

01  LBL "PS?"
02  SF 00
03  SF 03
04  ENTER^
05  STO O
06  STO a
07  X^2
08  LASTX
09   E5
10  /
11  +
12  STO M
13  +
14  STO N
15  INT
16  STO 00
17  LBL 01
18  CLX
19  STO P         ( synthetic )
20  RCL a
21  X^2
22  RCL 00
23  X<=Y?
24  GTO 01
25  RCL IND 00
26  STO P        ( synthetic )
27  LBL 01
28  RCL M
29  RCL N
30  LBL 02
31  RCL IND Y
32  RCL IND Y
33  *
34  ST+ P
35  CLX
36  SIGN
37  -
38  DSE Y
39  GTO 02
40  X<> P
41  RCL IND 00
42  RCL Y
43  -
44  ABS
45   E-7            ( or another "small" number )
46  X<=Y?
47  CF 00
48  X<> Z
49  RCL 00
50  1
51  ST- M
52  -
53  ENTER^
54  STO 00
55  RCL a
56  ST/ Z
57  MOD
58  X<>Y
59  INT
60  -
61  ABS
62  CHS
63  X=0?
64  SIGN
65  X<0?
66  CLX
67  -
68  ABS
69   E-7              ( or another "small" number )
70  X<=Y?
71  CF 03
72  FC? 00
73  FS? 03
74  X<0?
75  GTO 03
76  DSE O
77  GTO 01
78  RCL a
79  STO O
80  ST+ M
81  DSE N
82  GTO 01
83  LBL 03
84  CLA
85  END

( 135 bytes / SIZE n2+n+1 )

 STACK INPUTS OUTPUTS X n /

Example1:   A mapping is given by   x' = 9x + 12y + 28z -16
y' = -16x -23y -56z +32
z' = 4x + 6y +15z - 8

9    12     28   -16                              R01   R04   R07   R10
-We store      -16   -23   -56    32      into registers     R02   R05   R08   R11      respectively
4      6      15    -8                              R03   R06   R09   R12

-Then      3  XEQ "PS?"   >>>>   28 seconds later,  flag F00 is clear and flag F03  is set:   the transformation is a symmetry but not a projection.

Example2:    If  x' = 9x + 12y -28            we store         9   12   -28        into        R01   R03   R05      respectively
y' = -6x - 8y + 21                                -6   -8     21                     R02   R04   R06

and      2   XEQ "PS?"  >>>>  13   seconds later,   flag F00 is set and flag F03  is clear:   the transformation is projection but not a symmetry.

-If Flags F00 and F03 are clear, the mapping is neither a projection nor a symmetry.
-If both flags are set, the mapping = Identity.
-Actually, this program computes the elements of  TfoTf:
If  TfoTf = Id  we have a symmetry
If  TfoTf = Tf  we have a projection or a constant.
-This program can test up to a  17x18 matrix.

b) Isometry ?

-Let  Tf  defined by the formulas:       x'1 = a11.x1 + a12.x2 + ......... + a1n.xn + b1
x'2 = a21.x1 + a22.x2 + ......... + a2n.xn + b2
.................................................................
x'n = an1.x1 + an2.x2 + ......... + ann.xn + bn

-"PS?" tests if this transformation is an isometry (  i-e  if it preserves the distances )

Data Registers:        R00: temp       ( Registers R01 thru Rn2  are to be initialized before executing "ISO?" )  Registers Rn2+1 to Rn2+n are actually unused.
•  R01 = a1,1      •  Rn+1 = a1,2   .......................................   •  Rn2-n+1 = a1,n  •  Rn2+1 = b1
•  R02 = a2,1      •  Rn+2 = a2,2   .......................................   •  Rn2-n+2 = a2,n  •  Rn2+2 = b2
.....................................................................................................................................
•  Rnn = an,1      •  R2n  =  an,2   ........................................   •  Rn2 = an,n         •  Rn2+n = bn
Flags:  F02:    If flag F02 is still set when the program stops, Tf is an isometry.
Subroutines:  /

-If you don't want to use register a, replace lines 55 and 34 with the 5 lines   RCL M   FRC   ISG X   CLX   INT   and delete line 04

01  LBL "ISO?"
02  SF 02
03  STO O
04  STO a
05  X^2
06  STO 00
07  LASTX
08   E5
09  /
10  +
11  STO M
12  STO N
13  LBL 01
14  CLX
15  STO P           ( synthetic )
16  RCL M
17  RCL N
18  LBL 02
19  RCL IND Y
20  RCL IND Y
21  *
22  ST+ P
23  DSE Y
24  RDN
25  DSE Y
26  GTO 02
27  X<> P
28  RCL 00
29  1
30  ST- M
31  -
32  ENTER^
33  STO 00
34  RCL a
35  ST/ Z
36  MOD
37  X<>Y
38  INT
39  -
40  ABS
41  CHS
42  X=0?
43  SIGN
44  X<0?
45  CLX
46  -
47  ABS
48   E-7
49  X<=Y?
50  CF 02
51  X<=Y?
52  GTO 03
53  DSE O
54  GTO 01
55  RCL a
56  STO O
57  ST+ M
58  SIGN
59  ST- N
60  RCL 00
61  X#0?
62  GTO 01
63  LBL 03
64  CLA
65  END

( 104 bytes / SIZE n2+1 )

 STACK INPUTS OUTPUTS X n /

Example:     A mapping is given by   x' = 0.8.x - 0.6.y +1    we store   0.8  -0.6    1    into registers   R01  R03  R05    ( in fact, registers R05 & R06 are unused )
y' = 0.6.x + 0.8.y +2                   0.6    0.8    2                          R02  R04  R06

-Then      2  XEQ "ISO?"   >>>>  6 seconds later, Flag F02 is still set:  we have an isometry ( actually a rotation )

-This program works up to n = 17.

c) Similarity ?

-Let  Tf  defined by the formulas:       x'1 = a11.x1 + a12.x2 + ......... + a1n.xn + b1
x'2 = a21.x1 + a22.x2 + ......... + a2n.xn + b2
.................................................................
x'n = an1.x1 + an2.x2 + ......... + ann.xn + bn

-"SIM?" tests if this transformation is a similarity (  i-e  if it preserves the ratios of distances )

Data Registers:        R00: temp       ( Registers R01 thru Rn2  are to be initialized before executing "SIM?" )    Registers Rn2+1 to Rn2+n are actually unused.
•  R01 = a1,1      •  Rn+1 = a1,2   .......................................   •  Rn2-n+1 = a1,n  •  Rn2+1 = b1
•  R02 = a2,1      •  Rn+2 = a2,2   .......................................   •  Rn2-n+2 = a2,n  •  Rn2+2 = b2
.....................................................................................................................................
•  Rnn = an,1      •  R2n  =  an,2   ........................................   •  Rn2 = an,n         •  Rn2+n = bn
Flags:  F02:    If flag F02 is still set when the program stops, Tf is a similarity.
Subroutines:  /

-If you don't want to use register a, replace lines 41 and 13 with the 5 lines   RCL M   FRC   ISG X   CLX   INT   and delete line 04

01  LBL "SIM?"
02  SF 02
03  STO O
04  STO a
05  X^2
06  STO 00
07  LASTX
08   E5
09  /
10  +
11  STO M
12  STO N
13   E99
14  STO P     ( synthetic )
15  CHS
16  STO Q
17  LBL 01
18  RCL M
19  RCL N
20  ENTER^
21  CLX
22  LBL 02
23  RCL IND Z
24  SIGN
25  CLX
26  RCL IND Z
27  ST* L
28  X<> L
29  DSE Z
30  +
31  DSE Z
32  GTO 02
33  +
34  RCL 00
35  ENTER^
36  SIGN
37  ST- M
38  -
39  ENTER^
40  STO 00
41  RCL a
42  ST/ Z
43  MOD
44  X<>Y
45  INT
46  X=Y?
47  GTO 03
48  R^
49  ABS
50  PI                     ( lines 50 to 53 computes a "small" number without any digit entry line: this would disrupt status register P )
51  CHS
52  10^X
53  X^2
54  X<Y?
55  CF 02
56  X<Y?
57  GTO 05
58  GTO 04
59  LBL 03
60  X<> P
61  R^
62  X>Y?
63  X<>Y
64  STO P        ( synthetic )
65  X<> Q
66  R^
67  X<Y?
68  X<>Y
69  STO Q
70  LBL 04
71  DSE O
72  GTO 01
73  RCL a
74  STO O
75  ST+ M
76  SIGN
77  ST- N
78  RCL 00
79  X#0?
80  GTO 01
81  RCL Q
82  RCL P
83  RCL Y
84  RCL Y
85  -
86  5 E-7          ( or another "small" number )
87  X<Y?
88  CF 02
89  R^
90  R^
91  +
92  2
93  /
94  SQRT
95  LBL 05
96  CLA
97  END

( 151 bytes / SIZE n2+1 )

 STACK INPUTS OUTPUTS X n k

where k = the ratio of magnification  ( if Flag F02 is still set at the end )

Example:     Tf   is given by   x' =   7.68.x - 6.4.y - 0.24.z + 9.28
y' = -4.24.x - 4.8.y - 7.68.z - 3.04
z' =  -4.8.x   - 6.y  +  6.4.z  + 19.2

7.68    -6.4     -0.24     9.28                              R01   R04   R07   R10
-We store        -4.24    -4.8     -7.68   -3.04      into registers     R02   R05   R08   R11      respectively     ( Registers R10 to R12 are actually unused )
-4.8      -6         6.4      19.2                              R03   R06   R09   R12

3  XEQ "SIM?"   >>>>  10  ( execution time = 19 seconds ),  Flag F02 is still set:   Tf is a similarity and the ratio of magnification k = 10

-This program may also be used to test an isometry by comparing  k  with  1  ( if flag F02 is set )
-Up to 17x18 matrices can be dealt with.

9°) Matrix >>>> Transformation

a) 2-Dimensional Space

-"MT2"  gives the specifications of a transformation Tf defined by the following formulas

x' = ax + by + c
y' = a'x + b'y + c'

-This program finds the projections, symmetries and isometries.

Data Registers:        • R01 = a    • R03 = b   • R05 = c                    ( these 6 registers are to be initialized before executing "MT2" )
• R02 = a'   • R04 = b'   • R06 = c'
R00 and R07 to R19: temp
when the program stops,  R00 thru R04 contain the required data
Flags:  F00 F01 F02 F03 F10
Subroutines:  PS?   ISO?   COMP  and  LS  ( cf "linear and non-linear systems for the HP-41" )

Note:   If you don't have an X-Functions Module, you may, for instance,
replace all the REGMOVEs by  XEQ 14 and add the 21 following instructions after line 154

RTN
LBL 14
INT
LASTX
FRC
E3
*
INT
ST- L
E3
ST* L
LBL 15
CLX
RCL IND Z
STO IND Y
ISG Y
CLX
ISG Z
CLX
DSE L
GTO 15

( This alternative is not necessarily the best! )

01  LBL "MT2"
02  14.001006
03  STO 12
04  7.000005
05  STO 13
06  1.014006
07  REGMOVE
08  2
09  XEQ "PS?"
10  FS? 00
11  FC? 03
12  GTO 00
13  "ID"
14  PROMPT
15  LBL 00
16  CF 01
17  2
18  XEQ "ISO?"
19  FS? 02
20  GTO 01
21  FC? 00
22  FS? 03
23  GTO 00
25  PROMPT
26  LBL 00
27  XEQ 03
28  XEQ 06
29  RCL 12
30  REGMOVE
31  CLX
32  FS? 03
33  SIGN
34  ST+ 01
35  ST+ 04
36  SIGN
37  CHS
38  XEQ 04
39  RCL 01
40  RCL 04
41  +
42  X=0?
43  1/X
44  RCL 03
45  CHS
46  STO 10
47  1
48  STO 11
49  RCL 04
50  X=0?
51  GTO 00
52  STO 10
53  CLX
54  STO 11
55  LBL 00
56  RCL 13
57  REGMOVE
58  "PROJ"
59  FS? 03
60  "SYM"
61  "~/L//V"             ( append / L // V )
62  PROMPT
63  LBL 01
64  XEQ 03
65  RCL 01
66  RCL 04
67  +
68  GTO IND X
69  LBL 00
70  RCL 19
71  STO 02
72  RCL 18
73  STO 01
74  "TRANS"
75  PROMPT
76  LBL 01
77  14.01902
78  STO Y
79  6
80  XEQ "COMP"
81  RCL 12
82  REGMOVE
83  2
84  ST/ 10
85  ST/ 11
86  RCL 10
87  ST- 05
88  RCL 11
89  ST- 06
90  XEQ 03
91  XEQ 06
92  RCL 13
93  REGMOVE
94  "REFL/L"
95  FC? 03
96  "~*TRANS"                ( append *TRANS )
97  PROMPT
98  LBL 02
99  RCL 06
100  STO 02
101  RCL 05
102  STO 01
103  RCL 15
104  RCL 14
105  R-P
106  RDN
107  STO 00
108  "ROT"
109  PROMPT
110  LBL 03
111  1
112  CHS
113  ST+ 01
114  ST+ 04
115  LBL 04
116  ST* 05
117  ST* 06
118  1.00602
119   E-7
120  XEQ "LS"
121  6
122  LBL 05
123  RCL IND X
124  ABS
125   E-7                   ( or another "small" number )
126  X<=Y?
127  GTO 00
128  CLX
129  STO IND Z
130  LBL 00
131  X<> Z
132  DSE X
133  GTO 05
134  RTN
135  LBL 06
136  RCL 05
137  STO 07
138  RCL 01
139  STO 08
140  RCL 03
141  STO 09
142  RCL 04
143  X=0?
144  RTN
145  RCL 06
146  STO 07
147  CLX
148  STO 08
149  SIGN
150  STO 09
151  END

( 314 bytes / SIZE 020 )

Example1:     Tf  is defined by    x' = 9x + 12y -28       we store    9   12   -28     into registers     R01   R03   R05      respectively
y' = -6x - 8y + 21                       -6  -8     21                             R02   R04   R06

XEQ "MT2"  >>>>   ( in 35 seconds )    "PROJ/L//V"   meaning we have a projection onto a line (L) in the direction of a vector V

with (L):  1 x + 1.5 y = 3.5   the coefficients  1   1.5   3.5   in registers  R01   R02   R00  respectively
and  V( -4/3 ; 1 )  in registers  R03  R04  respectively

Example2:     x' = 17x + 24y - 56         we store    17   24   -56    into    R01  R03  R05    respectively
y' = -12x - 17y + 42                        -12  -17   42              R02  R04  R06

XEQ "MT2"  >>>>  ( 35 seconds )   "SYM/L//V"   Tf is a symmetry with respect to line (L) in the direction of vector V

with (L):  1 x + 1.5 y = 3.5   the coefficients  1   1.5   3.5   in registers  R01   R02   R00  respectively
and  V( -4/3 ; 1 )  in registers  R03  R04  respectively

Example3:    x' = 0.28x - 0.96y + 2.16     these 6 coefficients are stored into R01 to R06  ( in column order )
y' = -0.96x -0.28y + 2.88

XEQ "MT2"  >>>>  ( 51 seconds )    "REFL/L"     Tf is a reflexion with respect to line (L):  1 x + 4/3 y = 3   ( in registers R01  R02  R00 respectively )

Example4:    x' = 0.28x - 0.96y - 1.84     these 6 coefficients are stored into R01 to R06  ( in column order )
y' = -0.96x -0.28y + 5.88

XEQ "MT2"  >>>>  ( 41 seconds )   "REFL/L*TRANS" Tf is the product of a reflexion / a line (L) and a translation defined by U parallel to (L)

(L): 1 x + 4/3 y = 3  ( in R01  R02  R00 )    and  U( -4 ; 3 )  in registers R03  R04

Example5:     x' = 0.8x - 0.6y + 2.2     we store these 6 numbers in R01 to R06
y' = 0.6x + 0.8y - 0.6

XEQ "MT2"  >>>>   ( 24 seconds )   "ROT"    Tf is a rotation by an angle µ around a point A    µ is in R00 and the coordinates of A in R01 and R02

Here,   µ = 36.86989765  and  A( 2 ; 3 )

Example6:     x' = x + 3    we store     1   0   3     into   R01 thru R06
y' = y + 7                       0   1   7

XEQ "MT2"  >>>>  ( 17 seconds )     "TRANS"    Tf is a translation defined by a vector U    Here  U(3;7)  is registers  R01 and R02

-Likewise, with    x' = x      and      1   0   0      in R01 to R06     XEQ "MT2"  displays  "ID"  in 14 seconds but these transformations are trivial!
y' = y                  0   1   0

Example7:     x' = 2x + 3y + 1     in this case, the HP-41 displays "TF NOT FOUND"  after 7 seconds:  Tf is neither a symmetry nor a projection nor an isometry!
y' = 3x + 4y + 7

Remarks:  -Examples 3 to 6 illustrate all the possible isometries in a 2-dimensional Euclidean space.
-A central symmetry is equivalent to a rotation by 180°
-The HP-41 displays "DATA ERROR" ( line 43 )  if Tf is constant ( a = b = a' = b' = 0 ).
-You may also replace line 42-43 with  X#0?  GTO 00  RCL 19  STO 02  RCL 18  STO 01  "CST"  PROMPT  LBL 00
-Every similarity can be expressed as the product of an homothecy ( arbitrary center, hereafter we choose the origin O ) and an isometry.
Therefore, we can use "SIM?"  first and then "MT2" if a similarity has been found.

For instance:    x' =  2.8x - 9.6y - 18.4      1°)   Store these 6 numbers into R01 to R06
y' = -9.6x - 2.8y + 58.8     2°)   2  XEQ "SIM?"  >>>>  Flag F02 is still set at the end and we have k = 10 ( ratio of magnification )
3°)  Divide the contents of registers R01 to R06 by k  ( ST/ 01  ST/ 02  ST/ 03  ST/ 04  ST/ 05  ST/ 06 )
4°)  XEQ "MT2"  >>>>  we find the results of example 4 above

-Thus this transformation is the product of 3 transformations:    Tf = hosot
where  h is an homothecy ( homothetic center = the origin O ; ratio of magnification = 10 )
s is the reflexion with respect to (L): x + 4/3 y = 3
t is the translation defined by the vector U(-4;3)

-It's not difficult to modify "MT2" to take all similarities into account, but it costs several bytes:
-Change line 18 by XEQ "SIM?" , add  ST/ 01  ST/ 02  ST/ 03  ST/ 04  ST/ 05  ST/ 06
ST/ 14  ST/ 15  ST/ 16  ST/ 17  ST/ 18  ST/ 19  STO 20  2  XEQ "PS?"  after line 63 ,
and modify the text lines if  k is different from 1.

b) 3-Dimensional Space

-"MT3"  determines the characteristics of a transformation Tf defined by the formulas

x' = ax + by + cz + d
y' = a'x + b'y + c'z + d'
z' = a"x + b"y + c"z + d"

-This program identifies the projections, symmetries and isometries.

Data Registers:        • R01 = a    • R04 = b   • R07 = c     • R10 = d             ( these 12 registers are to be initialized before executing "MT3" )
• R02 = a'   • R05 = b'   • R08 = c'    • R11 = d'
• R03 = a"   • R06 = b"  • R09 = c"    • R12 = d"
R00 and R13 to R37: temp
when the program stops,  R00 thru R09 contain the solution.
Flags:  F00 F01 F02 F03 F06 F07 F10
Subroutines:  PS?   ISO?   COMP  and  LS  ( cf "linear and non-linear systems for the HP-41" )

Note:   If you don't have an X-Functions Module, you may, for instance,
replace all the REGMOVEs by  XEQ 14 and add the 21 following instructions after line 358

RTN
LBL 14
INT
LASTX
FRC
E3
*
INT
ST- L
E3
ST* L
LBL 15
CLX
RCL IND Z
STO IND Y
ISG Y
CLX
ISG Z
CLX
DSE L
GTO 15

-The "append" character is replaced by  ~  in this listing.

01  LBL "MT3"
02  23.001012
03  STO 35
04  13.00001
05  STO 36
06  23.03403
07  STO 37
08  1.023012
09  REGMOVE
10  3
11  XEQ "PS?"
12  FS? 00
13  FC? 03
14  GTO 00
15  "ID"
16  PROMPT
17  LBL 00
18  CF 01
19  3
20  XEQ "ISO?"
21  FS? 02
22  GTO 01
23  FC? 00
24  FS? 03
25  GTO 00
27  PROMPT
28  LBL 00
29  XEQ 07
30  SF 07
31  2
32  RCL 01
33  RCL 05
34  RCL 09
35  +
36  +
37  X>Y?
38  ACOS                             If Tf is a constant mapping ( a = a' = a" = b = b' = b" = c = c' = c" = 0 ), the HP-41 displays "DATA ERROR"  ( line 38 )
39  X=Y?                              Lines 37-38 may be replaced by
40  CF 07                              X<=Y?  GTO 00  RCL 34  STO 03  RCL 33  STO 02  RCL 32  STO 01  "CST"  PROMPT  LBL 00
41  X=Y?                              but is it really worthwhile?
42  XEQ 05
43  FC? 07
44  XEQ 06
45  FS? 07
46  XEQ 04
47  RCL 35
48  REGMOVE
49  CLX
50  FS? 03
51  SIGN
52  ST+ 01
53  ST+ 05
54  ST+ 09
55  SIGN
56  CHS
57  XEQ 08
58  FS? 07
59  XEQ 06
60  FS? 07
61  GTO 00
62  RCL 07
63  STO 22
64  RCL 04
65  STO 21
66  RCL 01
67  STO 20
68  X#0?
69  GTO 00
70  SIGN
71  STO 21
72  RCL 08
73  STO 22
74  RCL 05
75  X#0?
76  GTO 00
77  STO 21
78  SIGN
79  STO 22
80  LBL 00
81  RCL 36
82  REGMOVE
83  "PROJ"
84  FS? 03
85  "SYM"
86  FS? 07
87  "~/P//V"
88  FC?C 07
89  "~/L//P"
90  PROMPT
91  LBL 01
92  XEQ 07
93  RCL 01
94  RCL 05
95  RCL 09
96  +
97  +
98  GTO IND X
99  LBL 00
100  RCL 34
101  STO 03
102  RCL 33
103  STO 02
104  RCL 32
105  STO 01
106  "TRANS"
107  PROMPT
108  LBL 01
109  RCL 37
110  STO Y
111  8
112  XEQ "COMP"
113  RCL 35
114  REGMOVE
115  2
116  ST/ 17
117  ST/.18
118  ST/ 19
119  RCL 17
120  ST- 10
121  RCL 18
122  ST- 11
123  RCL 19
124  ST- 12
125  XEQ 07
126  XEQ 04
127  RCL 36
128  REGMOVE
129  "REFL/P"
130  FC? 03
131  "~*TRANS"
132  PROMPT
133  LBL 02
134  XEQ 06
135  RCL 35
136  REGMOVE
137  RCL 10
138  RCL 17
139  *
140  RCL 11
141  RCL 18
142  *
143  +
144  RCL 12
145  RCL 19
146  *
147  +
148  RCL 17
149  STO 20
150  X^2
151  RCL 18
152  STO 21
153  X^2
154  RCL 19
155  STO 22
156  X^2
157  +
158  +
159  /
160  ST* 20
161  ST* 21
162  ST* 22
163  RCL 20
164  ST- 10
165  RCL 21
166  ST- 11
167  RCL 22
168  ST- 12
169  XEQ 07
170  XEQ 05
171  CF 06
172  LBL 10
173  RCL 36
174  REGMOVE
175  CLX
176  STO 10
177  RCL 04
178  X=0?
179  ISG 10
180  CLX
181  RCL 10
182  RCL 24
183  *
184  RCL 30
185  +
186  STO 12
187  RCL 06
188  *
189  RCL 10
190  RCL 25
191  *
192  RCL 31
193  STO 14
194  +
195  RCL 05
196  *
197  -
198  RCL 10
199  ST* Y
200  RCL 23
201  ST+ 14
202  *
203  RCL 29
204  +
205  RCL 05
206  *
207  RCL 04
208  RCL 12
209  *
210  -
211  +
212  SIGN
213  RCL 14
214  RCL 27
215  +
216  1
217  FS? 06
218  CHS
219  -
220  2
221  /
222  ACOS
223  *
224  STO 00
225  FS?C 06
226  RTN
227  RCL 07
228  ABS
229  RCL 08
230  ABS
231  RCL 09
232  ABS
233  +
234  +
235   E-7
236  "ROT"
237  X<=Y?
238  "~*TRANS"
239  PROMPT
240  LBL 03
241  XEQ 05
242  FC? 03
243  GTO 00
244  RCL 36
245  REGMOVE
246  "CENTR SYM"
247  PROMPT
248  LBL 00
249  RCL 37
250  STO Y
251  1
252  XEQ "COMP"
253  XEQ 07
254  XEQ 06
255  SF 06
256  XEQ 10
257  RCL 01
258  RCL 04
259  *
260  RCL 02
261  RCL 05
262  *
263  +
264  RCL 03
265  RCL 06
266  *
267  +
268  STO 07
269  "ROT*REFL/P"
270  PROMPT
271  LBL 04
272  RCL 10
273  STO 13
274  RCL 07
275  STO 16
276  RCL 04
277  STO 15
278  RCL 01
279  STO 14
280  X#0?
281  RTN
282  SIGN
283  STO 15
284  RCL 08
285  STO 16
286  RCL 11
287  STO 13
288  RCL 05
289  X#0?
290  RTN
291  STO 15
292  SIGN
293  STO 16
294  RCL 12
295  STO 13
296  RTN
297  LBL 05
298  RCL 10
299  STO 14
300  RCL 11
301  STO 15
302  RCL 12
303  STO 16
304  RTN
305  LBL 06
306  RCL 07
307  STO 17
308  RCL 08
309  STO 18
310  1
311  CHS
312  STO 19
313  RCL 09
314  X=0?
315  RTN
316  STO 17
317  CLX
318  STO 18
319  STO 19
320  RCL 01
321  X=0?
322  RTN
323  STO 18
324  RCL 04
325  CHS
326  STO 17
327  RTN
328  LBL 07
329  1
330  CHS
331  ST+ 01
332  ST+ 05
333  ST+ 09
334  LBL 08
335  ST* 10
336  ST* 11
337  ST* 12
338  1.01203
339   E-7
340  XEQ "LS"
341  12
342  LBL 09
343  RCL IND X
344  ABS
345   E-7
346  X<=Y?
347  GTO 00
348  CLX
349  STO IND Z
350  LBL 00
351  X<> Z
352  DSE X
353  GTO 09
354  END

( 665 bytes / SIZE 038 )

a    b    c    d                                                       R01  R04  R07  R10
-In the following examples, the matrix  M =  a'   b'   c'   d'   is given and it is to be stored into   R02  R05  R08  R11   respectively before executing "MT3".
a"  b"   c"  d"                                                       R03  R06  R09  R12

-The numbers  a , a' , b , b' , ... etc ... in the solutions are of course different from the initial coefficients

-11  -18  -42  24
Example1:   M =  -2    -2    -7    4     XEQ "MT3"  >>>>  "PROJ/P//V"  ( 68 seconds )  Tf is a projection onto a plane (P) in the direction of vector V
4     6    15  -8

(P): ax + by + cz = d     with  a , b , c , d  in registers  R01  R02  R03  R00   respectively
and  V( a',b',c')                    with  a' , b' , c'     ----------   R04  R05  R06           ------------

-In this example:   (P): x + 1.5 y + 3.5 z = 2         ( or if you prefer:   2x + 3y + 7z = 4 )
and    V(3;1/2;-1)                             ( --------------:    V'(6;1;-2) )

-23  -36  -84   48
Example2:   M =  -4    -5   -14    8     XEQ "MT3"  >>>>  "SYM/P//V"  ( 68s )  Tf is a symmetry with respect to a plane (P) in the direction of vector V
8    12    29  -16

(P): ax + by + cz = d     with  a , b , c , d  in registers  R01  R02  R03  R00   respectively
and  V( a',b',c')                    with  a' , b' , c'     ----------   R04  R05  R06           ------------

-In this example:   (P): x + 1.5 y + 3.5 z = 2         ( or if you prefer:   2x + 3y + 7z = 4 )
and    V(3;1/2;-1)                             ( --------------:    V'(6;1;-2) )

12   2  -4   -46
Example3:   M =  18   3   -6   -74     XEQ "MT3"  >>>>  "PROJ/L//P" ( 70s )    Tf is a projection onto a line (L) in the direction of a vectorial plane (P)
42   7 -14  -175

(L) is determined by one point  A(xA,yA,zA)  in registers R01 R02 R03  and one vector U(a,b,c)  in registers  R04 R05 R06
(P) is given by one of its equations:  a'x + b'y + c'z = 0  where  a' , b' , c'  are in R07 R08 R09

-Here,     A(4,1,0)    U(-2/7,-3/7,-1)       ( or if you prefer:  U'(2,3,7) )
and    (P): x +y/6 - z/3 = 0                    or 6x + y - 2z = 0

23   4   -8    -92
Example4:   M =  36   5   -12  -148   XEQ "MT3"  >>>> "SYM/L//P" ( 70s ) Tf is a symmetry with respect to a line (L) in the direction of a vectorial plane (P)
84  14  -29  -350

(L) is determined by one point  A(xA,yA,zA)  in registers R01 R02 R03  and one vector U(a,b,c)  in registers  R04 R05 R06
(P) is given by one of its equations:  a'x + b'y + c'z = 0  where  a' , b' , c'  are in R07 R08 R09

-Here,     A(4,1,0)    U(-2/7,-3/7,-1)       ( or if you prefer:  U'(2,3,7) )
and    (P): x +y/6 - z/3 = 0                    or 6x + y - 2z = 0

1   0   0   2
Example5:   M =     0   1   0   3      XEQ "MT3"  >>>>  "TRANS"   ( 34s )    Tf is a translation   defined by a vector U(a,b,c)  in registers R01  R02  R03
0   0   1   4

-In this example,  U(2,3,4)
-If the last column is  0 0 0  ( instead of  2 3 4 ) , the HP-41 displays "ID"

0.64   -0.48   -0.6    1.08
Example6:    M =  -0.48    0.36   -0.8    1.44         XEQ "MT3" >>>>  "REFL/P"  ( 102s  )  Tf is a reflexion with respect to a plane (P)
-0.6     -0.8       0      1.8

(P): ax + by + cz = d     with  a , b , c , d  in registers  R01  R02  R03  R00   respectively

-Here,   (P):  x + 4y/3 +5z/3 = 3      ( or 3x + 4y + 5z = 9 )

0.64   -0.48   -0.6    5.08
Example7:     M =  -0.48    0.36   -0.8    3.44           XEQ "MT3" >>>>  "REFL/P*TRANS"  ( 77s  )
-0.6     -0.8       0     -2.2

Tf is the product of a reflexion with respect to a plane (P) and a translation defined by a vector U parallel to (P)

(P): ax + by + cz = d     with  a , b , c , d  in registers  R01  R02  R03  R00   respectively
and  U(a',b',c')                    with  a' , b' , c' in R04  R05  R06

-Here,   (P):  x + 4y/3 +5z/3 = 3      ( or 3x + 4y + 5z = 9 )
and      U(4,2,-4)

-0.56672    -0.16896    0.8064     3.64032
Example8:   M =      0.79104    -0.38528    0.4752     2.57376      XEQ "MT3"   >>>>  "ROT"   ( 66s )   Tf is a rotation by an angle µ around an axis (L)
0.2304        0.9072      0.352      -3.1824

-The angle µ is in register R00
-(L) is defined by one point  A(xA,yA,zA)  in registers R01 R02 R03  and one vector U(a,b,c)  in registers  R04 R05 R06

-Here,   µ = -143.1301024°   ( if the HP-41 is in DEG mode )     A(2,3,0)  and U(-0.45 , -0.6 , -1 )

or if you prefer, after multiplying  U by  -20: U'(9,12,20)   and  µ = 143.1301024°

Note:   Don't forget to change the sign of µ if you multiply the coordinates of U by a negative number!

-0.56672    -0.16896    0.8064     5.89032
Example9:      M =      0.79104    -0.38528    0.4752     5.57376      XEQ "MT3"   >>>>  "ROT*TRANS"   ( 66s )
0.2304        0.9072      0.352       1.8176

Tf is the product of a rotation by an angle µ around an axis (L) and a translation defined by a vector V parallel to (L)

-The angle µ is in register R00
-(L) is defined by one point  A(xA,yA,zA)  in registers R01 R02 R03  and one vector U(a,b,c)  in registers  R04 R05 R06
-The vector V(a',b',c') is in registers R07  R08  R09

-Here,   µ = -143.1301024°
(L) is determined by  A(2,3,0)  and  U(-0.45 , -0.6 , -1 )
and  V(2.25;3;5)

-1    0   0   4
Example10:       M =     0  -1   0   6      XEQ "MT3"  >>>>  "CENTR SYM"   ( 70s )   Tf is a central symmetry with respect to A
0   0   -1   8

-The point  A(xA,yA,zA)  is in registers  R01 R02 R03

-Here, we have   A(-2;-3;-4)

0.38528    -0.1344     0.91296    -2.0192
Example11:       M =   -0.9024        0.152       0.4032       2.736             XEQ "MT3"    >>>>    "ROT*REFL/P"   ( 92s )
0.19296     0.9792      0.06272     0.4256

Tf is the product of a rotation by an angle µ around an axis (L) and a reflexion with respect to a plane (P) orthogonal to (L)

-The angle µ is in register R00
-(L) is defined by the point  A(xA,yA,zA)  in registers R01 R02 R03  and one vector U(a,b,c)  in registers  R04 R05 R06
-(P) is defined by the equation  ax + by + cz = d       ( d is in R07 )

-Note that A is the unique "fixed point" of the transformation ( Tf(A) = A ):
A is the intersection of (P) and (L)

-In this example:     µ = 36.86989765      A(2;3;4)    U(3/4;15/16;-1)      (P): 3x/4 + 15y/16 - z = 5/16
or if you prefer:    U'(12;15;-16)         (P): 12x + 15y - 16z = 5

1   1   1   4
Example12:       M =       1   2   3   1         XEQ "MT3"  >>>>  "TF NOT FOUND"  ( 8s )  Tf is neither a projection, nor a symmetry nor an isometry.
1   3   6   8

Remarks:    -Examples 5 to 11 illustrate all the possible isometries in a 3-dimensional Euclidean space.
-An axial symmetry is equivalent to a rotation by 180° around this axis.
-If you want to detemine the characteristics of a similarity:
1°)  Key in   3  XEQ "SIM?"    if Flag F02 is still set at the end,  X = k = the ratio of magnification
2°)  Press  ST/ 01  ST/ 02  ST/ 03  ST/ 04  ST/ 05  ST/ 06  ST/ 07  ST/ 08  ST/ 09  ST/ 10  ST/ 11  ST/ 12
3°)  XEQ "MT3"
-If the HP-41 finds an isometry  Is , the original transformation Tf  verifies
Tf = hoIs  where h is an homothecy  ( homothetic center = the origin O ; k = ratio of magnification )

-You may also replace line 20 by XEQ "SIM?"
add  ST/ 01  ST/ 02  ST/ 03  ST/ 04  ST/ 05  ST/ 06  ST/ 07  ST/ 08  ST/ 09  ST/ 10  ST/ 11  ST/ 12
ST/ 23  ST/ 24  ST/ 25  ST/ 26  ST/ 27  ST/ 28  ST/ 29  ST/ 30  ST/ 31  ST/ 32  ST/ 33  ST/ 34  STO 38  3  XEQ "PS?"  after line 91
and modify the text lines if  k # 1
-However, choosing the homothetic center = O is not necessarily the best choice!

-In "MT2" and "MT3", the coefficients are replaced by zero if they are smaller than 10-7  ( in absolute value )
-You can replace E-7 by another small positive number.

c) n-Dimensional Space

-The general case is extremely complex and we give only one ( easy ) example:

x' = 9x + 12y + 16z + 28t - 36
Tf is defined by     y' = 4x + 7y + 8z + 14t - 18             find the characteristics of this transformation.
z' = 20x + 30y + 41z + 70t - 90
t' = -16x - 24y - 32z - 55t + 72

1°)  Store these 20 coefficients ( in column order ) into registers R01 to R20
2°)  4  XEQ "PS?"  >>>>  when the program stops,  Flag F00 is clear , Flag F03 is set:  Tf is a symmetry
3°)  4  XEQ "ISO?" >>>> ------------------------   Flag F02 is clear: Tf is not an isometry
4°)  To find the fixed points, subtract 1 to registers R01 R06 R11 R16   ( the diagonal elements )
multiply registers R17 R18 R19 R20 by -1  ( the last column )
and we solve this system:  1.02004  ENTER^   E-7  XEQ "LS"       ( cf "linear and non-linear systems for the HP-41" )

1    1.5   2   3.5   4.5
The array is now:        0      0    0    0      0        whence the set of fixed points is the hyperplane (H): x + 1.5y + 2z + 3.5t = 4.5
0      0    0    0      0            or  2x + 3y + 4z + 7t = 9
0      0    0    0      0

5°)  Since Tf is a symmetry, let's find an eigenvector corresponding to the eigenvalue -1  ( we would choose 0 if Tf were a projection )
We restore the 16 original coefficients into R01 to R16   ( the last column is unused here or may be replaced by 0 )
we subtract -1 ( i-e we add 1 ) to the diagonal elements:  1  ST+ 01  ST+ 06  ST+ 11  ST+ 16
and   1.01604  ENTER^   E-7   XEQ "LS"

1   0   0   0.5                         x + 0.5t = 0
the matrix becomes:    0   1   0   0.25    meaning       y + 0.25t = 0    for any eigenvector  V(x,y,z,t)  corresponding to -1
0   0   1   1.25                       z + 1.25t = 0
0   0   0   0

-Setting arbitrarily   t = -4  we get   x = 2 ; y = 1 ; z = 5

-Therefore,  Tf is the symmetry with respect to the hyperplane (H): 2x + 3y +4z + 7t = 9  in the direction of the vector V(2,1,5,-4)

Note:    There are so many other cases that writing a general "MTN" program seems almost impossible...

Reference:   J.M. Ferrard , "Mathez la HP-48 G/GX" , D3I Diffusion ,    ISBN 2-908791-12-9  ( in French )