Đánh gôn trình tự có chức năng tạo số mũ là tiếp tuyến


15

Hầu như mọi hàm có thể được biểu diễn dưới dạng đa thức với các số hạng vô hạn.

Ví dụ, e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...

Ví dụ, sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...

Các hệ số của các nđiều khoản -th tạo thành một chuỗi và hàm tương ứng được gọi là Hàm tạo của chuỗi.

Các hệ số của các nđiều khoản -th tạo thành một chuỗi.

Thông thường, nthuật ngữ -th sẽ có mẫu số là n!. Do đó, chúng tôi nhân hệ số n!với để có được một chuỗi khác, có Hàm tạo hàm mũ sẽ là hàm ban đầu.

Ví dụ, trình tự mà hàm mũ Tạoe^xsẽ 1,1,1,1,....

Ví dụ, trình tự mà hàm mũ Tạosin(x)sẽ 0,1,0,-1,0,1,0,-1,....

Bài tập

Nhiệm vụ của bạn là để tìm ra nhạn -thứ của dãy mà hàm mũ Tạotan(x).

Tủ thử

n result
0 0
1 1
2 0
3 2
4 0
5 16
6 0
7 272
8 0
9 7936
10 0
11 353792
12 0
13 22368256
14 0
15 1903757312
16 0
17 209865342976
18 0
19 29088885112832
20 0
21 4951498053124096
22 0
23 1015423886506852352
24 0
25 246921480190207983616
26 0

(Sao chép từ đây .) (Cảnh báo: 0thuật ngữ -th khác nhau)

Ví dụ thực hiện

# copied from https://github.com/Mego/Seriously/blob/v2.0/SeriouslyCommands.py#L16
def memoized(f):
    memo = {}
    def m_fun(*args):
        if args in memo:
            return memo[args]
        else:
            res = f(*args)
            memo[args] = res
            return res
    return m_fun

# copied from https://github.com/Mego/Seriously/blob/v2.0/SeriouslyCommands.py#L169
@memoized
def binomial(n,r):
    if r > n:
        return 0
    elif r==n:
        return 1
    res = 1
    i = 1
    while i<=r:
        res *= (n+1-i)
        res /= i
        i+=1
    return int(res)

# 2*u(n+1) = Sum_{k=0..n} binomial(n, k)*u(k)*u(n-k)
# from A000111
@memoized
def u(n):
    if n<0: return 0
    if n==0: return 1
    if n==1: return 1
    return sum([binomial(n-1,k)*u(k)*u(n-1-k) for k in range(n)])//2     

def t(n):
    if n%2 == 0: return 0
    return u(n)

print('\n'.join([str(x) + ' ' + str(t(x)) for x in range(26)]))

Nghĩa là nó!

Người giới thiệu


4
Nếu bạn muốn tìm hiểu thêm về việc tạo các hàm và cách sử dụng chúng trong toán học, đặc biệt là tổ hợp và số lý thuyết, tôi khuyên bạn nên sử dụng chức năng tạo sách giáo khoa "nổi tiếng" này của H. Wilf.
flawr

5
(Không thể cưỡng lại): được hiểu theo nghĩa đen, câu đầu tiên của bạn là vô cùng sai!
Flounderer

Bạn có nghĩa là "hàm tạo" và "hàm tạo hàm mũ" ngược. $ \ sin (x) $ là hàm tạo hàm mũ của chuỗi 0,1,0, -1,0,1,0, -1,0, ... - đó không phải là chuỗi là hàm tạo hàm mũ của $ \ sin (x) $. Những gì bạn đang yêu cầu chúng tôi làm là mã hóa chuỗi theo cấp số nhân được tạo bởi $ \ tan (x) $.
Glen O

Có vẻ ổn, ngoại trừ "Cái này còn được gọi là Hàm tạo của hàm đó. Các hệ số của thuật ngữ thứ n tạo thành một chuỗi.", Có lẽ nên nói một cái gì đó như "Các hệ số của thuật ngữ thứ n tạo thành một chuỗi và hàm tương ứng được gọi là Hàm tạo của chuỗi ".
Glen O

@GlenO Đã chỉnh sửa.
Nữ tu bị rò rỉ

Câu trả lời:


8

CJam ( 33 32 27 26 23 20 byte)

2,{ee::*_(@+.+}ri*0=

Bản demo trực tuyến

Mổ xẻ

Điều này về cơ bản thực hiện sự tái phát được mô tả bởi xnor .

2,        e# [0 1] represents the base case f(0,j) = j==1
{         e# Loop...
  ee::*   e#   Multiply each array element by its index
  _(@+.+  e#   Sum the array shifted left and the array shifted right
}ri*      e# ... n times
0=        e# Evaluate at j=0

Hoặc với một cách tiếp cận khá khác nhau, cho 23 byte:

ri_1&a{{1$+}*]W%0+}@*0=

Bản demo trực tuyến . Cảm ơn Dennis cho 3 byte.

Mổ xẻ

1a         e# Push [1]
{          e# Repeat...
  {1$+}*]  e#   Compute array of partial sums
  W%0+     e#   Reverse and append 0
}qi:A*     e# ... A times, where A is the input value
0=A1&*     e# Result is first element if A odd, and 0 otherwise

Hoặc với một cách tiếp cận rất khác nhau, với 29 byte:

qie!Ma-{W\+W+3ew{_$.=1=},!},,

Bản demo trực tuyến

Thật không may, một trường hợp đặc biệt là cần thiết cho đầu vào 0.

Mổ xẻ

qi            e# Take an integer n from stdin
e!            e#   Compute all permutations of [0 ... n-1]
Ma-           e#   Special-case n=0
{             e#   Filter...
  W\+W+       e#     Prepend and postpend -1
  3ew         e#     Take slices of 3 consecutive elements
  {           e#     Filter...
    _$.=1=    e#       Test whether the middle element is the second largest
  },!         e#     ... and require no matches
},,           e#   ... and count

Bạn có thể đang nghĩ "WTF?! Anh ấy đang trả lời sai câu hỏi." Nếu vậy, điều đó có thể hiểu được, nhưng cả hai phương pháp thực sự cho kết quả chính xác .


Trong trường hợp ot giúp, bản dựng hàng đêm trên TIO trả về một mảng trống cho [WW]3ew.
Dennis

@Dennis, cảm ơn. Tuy nhiên, hóa ra 0dù sao cũng cần phải là một trường hợp đặc biệt, bởi vì nó đánh giá 1.
Peter Taylor

1
Người ta sẽ chỉ nghĩ rằng bạn đang trả lời sai câu hỏi nếu người ta thậm chí không nhấp vào liên kết của tôi.
Rò rỉ Nun

ri_1&a{{1$+}*]W%0+}@*0=tiết kiệm 3 byte.
Dennis

2
@LeakyNun, vậy thì sẽ là mọi người rồi. Tôi thấy danh sách các liên kết và tl; dr.
Peter Taylor

7

Julia, 40 38 32 byte

!n=2(2*4^n-2^n-0^n)abs(zeta(-n))

Đầu vào và đầu ra ở dạng BigFloats. Hãy thử trực tuyến!

Lý lịch

Chuỗi Maclaurin của hàm tiếp tuyến thỏa mãn danh tính

Bất cứ khi nào x nằm trong bán kính hội tụ của nó, trong đó B n là số Bernoulli.

B 2 (n + 1)(-1) n có cùng dấu, B 2n + 1 = 0 nếu n> 0B 1 = 1/2 , chúng ta có thể viết lại như trên.

Hơn nữa, bất cứ khi nào n là số nguyên không âm, chúng ta có

trong đó ζ biểu thị hàm zeta Riemann .

Từ đó, với quy ước 0 0 = 1 , nó tuân theo điều đó

đó là công thức thực hiện sử dụng.


6

Python, 57 byte

f=lambda i,j=0:~-j*f(i-1,j-1)-~j*f(i-1,j+1)if i else j==1

Ít chơi gôn hơn:

f=lambda i,j=0:j==1 if i==0 else (j-1)*f(i-1,j-1)+(j+1)*f(i-1,j+1)

Chúng ta có thể tính ihệ số thứ của hàm tạo hàm mũ bằng cách phân biệt ithời gian của hàm tiếp tuyến và đánh giá tại 0. Mỗi đạo hàm là một đa thức trong tan(x)và giá trị của nó là 0 là số hạng không đổi.

Chúng tôi bày tỏ một cách đệ quy hệ số tan(x)**jtrong ihàm thứ của tanvới chức năng f(i,j). Các biểu thức đệ quy xuất phát từ mối quan hệ tan(x)' = 1 + tan(x)**2.

Vì vậy, đạo hàm của tan(x)**j

j*tan(x)**(j-1)*(tan(x)**2+1), or equivalently
j*tan(x)**(j+1) + j*tan(x)**(j-1)

Vì vậy, người đóng góp vào tan(x)**jtrong iphái thứ đang tan(x)**(j-1)tan(x)**(j+1)trong (i-1)phái sinh st, đều có hệ số tương đương với sức mạnh của nó. Điều này cho biểu thức đệ quy

f(i,j) = (j-1)*f(i-1,j-1) + (j+1)*f(i-1,j+1)

Lưu ý rằng chúng ta không cần loại trừ số mũ âm jvì dù sao chúng cũng đánh giá bằng 0 và không đóng góp vì việc vượt qua j=0mang lại cho một số nhân 0.

Trường hợp cơ sở i==0tương ứng với tan(x)chính nó j==1và các hệ số bằng không khác. Đánh giá cuối cùng xảy ra ở thời hạn không đổi j=0, được đặt làm giá trị mặc định.


Cổng này tới 20 byte trong CJam. Bạn có phiền nếu tôi đưa ra câu trả lời chính của mình, hoặc bạn muốn chuyển và đăng nó?
Peter Taylor

Bạn nên đăng nó, tôi không biết CJam.
xnor

4

Toán học, 20 byte

Tan@x~D~{x,#}/.x->0&

Phương pháp tiếp cận thẳng. Tính n đạo hàm thứ của tan (x) và đánh giá nó tại x = 0 .

Sử dụng

Thí dụ


3

Haskell, 48 byte

0%1=1
0%_=0
i%j=sum[k*(i-1)%k|k<-[j+1,j-1]]
(%0)

Chúng ta có thể tính ihệ số thứ của hàm tạo hàm mũ bằng cách phân biệt ithời gian của hàm tiếp tuyến và đánh giá tại0 . Mỗi đạo hàm là một đa thức trong tan(x)và giá trị tại 0 là số hạng không đổi.

Chúng tôi bày tỏ một cách đệ quy hệ số tan(x)^jtrong ihàm thứ củatanvới chức năng i%j. Các biểu thức đệ quy xuất phát từ mối quan hệ tan(x)' = 1 + tan(x)^2.

Vì vậy, đạo hàm của tan(x)^j

j*tan(x)^(j-1)*(tan(x)^2+1), or equivalently
j*tan(x)^(j+1) + j*tan(x)^(j-1)

Vì vậy, người đóng góp vào tan(x)^jtrong iphái thứ đang tan(x)^(j-1)tan(x)^(j+1)trong (i-1)phái sinh st, đều có hệ số tương đương với sức mạnh của nó.


3

Thạch , 12 11 byte

Ṛ+\;S
ḂÇ⁸¡Ḣ

Giống như câu trả lời CJam của Peter Taylor , điều này tính toán thuật ngữ thứ n của chuỗi lên / xuống của Euler nếu n là số lẻ và trường hợp đặc biệt thậm chí n 0 .

Hãy thử trực tuyến! hoặc là xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

ḂÇ⁸¡Ḣ  Main link. Argument: n

Ḃ       Bit; yield n's parity.
 Ç⁸¡    Apply the helper link (Ç) n (⁸) times.
    Ḣ   Head; retrieve the first element of the resulting list.


Ṛ+\;S   Helper link. Argument: A (list or 1/0)

Ṛ       Cast A to list (if necessary) and reverse the result.
 +\     Take the cumulative sum.
   ;S   Append the sum of A.

3

Sage, 26 byte

lambda n:tan(x).diff(n)(0)

Giống như các giải pháp khác trong các ngôn ngữ định hướng toán học, hàm này tính toán n đạo hàm thứ tan(x)và đánh giá nó tạix = 0 .

Dùng thử trực tuyến


2

J, 15 13 byte

Ngoài ra còn có dựng sẵn t:tính toán hệ số thứ n của hàm tạo hàm mũ của tan (x) .

(1&o.%2&o.)t:

Cảm ơn @ Leaky Nun đã nhắc nhở tôi về các trạng từ chuỗi Taylor trong J đã lưu 2 byte.

Thay thế cho 15 byte .

3 :'(3&o.d.y)0'

Một cách tiếp cận khác là tính đạo hàm thứ n của tan (x) và đánh giá nó tại x = 0 .

Lưu ý: Trong J , lượng bộ nhớ được sử dụng bởi hàm phái sinhd. tăng nhanh khi n vượt qua 10.

Sử dụng

   f =: (1&o.%2&o.)t:
   f 7
272
   (,.f"0) i. 11  NB. Additional commands are just for formatting the output
 0    0
 1    1
 2    0
 3    2
 4    0
 5   16
 6    0
 7  272
 8    0
 9 7936
10    0

Giải trình

(1&o.%2&o.)t:  Input: n
(         )    Define a monad (one argument function), call the input y
 1&o.          Get the trig function sin(x) and call it on y
      2&o.     Get the trig function cos(x) and call it on y
     %         Divide sin(y) by cos(y) to get tan(y)
           t:  Get the nth coefficient of the exponential generating series
               for that function and return

3 :'(3&o.d.y)0'  Input: n
3 :'          '  Define a monad (one argument function) with input y
     3&o.        Get the trig function tan(x)
           y     The input n
         d.      Get the nth derivative of tan(x)
             0   Evaluate the nth derivative at x = 0 and return

2

Julia, 39 37 byte

!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]

Đã lưu 2 byte nhờ Dennis.

Không phải là giải pháp Julia ngắn nhất (xem giải pháp của Dennis), nhưng giải pháp này được thực hiện hoàn toàn bằng cách sử dụng logic phái sinh ... dưới dạng ma trận.

Về cơ bản, nó sử dụng thực tế là đạo hàm của tan (x) là 1 + tan (x) ^ 2. Vì vậy, vì đạo hàm của bất kỳ lũy thừa nào của tan (x), giả sử tan (x) ^ k, là k tan (x) ^ (k-1) tan (x) '= k tan (x) ^ (k-1) + k tan (x) ^ (k + 1), chúng ta có thể sử dụng công suất ma trận đơn giản trên ma trận với các giá trị phù hợp để tạo ra sự mở rộng, với hàng hoặc cột thứ hai (tùy theo cách xây dựng) giữ các đạo hàm của tan (x ) chinh no.

Vì vậy, chúng ta chỉ cần tìm hằng số trong biểu thức kết quả và đó là giá trị đầu tiên trong hàng hoặc cột tương ứng.


!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]nên làm việc.
Dennis

@Dennis - Bắt đẹp. Không nhận ra spdiagmsẽ cho phép phong cách xây dựng đó - đã thử nó diagm, nhưng tất nhiên nó không hoạt động.
Glen O

2

JavaScript (ES6), 127 45 byte

f=(n,m=0)=>n?++m*f(--n,m--)+--m*f(n,m):m-1?0:1

Giải pháp của cảng @ xnor.


0

Haskell, 95 93 byte

p=product
f n=sum[(-1)^(n`div`2+j+1)*j^n*p[k-j+1..n+1]`div`p[1..n+1-k+j]|k<-[1..n],j<-[0..k]]

Về cơ bản, nó là một triển khai của công thức chung với một số tối ưu hóa nhỏ.


0

MATLAB với Hộp công cụ tượng trưng, ​​84 byte

n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)

Ví dụ chạy:

>> n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)
7
ans =
272

>> n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)
8
ans =
0

>> n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)
9
ans =
7936

0

Haskell (quá nhiều byte)

Chỉ sử dụng các thao tác trên danh sách và kết quả của Raymond Manzoni :

c n = last $ map numerator $ zipWith (*) (scanl (*) (1) [2,3..]) (intersperse 0 $ foldr (.) id (replicate n (\xs->(xs ++ [(1%(1+2*length xs)) * (sum (zipWith (*) xs (reverse xs)))]))) [1])

Thật không may, điều này tràn ra cho các giá trị khiêm tốn n, vì nó sử dụng Intcác giá trị. Tôi sẽ cố gắng khắc phục vấn đề bằng cách sử dụng Integercác giá trị. Cho đến lúc đó, đề xuất được chào đón.


0

Tiên đề, 46 byte

f(n:NNI):NNI==(n=0=>0;eval(D(tan(x),x,n),x=0))

mã kiểm tra và kết quả

(32) -> [[i, f(i)] for i in 0..26]
   (32)
   [[0,0], [1,1], [2,0], [3,2], [4,0], [5,16], [6,0], [7,272], [8,0], [9,7936],
    [10,0], [11,353792], [12,0], [13,22368256], [14,0], [15,1903757312],
    [16,0], [17,209865342976], [18,0], [19,29088885112832], [20,0],
    [21,4951498053124096], [22,0], [23,1015423886506852352], [24,0],
    [25,246921480190207983616], [26,0]]
                                       Type: List List NonNegativeInteger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.