查找本地最大和最小值


14

定义

给定函数的最大值和最小值是在给定范围内或在函数的整个域内的函数的最大值和最小值。

挑战

面临的挑战是使用任何您喜欢的方法找到给定多项式函数的局部最大值和最小值。不用担心,我会尽力解释这一挑战,并使其尽可能简单。

输入将按的降序或升序(由您决定)包含单个变量多项式的所有系数。例如,

  • [3,-7,1] 将代表 3x2 - 7x + 1 = 0
  • [4,0,0,-3] 将代表 4x3-3=0.

如何解决(使用导数)?

现在,假设我们的输入是[1,-12,45,8],但仅是函数。x3 - 12x2 + 45x + 8

  1. 第一项任务是找到该函数的导数。由于它是多项式函数,因此确实是一项简单的任务。

    的导数是。存在的任何常数项都将简单地相乘。同样,如果有添加/减去的项,则它们的导数也要分别添加或减去。请记住,任何恒定数值的导数均为零。这里有一些例子:xnn*xn-1xn

    • x3 -> 3x2
    • 9x4 -> 9*4*x3 = 36x3
    • -5x2 -> -5*2*x = - 10x
    • 2x3 - 3x2 + 7x -> 6x2 - 6x + 7
    • 4x2 - 3 -> 8x - 0 = 8x
  2. 现在,通过将新多项式等于零来求解方程,并且仅获得x的整数值。

  3. 将这些x值放入原始函数中并返回结果。那应该是输出

让我们以前面提到的示例为例[1,-12,45,8]

  • 输入: [1,-12,45,8]
  • 功能: x3 - 12x2 + 45x + 8
  • 导数-> 3x2 - 24x + 45 + 0 -> [3,-24,45]
  • 解方程,我们得到或。3x2 - 24x + 45 = 0x = 3x = 5
  • 现在将x = 3x = 5放入函数中,我们得到了值(62,58)
  • 输出-> [62,58]

假设条件

  1. 假设所有输入系数都是整数。它们可以按功率递增或递减顺序排列。

  2. 假设输入至少为2度多项式。如果多项式没有整数解,则可以返回任何值。

  3. 假设最终结果将仅为整数。

  4. 您可以按任何顺序打印结果。输入多项式的次数不得超过5,以便您的代码可以处理它。

  5. 输入有效,因此x的解不是鞍点。

此外,您不必通过派生方法来执行此操作。您可以使用任何您喜欢的方法。

样本输入和输出

[2,-8,0] -> (-8)
[2,3,-36,10] -> (91,-34)
[1,-8,22,-24,8] -> (-1,0,-1) 
[1,0,0] -> (0)

计分

这是因此最短的代码获胜。


1
如果我理解正确:在示例中,“ 求解方程式 ” 步骤将部分是您先前面临的挑战?另外,步骤“ 现在将x = 3和x = 5放到函数中 ”意味着原始函数在“ Function ”处,而不是在“ Derivative ”处,对吧?
凯文·克鲁伊森

1
对于示例I / O 3,我会得到(-1, 0, 1),我相信这是实际的正确答案...虽然不确定。如果您不同意我的聊天记录,请与我联系。
HyperNeutrino

1
The input will be valid so that the solutions of x are not saddle points,该案[1,0,0,3]似乎给了一个鞍点。
JungHwan Min

1
@JungHwanMin啊,在制定规则之前添加了示例。现在已删除。
Manish Kundu

1
x^3 - 12x^2 + 45x + 8 = 0,尽管我个人更喜欢将其编写为f(x)=x^3-12x^2+45x+8不带,=0因为这=0是没有意义的,因为我们正在处理函数,而不是求解方程。

Answers:


4

果冻,20字节

ASŒRḅ@Ðḟ
J’U×µṖÇḅ@€³

在线尝试!

说明

ASŒRḅ@Ðḟ     Helper Function; find all integer solutions to a polynomial
             All integer roots are within the symmetric range of the sum of the absolute values of the coefficients
A            Absolute Value (Of Each)
 S           Sum
  ŒR         Symmetric Range; `n -> [-n, n]`
      Ðḟ     Filter; keep elements where the result is falsy for:
    ḅ@       Base conversion, which acts like the application of the polynomial
J’U×µṖÇḅ@€³  Main Link
J                             Range of length
 ’                    Lowered
  U          Reversed
   ×         Multiplied with the original list (last value is 0)
    µ        Begin new monadic chain
     Ṗ       Pop; all but the last element
      Ç      Apply last link (get all integer solutions of the derivative)
       ḅ@€³  Base conversion of the polynomial into each of the solutions; apply polynomial to each solution of the derivative.

该程序中的辅助函数取自Xcoder先生的此处答案该答案 基于Luis 此处的答案


@JungHwanMin我将指出这一点。这直接违反了将没有鞍点的说法,因为多项式at的导数30编辑哦,您已经做过nvm只是对评论进行了投票,然后
HyperNeutrino

3

的JavaScript(ES7),129 120个字节

以幂的递增顺序取系数。

a=>(g=x=>x+k?(A=g(x-1),h=e=>a.reduce((s,n,i)=>s+n*(e||i&&i--)*x**i,0))()?A:[h(1),...A]:[])(k=Math.max(...a.map(n=>n*n)))

测试用例

已评论

a => (                        // given the input array a[]
  g = x =>                    // g = recursive function checking whether x is a solution
    x + k ? (                 //   if x != -k:
      A = g(x - 1),           //     A[] = result of a recursive call with x - 1
      h = e =>                //     h = function evaluating the polynomial:
        a.reduce((s, n, i) => //       for each coefficient n at position i:
          s +                 //         add to s
          n                   //         the coefficient multiplied by
          * (e || i && i--)   //         either 1 (if e = 1) or i (if e is undefined)
          * x**i,             //         multiplied by x**i or x**(i-1)
          0                   //         initial value of s
        )                     //       end of reduce()
      )() ?                   //     if h() is non-zero:
        A                     //       just return A[]
      :                       //     else:
        [h(1), ...A]          //       prepend h(1) to A[]
    :                         //   else:
      []                      //     stop recursion
  )(k = Math.max(             // initial call to g() with x = k = maximum of
    ...a.map(n => n * n)      // the squared coefficients of the polynomial
  ))                          // (Math.abs would be more efficient, but longer)

1
失败0,0,1(x ^ 2 = 0)
betseg '18

@betseg感谢您的举报。固定。
Arnauld

3

朱莉娅0.6(带Polynomials包装),57字节

using Polynomials
x->map(Poly(x),roots(polyder(Poly(x))))

在线尝试!

以递增顺序获取系数,即第一个输入是常数项。

示例运行:

julia> using Polynomials

julia> g = x -> map(Poly(x), roots(polyder(Poly(x))))
(::#1) (generic function with 1 method)

julia> g([8,45,-12,1])
2-element Array{Float64,1}:
 58.0
 62.0

3

爪哇8,364个 239 227 226 218字节

a->{int l=a.length,A[]=a.clone(),s=0,i,r,f=l,p;for(;f>0;A[--f]*=f);for(int n:A)s+=n<0?-n:n;for(r=~s;r++<s;){for(p=0,i=f=1;i<l;f*=r)p+=A[i++]*f;if(p==0){for(f=i=0;i<l;f+=a[i++]*Math.pow(r,p++));System.out.println(f);}}}

使用与我的答案相同的功能。

@OlivierGrégoire通过将数组取反顺序获得了-8个字节。

说明:

在线尝试。

a->{                  // Method with integer-varargs parameter and integer return-type
  int l=a.length,     //  The length of the input-array
      A[]=a.clone(),  //  Copy of the input-array
      s=0,            //  Sum-integer, starting at 0
      i,              //  Index-integer
      r,              //  Range-integer
      f=l,            //  Factor-integer, starting at `l`
      p;              //  Polynomial-integer
  for(;f>0;           //  Loop over the copy-array
    A[--f]*=f);       //   And multiply each value with it's index
                      //   (i.e. [8,45,-12,1] becomes [0,45,-24,3])
  for(int n:A)        //  Loop over this copy-array:
    s+=n<0?-n:n;      //   And sum their absolute values
  for(r=~s;r++<s;){   //  Loop `r` from `-s` up to `s` (inclusive) (where `s` is the sum)
    for(p=0,          //   Reset `p` to 0
        i=f=1;        //   and `f` to 1
                      //   (`i` is 1 to skip the first item in the copy-array)
        i<l;          //   Inner loop over the input again, this time with index (`i`)
        f*=r)         //     After every iteration: multiply `f` with the current `r`
      p+=             //    Sum the Polynomial-integer `p` with:
         A[i++]       //     The value of the input at index `i`,
               *f;}   //     multiplied with the current factor `f`
    if(p==0){         //   If `p` is now 0:
      for(f=i=0;      //    Use `f` as sum, and reset it to 0
          i<l;        //    Loop over the input-array
        f+=a[i++]*Math.pow(r,p++));
                      //     Fill in `r` in the parts of the input-function
      System.out.println(f);}}}
                      //    And print the sum

2
失败1,0,0(x ^ 2 = 0)
betseg '18

@betseg谢谢!固定并打高尔夫球。
凯文·克鲁伊森

1
你应该接受以相反的顺序输入(它被明确允许),以减少这样的次数:int... ,i, ...; for(;f>0;)A[--f]*=f;。除非我没有记错,否则这至少可以节省4个字节。如果执行此操作,请确保反转对输入的所有访问。
奥利维尔·格雷戈尔(OlivierGrégoire)'18年

@OlivierGrégoire谢谢,节省了8个字节!
凯文·克鲁伊森



1

Python 3,156字节

def f(p,E=enumerate):a=lambda p,v:sum(e*v**i for i,e in E(p));d=[e*i for i,e in E(p)][1:];r=sum(map(abs,d));return[a(p,x)for x in range(-r,r+1)if a(d,x)==0]

在线尝试!

Xcoder先生-2个字节ovs
-22个字节


1

Python + numpy,91

  • @KevinCruijssen节省了1个字节
from numpy import*
p=poly1d(input())
print map(lambda x:int(polyval(p,x)),roots(p.deriv()))

在线尝试


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.