Напишіть названу функцію або програму, яка обчислює добу кватерніона двох кватерніонів. Використовуйте якомога менше байтів.
Кватерніони
Кватерніони - це розширення дійсних чисел, що ще більше розширює складні числа. Замість однієї уявної одиниці i
, кватерніони використовують три уявні одиниці, i,j,k
які задовольняють відносини.
i*i = j*j = k*k = -1
i*j = k
j*i = -k
j*k = i
k*j = -i
k*i = j
i*k = -j
(На сторінці у Вікіпедії також є таблиці .)
Словом, кожна уявна одиниця -1
складається з квадратів , а добуток двох різних уявних одиниць є рештою третьою, +/-
залежно від того, чи (i,j,k)
дотримується циклічний порядок (тобто правий правий ). Отже, порядок множення має значення.
Загальний кватерніон - це лінійна комбінація реальної частини та трьох уявних одиниць. Отже, це описується чотирма реальними числами (a,b,c,d)
.
x = a + b*i + c*j + d*k
Отже, ми можемо помножити два кватерніони, використовуючи властивість розподілу, обережно перемножуючи одиниці в потрібному порядку і групуючи, як і терміни, в результаті.
(a + b*i + c*j + d*k) * (e + f*i + g*j + h*k)
= (a*e - b*f - c*g - d*h) +
(a*f + b*e + c*h - d*g)*i +
(a*g - b*h + c*e + d*f)*j +
(a*h + b*g - c*f + d*e)*k
Побачене таким чином, кватерніонне множення можна розглядати як мапу від пари 4-кортежів до одного-4-кортезів, що саме вам пропонується реалізувати.
Формат
Ви повинні написати або програму, або назву функції . Програма повинна брати дані STDIN і роздрукувати результат. Функція повинна приймати функціональні входи та повертати (не друкувати) вихід.
Формати введення та виведення є гнучкими. Вхід - вісім реальних чисел (коефіцієнти для двох кватерніонів), а вихід складається з чотирьох дійсних чисел. На вході можуть бути вісім чисел, два списки з чотирьох чисел, матриця 2x4 тощо. Формат вводу / виводу не повинен бути однаковим. Упорядкування (1,i,j,k)
коефіцієнтів залежить від вас.
Коефіцієнти можуть бути негативними або не цілими. Не турбуйтеся про справжню точність або переливи.
Заборонено: функція або типи, спеціально для кватерніонів або еквівалентів.
Тестові справи
Вони у (1,i,j,k)
форматі коефіцієнтів.
[[12, 54, -2, 23], [1, 4, 6, -2]]
[-146, -32, 270, 331]
[[1, 4, 6, -2], [12, 54, -2, 23]]
[-146, 236, -130, -333]
[[3.5, 4.6, -0.24, 0], [2.1, -3, -4.3, -12]]
[20.118, 2.04, 39.646, -62.5]
Довідкова реалізація
У Python як функція:
#Input quaternions: [a,b,c,d], [e,f,g,h]
#Coeff order: [1,i,j,k]
def mult(a,b,c,d,e,f,g,h):
coeff_1 = a*e-b*f-c*g-d*h
coeff_i = a*f+b*e+c*h-d*g
coeff_j = a*g-b*h+c*e+d*f
coeff_k = a*h+b*g-c*f+d*e
result = [coeff_1, coeff_i, coeff_j, coeff_k]
return result