Напишите именованную функцию или программу, которая вычисляет произведение кватернионов двух кватернионов. Используйте как можно меньше байтов.
Кватернионы
Кватернионы - это расширение действительных чисел, которое дополнительно расширяет комплексные числа. Вместо одной мнимой единицы 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