Jump to content

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
≫ ''''<span style="color:blue">QNORM'''</span>' STO
≪ NEG 1 DUP2 GET NEG PUT ≫ ''''<span style="color:blue">QCONJ'''</span>' STO
DUP TYPE 3 == ≪ SWAP ≫ IFT
OVER 1 GET + 1 SWAP PUT
≫ ''''<span style="color:blue">QRADD'''</span>' STO
Line 7,643:
'a1*d2 + b1*c2 − c1*b2 + d1*a2' EVAL
{ 4 } →ARRY
≫ ≫ ''''<span style="color:blue">QMULT'''</span>' STO
|
'''<span style="color:blue">QNORM'''</span> ''( [ a b c d ] -- √(a²+b²+c²+d²) )''
'''<span style="color:blue">QCONJ'''</span> ''( [ a b c d ] -- [ a -b -c -d ] )''
'''<span style="color:blue">QRADD'''</span> ''( [ a b c d ] r -- [ a+r b c d ] )''
switch arguments if quaternion is at stack level 1
replace a by a+r
'''<span style="color:blue">QMULT'''</span> ''( [Q1] [Q2] -- [Q1 x Q2] )''
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>
{{in}}
[1 2 3 4] NEG
<pre>
[1 2 3 4] QNORM<span style="color:blue">QCONJ</span>
[1 2 3 4] 7 <span style="color:blue">QRADD</span>
[1 2 3 4] NEG
[1 2 3 4 5] [3 4 5 6] QCONJ+
[1 2 3 4] 7 QRADD*
[2 3 4 5] [3 4 5 6] +<span style="color:blue">QMULT</span>
[3 4 5 6] [2 3 4 5] <span style="color:blue">QMULT</span>
[1 2 3 4] 7 *
[2 3 4 5] [3 4 5 6] QMULT
[3 4 5 6] [2 3 4 5] QMULT
</pre>
 
{{out}}
Line 7,701 ⟶ 7,698:
d a * b c CONJ * + C→R
{ 4 } →ARRY
≫ ≫ ''''<span style="color:blue">QMULT'''</span>' STO
|
'''<span style="color:blue">QMULT'''</span> ''( [Q1] [Q2] -- [Q1 x Q2] )''
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}}==
1,150

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.