รากที่สี่ quaternion


11

พื้นหลัง

Quaternionเป็นระบบตัวเลขที่ขยายจำนวนเชิงซ้อน quaternion มีแบบฟอร์มต่อไปนี้

a+bi+cj+dk

ที่, , , วันที่ตัวเลขจริงและฉัน, J , Kสามหน่วย quaternion พื้นฐาน หน่วยมีคุณสมบัติดังต่อไปนี้:a,b,c,di,j,k

i2=j2=k2=1
ij=k,jk=i,ki=j
ji=k,kj=i,ik=j

โปรดทราบว่าการคูณ quaternion ไม่ได้สลับกัน

งาน

ให้quaternion ที่ไม่ใช่ของจริงคำนวณอย่างน้อยหนึ่งในรากที่สองของมัน

อย่างไร?

ตามคำตอบ Math.SE นี้เราสามารถแสดงควอเทอเนียนที่ไม่ใช่ของจริงในรูปแบบต่อไปนี้

q=a+bu

ที่, Bตัวเลขจริงและยูเป็นเวกเตอร์หน่วยจินตภาพในรูปแบบx ฉัน+ Y J + Z kกับx 2 + y ที่2 + Z 2 = 1 uใด ๆ ดังกล่าวมีคุณสมบัติu 2 = - 1ดังนั้นจึงสามารถดูได้เป็นหน่วยจินตภาพa,buxi+yj+zkx2+y2+z2=1uu2=1

จากนั้นสแควร์ของqจะเป็นแบบนี้:

q2=(a2b2)+2abu

ตรงกันข้ามได้รับ quaternion q=x+yuเราสามารถหาสแควร์รูทของqโดยการแก้สมการต่อไปนี้

x=a2b2,y=2ab

ซึ่งเหมือนกับกระบวนการค้นหารากที่สองของจำนวนเชิงซ้อน

โปรดทราบว่าจำนวนจริงเชิงลบมี quaternion รากหลายอย่างมากมาย แต่quaternion ไม่ใช่จริงมีเพียงสองราก

อินพุตและเอาต์พุต

อินพุตเป็นควอเทอเนียนที่ไม่ใช่ของจริง คุณสามารถนำตัวเลขจริง (เลขทศนิยม) สี่ตัวในลำดับและโครงสร้างใด ๆ ที่คุณเลือก ไม่ใช่ของจริงหมายความว่าอย่างน้อยหนึ่งในb,c,dไม่ใช่ศูนย์

เอาท์พุทเป็นหนึ่งหรือสอง quaternions ซึ่งเมื่อยกกำลังสองเท่ากับการป้อนข้อมูล

กรณีทดสอบ

   Input (a, b, c, d)  =>  Output (a, b, c, d) rounded to 6 digits

 0.0,  1.0,  0.0,  0.0 =>  0.707107,  0.707107,  0.000000,  0.000000
 1.0,  1.0,  0.0,  0.0 =>  1.098684,  0.455090,  0.000000,  0.000000
 1.0, -1.0,  1.0,  0.0 =>  1.168771, -0.427800,  0.427800,  0.000000
 2.0,  0.0, -2.0, -1.0 =>  1.581139,  0.000000, -0.632456, -0.316228
 1.0,  1.0,  1.0,  1.0 =>  1.224745,  0.408248,  0.408248,  0.408248
 0.1,  0.2,  0.3,  0.4 =>  0.569088,  0.175720,  0.263580,  0.351439
99.0,  0.0,  0.0,  0.1 =>  9.949876,  0.000000,  0.000000,  0.005025

สร้างโดยใช้สคริปต์ Pythonนี้ มีการระบุคำตอบที่ถูกต้องเพียงหนึ่งในสองคำตอบสำหรับแต่ละกรณีทดสอบ อีกประการหนึ่งคือทั้งสี่ค่าเมื่อตะกี้

เกณฑ์การให้คะแนนและการชนะ

ใช้กฎมาตรฐานของโปรแกรมหรือฟังก์ชั่นที่สั้นที่สุดในหน่วยไบต์ในแต่ละภาษาชนะ


เราสามารถนำควอเทอร์ชันเป็นa, (b, c, d)?
nwellnhof

@nwellnhof แน่นอน บางสิ่งบางอย่างแม้เหมือนa,[b,[c,[d]]]จะดีหากคุณสามารถบันทึกอย่างใดไบต์กับมัน :)
Bubbler

คำตอบ:


29

APL (NARS) 2 ไบต์

NARS มีการสนับสนุน quaternions ในตัว ¯ \ _ (⍨) _ / ¯


4
ฉันไม่สามารถช่วยได้: คุณควรรวม "¯_ (ツ) _ / ¯" ในคำตอบของคุณ
Barranka

7
คุณทำแบบนี้ \
แอนดรูว์

@Barranka เรียบร้อยแล้ว
Adám

@Andrew ตำหนิบนแอป Android ... ขอบคุณสำหรับการยกมันขึ้นมา :)
Barranka

2
มันจะดีกว่าถ้ามันเป็น¯\_(⍨)√¯
Zacharý

8

Python 2 , 72 ไบต์

def f(a,b,c,d):s=((a+(a*a+b*b+c*c+d*d)**.5)*2)**.5;print s/2,b/s,c/s,d/s

ลองออนไลน์!

สูตรดิบมากหรือน้อย ฉันคิดว่าฉันสามารถใช้ list comprehensions เพื่อวนซ้ำb,c,dแต่นี่น่าจะนานกว่านี้ Python ได้รับบาดเจ็บที่นี่เนื่องจากการขาดการดำเนินงานของเวกเตอร์

Python 3 , 77 ไบต์

def f(a,*l):r=a+sum(x*x for x in[a,*l])**.5;return[x/(r*2)**.5for x in[r,*l]]

ลองออนไลน์!

การแก้สมการกำลังสองโดยตรงก็สั้นกว่าการใช้สแควร์รูทที่ซับซ้อนจำนวนของไพ ธ อนเพื่อแก้ปัญหาดังเช่นในคำแถลงปัญหา


"อินพุตเป็นควอเทอร์นอลที่ไม่จริงคุณสามารถใช้ตัวเลขสี่ตัว (ทศนิยม) ในลำดับและโครงสร้างที่คุณเลือกได้" ดังนั้นคุณสามารถพิจารณาให้เป็นซีรีย์แพนด้าหรืออาร์เรย์ที่ไม่มีค่าได้ (s*s).sum()**.5ซีรีส์ได้ปรับคูณด้วยง่ายและมีหลายวิธีที่จะได้รับเป็นบรรทัดฐานเช่น
สะสม

6

ภาษา Wolfram (Mathematica) , 19 ไบต์

Sqrt
<<Quaternions`

ลองออนไลน์!

Mathematica มี Quaternion ในตัวด้วย แต่มีความละเอียดมากกว่า


ถึงแม้ว่าบิวด์อินจะเจ๋ง แต่ทำ upvote โซลูชันที่ไม่ได้ใช้บิวด์อินด้วย! ฉันไม่ต้องการให้คะแนนสำหรับคำถามที่ถึง HNQ ถูกเบ้


4

JavaScript (ES7), 55 53 ไบต์

ขึ้นอยู่กับสูตรโดยตรงใช้โดย XNOR

รับอินพุตเป็นอาร์เรย์

q=>q.map(v=>1/q?v/2/q:q=((v+Math.hypot(...q))/2)**.5)

ลองออนไลน์!

อย่างไร?

q=[a,b,c,d]

x=a+a2+b2+c2+d22

และส่งคืน:

[x,b2x,c2x,d2x]

q =>                            // q[] = input array
  q.map(v =>                    // for each value v in q[]:
    1 / q ?                     //   if q is numeric (2nd to 4th iteration):
      v / 2 / q                 //     yield v / 2q
    :                           //   else (1st iteration, with v = a):
      q = (                     //     compute x (as defined above) and store it in q
        (v + Math.hypot(...q))  //     we use Math.hypot(...q) to compute:
        / 2                     //       (q[0]**2 + q[1]**2 + q[2]**2 + q[3]**2) ** 0.5
      ) ** .5                   //     yield x
  )                             // end of map()

3

Haskell , 51 ไบต์

f(a:l)|r<-a+sqrt(sum$(^2)<$>a:l)=(/sqrt(r*2))<$>r:l

ลองออนไลน์!

สูตรโดยตรง เคล็ดลับหลักในการแสดงส่วนที่แท้จริงของเอาท์พุทเป็นr/sqrt(r*2)ขนานการแสดงออกส่วนจินตภาพซึ่งจะช่วยประหยัดไม่กี่ไบต์กว่า:

54 ไบต์

f(a:l)|s<-sqrt$2*(a+sqrt(sum$(^2)<$>a:l))=s/2:map(/s)l

ลองออนไลน์!


3

ถ่าน 32 ไบต์

≔X⊗⁺§θ⁰XΣEθ×ιι·⁵¦·⁵η≧∕ηθ§≔θ⁰⊘ηIθ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำตอบ Python ของพอร์ตของ @ xnor คำอธิบาย:

≔X⊗⁺§θ⁰XΣEθ×ιι·⁵¦·⁵η

|x+yu|=x2+y2=(a2b2)2+(2ab)2=a2+b2x2a22a

≧∕ηθ

y=2abb2a

§≔θ⁰⊘η

2a

Iθ

ส่งค่าเป็นสตริงและพิมพ์โดยนัย


3

Java 8, 84 ไบต์

(a,b,c,d)->(a=Math.sqrt(2*(a+Math.sqrt(a*a+b*b+c*c+d*d))))/2+" "+b/a+" "+c/a+" "+d/a

ท่าเรือ@xnor 's งูหลาม 2 คำตอบ

ลองออนไลน์

คำอธิบาย:

(a,b,c,d)->           // Method with four double parameters and String return-type
  (a=                 //  Change `a` to:
     Math.sqrt(       //   The square root of:
       2*             //    Two times:
         (a+          //     `a` plus,
          Math.sqrt(  //     the square-root of:
            a*a       //      `a`  squared,
            +b*b      //      `b` squared,
            +c*c      //      `c` squared,
            +d*d))))  //      And `d` squared summed together
  /2                  //  Then return this modified `a` divided by 2
  +" "+b/a            //  `b` divided by the modified `a`
  +" "+c/a            //  `c` divided by the modified `a`
  +" "+d/a            //  And `d` divided by the modified `a`, with space delimiters

2

05AB1E , 14 ไบต์

nOtsн+·t©/¦®;š

ท่าเรือ@xnor 's งูหลาม 2 คำตอบ

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

n                 # Square each number in the (implicit) input-list
 O                # Sum them
  t               # Take the square-root of that
   sн+            # Add the first item of the input-list
      ·           # Double it
       t          # Take the square-root of it
        ©         # Store it in the register (without popping)
         /        # Divide each value in the (implicit) input with it
          ¦       # Remove the first item
           ®;     # Push the value from the register again, and halve it
             š    # Prepend it to the list (and output implicitly)


2

C # .NET, 88 ไบต์

(a,b,c,d)=>((a=System.Math.Sqrt(2*(a+System.Math.Sqrt(a*a+b*b+c*c+d*d))))/2,b/a,c/a,d/a)

คำตอบพอร์ตของJava 8ของฉันแต่ส่งคืน Tuple แทน String ฉันคิดว่ามันสั้นกว่านี้ แต่น่าเสียดายที่Math.Sqrtต้องมีSystem-import ใน C # .NET สิ้นสุดที่ 4 ไบต์นานกว่าแทนที่จะสั้นกว่า 10 ไบต์ .. >.>

การประกาศแลมบ์ดานั้นค่อนข้างตลก แต่:

System.Func<double, double, double, double, (double, double, double, double)> f =

ลองออนไลน์


1

Perl 6 , 49 ไบต์

{;(*+@^b>>².sum**.5*i).sqrt.&{.re,(@b X/2*.re)}}

ลองออนไลน์!

Curried f(b,c,d)(a)ฟังก์ชั่นการถ่ายป้อนข้อมูลเป็น a,(b,c,d)ผลตอบแทนที่เป็น quaternion

คำอธิบาย

{;                                             }  # Block returning WhateverCode
     @^b>>².sum**.5     # Compute B of quaternion written as q = a + B*u
                        # (length of vector (b,c,d))
  (*+              *i)  # Complex number a + B*i
                      .sqrt  # Square root of complex number
                           .&{                }  # Return
                              .re,  # Real part of square root
                                  (@b X/2*.re)  # b,c,d divided by 2* real part
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.