Знайдіть швидкість зміни в точці на многочлени


15

З огляду на рівняння многочлена і координати x, знайдіть швидкість зміни точки в цій x-координаті на кривій.

Поліном має вигляд: ax n + ax n-1 + ... + ax 1 + a, де a ϵ Q і n ϵ W. Для цього виклику n також може бути 0, якщо ви не хочете мати мати справу з особливими випадками (константами), де немає x.

Щоб знайти швидкість зміни на цій x-координаті, ми можемо отримати похідну від многочлена і підключити до x-координати.

Вхідні дані

Поліном може бути прийнятий у будь-якій розумній формі, але ви повинні вказати, який формат є чітко. Наприклад, масив форми [..[coefficient, exponent]..]прийнятний.

Вихідні дані

Швидкість зміни точки при заданій x-координаті.

Це , тому найкоротший код у байтах виграє.

Приклади

[[4, 3], [-2, 4], [5, 10]]   19    ->   16134384838410
                  [[0, 4]]  400    ->   0
           [[4, 0], [5,1]]  -13    ->   5
      [[4.14, 4], [48, 2]]   -3    ->   -735.12
         [[1, 3], [-5, 0]]    5.4  ->   87.48

8
Алгоритм для тих, хто не має відповідного математичного фону: Похідна від A x ^ B + C x ^ D + ... є (A B) * x ^ (B-1) + (C D) * x ^ ( D-1) + ...
Спарр

Я не знайомий з множиною W. Це об'єднання натуральних чисел 0?
Олексій А.

@AlexA., Так, так.
Даніель


2
@PeterTaylor Я думаю, що вони поділяють подібну ідею, але я не думаю, що будь-яка відповідь звідти може бути розміщена тут без дуже, дуже суттєвої модифікації.
Олексій А.

Відповіді:


23

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

#'@#2&

(Бийте ТО , MATL та 05AB1E)

Перший аргумент повинен бути многочленом з #його змінною і з &кінцем (тобто поліном з чистою функцією; наприклад 3 #^2 + # - 7 &). Другий аргумент - x-координата точки, що цікавить.

Пояснення

#'

Візьміть похідну першого аргументу ( 1мається на увазі).

... @#2&

Підключіть другий аргумент.

Використання

#'@#2&[4 #^3 - 2 #^4 + 5 #^10 &, 19] (* The first test case *)

16134384838410


3
Зараз ви виграєте 0 байт :-P
Луїс Мендо

@LuisMendo Коли хлопець з кухарським ножем може зв'язати мандоліну у змаганнях з нарізки, я дам балу хлопцеві за допомогою ножа. ;)
J ...

8

MATL , 8 6 байт

yq^**s

Вхід - це масив експонентів, число, масив коефіцієнтів.

Спробуйте в Інтернеті! Або перевірити всі тестові випадки: 1 , 2 3 , 4 , 5 .

Пояснення

Розглянемо приклад входів [3 4 10], 19, [4 -2 5].

y    % Take first two inputs implicitly and duplicate the first
     %   STACK: [3 4 10], 19, [3 4 10]
q    % Subtract 1, element-wise
     %   STACK: [3 4 10], 19, [2 3 9]
^    % Power, element-wise
     %   STACK: [3 4 10], [361 6859 322687697779]
*    % Multiply, element-wise
     %   STACK: [1083 27436 3226876977790]
*    % Take third input implicitly and multiply element-wise
     %   STACK: [4332 -54872 16134384888950]
s    % Sum of array
     %   STACK: 16134384838410

7

Джулія, 45 42 40 37 байт

f(p,x)=sum(i->prod(i)x^abs(i[2]-1),p)

Це функція, яка отримує доступ до вектора кортежів та числа та повертає число. Абсолютне значення полягає в тому, щоб показник не був негативним, що необхідно, тому що Джулія дратує кидає а, DomainErrorколи піднімає ціле число до негативного показника.

Спробуйте в Інтернеті! (включає всі тестові випадки)

Дякую Glen O за пару виправлень та байтів.


3
Я побоювався цього @AlexA. і Юлія розійшлася, але ось вони знову разом, у згоді <3
хитка

Ви можете зберегти зайві три байти, якщо замість того, i[2]>0&&щоб мати справу з постійним випадком, ви використовуєте abs(i[2]-1)в експоненті x. І трохи менш чистим трюком для збереження ще трьох байтів є використання p%xзамість цього f(p,x)- зауважте, що ви можете називати це так, %(p,x)ніби хочете використовувати його у формі функції ... на жаль, здається, він не працює на TIO (що, мабуть, працює на Julia 0.4.6), хоча вона працює на моїй Julia 0.5.0.
Глен О

@GlenO Приємно, дякую за пропозиції. Я пішов з absчастиною, але переосмислення операторів інфіксів фізично болить мене ...
Алекс А.

5

05AB1E ,12 11 байт

Збережено один байт завдяки Аднану.

vy¤<²smsP*O

v          For each [coefficient, power] in the input array
 y         Push [coefficient, power]
  ¤<       Compute (power-1)
   ²       Push x value (second input entry)
    sms    Push pow(x, power-1)
       P   Push coefficient * power ( = coefficient of derivative)
        *  Push coefficient * power * pow(x, power-1)
         O Sum everything and implicitly display the result

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

Точність з плаваючою точкою - це Python. В даний час я міняю значення стека двічі, можливо, є спосіб уникнути цього і зберегти кілька байт.


1
Я вірю, що ви можете залишити }:).
Аднан

DIs<m**Oстановить 8 байт, що відповідає відповіді MATL, яку надав @Luis Mendo.
Чарівний восьминога Урна

Ще краще s¹<m**O- 7 байт. ( 05ab1e.tryitonline.net/… )
Чарівний восьминіг

Він істотно змінює формат введення, поки я зберігав початковий. Але я погоджуюсь, що маніпулювання форматом введення дає можливість коротших відповідей.
Доступна

@Ovable true, але інші використали цю лазівку;)
Чарівний восьминіг Урн

4

Python 3, 41 байт

6 байтів видалено завдяки @AndrasDeak ! Насправді ця відповідь зараз більше його, ніж моя ...

Дякуємо також @ 1Darco1 за два виправлення!

lambda A,x:sum(a*b*x**(b-1) for a,b in A)

Анонімна функція, яка приймає список списків з коефіцієнтами та показниками (той же формат, що описаний у виклику) та числом.

Спробуйте тут .


Чому можна сумувати a*x**(b-1)замість a*b*x**(b-1)? І далі, що робити, якщо $ x = 0 $?
1Darco1

@ 1Darco1 Ви маєте рацію на обидва. Я трохи зміню його
Луїс Мендо

3

R, 31 байт

function(a,n,x)sum(a*n*x^(n-1))

Анонімна функція, яка приймає вектор коефіцієнтів a, вектор експонентів nта xзначення.


1
Приємно! Я додав ще одну відповідь з тим же числом байтів. Однак він використовує зовсім інший підхід. Хіба не дивовижно?
Billywob

1
Редагувати: Більше не однакове число байтів :)
Billywob

2

Матлаб, 27 байт

Це анонімна функція, яка приймає значення xі поліонміальну pу вигляді списку коефіцієнтів, наприклад, x^2 + 2може бути представлена ​​як [1,0,2].

@(x,p)polyval(polyder(p),x)

2

JavaScript (ES7), 40 байт

(a,n)=>a.reduce((t,c,i)=>t+i*c*n**--i,0)

aявляє собою масив коефіцієнтів у порядку зростання експонента з нулями, включеними, наприклад, x ³-5 буде представлено через [-5, 0, 0, 1].


2

MATLAB з Symbolic Math Toolbox, 26 байт

@(p,x)subs(diff(sym(p)),x)

Це визначає анонімну функцію. Вхідні дані:

  • рядок, що pвизначає многочлен, у форматі'4*x^3-2*x^4+5*x^10'
  • номер x

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

>> f = @(p,x)subs(diff(sym(p)),x)
f = 
    @(p,x)subs(diff(sym(p)),x)

>> f('4*x^3-2*x^4+5*x^10', 19)
ans =
16134384838410

Ви можете використовувати @(x,p)polyval(polyder(p),x)для отримання байта.
flawr

@flawr Ну, він зараз не повинен, тому що ви щойно опублікували це як відповідь; P
Алекс А.

@flawr Спасибі, але це занадто інакше, слід опублікувати це!
Луїс Мендо

1
Ну, я думаю, ви б так чи інакше цього не зробили, бо ви отримаєте байт = D
недолік

@flawr Aww. Я повністю неправильно зрозумів, ха-ха
Луїс Мендо

2

R, 31 27 байт

Безіменна функція, що приймає два входи pта x. pвважається R-виразом полінома (див. приклад нижче) і xє просто точкою оцінки.

function(p,x)eval(D(p,"x"))

Він працює за допомогою виклику, Dякий обчислює символьну похідну wrt, xта оцінює вираз у x.

Приклад виведення

Якщо припустити, що функція тепер названа, fїї можна викликати наступним чином:

f(expression(4*x^3-2*x^4+5*x^10),19)
f(expression(0*x^4),400)
f(expression(4*x^0+5*x^1),-13)
f(expression(4.14*x^4+48*x^2),-3)
f(expression(1*x^3-5*x^0),5.4)

який відповідно виробляє:

[1] 1.613438e+13
[1] 0
[1] 5
[1] -735.12
[1] 87.48

Дякую, що показали мені це! Я не розглядав можливість мати введення як вираз - це дійсно елегантне рішення.
rturnbull

2

PARI / GP , 20 байт

a(f,n)=subst(f',x,n)

Наприклад, a(4*x^3-2*x^4+5*x^10,19)урожайність 16134384838410.


Як чорт це працює?
кіт

@cat Він обчислює похідну f'від f, а потім підставляє nдля x.
Paŭlo Ebermann

2

C ++ 14, 165 138 133 112 110 байт

Універсальна варядна лямбда значно економить. -2 байти за#import та видалення пробілу раніше<

#import<cmath>
#define A auto
A f(A x){return 0;}A f(A x,A a,A b,A...p){return a*b*std::pow(x,b-1)+f(x,p...);}

Безголівки:

#include <cmath>

auto f(auto x){return 0;}

auto f(auto x,auto a,auto b,auto...p){
    return a*b*std::pow(x,b-1)+f(x,p...);
}

Використання:

int main() {
 std::cout << f(19,4,3,-2,4,5,10) << std::endl;
 std::cout << f(400,0,4) << std::endl;
 std::cout << f(-13,4,0,5,1) << std::endl;
 std::cout << f(-3,4.14,4,48,2) << std::endl;
 std::cout << f(5.4,1,3,-5,0) << std::endl;
}

Ви, здається, перекреслили всі ваші байти. Яка тоді фактична кількість байтів?
числоманіяк

1
@numbermaniac дякую, зробили.
Карл Напф

1

Haskell, 33 байти

f x=sum.map(\[c,e]->c*e*x**(e-1))

Використання:

> f 5.4 [[1, 3], [-5, 0]]
87.48000000000002

1

DC, 31 байт

??sx0[snd1-lxr^**ln+z2<r]srlrxp

Використання:

$ dc -e "??sx0[snd1-lxr^**ln+z2<r]srlrxp"
4.14 4 48 2
_3
-735.12

0

DASH , 33 байти

@@sum(->@* ^#1- :1#0 1(sS *)#0)#1

Використання:

(
  (
    @@sum(->@* ^#1- :1#0 1(sS *)#0)#1
  ) [[4;3];[_2;4];[5;10]]
) 19

Пояснення

@@                             #. Curried 2-arg lambda
                               #. 1st arg -> X, 2nd arg -> Y
  sum                          #. Sum the following list:
    (map @                     #. Map over X
                               #. item list -> [A;B]
      * ^ #1 - :1#0 1(sS *)#0  #. This mess is just A*B*Y^(B-1)
    )#1                        #. X

0

Скала, 46 байт

s=>i=>s map{case(c,e)=>c*e*math.pow(i,e-1)}sum

Використання:

val f:(Seq[(Double,Double)]=>Double=>Double)=
  s=>i=>s map{case(c,e)=>c*e*math.pow(i,e-1)}sum
print(f(Seq(4.0 → 3, -2.0 → 4, 5.0 → 10))(19))

Пояснення:

s=>                        //define an anonymous function with a parameter s returning
  i=>                        //an anonymous function taking a paramater i and returning
    s map{                   //map each element of s:
      case(c,e)=>              //unpack the tuple and call the values c and e
        c*e*math.pow(i,e-1)    //calculate the value of the first derivate
    }sum                      //take the sum

0

Аксіома 31 байт

h(q,y)==eval(D(q,x),x,y)::Float

результати

 -> h(4*x^3-2*x^4+5*x^10, 19)
     161343 84838410.0

 -> h(4.14*x^4+48*x^2, -3)
     - 735.12

0

Python 2, 39 байт

lambda p,x:sum(c*e*x**~-e for c,e in p)

lambdaФункція займає два входи, pі x. p- це многочлен, поданий у форматі прикладу, наведеному у питанні. x- значення x, за яким можна знайти швидкість зміни.




0

Clojure, 53 байти

#(apply +(for[[c e]%](apply * c e(repeat(dec e)%2))))

Поліном виражається хеш-картою, ключі - коефіцієнтами, а значення - показниками.


0

Casio Basic, 16 байт

diff(a,x)|x=b

Введення має бути многочленом з точки зору x. 13 байт для коду, +3 байти, які потрібно ввести a,bяк параметри.

Просто виводиться вираз aщодо x, а потім підписується x=b.


0

Діалог APL, 26 25 23 байт

{a←⍺⋄+/{×/⍵×a*2⌷⍵-1}¨⍵}

Приймає многочлен як правий аргумент, а значення як аргумент лівого.

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