Експонент складних чисел


10

Дано два цілих числа, які можуть бути від'ємними, нульовими або додатними aі b(прийняті в будь-якому розумному форматі, включаючи введення простого комплексного числа ), перетворіть його туди, a + biде iє уявне число (квадратний корінь від’ємного). Потім підняти його потужності змінної вхідного третього (ціле позитивне число), cщоб . Тоді ви повинні закінчити щось подібне . Ви повинні потім вихід, або повернення, і в будь-якому зручному форматі ( включаючи висновок простий комплексне число ).(a + bi)cd + eide

Вхід і вихід можуть бути прийняті або виведені в будь-якому порядку.

Приклади:

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

Якщо ми використовуємо формулу де Моєрра, чи допускається неточність з плаваючою точкою?
Джузеппе

@Giuseppe Так, це нормально.
Okx

4
FWIW Я думаю, що зміна правил (що дозволяють повністю гнучко вводити-виводити) зробило досить цікавим завданням досить тупим.
Джонатан Аллан

@JonathanAllan принаймні для мов із підтримкою рідного складного числа - яких досить багато :(
Фелікс Палмен

@JonathanAllan Я не можу порадувати всіх :(
Okx

Відповіді:


7

Математика, 17 байт

ReIm[(#+#2I)^#3]&

Спробуйте в Інтернеті!

-8 байт з алефальфи

але ........ правила змінилися ...... так

Математика, 5 байт

Power

5
{Re@#,Im@#}&->ReIm
алефальфа

1
17 байт . Ви можете просто видалити @#&.
Містер Xcoder

ха-ха, так, моя помилка
J42161217

Тепер ви можете робити #^#2&чи просто Power.
повністюлюдський

6

Python 3 , 3 байти

pow

Спробуйте в Інтернеті!

Введення та вихід у вигляді складних чисел.


Python 3 , 47 байт

def f(a,b,c):n=(a+b*1j)**c;return n.real,n.imag

Спробуйте в Інтернеті!

Введення та вихід у вигляді цілих чисел


Python 2 , 62 60 байт

-2 байти завдяки @Leonhard

a,b,c=input();d=1;e=0
exec'd,e=a*d-b*e,a*e+b*d;'*c
print d,e

Спробуйте в Інтернеті!

не використовує складний тип числа


4

Javascript (ES6), 51 50 байт

a=>b=>g=c=>c?([x,y]=g(c-1),[x*a-b*y,a*y+b*x]):"10"
  • Приймає введення у вигляді кашлю: f(a)(b)(c)
  • Повертає результат у вигляді масиву: [d, e]

Пояснення

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

Власне , 1 байт

Спробуйте в Інтернеті!

Зауважте, що правила змінилися і складні числа є дійсними типами вводу-виводу (на жаль, це перетворює публікацію у виклик "виконати цю експоненцію"). Оригінальна відповідь нижче.

Власне , 3 байти

Çⁿ╫

Спробуйте в Інтернеті!

Повертає значення, розділені новим рядком. Приймає введення у зворотному порядку та повертає результати у зворотному порядку (Див. Посилання tio).

Çⁿ╫ - Повна програма. Зворотні входи.

Ç - Повернення + bi.
 ⁿ - Експоненція.
  ╫ - Висуває реальні та уявні частини a.

3

Желе , 1 байт

*

Спробуйте в Інтернеті!

Дякую містеру Xcoder за те, що він попередив мене про оновлення правил (як результат -6).
Дякую комусь, що попередив мене про оновлення правил (як результат - -2).

Перший аргумент: (a+bj)
Другий аргумент: c
Повертає:(d+ej)




Насправді 3 байтера Джонатана було б достатньо; ḅı*, оскільки правила змінилися, і тепер вам дозволяється виводити просте складне число.
Містер Xcoder

@ Mr.Xcoder спав, коли це сталося
Erik the Outgolfer

1
Здається, що зараз * onebyter все в порядку, тому що ви можете сприйняти вклад як складний
мій займенник monicareinstate

3

R , 3 байти

Це стає нудно. Якщо вхід і вихід дозволені як комплексне число, існує функція живлення.

`^`

Наприклад:

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

або

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

2

05AB1E , 20 19 17 16 байт

‚UTSsFXâP`(‚RŠ‚+

Спробуйте в Інтернеті! Бере три окремі входи в порядку b, a, cі виводить масив [d, e]. Редагувати: збережено 2 байти завдяки @Datboi. Збережено 1 байт завдяки @Adnan. Пояснення:

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

Вхід і вихід можуть бути прийняті або виведені в будь-якому порядку. - Це означає, що ви можете взяти перші два входи у зворотному порядку.
Містер Xcoder

@ Mr.Xcoder Спасибі, я цього не помічав.
Ніл

Я не впевнений, має значення це чи ні, але підрахувати кількість також можна 'jì+³m.
Аднан

Ви можете замінити 1 0‚з TSна -2 байт :)
Datboi

І Pавтоматично векторизується, тому вам це не потрібно .
Аднан

2

C # (.NET Core) , 62 38 байт

a=>c=>System.Numerics.Complex.Pow(a,c)

Спробуйте в Інтернеті!


Ви повинні включити .Realу свою відповідь і .Imaginary`. Відповідно до правила " Тоді ви повинні вивести або повернутись, dі eв будь-якому розумному форматі (не включаючи виведення простого складного числа) " вам не дозволяється просто виводити вихід Комплексний номер.
Kevin Cruijssen

2

Pyth, 5 12 5 2 байти

^E

Приймає cспочатку, після чого a+bj.

7 байт котла, тому що, мабуть, вихід у вигляді уявного числа заборонений. Це було дозволено! Ура! І якщо складне число є розумним вкладом, ми можемо вирізати додаткові 3 байти!

Попередні рішення:

^.jEE

Коли складні числа не були розумними вхідними даними.

m,edsd]^.jEE

Коли складні числа не були розумними результатами.

Тестовий сюїт.



2

J, 10 , 7 , 1 байт с

^

Вважає cправильним аргументом і комплексне число ajb(як ви представляєтеa + bi в J) як лівий аргумент.

Спробуйте в Інтернеті!

Інші рішення

7 байт

Приймає введення складного числа як список.

^~j./@]

10 байт

Це виводило a + biсписок у списку a b.

+.@^~j./@]

Я хотів спробувати щось симпатичне на кшталт, ^~&.(j./)але зворотне значення j./очевидно не визначено. Насправді, ^~&.(+.inv)працює, і ви можете зробити те, ^&.(+.inv)що також становить 10 байт, якщо ви скасуєте порядок, у якому ви приймаєте аргументи.


2

TI-BASIC, 25 22 8 байт

Приймає комплексне число та експонент як вхідні дані та зберігає вихід у Ansскладному числі. Різке падіння байтів через послаблені обмеження на введення / виведення.

Prompt C,E
C^E

У imag({iAns,Ansостанньому рядку можна зберегти 2 байти ( iя маю на увазі комплексне число i ).
Міша Лавров

1
І я думаю, тоді ще один байт, просто поєднуючи два рядки в imag({i,1}(A+Bi)^C.
Міша Лавров

1
Правила змінилися, тепер ви можете приймати і вводити складні номери, якщо це допоможе.
Ерік Аутгольфер

2

Підпрограма 6502 машинного коду , 199 187 185 байт

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 байт з покращеною структурою "спагетті"
  • -2 байти, змінюючи регістр для передачі показника, тому ми можемо використовувати режим адресації нульової сторінки в початковому циклі копіювання

Це незалежний від позиції код, просто покладіть його десь у оперативній пам’яті та зателефонуйте до нього jsr інструкцією.

Підпрограма приймає (складну) базу як два 16-бітових цілих чисел (2-х доповнення, мало-ендіан) у $fb/$fc (реальному) та $fd/$fe(уявному), а експонент як непідписане 8-бітове ціле число уY регістрі.

Результат повертається $26/$27 (реальний) і $28/$29(уявний).


Пояснення

Це все ще є цікавим завданням для процесора 6502, оскільки немає інструкцій щодо навіть множення. Підхід є прямим вперед, реалізуючи складне множення і виконуючи його так часто, як того вимагає експонент. Гольфінг проводиться, уникаючи підпрограм, замість того, щоб створити різновид "гілки спагетті", тому код для простого 16-бітного множення, який потрібен кілька разів, повторно використовується з найменшими можливими накладними витратами. Ось коментоване розбирання:

 .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

Приклад програми, що використовує її (C64, джерело складання в ca65 -синтаксисі):

.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

Демонстрація в Інтернеті

Використання: sys49152,[a],[b],[c] , наприклад , sys49152,5,2,2(вихід: 21+20i)



1

MATL , 1 байт

^

Входи a+jb, c.

Спробуйте в Інтернеті!

Стара версія: нескладні введення та виведення, 8 байт

J*+i^&Zj

Вхідний замовлення b, a, c.

Спробуйте в Інтернеті!

Пояснення

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

Помножити на неявний ввід b - Додати неявний ввід b . Ви мали на увазі один із них?
Містер Xcoder

@ Mr.Xcoder Так, спасибі Виправлено
Луїс Мендо

Ви можете прийняти введення у вигляді комплексного числа зараз, а вивести у вигляді комплексного числа. Ви можете, мабуть, вирізати з цієї відповіді багато котельних плит.
Стівен Х.

@StevenHewitt Дякую! Відредаговано зараз
Луїс Мендо


0

8-й , 38 байт

Код

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

SED (Дія Дія Діаграма):c a b -- (a + bi) ^ c

Попередження : a + biзалишається на r-стеку , але це не впливає на наступні обчислення.

Безгольова версія з коментарями

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
;

Приклад та використання

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

Виведення попереднього коду

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

0

Октава / MATLAB, 6 байт

@power

Анонімна функція, яка вводить два числа і виводить їх потужність.

Спробуйте в Інтернеті !

Стара версія: нескладні введення та виведення, 30 байт

@(a,b,c)real((a+j*b)^c./[1 j])

Анонімна функція, яка вводить три числа і виводить масив з двох чисел.

Спробуйте в Інтернеті!


0

Perl 6 ,  29 26 20 19  11 байт

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

Спробуй це

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

Спробуй це

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

Спробуй це

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

Спробуй це

Зі зміною обмежень на виході його можна ще зменшити:

(*+* *i)***

Спробуй це

***Частина аналізується як ** *тому ,** оператор інфіксне довше , ніж *інфіксне оператор.

Розширено:

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

Тепер ви можете це зробити (*+* *i)***.
повністюлюдський

0

R, 25 байт

найпростіший - оскільки вихідний комплекс дозволений.

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

0

Casio-Basic, 6 байт

a^b

Зміна правил, щоб дозволити введення та виведення, оскільки складні числа зробили це значно коротше.

3 байти для функції, +3 для введення a,bу поле параметрів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.