다항식의 한 지점에서 변화율 찾기


15

다항식과 x 좌표의 방정식이 주어지면 곡선의 해당 x 좌표에서 점의 변화율을 찾습니다.

다항식의 형식은 ax n + ax n-1 + ... + ax 1 + a입니다. 여기서 a ϵ Q 및 n ϵ W입니다. 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) + ...
Sparr

나는 세트 W에 익숙하지 않습니다. 자연수는 0입니까?
Alex A.

@AlexA. 네, 그렇습니다.
다니엘


2
@ PeterTaylor 나는 비슷한 아이디어를 공유한다고 생각하지만 거기에서 어떤 대답도 매우 중요한 수정없이 여기에 게시 될 수 있다고 생각하지 않습니다.
Alex A.

답변:


23

Mathematica, 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
Luis Mendo 1

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

이것은 튜플과 숫자로 구성된 벡터를 가속하고 숫자를 반환하는 함수입니다. 절대 값은 지수가 음수가 아닌지 확인하는 것입니다. Julia Annoying DomainError은 정수를 음의 지수로 올릴 때 a를 던지기 때문에 필요 합니다.

온라인으로 사용해보십시오!(모든 테스트 케이스 포함)

몇 가지 수정 및 바이트를위한 Glen O에게 감사합니다.


3
나는 @AlexA를 두려워했다. 줄리아가 헤어졌지만 여기에 다시 조화를
이룹니다

i[2]>0&&상수 대 / 소문자를 처리하는 데 사용 하는 대신의 abs(i[2]-1)지수 를 사용하는 경우 추가 3 바이트를 절약 할 수 있습니다 x. 그리고 또 다른 3 바이트를 절약하는 약간 덜 깨끗한 트릭은 p%x대신 사용하는 것입니다. 함수 형식으로 사용하려는 f(p,x)것처럼 호출 할 수 있습니다 %(p,x)... 불행히도 TIO에서는 작동하지 않는 것 같습니다. Julia 0.5.0에서 작동하지만 Julia 0.4.6을 실행 중입니다.
Glen O

@GlenO Nice, 제안 해 주셔서 감사합니다. 나는 함께 갔다abs 부분 , 연산자를 재정의 물리적으로 고통을 느낀다 ...
Alex A.

5

05AB1E ,12 11 바이트

Adnan 덕분에 1 바이트를 절약했습니다.

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
나는 당신이 }:)을 생략 할 수 있다고 생각합니다 .
Adnan은

DIs<m**O@Luis Mendo가 제공 한 MATL 답변에 따라 8 바이트입니다.
Magic Octopus Urn

더 좋은 s¹<m**O것은 7 바이트입니다. ( 05ab1e.tryitonline.net/… )
Magic Octopus Urn

원래 형식을 유지하면서 입력 형식이 크게 바뀝니다. 그러나 입력 형식을 조작하면 더 짧은 답변을 얻을 수 있다는 데 동의합니다.
Osable

@Osable true, 그러나 다른 사람들은 그 허점을 사용했습니다;)
Magic Octopus Urn

4

파이썬 3, 41 바이트

@AndrasDeak 덕분에 6 바이트가 제거되었습니다 ! 사실,이 대답은 이제 내 것보다 더 그의 것입니다 ...

두 가지 수정 을 위해 @ 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 둘 다 맞습니다. 잠시 후에 변경하겠습니다
Luis Mendo

3

R, 31 바이트

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

계수 a벡터, 지수 벡터 nx값 을 취하는 익명 함수입니다 .


1
좋은! 동일한 바이트 수로 다른 답변을 추가했습니다. 그러나 완전히 다른 접근법을 사용합니다. R은 놀랍지 않습니까?
Billywob

1
편집 : 더 이상 같은 바이트 수 :)
Billywob

2

Matlab, 27 바이트

이것은 계수 목록의 형태로 값 x과 다항식 을 받아들이는 익명 함수입니다 . p예를 들어 x^2 + 2로 나타낼 수 있습니다 [1,0,2].

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

2

자바 스크립트 (ES7), 40 바이트

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

a는 0을 포함한 오름차순 지수 순서로 계수의 배열입니다. 예를 들어 x ³-5는로 표시됩니다 [-5, 0, 0, 1].


2

Symbolic Math Toolbox를 사용한 MATLAB, 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
Alex A.

@flawr 감사합니다, 그러나 그것은 너무 다릅니다. 게시해야합니다!
Luis Mendo

1
글쎄, 당신은 어쨌든 그렇게하지 않았을 것이라고 생각합니다. 왜냐하면 당신 은 바이트 = D를 얻을
것이기 때문입니다

@flawr Aww. 나는 완전히 오해했다
Luis Mendo

2

R, 31 27 바이트

두 개의 입력을받는 명명되지 않은 함수 px. 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)yields 16134384838410입니다.


도대체 어떻게 작동합니까?
고양이

@cat이 도함수 f'를 계산 f한 후를 대체 n합니다 x.
Paŭlo Ebermann

2

C ++ 14 165 138 133 112 110 바이트

일반 Variadic Lambda가 많이 절약합니다. -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;
}

모든 바이트 수를 초과 한 것으로 보입니다. 그렇다면 실제 바이트 수는 얼마입니까?
numbermaniac

1
@numbermaniac 감사합니다.
Karl Napf

1

하스켈, 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

대시 , 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

파이썬 2, 39 바이트

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

lambda함수는 두 개의 입력을 소요 p하고 x. p질문에 주어진 예제 형식으로 주어진 다항식입니다. x변화율을 찾는 x 값입니다.



0

C, 78 바이트

f(int*Q,int*W,int S,int x){return Q[--S]*W[S]*pow(x,W[S]-1)+(S?f(Q,W,S,x):0);}

0

클로저, 53 바이트

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

다항식은 해시 맵으로 표현되며 키는 계수이며 값은 지수입니다.


0

카시오 베이직, 16 바이트

diff(a,x)|x=b

입력은의 다항식이어야합니다 x. 코드의 경우 13 바이트, +3 바이트 입력a,b 매개 변수

a에 대한 표현 을 간단하게 도출 x한 다음에을 포함 x=b합니다.


0

Dyalog APL, 26 25 23 바이트

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

다항식을 오른쪽 인수로, 값을 왼쪽 인수로 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.