Loading [MathJax]/jax/output/CommonHTML/jax.js

四元数のかけ算

複素数を拡張したものに四元数と呼ばれるものがあります。物体の回転などを表現するのに便利なので、ロボットの腕の制御などに使える便利な数です。四元数は、4つの実数 x、y、z、w と特別な数(虚数を拡張したもの)i、j、k を用いて、x+yi+zj+wk と表されます。このような四元数の和は次のように定義されます。

(x1+y1i+z1j+w1k)+(x2+y2i+z2j+w2k)=(x1+x2)+(y1+y2)i+(z1+z2)j+(w1+w2)k

一方、1、i、j、k の間の積は次のように与えます。


この表は、2つの特別な数 A と B の積 AB を表しています。例えば、 i と j の積 ij は k であり、 j と i の積 ji は k であることを表しています。

一般の四元数の積は、この関係を満たすように計算されます。例えば、2つの四元数、1+2i+3j+4k と7+6i+7j+8k の積は次のように計算します。

(1+2i+3j+4k)×(7+6i+7j+8k)=
7+6i+7j+8k
+14i+12i2+14ij+16ik
+21j+18ji+21j2+24jk
+28k+24ki+28kj+32k2

上の表を適用することにより

=58+16i+36j+32k

となります。

4つの係数x、y、z、w が整数でかつすべてがゼロとはならない2つの四元数 (x1+y1i+z1j+w1k) と(x2+y2i+z2j+w2k)を入力とし、その積を(x3+y3i+z3j+w3k)とする時のx3、y3、z3、w3 を出力するプログラムを作成してください。

入力

複数のデータセットが与えられます。入力の終わりはゼロひとつの行で示されます。各データセットは以下の形式で与えられます。

n
data1
data2
:
datan

1行目に処理を行う四元数の組の個数 n (n10) が与えられます。続く n 行に i 番目の四元数の組の情報 datai が次の形式で与えられます。

x1 y1 z1 w1 x2 y2 z2 w2

与えられる係数はすべて-1000 以上1000 以下とします。データセットの数は 50 を超えません。

出力

データセットごとに、与えられた四元数の組の積を出力します。

入力例

2
1 2 3 4 7 6 7 8
5 6 7 8 3 2 3 4
0

出力例

-58 16 36 32
-50 32 28 48