Quaternion type: Difference between revisions
→{{header|RPL}}: Using quaternions' matrix form
imported>Arakov |
(→{{header|RPL}}: Using quaternions' matrix form) |
||
Line 7,627:
|
≪ 0 1 4 '''FOR''' q OVER q GET SQ + '''NEXT''' √ SWAP DROP
≫ '
≪ NEG 1 DUP2 GET NEG PUT ≫ '
≪
DUP TYPE 3 == ≪ SWAP ≫ IFT
OVER 1 GET + 1 SWAP PUT
≫ '
≪
Line 7,643:
'a1*d2 + b1*c2 − c1*b2 + d1*a2' EVAL
{ 4 } →ARRY
≫ ≫ '
|
switch arguments if quaternion is at stack level 1
replace a by a+r
put the 2 quaternions in local variables
do the math in stack
Line 7,665:
|}
[1 2 3 4] <span style="color:blue">QNORM</span>
[1 2 3 4] NEG▼
[1 2 3 4]
[1 2 3 4] 7 <span style="color:blue">QRADD</span>
▲[1 2 3 4] NEG
[
[1 2 3 4] 7
[2 3 4 5] [3 4 5 6]
[3 4 5 6] [2 3 4 5] <span style="color:blue">QMULT</span>▼
▲[3 4 5 6] [2 3 4 5] QMULT
{{out}}
Line 7,701 ⟶ 7,698:
d a * b c CONJ * + C→R
{ 4 } →ARRY
≫ ≫ '
|
convert the 2 quaternions into 2 pairs of complex numbers
and store them locally
Line 7,712 ⟶ 7,709:
|}
Output is the same.
===Using the matrix form===
This efficient implementation is based on an article of [https://edspi31415.blogspot.com/2015/06/hp-prime-and-hp-50g-quaternions.html?fbclid=IwAR1KTjHt4xVt2FoMqL-82MJ1SS3SBg8jNoF-8uNcqg2Y5bLD2oiyxVfO88Y Eddie's Math and Calculator Blog].
« ARRY→ DROP → a b c d
« a b R→C c d R→C
c NEG d R→C
3 PICK CONJ
{ 2 2 } →ARRY
» » '<span style="color:blue">→QTM</span>' STO <span style="color:grey">''@ ( [ a b c d ] → [[ a+bi c+di ][ -c+di a-bi ]] )''</span>
« DUP 1 GET RE LASTARG IM
ROT 2 GET RE LASTARG IM
{ 4 } →ARRY
» '<span style="color:blue">QTM→</span>' STO <span style="color:grey">''@ ( [[ a+bi c+di ][ -c+di a-bi ]] → [ a b c d ] )''</span>
« <span style="color:blue">→QTM</span> SWAP <span style="color:blue">QTM→</span> SWAP * <span style="color:blue">QTM→</span>
» '<span style="color:blue">QMULT</span>' STO <span style="color:grey">''@ ( q1 q2 → q1*q2 ) ''</span>
« <span style="color:blue">→QTM</span> DET √ ABS
» '<span style="color:blue">QNORM</span>' STO <span style="color:grey">''@ ( q → qnorm(q) ) ''</span>
« DUP INV SWAP <span style="color:blue">QNORM</span> SQ *
» '<span style="color:blue">QCONJ</span>' STO <span style="color:grey">''@ ( q → conj(q) ) ''</span>
Quaternions' matrix form allows to quickly develop additional operations:
« DUP <span style="color:blue">QNORM</span> /
» '<span style="color:blue">QSIGN</span>' STO <span style="color:grey">'@ ( q → q/norm(q) ) ''</span>
« <span style="color:blue">→QTM</span> INV <span style="color:blue">QTM→</span>
» '<span style="color:blue">QINV</span>' STO <span style="color:grey">'''@ ( q → q^(-1) ) ''</span>
« <span style="color:blue">QINV QMULT</span>
» '<span style="color:blue">QDIV</span>' STO <span style="color:grey">''@ ( q1 q2 → q1/q2 )''</span>
=={{header|Ruby}}==
|