쿼터니언 제곱근


11

배경

쿼터니언 은 복소수를 확장하는 숫자 시스템입니다. 쿼터니언의 형식은 다음과 같습니다.

a+bi+cj+dk

여기서 는 실수이고 는 3 개의 기본 쿼터니언 단위 입니다. 단위는 다음과 같은 속성을 갖습니다.a,b,c,di,j,k

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

참고 사원 수의 곱셈은 교환 법칙이 성립하지 않습니다 .

직무

비 리얼 쿼터니언이 주어지면 제곱근 중 적어도 하나를 계산하십시오.

어떻게?

이 Math.SE answer 에 따르면 다음과 같은 형식으로 실제가 아닌 쿼터니언을 표현할 수 있습니다.

q=a+bu

여기서 실수되고 형태 허수 단위 벡터이다 와 . 이러한 는 속성 을 가지므로 허수 단위로 볼 수 있습니다.a,buxi+yj+zkx2+y2+z2=1uu2=1

그런 다음 의 제곱은 다음과 같습니다.q

q2=(a2b2)+2abu

반대로 쿼터니언 주어지면 다음 방정식을 풀어서 제곱근을 찾을 수 있습니다.q=x+yuq

x=a2b2,y=2ab

복소수의 제곱근을 찾는 과정과 동일합니다.

음의 실수는 쿼터니언 제곱근을 무한히 많이 갖지만, 리얼 수가 아닌 쿼터니언은 2 개의 제곱근을 갖습니다 .

입력과 출력

입력은 실제가 아닌 쿼터니언입니다. 선택한 순서와 구조에 따라 4 개의 실수 (부동 소수점) 숫자로 사용할 수 있습니다. 비 실제 란 중 하나 이상 이 0이 아님을 의미합니다.b,c,d

출력은 제곱 할 때 입력과 같은 하나 또는 두 개의 쿼터니언입니다.

테스트 사례

   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는 쿼터니언을 기본적으로 지원합니다. ¯ \ _ (⍨) _ / ¯


4
도와 드릴 수 없습니다 : 답에 "¯_ (ツ) _ / ¯"를 포함시켜야합니다
Barranka

7
당신은 이것을 떨어 뜨 렸습니다
Andrew

@Barranka 완료.
Adám

안드로이드 응용 프로그램에 비난 앤드류 ... :)을 따기 주셔서 감사합니다
Barranka

2
그렇다면 더 좋을 것입니다¯\_(⍨)√¯
Zacharý

8

파이썬 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

온라인으로 사용해보십시오!

원시 수식의 다소간. 목록 이해를 사용하여 반복 할 수 있다고 생각 b,c,d했지만 더 길어 보입니다. 파이썬은 여기서 벡터 연산, 특히 스케일링과 규범이 부족하여 실제로 상처를받습니다.

파이썬 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]]

온라인으로 사용해보십시오!

2 차법을 직접 푸는 것도 문제 설명에서와 같이 파이썬의 복소수 제곱근을 사용하는 것보다 짧았습니다.


"입력은 실수가 아닌 쿼터니언입니다. 선택한 순서와 구조에 상관없이 4 개의 실수 (부동 소수점)로 사용할 수 있습니다." 따라서 팬더 시리즈 또는 numpy 배열이라고 생각할 수 있습니다. 시리즈는 간단한 곱셈으로 스케일링이 가능하며, 같은 표준을 얻는 다양한 방법이 있습니다 (s*s).sum()**.5.
누계


4

자바 스크립트 (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

, 32 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. @xnor의 Python 답변 포트. 설명:

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

입력의 모든 요소를 ​​제곱하고 합을 취한 다음 제곱근을 취하십시오. 이 계산 . 를 더하면 가되며, 2를 두 배로 제곱하면 됩니다.|x+yu|=x2+y2=(a2b2)2+(2ab)2=a2+b2x2a22a

≧∕ηθ

이므로 로 나눠서 를 계산하십시오 .y=2abb2a

§≔θ⁰⊘η

2a

Iθ

값을 문자열로 캐스트하고 내재적으로 인쇄하십시오.


3

자바 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 의 Python 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 의 Python 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 응답의 포트 이지만 String 대신 Tuple을 반환합니다. 나는 그것이 더 짧을 것이라고 생각했지만, 불행히도 C # .NET에서 -import가 Math.Sqrt필요합니다 System.

람다 선언은 꽤 재미있게 보입니다.

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

온라인으로 사용해보십시오.


1

펄 6 , 49 바이트

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

온라인으로 사용해보십시오!

로 입력되는 커리 기능 f(b,c,d)(a). 쿼터니언을로 반환합니다 a,(b,c,d).

설명

{;                                             }  # 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.