Karmaşık sayıların üssü


10

Negatif, sıfır veya pozitif olabilecek iki tamsayı göz önüne alındığında ave b( düz karmaşık bir sayı girilmesi de dahil olmak üzere herhangi bir makul formatta alınır ), onu hayali sayı olan a + biyere i(negatif olanın karekökü) dönüştürün. Daha sonra, üçüncü bir (pozitif tamsayı) giriş değişkeni gücüne yükseltmek ciçin . Sonunda böyle bir şeyle sonuçlanmalısın . Daha sonra çıktı almanız veya geri dönmeniz ve herhangi bir makul biçimde ( düz karmaşık bir sayının çıktısı dahil) girmeniz gerekir .(a + bi)cd + eide

Giriş ve çıkış herhangi bir sırada alınabilir veya çıkarılabilir.

Örnekler:

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

De Moivre'nin formülünü kullanırsak, kayan nokta belirsizliğine izin verilir mi?
Giuseppe

@Giuseppe Evet, sorun değil.
Okx

4
FWIW Kurallardaki değişikliğin (tamamen esnek bir G / Ç'ye izin vererek) oldukça ilginç bir zorluk yarattığını düşünüyorum.
Jonathan Allan

@JonathanAllan en azından yerel karmaşık sayı desteği olan diller için - oldukça fazla :(
Felix Palmen

Yanıtlar:




4

Javascript (ES6), 51 50 bayt

a=>b=>g=c=>c?([x,y]=g(c-1),[x*a-b*y,a*y+b*x]):"10"
  • Körili formda girdi alır: f(a)(b)(c)
  • Sonucu bir dizi olarak döndürür: [d, e]

açıklama

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

Aslında 1 bayt

Çevrimiçi deneyin!

Kuralların değiştiğini ve karmaşık sayıların geçerli G / Ç türleri olduğunu unutmayın (maalesef bu, yazıyı "bu üslendirme yap" zorluğuna dönüştürür). Orijinal cevap aşağıda.

Aslında 3 bayt

Çⁿ╫

Çevrimiçi deneyin!

Yeni satırla ayrılmış değerleri döndürür. Girişleri ters sırada alır ve sonuçları ters sırada döndürür (tio bağlantısına bakınız).

Çⁿ╫ - Tam program. Ters girişler.

Ç - a + bi döndür.
 ⁿ - Üstelleştirme.
  ╫ - a'nın gerçek ve hayali kısımlarını iter.

3

Jöle , 1 bayt

*

Çevrimiçi deneyin!

Bay Xcoder'a kural güncellemelerini bildirdiği için teşekkürler (sonuç olarak -6). Birisi bana kural güncellemelerini uyardığı için
teşekkürler (sonuç olarak -2).

Birinci bağımsız değişken: (a+bj)
İkinci bağımsız değişken: c
Döndürür:(d+ej)




Aslında Jonathan'ın 3 byter'ı yeterli olurdu; ḅı*, kurallar değiştikçe ve artık düz karmaşık bir sayı vermenize izin verilmektedir.
Bay Xcoder

@ Mr.Xcoder bu olduğunda uyuyordu
Outgolfer Erik

1
Bir kompleks olarak girdi alabileceğiniz gibi * onebyter şimdi ok gibi görünüyor
zamirim monicareinstate

3

R , 3 bayt

Bu sıkıcı bir hal alıyor. Giriş ve çıkışa karmaşık bir sayı olarak izin verilirse, bir güç işlevi için bir yerleşik vardır.

`^`

Örneğin:

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

veya

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

2

05AB1E , 20 19 17 16 bayt

‚UTSsFXâP`(‚RŠ‚+

Çevrimiçi deneyin! Sırayla üç ayrı girdi alır b, a, cve bir dizi çıkarır [d, e]. Düzenleme: @Datboi sayesinde 2 bayt kaydedildi. @Adnan sayesinde 1 bayt kaydedildi. Açıklama:

‚                   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]

Giriş ve çıkış herhangi bir sırada alınabilir veya çıkarılabilir. - Bu, ilk iki girişi ters sırada alabileceğiniz anlamına gelir.
Bay Xcoder

@ Mr.Xcoder Teşekkürler, bunu fark etmemiştim.
Neil

Önemli olup olmadığından emin değilim, ancak sayıyı hesaplamak da yapılabilir 'jì+³m.
Adnan

-2 bayt 1 0‚ile değiştirebilirsiniz TS:)
Datboi

Ve Potomatik olarak vektörleşir, böylece ihtiyacınız yoktur .
Adnan


2

Pyth, 5 12 5 2 bayt

^E

İçinde Alır cilk izledi a+bj.

Görünüşe göre hayali bir sayı olarak çıktıya izin verilmediğinden 7 bayt kazan plakası. Yeniden izin verildi! Yaşa! Ve karmaşık bir sayıyı makul bir girdi olarak alarak, 3 bayt daha kesebiliriz!

Önceki çözümler:

^.jEE

Karmaşık sayılar makul girdiler olmadığında.

m,edsd]^.jEE

Karmaşık sayılar makul çıktılar olmadığında.

Test odası.



2

J, 10 , 7 , 1 bayt s

^

Alır csağ argüman ve karmaşık sayı olarak ajb(temsil ettiğiniz ne a + bisol argüman olarak J).

Çevrimiçi deneyin!

Diğer Çözümler

7 bayt

Karmaşık sayı girişini liste olarak alır.

^~j./@]

10 bayt

Bu a + bilistede çıktı a b.

+.@^~j./@]

Sevimli bir şey denemek istedim ^~&.(j./)ama tersi j./belli değil. Aslında, ^~&.(+.inv)çalışır ve ^&.(+.inv)argümanları aldığınız sırayı tersine çevirirseniz, 10 bayt olanı da yapabilirsiniz .


2

TI-BASIC, 25 22 8 bayt

Karmaşık sayı ve üssü girdi olarak alır ve çıktıyı Anskarmaşık sayı olarak saklar . Giriş / çıkıştaki kısıtlamaların gevşemesi nedeniyle baytlarda büyük düşüş.

Prompt C,E
C^E

imag({iAns,AnsSon satırda ile 2 bayt kaydedebilirsiniz ( iyani karmaşık sayı i ).
Misha Lavrov

1
Ve sanırım iki satırı birleştirerek bir bayt daha imag({i,1}(A+Bi)^C.
Misha Lavrov

1
Kurallar değişti, şimdi herhangi bir yardım varsa giriş alabilir ve karmaşık sayıları döndürebilirsiniz.
Outgolfer Erik

2

6502 makine kodu alt yordam, 199 187 185 bayt

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
  • Geliştirilmiş "spagetti" yapısına sahip -12 bayt
  • -2 bayt üs geçmek için kaydı değiştirir, böylece ilk kopya döngüsünde sıfır adresleme modunu kullanabiliriz

Bu konumdan bağımsız bir koddur, sadece RAM'de bir yere koyun ve bir jsrtalimatla çağırın .

Rutin (karmaşık) tabanı, $fb/$fc(gerçek) ve $fd/$fe(hayali) içinde iki 16 bit işaretli tam sayı (2'nin tamamlayıcısı, küçük-endian) ve Ykayıtta işaretsiz bir 8 bit tam sayı olarak alır .

Sonuç $26/$27(gerçek) ve $28/$29(hayali) olarak döndürülür .


açıklama

Bu, 6502 CPU'da hala ilginç bir zorluktur, çünkü çarpma için bile talimat yoktur. Yaklaşım basittir, karmaşık bir çarpımı uygular ve üssün gerektirdiği sıklıkta uygular. Golf, alt rutinlerden kaçınarak yapılır, bunun yerine bir çeşit "dal spagetti" yaratılır, böylece birden çok kez ihtiyaç duyulan basit bir 16 bit çarpma kodu mümkün olan en düşük ek yük ile yeniden kullanılır. Yorum yapılan sökme:

 .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

Kullanan örnek program (C64, ca65- syntax içindeki montaj kaynağı ):

.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

Çevrimiçi demo

Kullanımı: sys49152,[a],[b],[c] Örneğin sys49152,5,2,2(Çıktı: 21+20i)


1

Dyalog APL , 10 bayt

⎕*⍨⊣+¯11○⊢

Çevrimiçi deneyin!

asol argüman, bsağ argüman ve cgiriş istemi.

Biçimdeki karmaşık bir sayıyı döndürür dJe.


Kurallar değişti, şimdi herhangi bir yardım varsa giriş alabilir ve karmaşık sayıları döndürebilirsiniz.
Outgolfer Erik

1

MATL , 1 bayt

^

Girdiler vardır a+jb, c.

Çevrimiçi deneyin!

Eski sürüm: karmaşık olmayan giriş ve çıkış, 8 bayt

J*+i^&Zj

Girdi emirdir b, a, c.

Çevrimiçi deneyin!

açıklama

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

Örtülü girdi ile çarpma b - Örtülü girdi ekle b . Bunlardan herhangi birinde a mı demek istediniz ?
Bay Xcoder

@ Mr.Xcoder Evet, teşekkürler. Düzeltildi
Luis Mendo

Şimdi karmaşık sayı biçiminde girdi alabilir ve karmaşık sayı biçiminde çıktı alabilirsiniz. Muhtemelen bu cevaptan çok sayıda kaynatma plakası kesebilirsiniz.
Steven H.15

@StevenHewitt Teşekkürler! Şimdi düzenlendi
Luis Mendo


0

8 , 38 bayt

kod

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

SED (Yığın Etkisi Şeması):c a b -- (a + bi) ^ c

Uyarı : a + bibırakılır r-yığını , ancak bu sonraki hesaplamalar etkilemez.

Yorumları olmayan yorumlanmamış sürüm

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
;

Örnek ve kullanım

: 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
;

Önceki kodun çıktısı

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 bayt

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

Dene

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

Dene

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

Dene

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

Dene

Çıktı kısıtlamalarının değiştirilmesi ile daha da azaltılabilir:

(*+* *i)***

Dene

***Bölüm olarak ayrıştırılır ** *çünkü **infix operatörü daha uzundur *infix operatörü.

Expanded:

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

Şimdi yapabilirsiniz (*+* *i)***.
totallyhuman

0

R, 25 bayt

en basit - çıkış kompleksine izin verildiğinden.

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

0

Casio-Basic, 6 bayt

a^b

Karmaşık sayılar olarak giriş ve çıkışa izin vermek için kuralları değiştirin, bunu önemli ölçüde kısaltın.

Fonksiyon için 3 bayt a,b, parametre kutusuna girmek için +3 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.