求多项式某个点的变化率


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)+ ...
Sparr

我对集合W不熟悉。这是自然数并集0吗?
Alex A.

@AlexA。,是的。
丹尼尔(Daniel)


2
@PeterTaylor我认为他们也有类似的想法,但我认为如果没有非常非常重要的修改,此处的任何答案都不会发布在这里。
Alex A.

Answers:


23

Mathematica,6个字节

#'@#2&

(击败THATMATL和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

MATL8 6字节

yq^**s

输入为:指数数组,数字,系数数组。

在线尝试!或验证所有测试用例:12 345

说明

考虑例如输入[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在将整数提升为负指数时,Julia烦人地抛出a 。

在线尝试!(包括所有测试用例)

感谢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。
Glen O

@GlenO很好,谢谢您的建议。我同意了abs,但是重新定义中缀运算符实际上使我感到痛苦……
Alex

5

05AB1E12 11字节

感谢Adnan,节省了一个字节。

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@Luis Mendo提供的MATL答案之后,是8个字节。
魔术

更好的s¹<m**O是7个字节。(05ab1e.tryitonline.net/...
神奇章鱼金塔

在我保留原始格式的同时,它实质上改变了输入格式。但是我同意操纵输入格式可以缩短答案。
2016年

@Osable是正确的,但其他人已利用该漏洞;)
Magic Octopus Urn

4

Python 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 '16

@ 1Darco1两者都正确。我会在一段时间内更改它
Luis Mendo

3

R,31个字节

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

匿名函数,采用系数a向量,指数向量nx值。


1
真好!我添加了另一个具有相同字节数的答案。但是,它使用了完全不同的方法。R太神奇了吗?
Billywob '16

1
编辑:不再相同的字节数:)
Billywob

2

Matlab,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,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好吧,他现在不应该因为您只是将其发布为答案而已; P
Alex A.

@flawr谢谢,但是那太不一样了,您应该发布它!
路易斯·门多

1
好吧,我认为您还是不会这样做,因为您将获得一个字节= D
更加错误的

@flawr Aww。我完全被误解了,哈哈
Luis Mendo

2

R,31 27字节

未命名函数需要两个输入pxp假定是多项式的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

C ++ 14,165个 138 133 112 110字节

通用可变参数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 '17

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

Scala,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函数需要两个输入,pxp是多项式,以问题中给出的示例格式给出。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

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

Dyalog APL,26 25 23字节

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

将多项式作为右自变量,将值作为左自变量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.