Đệ tứ vuông


11

Lý lịch

Đệ tứ là một hệ thống số mở rộng số phức. Một bộ tứ có dạng sau

a+bi+cj+dk

trong đó a,b,c,d là các số thực và i,j,k là ba đơn vị bậc bốn cơ bản . Các đơn vị có các thuộc tính sau:

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

Lưu ý rằng phép nhân bậc bốn không giao hoán .

Bài tập

Cho một tứ phân vị không thực , tính toán ít nhất một trong các căn bậc hai của nó.

Làm sao?

Theo câu trả lời Math.SE này , chúng ta có thể diễn đạt bất kỳ quan điểm không thực nào dưới dạng sau:

q=a+bu

trong đó a,b là các số thực và u là vectơ đơn vị tưởng tượng có dạng xi+yj+zk với x2+y2+z2=1 . Bất kỳ u cũng có thuộc tính u2=1 , vì vậy nó có thể được xem là đơn vị tưởng tượng.

Sau đó, hình vuông của q trông như thế này:

q2=(a2b2)+2abu

Ngược lại, cho một quaternion q=x+yu , chúng ta có thể tìm ra căn bậc hai của q bằng cách giải các phương trình sau

x=a2b2,y=2ab

trùng với quá trình tìm căn bậc hai của một số phức.

Lưu ý rằng một số thực âm có vô số căn bậc hai, nhưng một số tứ không thực chỉ có hai căn bậc hai .

Đầu vào và đầu ra

Đầu vào là một tứ phương không thực. Bạn có thể lấy nó làm bốn số thực (dấu phẩy động), theo bất kỳ thứ tự và cấu trúc nào bạn chọn. Không thực có nghĩa là ít nhất một trong số b,c,d là khác không.

Đầu ra là một hoặc hai bậc bốn, khi bình phương, bằng với đầu vào.

Các trường hợp thử nghiệm

   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

Được tạo bằng tập lệnh Python này . Chỉ một trong hai câu trả lời đúng được chỉ định cho từng trường hợp kiểm tra; khác là tất cả bốn giá trị phủ định.

Ghi điểm & tiêu chí chiến thắng

Luật tiêu chuẩn được áp dụng. Chương trình hoặc hàm ngắn nhất tính theo byte trong mỗi ngôn ngữ sẽ thắng.


Chúng ta có thể lấy tứ phương làm a, (b, c, d)?
nwellnhof

@nwellnhof Chắc chắn rồi. Ngay cả một cái gì đó giống như a,[b,[c,[d]]]là tốt, nếu bạn bằng cách nào đó có thể lưu byte với nó :)
Bubbler

Câu trả lời:


29

APL (NARS) , 2 byte

NARS đã tích hợp hỗ trợ cho các bộ tứ. ¯ \ _ (⍨) _ /


4
Tôi không thể giúp nó: bạn nên bao gồm "¯_ (ツ) _ /" trong câu trả lời của bạn
Barranka

7
Bạn đã đánh rơi cái này \
Andrew

@Barranka Xong.
Adám

@Andrew đổ lỗi cho ứng dụng Android ... Cảm ơn bạn đã chọn nó :)
Barranka 16/11/18

2
Sẽ tốt hơn nếu nó¯\_(⍨)√¯
Zacharý 16/11/18

8

Python 2 , 72 byte

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

Hãy thử trực tuyến!

Nhiều hơn hoặc ít hơn một công thức thô. Tôi nghĩ rằng tôi có thể sử dụng sự hiểu biết danh sách để lặp đi lặp lại b,c,d, nhưng điều này dường như dài hơn. Python thực sự bị tổn thương ở đây do thiếu các hoạt động véc tơ, đặc biệt là tỷ lệ và quy mô.

Python 3 , 77 byte

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

Hãy thử trực tuyến!

Việc giải trực tiếp bậc hai cũng ngắn hơn so với sử dụng căn bậc hai số phức của Python để giải quyết nó như trong câu lệnh vấn đề.


"Đầu vào là một tứ phân vị không có thực. Bạn có thể lấy nó làm bốn số thực (dấu phẩy động), theo bất kỳ thứ tự và cấu trúc nào bạn chọn." Vì vậy, bạn có thể coi nó là một loạt gấu trúc hoặc mảng numpy. Sê-ri có tỷ lệ với phép nhân đơn giản, và có nhiều cách khác nhau để có được định mức, chẳng hạn như (s*s).sum()**.5.
Tích lũy


4

JavaScript (ES7), 55 53 byte

Dựa trên công thức trực tiếp được sử dụng bởi xnor .

Đưa đầu vào như một mảng.

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

Hãy thử trực tuyến!

Làm sao?

Cho một mảng q= =[một,b,c,d], điều này tính toán:

x= =một+một2+b2+c2+d22

Và trả lại:

[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 byte

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

Hãy thử trực tuyến!

Một công thức trực tiếp. Thủ thuật chính để thể hiện phần thực của đầu ra là r/sqrt(r*2)song song với biểu thức phần ảo, giúp tiết kiệm một vài byte:

54 byte

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

Hãy thử trực tuyến!


3

Than , 32 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Cổng câu trả lời Python của @ xnor. Giải trình:

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

Bình phương tất cả các phần tử của đầu vào và lấy tổng, sau đó lấy căn bậc hai. Điều này tính toán|x+ybạn|= =x2+y2= =(một2-b2)2+(2mộtb)2= =một2+b2. Thêmx cho 2một2 mà sau đó được nhân đôi và căn bậc hai để cung cấp 2một.

≧∕ηθ

Bởi vì y= =2mộtb, tính toán b bằng cách chia cho 2một.

§≔θ⁰⊘η

Đặt phần tử đầu tiên của mảng (tức là phần thực) thành một nửa 2một.

Iθ

Truyền các giá trị thành chuỗi và in ngầm.


3

Java 8, 84 byte

(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

Cổng câu trả lời Python 2 của @xnor .

Hãy thử trực tuyến.

Giải trình:

(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 byte

nOtsн+·t©/¦®;š

Cổng câu trả lời Python 2 của @xnor .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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 byte

(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)

Cổng câu trả lời Java 8 của tôi , nhưng trả về một Tuple thay vì Chuỗi. Tôi nghĩ rằng nó sẽ ngắn hơn, nhưng thật không may, Math.Sqrtyêu cầu một System-import trong C # .NET, kết thúc dài hơn 4 byte thay vì ngắn hơn 10 byte ..>.>

Tuyên bố lambda trông khá buồn cười, mặc dù:

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

Hãy thử trực tuyến.


1

Perl 6 , 49 byte

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

Hãy thử trực tuyến!

Hàm curried lấy đầu vào là f(b,c,d)(a). Trả về tứ phương như a,(b,c,d).

Giải trình

{;                                             }  # 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.