İki quaternionun quaternion ürününü hesaplayan adlandırılmış bir işlev veya program yazın. Mümkün olduğunca az bayt kullanın.
Kuaterniyonlar
Kuaterniyonlar , karmaşık sayıları daha da genişleten gerçek sayıların bir uzantısıdır. i
Kuaterniyonlar, tek bir hayali birimden ziyade i,j,k
ilişkileri tatmin eden üç hayali birim kullanırlar .
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
( Wikipedia sayfasında bunların tabloları da vardır .)
Kelimelerle, her hayali birim kareler -1
ve iki farklı hayali birimin çarpımı +/-
, döngüsel düzene uyulup (i,j,k)
uyulmadığına (yani sağ-kural ) bağlı olarak kalan üçüncü birimdir . Bu nedenle, çarpma sırası önemlidir.
Genel bir kuaterniyon, gerçek bir parçanın ve üç hayali birimin doğrusal bir kombinasyonudur. Yani, dört gerçek sayı ile tanımlanır (a,b,c,d)
.
x = a + b*i + c*j + d*k
Böylece, dağıtım özelliğini kullanarak iki dördüncüyü çoğaltabiliriz, birimleri doğru sırayla çarpmaya dikkat edebilir ve sonuçtaki terimler gibi gruplayabiliriz.
(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
Bu şekilde görüldüğü gibi, kuaterniyon çarpımı, bir çift 4-tuple'den tek bir 4-tuple'ye bir harita olarak görülebilir;
Biçim
Bir program veya adlandırılmış işlev yazmalısınız . Bir program STDIN'den girdi almalı ve sonucu yazdırmalıdır. Bir işlev, işlev girişlerini almalı ve bir çıktı döndürmelidir (yazdırmaz).
Giriş ve çıkış formatları esnektir. Girdi sekiz gerçek sayıdır (iki kuaterniyon için katsayılar) ve çıktı dört gerçek sayıdan oluşur. Giriş sekiz sayı, dört sayıdan oluşan iki liste, 2x4 matris vb. Olabilir. Giriş / çıkış formatı aynı olmak zorunda değildir. Katsayıların sırası (1,i,j,k)
size kalmış.
Katsayılar negatif olabilir veya bütün olmayabilir. Gerçek hassasiyet veya taşmalar hakkında endişelenmeyin.
Yasaklı: Özellikle kuaterniyonlar veya eşdeğerleri için işlev veya türler.
Test senaryoları
Bunlar (1,i,j,k)
katsayı biçimindedir.
[[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]
Referans uygulaması
Python'da, işlev olarak:
#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