지수 생성 함수가 탄젠트 인 시퀀스의 골프


15

거의 모든 함수는 무한 항을 갖는 다항식으로 표현 될 수 있습니다.

예를 들어 e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...

예를 들어 sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...

-항의 계수는 n시퀀스를 형성하며 해당 함수를 시퀀스 의 생성 함수 라고합니다 .

-항의 계수 n는 시퀀스를 형성합니다.

종종, n제 2 항은 분모를 갖습니다 n!. 따라서 우리 n!지수 생성 함수 가 원래 함수가 될 다른 시퀀스를 얻기 위해 계수를 곱합니다 .

예를 들어 지수 생성 함수 의 시퀀스 는 e^x입니다 1,1,1,1,....

예를 들어 지수 생성 함수 의 시퀀스 는 sin(x)입니다 0,1,0,-1,0,1,0,-1,....

직무

당신의 임무는 지수 생성 함수n시퀀스 의- 번째 항 을 찾는 것 입니다 .tan(x)

테스트 케이스

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

( 여기서 복사 함 ) (경고 : 0용어가 다름)

구현 예

# 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)]))

무시 했어!

참고 문헌


4
함수 생성, 수학에서의 함수, 특히 조합론 및 숫자 이론에 대한 자세한 내용을 보려면 H. Wilf의 "유명한"교과서 생성 기능 을 강력히 권장합니다 .
flawr

5
(저항 할 수 없음) : 말 그대로, 첫 번째 문장은 매우 거짓입니다!
Flounderer

"함수 생성"및 "지수 생성 기능"의 의미가 거꾸로 있습니다. $ \ sin (x) $는 시퀀스 0,1,0, -1,0,1,0, -1,0, ...의 지수 생성 함수입니다.-지수 생성 함수 인 시퀀스가 ​​아닙니다. $ \ sin (x) $입니다. 당신이 요구하는 것은 $ \ tan (x) $에 의해 지수 적으로 생성 된 시퀀스를 코딩하는 것입니다.
Glen O

"이 함수의 생성 함수라고도합니다. n 번째 항의 계수는 시퀀스를 형성합니다."를 제외하고는 잘 보입니다. "n 번째 항의 계수는 시퀀스를 형성합니다. 해당 기능을 시퀀스의 생성 기능이라고합니다. "
Glen O

@GlenO 편집 됨.
Leaky Nun

답변:


8

CJam ( 33 32 27 26 23 20 바이트)

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

온라인 데모

해부

이것은 본질적 으로 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

또는 23 바이트에 대해 다소 다른 접근 방식을 사용하십시오.

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

온라인 데모 . 3 바이트의 Dennis에게 감사합니다.

해부

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

또는 29 바이트에 대해 매우 다른 접근 방식을 사용하십시오.

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

온라인 데모

불행히도 입력에는 특별한 경우가 필요합니다 0.

해부

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

"WTF ?! 그는 잘못된 질문에 대답하고 있습니다." 그렇다면 이해할 수 있지만 두 방법 모두 실제로 올바른 결과를 제공합니다 .


ot가 도움이되는 경우 TIO의 야간 빌드는에 대한 빈 배열을 반환합니다 [WW]3ew.
데니스

@ 데니스, 고마워 그러나로 0평가되기 때문에 어쨌든 특별한 경우 가 필요합니다 1.
피터 테일러

1
내 링크를 클릭하지 않은 경우에만 잘못된 질문에 답변한다고 생각할 것입니다.
Leaky Nun

ri_1&a{{1$+}*]W%0+}@*0=3 바이트를 절약합니다.
Dennis

2
@LeakyNun, 그렇다면 그것은 모두가 될 것입니다. 그 링크와 tl; dr의 목록을 보았습니다.
피터 테일러

7

줄리아, 40 38 32 바이트

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

입력 및 출력은 BigFloats 형식입니다 . 온라인으로 사용해보십시오!

배경

접선 함수의 Maclaurin 계열은 동일성을 만족시킵니다.

x 가 수렴 반경에 있을 때마다 B n 은 Bernoulli 수입니다.

사람 B 2 (N + 1)(-1) n은 동일한 기호가 B를 2N + 1 = 0 인 경우, N> 0B (1) = 1/2 , 우리는 다시 쓸 수있는 다음과 같이 상술.

또한, n 이 음이 아닌 정수일 때마다

여기서 ζ리만 제타 함수를 나타냅니다 .

이것으로부터, 관습 0 0 = 1 이면 다음과 같습니다.

구현에서 사용하는 공식입니다.


6

파이썬, 57 바이트

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

덜 골프 :

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)

i탄젠트 함수 i시간 을 차별화하고 에서를 평가 하여 지수 생성 함수의 계수를 계산할 수 있습니다 0. 각 도함수는 다항식tan(x) 0의 값은 상수 항입니다.

우리는 순환 계수 표현 tan(x)**j에서 i의 차 미분 tan함수와 f(i,j). 재귀 표현은 관계에서 비롯됩니다tan(x)' = 1 + tan(x)**2 .

따라서의 미분 tan(x)**j

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

따라서, 제 2 도함수 tan(x)**j에 기여하는 사람 은 i제 2 도함수에 tan(x)**(j-1)있고 tan(x)**(j+1), 제 (i-1)2 도함수에는 각각 그 제곱과 같은 계수를 갖습니다. 이것은 재귀 표현을 제공합니다

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

음수 지수는 j어쨌든 0으로 평가되기 때문에 제외 할 필요 가 없으며, 교차 j=0는의 배수를 제공 하므로 기여하지 않습니다 0.

의 기본 사례는 i==0tan(x)자체 에 해당 하며 j==1, 그렇지 않으면 계수가 0입니다. 최종 평가는 상수 항 j=0에서 이루어지며 기본값으로 사용됩니다.


CJam에서 20 바이트로 포팅됩니다. 내가 그 주요 대답을한다고해도 괜찮습니까? 아니면 포팅하고 게시 하시겠습니까?
피터 테일러

당신은 그것을 게시해야합니다, 나는 CJam을 모른다.
xnor

4

Mathematica, 20 바이트

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

직접적인 접근. tan (x)n 번째 도함수를 계산하고 x = 0 에서 평가하십시오 .

용법

예


3

하스켈, 48 바이트

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

i탄젠트 함수 i시간 을 차별화하고 에서를 평가 하여 지수 생성 함수의 계수를 계산할 수 있습니다 0. 각 도함수는의 다항식이며 tan(x)0의 값은 상수 항입니다.

우리는 순환 계수 표현 tan(x)^j에서 i의 차 미분 tan함수와 i%j. 재귀 표현은 관계에서 비롯됩니다tan(x)' = 1 + tan(x)^2 .

따라서의 미분 tan(x)^j

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

따라서, 제 2 도함수 tan(x)^j에 기여하는 사람 은 i제 2 도함수에 tan(x)^(j-1)있고 tan(x)^(j+1), 제 (i-1)2 도함수에는 각각 그 제곱과 같은 계수를 갖습니다.


3

젤리 , 12 11 바이트

Ṛ+\;S
ḂÇ⁸¡Ḣ

마찬가지로 피터 테일러의 CJam 응답 이는 계산 N 의 일 기간 오일러 순서 위 / 아래의 경우 n이 홀수 특별한 케이스이다 N 으로 0 .

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인 .

작동 원리

ḂÇ⁸¡Ḣ  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.


2

J, 15 13 바이트

tan (x) 의 지수 생성 함수의 n 번째 계수 t:를 계산 하는 내장 기능도 있습니다.

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

2 바이트를 절약 한 J의 Taylor 시리즈 부사를 상기시켜 준 @ Leaky Nun 에게 감사드립니다 .

15 바이트를 대체 합니다 .

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

또 다른 접근법은 tan (x)n 번째 도함수 를 계산하고 x = 0 에서 평가하는 것 입니다.

참고 : J 에서 미분 함수가 사용하는 메모리의 양은 n 이 10을 통과 d.함에 따라 빠르게 증가 합니다.

용법

   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

설명

(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

줄리아, 39 37 바이트

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

Dennis 덕분에 2 바이트를 절약했습니다.

가장 짧은 Julia 솔루션 (Dennis의 솔루션 참조)은 아니지만 행렬 형태의 파생 논리를 사용하여 순수하게 수행됩니다.

기본적으로 tan (x)의 도함수가 1 + tan (x) ^ 2라는 사실을 사용합니다. 따라서 tan (x)의 거듭 제곱의 미분, 즉 tan (x) ^ k는 k tan (x) ^ (k-1) tan (x) '= k tan (x) ^ (k-1)입니다. + k tan (x) ^ (k + 1), tan (x)의 미분 값을 보유하는 두 번째 행 또는 열 (구성에 따라 다름)과 함께 적절한 값을 가진 행렬에 간단한 행렬 거듭 제곱을 사용하여 확장을 생성 할 수 있습니다. ) 자체.

따라서 결과 표현식에서 상수를 찾아야하며 이는 해당 행 또는 열의 첫 번째 값입니다.


!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]작동해야합니다.
데니스

@ 데니스-좋은 캐치. spdiagm그런 스타일의 건축을 허용한다는 것을 알지 diagm못했지만로 시도 했지만 물론 작동하지 않았습니다.
Glen O

2

자바 스크립트 (ES6), 127 45 바이트

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

@xnor 솔루션 포트.


0

하스켈, 95 93 바이트

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]]

기본적으로 약간의 최적화로 일반 수식을 구현 한 것입니다.


0

Symbolic Toolbox가있는 MATLAB, 84 바이트

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

예제 실행 :

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

하스켈 (너무 많은 바이트)

목록과 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])

불행히도, 값을 n사용 하므로이 값이 적당한 값인 경우 오버플로 Int됩니다. Integer값을 사용하여 문제를 해결하려고 합니다. 그때까지 제안을 환영합니다.


0

공리, 46 바이트

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

테스트 및 결과 코드

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