Số mũ của số phức


10

Cho hai số nguyên, có thể là tiêu cực, bằng không, hoặc tích cực, ab(thực hiện trong bất kỳ định dạng hợp lý, bao gồm cả nhập một số phức đồng bằng ), chuyển nó sang a + binơi ilà số ảo (căn bậc hai của một âm). Sau đó, nâng nó lên sức mạnh của biến đầu vào thứ ba (số nguyên dương), cnhư . Sau đó bạn nên kết thúc với một cái gì đó như . Sau đó, bạn phải xuất hoặc trả lại và ở bất kỳ định dạng hợp lý nào ( bao gồm xuất ra một số phức đơn giản ).(a + bi)cd + eide

Đầu vào và đầu ra có thể được lấy hoặc xuất ra theo thứ tự bất kỳ.

Ví dụ:

5, 2, 2 -> 21, 20
1, 4, 2 -> -15, 8
-5, 0, 1 -> -5, 0

Nếu chúng ta sử dụng công thức của de Moivre, liệu dấu phẩy động có được phép không?
Giuseppe

@Giuseppe Vâng, không sao đâu.
Okx

4
FWIW Tôi nghĩ rằng việc thay đổi các quy tắc (cho phép I / O hoàn toàn linh hoạt) đã tạo ra một thử thách khá thú vị khá buồn tẻ.
Jonathan Allan

@Jonathan ALLan ít nhất là đối với các ngôn ngữ có hỗ trợ số phức riêng - khá nhiều :(
Felix Palmen

Câu trả lời:




4

Javascript (ES6), 51 50 byte

a=>b=>g=c=>c?([x,y]=g(c-1),[x*a-b*y,a*y+b*x]):"10"
  • Có đầu vào ở dạng cà ri: f(a)(b)(c)
  • Trả về kết quả dưới dạng một mảng: [d, e]

Giải trình

a=>b=>g=c=>               // Input in currying syntax
    c?(                   // If `c` != 0:
        [x,y]=g(c-1),     //     Set [x, y] to the result of f(a)(b)(c-1)
        [x*a-b*y,a*y+b*x] //     Return (a + bi) * (x + yi)
    ):                    // Else: (when c = 0)
        "10"              //     Return [1, 0] (to end the recursion)

f=a=>b=>g=c=>c?([x,y]=g(c-1),[x*a-b*y,a*y+b*x]):"10"
<div oninput="o.innerText=f(a.value)(b.value)(c.value)"><input id=a type=number value=0><input id=b type=number value=0><input id=c type=number value=1 min=1><pre id=o>



3

Trên thực tế , 1 byte

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

Lưu ý rằng các quy tắc đã thay đổi và số phức là loại I / O hợp lệ (không may điều này biến bài đăng thành một thách thức "thực hiện phép lũy thừa" này). Câu trả lời gốc dưới đây.

Trên thực tế , 3 byte

Çⁿ╫

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

Trả về các giá trị được phân tách bằng một dòng mới. Đưa các đầu vào theo thứ tự ngược lại và trả về kết quả theo thứ tự ngược lại (Xem liên kết tio).

Çⁿ╫ - Chương trình đầy đủ. Đảo ngược đầu vào.

Ç - Trả về a + bi.
 ⁿ - lũy thừa.
  ╫ - Đẩy phần thực và phần ảo của a.

3

Thạch , 1 byte

*

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

Cảm ơn ông Xcoder đã cảnh báo tôi về các cập nhật quy tắc (kết quả là -6).
Cảm ơn ai đó đã cảnh báo tôi về các cập nhật quy tắc (kết quả là -2).

Đối số thứ nhất: Đối số (a+bj)
thứ hai: c
Trả về:(d+ej)




Trong thực tế, 3 byter Jonathan sẽ đủ; ḅı*, vì các quy tắc đã thay đổi và bây giờ bạn được phép xuất một số phức đơn giản.
Ông Xcoder

@ Mr.Xcoder đang ngủ khi điều đó xảy ra
Erik the Outgolfer 15/10/17

1
Có vẻ như * onwardster hiện đã ổn vì bạn có thể lấy đầu vào là một phức tạp
đại từ của tôi là monicareinstate

3

R , 3 byte

Điều này đang trở nên nhàm chán. Nếu đầu vào và đầu ra được cho phép là một số phức, thì có một hàm dựng sẵn cho một hàm nguồn.

`^`

Ví dụ:

> (5+2i)^2
[1] 21+20i
> (1+4i)^2
[1] -15+8i
> (-5+0i)^1
[1] -5+0i

hoặc là

> `^`(5+2i,2)
[1] 21+20i
> `^`(1+4i,2)
[1] -15+8i
> `^`(-5+0i,1)
[1] -5+0i

2

05AB1E , 20 19 17 16 byte

‚UTSsFXâP`(‚RŠ‚+

Hãy thử trực tuyến! Có ba đầu vào riêng biệt theo thứ tự b, a, cvà xuất ra một mảng [d, e]. Chỉnh sửa: Đã lưu 2 byte nhờ @Datboi. Đã lưu 1 byte nhờ @Adnan. Giải trình:

‚                   Join a and b into a pair
 U                  Store in variable X
  T                 Push 10 to the stack
   S                Split into the pair [d, e] = [1, 0]
    s               Swap with c
     F              Repeat the rest of the program c times
      X             Get [a, b]
       â            Cartesian product with [d, e]
        P           Multiply each pair together [da, db, ea, eb]
         `          Push each product as a separate stack entry
          (         Negate eb
           ‚        Join with ea into a pair [ea, -eb]
            R       Reverse the pair [-eb, ea]
             Š      Push under da and db
              ‚     Join them into a pair [da, db]
               +    Add the two pairs [da-eb, db+ea]

Đầu vào và đầu ra có thể được lấy hoặc xuất ra theo thứ tự bất kỳ. - Điều đó có nghĩa là bạn có thể lấy hai đầu vào đầu tiên theo thứ tự ngược lại.
Ông Xcoder

@ Mr.Xcoder Cảm ơn, tôi đã không nhận thấy điều đó.
Neil

Tôi không chắc nó có quan trọng hay không, nhưng tính toán số lượng cũng có thể được thực hiện 'jì+³m.
Ad Nam

Bạn có thể thay thế 1 0‚bằng TS-2 byte :)
Datboi

Ptự động vector hóa, vì vậy bạn không cần .
Ad Nam


2

Bình thường, 5 12 5 2 byte

^E

Đưa vào cđầu tiên, tiếp theo a+bj.

7 byte soạn sẵn vì rõ ràng đầu ra dưới dạng số ảo không được phép. Nó đã được cho phép lại! Tiếng hoan hô! Và với việc lấy một số phức là đầu vào hợp lý, chúng ta có thể cắt ra thêm 3 byte!

Giải pháp trước đây:

^.jEE

Khi số phức không phải là đầu vào hợp lý.

m,edsd]^.jEE

Khi số phức không phải là đầu ra hợp lý.

Phòng thử nghiệm.



2

J, 10 , 7 , 1 byte s

^

Lấy cđúng đối số và số phức ajb(cách bạn biểu diễna + bi trong J) làm đối số bên trái.

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

Giải pháp khác

7 byte

Lấy đầu vào số phức làm danh sách.

^~j./@]

10 byte

Điều này xuất ra a + bitrong danh sách a b.

+.@^~j./@]

Tôi muốn thử một cái gì đó dễ thương như thế ^~&.(j./)nhưng ngược lại j./rõ ràng là không được xác định. Trên thực tế, ^~&.(+.inv)hoạt động và bạn có thể tạo ra ^&.(+.inv)đó cũng là 10 byte nếu bạn đảo ngược thứ tự mà bạn lấy các đối số.


2

TI-BASIC, 25 22 8 byte

Lấy số phức và số mũ làm đầu vào và lưu trữ đầu ra Ansdưới dạng số phức. Giảm mạnh byte do các hạn chế nới lỏng về đầu vào / đầu ra.

Prompt C,E
C^E

Bạn có thể lưu 2 byte với imag({iAns,Ansdòng cuối cùng ( iý tôi là số phức i ).
Misha Lavrov

1
Và tôi đoán sau đó thêm một byte bằng cách kết hợp hai dòng vào imag({i,1}(A+Bi)^C.
Misha Lavrov

1
Các quy tắc đã thay đổi, bây giờ bạn có thể lấy đầu vào và trả về các số phức, nếu đó là bất kỳ trợ giúp.
Erik the Outgolfer

2

Chương trình con mã máy 6502 , 199 187 185 byte

A2 03 B5 FB 95 26 CA 10 F9 88 D0 01 60 A5 26 85 61 A5 27 85 62 A5 FB 85 63 A5
FC 85 64 A9 20 85 6F D0 36 18 A5 6D 65 65 85 28 A5 6E 65 66 85 29 A5 4B 85 26
A5 4C 85 27 50 CF 38 A5 6D E5 65 85 4B A5 6E E5 66 85 4C A5 28 85 61 A5 29 85
62 A5 FB 85 63 A5 FC 85 64 06 6F A9 00 85 65 85 66 A2 10 46 62 66 61 90 0D A5
63 18 65 65 85 65 A5 64 65 66 85 66 06 63 26 64 CA 10 E6 A9 FF 24 6F 70 B9 30
02 F0 9E A5 65 85 6D A5 66 85 6E 24 6F 30 14 A5 28 85 61 A5 29 85 62 A5 FD 85
63 A5 FE 85 64 06 6F D0 B4 A5 26 85 61 A5 27 85 62 A5 FD 85 63 A5 FE 85 64 06
6F B0 A0
  • -12 byte với cấu trúc "spaghetti" được cải thiện
  • -2 byte thay đổi thanh ghi để vượt qua số mũ, vì vậy chúng ta có thể sử dụng chế độ địa chỉ zeropage trong vòng lặp sao chép ban đầu

Đây là mã độc lập với vị trí, chỉ cần đặt nó ở đâu đó trong RAM và gọi nó bằng một jsr lệnh.

Thường trình lấy cơ sở (phức tạp) làm hai số nguyên có ký hiệu 16 bit (phần bù 2, phần cuối nhỏ) trong $fb/$fc(thực) và $fd/$fe(tưởng tượng) và số mũ dưới dạng số nguyên 8 bit không dấu trongY ghi.

Kết quả được trả về trong $26/$27(thực) và $28/$29(tưởng tượng).


Giải trình

Đây vẫn là một thách thức thú vị trên CPU 6502 vì không có hướng dẫn nào để nhân lên. Cách tiếp cận là thẳng tiến, thực hiện một phép nhân phức tạp và thực hiện nó thường xuyên theo yêu cầu của số mũ. Chơi golf được thực hiện bằng cách tránh các chương trình con, thay vào đó tạo ra một loại "spaghetti chi nhánh", do đó, mã để thực hiện phép nhân 16 bit đơn giản cần nhiều lần được sử dụng lại với chi phí thấp nhất có thể. Đây là phần tháo gỡ nhận xét:

 .cexp:
A2 03       LDX #$03            ; copy argument ...
 .copyloop:
B5 FB       LDA $FB,X
95 26       STA $26,X
CA          DEX
10 F9       BPL .copyloop       ; ... to result
 .exploop:
88          DEY                 ; decrement exponent
D0 01       BNE .mult           ; zero reached -> done
60          RTS
 .mult:                         ; multiply (complex) result by argument
A5 26       LDA $26             ; prepare to multiply real components
85 61       STA $61             ; (a*c)
A5 27       LDA $27
85 62       STA $62
A5 FB       LDA $FB
85 63       STA $63
A5 FC       LDA $FC
85 64       STA $64
A9 20       LDA #$20            ; marker for where to continue
85 6F       STA $6F
D0 36       BNE .mult16         ; branch to 16bit multiplication
 .mult5:
18          CLC                 ; calculate sum (a*d) + (b*c)
A5 6D       LDA $6D
65 65       ADC $65
85 28       STA $28             ; and store to imaginary component of result
A5 6E       LDA $6E
65 66       ADC $66
85 29       STA $29
A5 4B       LDA $4B             ; load temporary result (a*c) - (b*d)
85 26       STA $26             ; and store to real component of result
A5 4C       LDA $4C
85 27       STA $27
50 CF       BVC .exploop        ; next exponentiation step
 .mult3:
38          SEC                 ; calculate difference (a*c) - (b*d)
A5 6D       LDA $6D
E5 65       SBC $65
85 4B       STA $4B             ; and store to temporary location
A5 6E       LDA $6E
E5 66       SBC $66
85 4C       STA $4C
A5 28       LDA $28             ; prepare to multiply real component of result
85 61       STA $61             ; with imaginary component of argument
A5 29       LDA $29             ; (a*d)
85 62       STA $62
A5 FB       LDA $FB
85 63       STA $63
A5 FC       LDA $FC
85 64       STA $64
06 6F       ASL $6F             ; advance "continue marker"
 .mult16:
A9 00       LDA #$00            ; initialize 16bit multiplication
85 65       STA $65             ; result with 0
85 66       STA $66
A2 10       LDX #$10            ; bit counter (16)
 .m16_loop:
46 62       LSR $62             ; shift arg1 right
66 61       ROR $61
90 0D       BCC .m16_noadd      ; no carry -> nothing to add
A5 63       LDA $63             ; add arg2 ...
18          CLC
65 65       ADC $65
85 65       STA $65
A5 64       LDA $64
65 66       ADC $66
85 66       STA $66             ; ... to result
 .m16_noadd:
06 63       ASL $63             ; shift arg2 left
26 64       ROL $64
CA          DEX                 ; decrement number of bits to go
10 E6       BPL .m16_loop
A9 FF       LDA #$FF            ; check marker for where to continue
24 6F       BIT $6F
70 B9       BVS .mult3
30 02       BMI .saveres        ; have to save result to temp in 2 cases
F0 9E       BEQ .mult5
 .saveres:
A5 65       LDA $65             ; save result to temporary
85 6D       STA $6D
A5 66       LDA $66
85 6E       STA $6E
24 6F       BIT $6F             ; check "continue marker" again
30 14       BMI .mult4
 .mult2:
A5 28       LDA $28             ; prepare to multiply imaginary components
85 61       STA $61             ; (b*d)
A5 29       LDA $29
85 62       STA $62
A5 FD       LDA $FD
85 63       STA $63
A5 FE       LDA $FE
85 64       STA $64
06 6F       ASL $6F             ; advance "continue marker"
D0 B4       BNE .mult16         ; branch to 16bit multiplication
 .mult4:
A5 26       LDA $26             ; prepare to multiply imaginary component of
85 61       STA $61             ; result with real component of argument
A5 27       LDA $27             ; (b*c)
85 62       STA $62
A5 FD       LDA $FD
85 63       STA $63
A5 FE       LDA $FE
85 64       STA $64
06 6F       ASL $6F             ; advance "continue marker"
B0 A0       BCS .mult16         ; branch to 16bit multiplication

Ví dụ chương trình sử dụng nó (C64, nguồn lắp ráp trong ca65 -syntax):

.import cexp

CEXP_A          = $fb
CEXP_AL         = $fb
CEXP_AH         = $fc
CEXP_B          = $fd
CEXP_BL         = $fd
CEXP_BH         = $fe

CEXP_RA         = $26
CEXP_RAL        = $26
CEXP_RAH        = $27
CEXP_RB         = $28
CEXP_RBL        = $28
CEXP_RBH        = $29

.segment "LDADDR"
                .word   $c000

.segment "MAIN"
                jsr     $aefd           ; consume comma
                jsr     $ad8a           ; evaluate number
                jsr     $b1aa           ; convert to 16bit int
                sty     CEXP_AL         ; store as first argument
                sta     CEXP_AH
                jsr     $aefd           ; ...
                jsr     $ad8a
                jsr     $b1aa
                sty     CEXP_BL         ; store as second argument
                sta     CEXP_BH
                jsr     $b79b           ; read 8bit unsigned into X
                txa                     ; and transfer
                tay                     ; to Y

                jsr     cexp            ; call our function

                lda     CEXP_RAH        ; read result (real part)
                ldy     CEXP_RAL
                jsr     numout          ; output
                ldx     CEXP_RBH        ; read result (imaginary part)
                bmi     noplus
                lda     #'+'            ; output a `+` if it's not negative
                jsr     $ffd2
noplus:         txa
                ldy     CEXP_RBL
                jsr     numout          ; output (imaginary part)
                lda     #'i'
                jsr     $ffd2           ; output `i`
                lda     #$0d            ; and newline
                jmp     $ffd2

numout:
                jsr     $b391           ; convert to floating point
                jsr     $bddd           ; format floating point as string
                ldy     #$01
numout_loop:    lda     $ff,y           ; output loop
                bne     numout_print    ; until 0 terminator found
                rts
numout_print:   cmp     #' '            ; skip space characters in output
                beq     numout_next
                jsr     $ffd2
numout_next:    iny
                bne     numout_loop

Bản demo trực tuyến

Cách sử dụng : sys49152,[a],[b],[c] , ví dụ sys49152,5,2,2(Đầu ra 21+20i:)


1

APL Dyalog , 10 byte

⎕*⍨⊣+¯11○⊢

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

alà đối số bên trái, blà đối số bên phải và cthông qua dấu nhắc nhập.

Trả về một số phức trong định dạng dJe.


Các quy tắc đã thay đổi, bây giờ bạn có thể lấy đầu vào và trả về các số phức, nếu đó là bất kỳ trợ giúp nào.
Erik the Outgolfer

1

MATL , 1 byte

^

Đầu vào là a+jb, c.

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

Phiên bản cũ: đầu vào và đầu ra không phức tạp, 8 byte

J*+i^&Zj

Trật tự đầu vào là b, a, c.

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

Giải trình

J           Push imaginary unit
 *          Multiply by implicit input b
  +         Add implicit input a
   i        Take input c
    ^       Power
     &Zj    Push real and imaginary parts. Implicitly display

Nhân với đầu vào ẩn b - Thêm đầu vào ẩn b . Bạn có nghĩa là một trong những người đó?
Ông Xcoder

@ Mr.Xcoder Vâng, cảm ơn. Đã sửa
Luis Mendo

Bây giờ bạn có thể lấy đầu vào ở dạng số phức và đầu ra ở dạng số phức. Có lẽ bạn có thể cắt ra rất nhiều cái nồi hơi từ câu trả lời này vì điều đó.
Steven H.

@StevenHewitt Cảm ơn! Đã chỉnh sửa ngay bây giờ
Luis Mendo


0

8 , 38 byte

c:new dup >r ( r@ c:* ) rot n:1- times

SED (Sơ đồ hiệu ứng ngăn xếp) là:c a b -- (a + bi) ^ c

Cảnh báo : a + biđược để lại trên r-stack , nhưng điều này không ảnh hưởng đến các tính toán tiếp theo.

Phiên bản Ungolfed với ý kiến

needs math/complex

: f \ c a b  -- (a + bi) ^ c
    c:new                      \ create a complex number from a and b
    dup                        \ duplicate a + bi
    >r                         \ store a + bi on r-stack
    ( r@ c:* ) rot n:1- times  \ raise ( a + bi ) to c
;

Ví dụ và cách sử dụng

: app:main
    \ rdrop is not strictly required
    2 5 2 f . cr rdrop
    2 1 4 f . cr rdrop 
    1 -5 0 f . cr rdrop 
    bye
;

Đầu ra của mã trước

c:1:data:{"real":21,"imag":20}
c:1:data:{"real":-15,"imag":8}
c:2:data:{"real":-5,"imag":0}


0

Perl 6 ,  29 26 20 19  11 byte

{$_=($^a+$^b*i)**$^c;.re,.im}

Thử nó

{(($^a+$^b*i)**$^c).reals}

Thử nó

((*+* *i)** *).reals

Thử nó

((*+* *i)***).reals

Thử nó

Với sự thay đổi của các hạn chế đầu ra, nó có thể được giảm thêm:

(*+* *i)***

Thử nó

Phần ***được phân tích cú pháp ** ***toán tử infix dài hơn *toán tử infix.

Mở rộng:

#     __________________ 1st parameter
#    /   _______________ 2nd parameter
#   /   /         ______ 3rd parameter
#  /   /         /
# V   V         V
( * + * * i) ** *
#       ^    ^^
#        \     \________ exponentiation
#         \_____________ multiplication

Bây giờ bạn có thể làm (*+* *i)***.
hoàn toàn là

0

R, 25 byte

đơn giản nhất - kể từ khi xuất ra phức tạp được cho phép.

function(a,b,c)(a+b*1i)^c

0

Casio-Basic, 6 byte

a^b

Thay đổi các quy tắc để cho phép đầu vào và đầu ra dưới dạng số phức làm cho việc này ngắn hơn đáng kể.

3 byte cho hàm, +3 để nhập a,bvào hộp tham số.

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.