কোয়াটার্নিয়ান্সকে গুণ করুন


13

এমন একটি নামকৃত ফাংশন বা প্রোগ্রাম লিখুন যা দুটি কোয়ার্টেরিয়ানের চতুর্মুখী পণ্যটির গুণগত মান করে। যতটা সম্ভব বাইট ব্যবহার করুন।

কোয়াটেরনিয়ন

Quaternions হ'ল আসল সংখ্যার একটি এক্সটেনশন যা জটিল সংখ্যাগুলি আরও প্রসারিত করে। একক কাল্পনিক ইউনিটের পরিবর্তে 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]

রেফারেন্স বাস্তবায়ন

পাইথনে, ফাংশন হিসাবে:

#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

উত্তর:


4

সিজেম, 49 45 39 বাইট

"cM-^\M-^G-^^KM-zP"256bGbq~m*f{=:*}4/{:-W*}/W*]`

উপরের অংশটিতে ক্যারেট এবং এম স্বরলিপি ব্যবহার করা হয়েছে, যেহেতু কোডটিতে অরক্ষিত অক্ষর রয়েছে।

দুটি অতিরিক্ত বাইট ব্যয়ে, এই অক্ষরগুলি এড়ানো যায়:

6Z9C8 7YDXE4BFA5U]q~m*f{=:*}4/{:-W*}/W*]`

আপনি এই সংস্করণটি অনলাইনে চেষ্টা করতে পারেন: সিজেএম ইন্টারপ্রেটার

পরীক্ষার মামলা

গণনা (a + bi + cj + dk) * (e + fi + gj + hk)করতে, নিম্নলিখিত ইনপুটটি ব্যবহার করুন:

[ d c b a ] [ h g f e ]

আউটপুট হবে

[ z y x w ]

যা চতুষ্পদের সাথে মিলে যায় w + xi + yj + zk

$ base64 -d > product.cjam <<< ImOchy0eS/pQIjI1NmJHYnF+bSpmez06Kn00L3s6LVcqfS9XKl1g
$ wc -c product.cjam
39 product.cjam
$ LANG=en_US cjam product.cjam <<< "[23 -2 54 12] [-2 6 4 1]"; echo
[331 270 -32 -146]
$ LANG=en_US cjam product.cjam <<< "[-2 6 4 1] [23 -2 54 12]"; echo
[-333 -130 236 -146]
$ LANG=en_US cjam product.cjam <<< "[0 -0.24 4.6 3.5] [-12 -4.3 -3 2.1]"; echo
[-62.5 39.646 2.04 20.118]

কিভাবে এটা কাজ করে

6Z9C8 7YDXE4BFA5U]  " Push the array [ 6 3 9 12 8 7 2 13 1 14 4 11 15 10 5 0].         ";
q~                  " Read from STDIN and interpret the input.                         ";
m*                  " Compute the cartesian product of the input arrays.               ";
f                   " Execute the following for each element of the first array:       ";
{                   " Push the cartesian product (implicit).                           ";
    =               " Retrieve the corresponding pair of coefficients.                 ";
    :*              " Calculate their product.                                         ";
}                   "                                                                  ";
4/                  " Split into chunks of 4 elements.                                 ";
{:-W*}/             " For each, subtract the first element from the sum of the others. ";
W*                  " Multiply the last integers (coefficient of 1) by -1.             ";
]`                  " Collect the results into an array and stringify it.              ";

6

পাইথন (83)

r=lambda A,B,R=range(4):[sum(A[m]*B[m^p]*(-1)**(14672>>p+4*m)for m in R)for p in R]

দুটি তালিকা লাগে A,Bমধ্যে [1,i,j,k]অর্ডার ও একই বিন্যাসে ফলে ফেরৎ।

মূল ধারণাটি হ'ল [1,i,j,k]সূচকগুলির সাথে সংশ্লিষ্ট [0,1,2,3], আপনি সূচকগুলি XOR''র দ্বারা পণ্যের সূচক (সাইন আপ করতে) পান। সুতরাং, শর্তাবলী যে সূচীতে স্থাপন করা pহয় সেগুলি হ'ল XOR কে সূচক করে pএবং এইভাবে পণ্যগুলি A[m]*B[m^p]

এটি কেবল লক্ষণগুলি কার্যকর করার জন্য রয়ে গেছে। আমি খুঁজে পেয়েছি সবচেয়ে সংক্ষিপ্ততম উপায়টি ছিল কেবল তাদের যাদু স্ট্রিংয়ে কোড করা। 16 সম্ভাবনার (m,p)সংখ্যার মধ্যে প্রমাণিত হয় 0থেকে 15যেমন p+4*m14672বাইনারি সংখ্যাটি 1সেই জায়গাগুলিতে রয়েছে যেখানে -1চিহ্নগুলি প্রয়োজন। এটিকে যথাযথ জায়গাগুলি স্থানান্তরিত করে, একটি 1বা 0শেষ অঙ্কে বাতাস বেঁধে, সংখ্যাটি বিজোড় বা এমনকি তৈরি করে এবং তাই (-1)**হয় হয় 1বা -1প্রয়োজন হিসাবে হয় ।


এক্সওআর অংশটি খাঁটি প্রতিভা।
ডেনিস

3

পাইথন - 90 75 72 69

খাঁটি পাইথন, কোনও গ্রন্থাগার নেই - 90:

m=lambda a,b,c,d,e,f,g,h:[a*e-b*f-c*g-d*h,a*f+b*e+c*h-d*g,a*g-b*h+c*e+d*f,a*h+b*g-c*f+d*e]

পাইথনের এই "ডিফল্ট" সমাধানটি ছোট করা সম্ভবত বেশ কঠিন। তবে আমি কী কৌতূহল বোধ করি অন্যেরা কী সামনে আসতে পারে। :)


NumPy ব্যবহার করে - 75 72 69:

ঠিক আছে, যেহেতু ইনপুট এবং আউটপুটটি বরং নমনীয়, আমরা কিছু NumPy ফাংশন ব্যবহার করতে এবং স্কেলার-ভেক্টর উপস্থাপনাকে কাজে লাগাতে পারি :

import numpy
m=lambda s,p,t,q:[s*t-sum(p*q),s*q+t*p+numpy.cross(p,q)]

আর্গুমেন্টগুলি ইনপুট করুন sএবং tদুটি কোয়ার্টেরিয়নের (আসল অংশ) এর স্কেলারের অংশ pএবং qএটি সম্পর্কিত ভেক্টর অংশগুলি (কাল্পনিক ইউনিট)। আউটপুটটি স্কেলার অংশ এবং ফলস্বরূপ কোয়ার্টেরিয়নের ভেক্টর অংশযুক্ত একটি তালিকা যা পরেরটি নুমপি অ্যারে হিসাবে উপস্থাপিত হয়।

সাধারণ পরীক্ষার লিপি:

for i in range(5):
    a,b,c,d,e,f,g,h=np.random.randn(8)
    s,p,t,q=a, np.array([b, c, d]), e, np.array([f, g, h])
    print mult(a, b, c, d, e, f, g, h), "\n", m(s,p,t,q)

( mult(...)ওপি'র রেফারেন্স বাস্তবায়ন হচ্ছে))

আউটপুট:

[1.1564241702553644, 0.51859264077125156, 2.5839001110572792, 1.2010364098925583] 
[1.1564241702553644, array([ 0.51859264,  2.58390011,  1.20103641])]
[-1.8892934508324888, 1.5690229769129256, 3.5520713781125863, 1.455726589916204] 
[-1.889293450832489, array([ 1.56902298,  3.55207138,  1.45572659])]
[-0.72875976923685226, -0.69631848934167684, 0.77897519489219036, 1.4024428845608419] 
[-0.72875976923685226, array([-0.69631849,  0.77897519,  1.40244288])]
[-0.83690812141836401, -6.5476014589535243, 0.29693969165495304, 1.7810682337361325] 
[-0.8369081214183639, array([-6.54760146,  0.29693969,  1.78106823])]
[-1.1284033842268242, 1.4038096725834259, -0.12599103441714574, -0.5233468317643214] 
[-1.1284033842268244, array([ 1.40380967, -0.12599103, -0.52334683])]

2

হাস্কেল, 85

m a b c d e f g h=[a*e-b*f-c*g-d*h,a*f+b*e+c*h-d*g,a*g-b*h+c*e+d*f,a*h+b*g-c*f+d*e]

এটি হাস্কেলের কাছে পোর্ট করা আমাদের কয়েকটি অক্ষর সাশ্রয় করে;)


2

ম্যাথামেটিকাল 83 50

সম্ভবত আরও গল্ফ করা যেতে পারে ..

p = Permutations;
f = #1.(Join[{{1, 1, 1, 1}}, p[{-1, 1, -1, 1}][[1 ;; 3]]] p[#2][[{1, 8, 17, 24}]]) &

স্পেস এবং নিউলাইনগুলি গণনা করা হয়নি এবং প্রয়োজন নেই।

ব্যবহার:

f[{a,b,c,d},{e,f,g,h}]        (* => {x,w,y,z}   *)


এটি কীভাবে কাজ করে তা সম্পাদনা করুন।

ম্যাথমেটিকা ​​ফাংশনটি (দ্বিতীয় যুক্তি) Permutationsএর সমস্ত সম্ভাব্য অনুমতি দেয় #2। 24 বিনিময়ের আছে, কিন্তু আমরা শুধু প্রয়োজন {e,f,g,h}, {f,e,h,g}, {g,h,e,f}, এবং {h,g,f,e}। এটি প্রথম, অষ্টম, 17 তম এবং 24 তম অনুমান। সুতরাং কোড

p[#2][[{1,8,17,24}]]

দ্বিতীয় যুক্তির ক্রম থেকে এগুলি ঠিক নির্বাচন করে এবং সেগুলি ম্যাট্রিক্স হিসাবে ফিরিয়ে দেয়। তবে তারপরেও তাদের সঠিক চিহ্ন নেই। কোডটি p[{-1,1,-1,1}][[1;;3]]সঠিক চিহ্ন সহ একটি 3x4 ম্যাট্রিক্স প্রদান করে। আমরা সঙ্গে এটি পূর্বে লিখুন {1,1,1,1}ব্যবহার করে Join, এবং উপার্জন একটি স্বাভাবিক গুণ ( Timesঅথবা যদি শুধু একে অপরের পর তাদের লেখার মাধ্যমে এখানে হিসাবে) দুটি ম্যাট্রিক্সের মধ্যবর্তী ম্যাথামেটিকাল মধ্যে একটি উপাদান-বাই-উপাদান গুণ করে তোলে।

সুতরাং অবশেষে, ফলাফল

(Join[{{1, 1, 1, 1}}, p[{-1, 1, -1, 1}][[1 ;; 3]]] p[#2][[{1, 8, 17, 24}]])

ম্যাট্রিক্স হয়

 e  f  g  h
-f  e -h  g
-g  h  e -f
-h -g  f  e

{a,b,c,d}(প্রথম যুক্তি #1) এবং প্রাক্তন ম্যাট্রিক্সের মধ্যে একটি ম্যাট্রিক্স গুণ করা পছন্দসই ফলাফল দেয়।



সংক্ষিপ্ত 2 কোড সম্পাদনা করুন

ফালকোর পাইথন কোড থেকে অনুপ্রাণিত হয়ে আমি কোয়ার্টেরিয়নকে একটি স্কেলার এবং ভেক্টর অংশে বিভক্ত করেছি এবং Crossভেক্টরের অংশগুলির ক্রস প্রোডাক্ট গণনা করতে ম্যাথামেটিকার বিল্ট ইন কমান্ড ব্যবহার করেছি :

f[a_, A_, b_, B_] := Join[{a*b - A.B}, a*B + b*A + Cross[A, B]]

ব্যবহার:

f[a,{b,c,d},e,{f,g,h}]        (* => {x,w,y,z}   *)

এটি কীভাবে কাজ করে তা আপনি ব্যাখ্যা করতে পারেন? কি আছে 1, 8, 17, 24?
xnor



1

লুয়া - 99

পাশাপাশি হতে পারে।

_,a,b,c,d,e,f,g,h=unpack(arg)print(a*e-b*f-c*g-d*h,a*f+b*e+c*h-d*g,a*g-b*h+c*e+d*f,a*h+b*g-c*f+d*e)

লুয়ার "আনপ্যাক ()" কোনও টেবিলের উপাদানগুলি মুক্ত করে। সুতরাং সারণিটি 'আরগ' হ'ল যেখানে সমস্ত কমান্ড লাইন ইনপুট সংরক্ষিত আছে (এটি সহ arg[0]প্রোগ্রামটির ফাইলের নাম, এটি বাতিল হয়ে যায়)।


1

পাইথন, 58 টি চর

m=lambda x,y,z,w:(x*z-y*(2*w.real-w),x*w+y*(2*z.real-z))

আমি ইনপুট / আউটপুট ফর্ম্যাট উইগল রুমের খুব উদার ব্যবহার করি । ইনপুটগুলি 4 টি জটিল সংখ্যা, এভাবে এনকোড করা হয়:

x = a+b*i
y = c+d*i
z = e+f*i
w = g+h*i

এটি জটিল সংখ্যার এক জোড়াকে একই ধরণের বিন্যাসে আউটপুট দেয়, জোড়ার প্রথমটি আসল এবং iঅংশকে এনকোড করে, দ্বিতীয়টি jএবং kঅংশগুলি এনকোড করে ।

এই কাজগুলি দেখতে, মনে রাখবেন যে প্রথম চৌম্বকটি x+y*jদ্বিতীয়টি এবং দ্বিতীয়টি z+w*j(x+y*j)*(z+w*j)যে কোনও কাল্পনিক সংখ্যার জন্য কেবল j*t= এটি মূল্যায়ন এবং উপলব্ধি করুন ।conj(t)*jt


খুব চালাক! আপনি কি জানেন যে কোয়ার্ট্রেনগুলি জটিল সংখ্যাসমূহের সাথে জটিল সংখ্যার মতো কেন আপনার গুণ থেকে প্রকাশিত হচ্ছে বলে মনে হয়?
xnor

কিছু মনে করবেন না, আমি এখন আপনার ব্যাখ্যা থেকে বুঝতে পারি কীভাবে iএবং jঅভ্যন্তরীণ এবং বহিরাগত জটিল সহগগুলির মতো আচরণ করে। কত আকর্ষণীয়!
xnor

এটি মজাদার যে কীভাবে কনজ কলগুলি আপনার চরিত্রের 2/5 এরও বেশি সময় নেয়। আমি মনে করি আপনি প্রতিটি ব্যবহার করে একটি চর শেভ করতে পারেন (2*w.real-w)abs(w)**2/wতবে 0 এর জন্য কাজ করবে সম্ভবত স্ট্রিং প্রতিস্থাপনের সাথে এক্সিকিউট করাও এটির জন্য উপযুক্ত হবে? `
xnor

1

ফিসফিসি ভি 2 , 396 বাইট

> 1
> 2
> 0
> 4
> Input
> Input
>> 6ᶠ2
>> 6ᵗ2
>> 7ⁿ3
>> 7ⁿ1
>> 10‖9
>> 8ⁿ3
>> 8ⁿ1
>> 13‖12
>> 7‖8
>> 11‖14
>> 8‖7
>> 14‖11
>> 15‖16
>> 19‖17
>> 20‖18
>> 4⋅5
>> L⋅R
>> Each 23 22 21
> [1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1]
>> Each 23 24 25
>> 26ᶠ4
>> 26ᵗ4
>> 28ᶠ4
> 8
>> 26ᵗ30
>> 31ᶠ4
>> 31ᵗ4
>> ∑27
>> ∑29
>> ∑32
>> ∑33
>> Output 34 35 36 37

এটি অনলাইন চেষ্টা করুন!

ফর্ম ইনপুট লাগে

[a, b, c, d]
[e, f, g, h]

এবং ফলাফল হিসাবে

w
x
y
z

q=w+xi+yj+zk

এই উত্তরের কাঠামো ট্রিটি হ'ল:

গাছ

এই উত্তরটির বেশিরভাগ অংশ হুইস্পারের দুটি প্রধান ত্রুটি থেকে আসে:

  • কোনও অ্যারে বিপরীতে ফাংশন নেই
  • কার্টেসিয়ান পণ্যটির গণনায় সেটগুলির ব্যবহার

সুতরাং, আমরা কোডটি 3 ভাগে বিভক্ত করতে পারি।

কিভাবে এটা কাজ করে

আমরা স্বচ্ছতা এবং দৃis়তার জন্য নিম্নলিখিত সংজ্ঞাগুলি ব্যবহার করব:

q=a+bi+cj+dk
p=e+fi+gj+hk
r=w+xi+yj+zk,(qp=r)
A=[a,b,c,d]
B=[e,f,g,h]
C=[w,x,y,z]

বিভাগ 1: পরিবহন করাAB

প্রথম বিভাগটি দীর্ঘতম, লাইন 1 থেকে লাইন 22 পর্যন্ত প্রসারিত :

> 1
> 2
> 0
> 4
> Input
> Input
>> 6ᶠ2
>> 6ᵗ2
>> 7ⁿ3
>> 7ⁿ1
>> 10‖9
>> 8ⁿ3
>> 8ⁿ1
>> 13‖12
>> 7‖8
>> 11‖14
>> 8‖7
>> 14‖11
>> 15‖16
>> 19‖17
>> 20‖18
>> 4⋅5

BABBA

B1=[e,f,g,h]
B2=[f,e,h,g]
B3=[g,h,e,f]
B4=[h,g,f,e]

BBBB2B4

>> 7ⁿ3
>> 7ⁿ1
>> 10‖9

[f,e]

>> 8ⁿ3
>> 8ⁿ1
>> 13‖12

[h,g]B1,B2,B3B4BTATA4

AT=[a,b,c,d,a,b,c,d,a,b,c,d,a,b,c,d]
BT=[e,f,g,h,f,e,h,g,g,h,e,f,h,g,f,e]

BTATqp

বিভাগ 2: লক্ষণ এবং পণ্য

ATBTqp

> [1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1]

SAT,BTS[[a,e,1],[b,f,1],,[e,f,1],[d,e,1]]D=[ae,bf,,ef,de]

বিভাগ 3: পার্টিশন এবং চূড়ান্ত পরিমাণ।

qpqp

> 4

54DD

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.