Quaternion Multiplication

Time Limit : 1 sec, Memory Limit : 65536 KB

四元数のかけ算

複素数を拡張したものに四元数と呼ばれるものがあります。物体の回転などを表現するのに便利なので、ロボットの腕の制御などに使える便利な数です。四元数は、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を出力するプログラムを作成してください。ただし、与えられる係数はすべて-1000以上1000以下とします。

入力

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

1行目 四元数の組の個数n (整数)
2行目 第1の四元数の組の情報 x1 y1 z1 w1 x2 y2 z2 w2 (すべて整数;半角空白区切り)
3行目 第2の四元数の組の情報

n+1行目 第nの四元数の組の情報
出 力

出力

入力データセットごとに、四元数の積を出力します。

入力例

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

Source: PC Koshien 2011, Preliminary Round , All-Japan High School Programming Contest, Aizu-Wakamatsu, Japan, 2011
(revised version)
http://www.pref.fukushima.jp/pc-concours/