합리적인 생성 함수의 계수 찾기


12

일련의 숫자를 거듭 제곱의 계수로 쓰면, 그 거듭 제곱 을 해당 순서 의 (일반) 생성 함수 (또는 Gf)라고합니다. 즉, 함수 F(x)와 일련의 정수에 a(n)대해 다음과 같은 경우

a(0) + a(1)x + a(2)x^2 + a(3)x^3 + a(4)x^4 + ... = F(x)

그런 다음 F(x)의 생성 함수입니다 a. 예를 들어, 기하학적 시리즈 는 다음과 같이 알려줍니다.

1 + x + x^2 + x^3 + x^4 + ... = 1/(1-x)

따라서의 생성 함수는 1, 1, 1, ...입니다 1/(1-x). 위 방정식의 양변을 구별하고 곱 x하면 다음과 같은 평등을 얻습니다.

x + 2x^2 + 3x^3 + 4x^4 + ... = x/(1-x)^2

따라서의 생성 함수는 1, 2, 3, ...입니다 x/(1-x)^2. 함수 생성은 매우 강력한 도구이므로 여러 유용한 기능을 수행 할 수 있습니다. 짧은 소개는 여기 에서 찾을 수 있지만, 자세한 설명을 위해 놀라운 책 생성 기능이 있습니다.


이 도전에서는 정수 계수의 두 배열, 먼저 분자 다음에 분모로 입력 되는 합리적 함수 (정수 계수를 갖는 두 개의 다항식의 몫)를 사용합니다. 예를 들어 함수 f(x) = x / (1 - x - x^2)[0, 1], [1, -1, -1]입력 과 같이 인코딩됩니다 .

이 입력이 주어 무한히 계수부터 시작하여 라인 당 하나의 발생 기능과 동일 멱급수의 계수 인쇄해야 프로그램 x이어서, x^2등,


예 :

[1], [1, -1] -> 1, 1, 1, 1, 1, 1, 1, ...
[1], [2, -2] -> 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, ...
[0, 1], [1, -2, 1] -> 1, 2, 3, 4, 5, 6, 7, 8, ...
[0, 1], [1, -1, -1] -> 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
[1], [1, -2] -> 1, 2, 4, 8, 16, 32, 64, 128, ...
[0, 1, 1], [1, -3, 3, -1] -> 1, 4, 9, 16, 25, 36, ...

Crap, 내 언어는 시퀀스를 위해 만들어졌지만 실제로 다차원 배열 입력을 할 수는 없습니다. (
Stephen

2
나는이 사양에 대해 수학적으로 충분히 생각하지 못합니다. 일반적인 사람들을 위해 평신도의 설명을 더 많이 올릴 수 있습니까?
Skidsdev


1
@trichoplax 분자가 항상 1이되도록 강제합니다. 예를 들어 마지막 예제 인 사각형을 표현할 수 없습니다.
orlp

1
이것을 표현하는 다른 방법은 일반적인 선형 재귀를 평가하는 것입니다. 그런 식 으로이 질문을 일반화 하고 향후 반복 질문에 대한 속임수 역할을 할 수 있습니다.
피터 테일러

답변:



3

매스 매 티카, 64 83 90 바이트

Do[Echo@Limit[D[#/#2/i!&@@Fold[x#+#2&]/@#,{x,i}],x->0],{i,∞}‌​]&

@ngenisis와 @Jenny_mathy에게 감사합니다!

두 개의 목록으로 입력하십시오.

Alt+.결과를 보려면 실행을 종료 해야 합니다. 빠른 출력으로 인해 프론트 엔드가 충돌 할 수 있습니다.

83 바이트 버전 (@Jenny_mathy) :

i=1;v=Tr[#*x^Range@Length@#]&;While[1<2,Echo@Limit[D[v@#/v@#2/i!,{x,i}],x->0];i++]&

83 바이트 : i = 1; v = Tr [# * x ^ Range @ Length @ #] &; [1 <2, Echo @ Limit [D [v @ # / v @ # 2 / i !, {x, i}], x-> 0]; i ++] &
J42161217

@Jenny_mathy 귀찮게해서 죄송합니다. 첫 번째 주석에 정크가 보이지 않는 유니 코드 문자가 있음을 알았습니다. 정리가 끝나면 코드가 정상입니다.
Keyu Gan

3
64바이트 : Do[Echo@Limit[D[#/#2/i!&@@Fold[x#+#2&]/@#,{x,i}],x->0],{i,∞}]&. 이것은 입력이 두리스트의리스트이고 계수는 내림차순으로 가정합니다. 내가하는 일을 알고있는 유일한 내장 기능 v은 다음과 같습니다.Internal`FromCoefficientList
ngenisis

이것을 반복적으로 실행합니까? i람다 안에 넣으려면 몇 개의 추가 괄호가 필요할 수 있습니다 . (반면, 목표가 무한 목록을 인쇄 할 때 반복 실행 능력이 적절한 지 확실하지 않습니다. 이것에 대한 메타 합의가 있었습니까?)
Julian Wolf

@ ngenisis : 어떤 버전을 사용하고 있습니까? v10.0에서는 솔루션이 나에게 제공합니다 Iterator {i,∞} does not have appropriate bounds.
Julian Wolf

1

CJam (22 바이트)

{\{(W$(@\/_pW*f*.+1}g}

온라인 데모 . 기존 답변의 많은 수에는 출력에 0 번째 계수가 포함됩니다.

해부

{           e# Define a block which takes numerator N and denominator D as arguments
  \         e# Flip to put D at the bottom, since that won't change
  {         e# Infinite loop:
    (       e#   Pop the first element of (the modified) N
    W$(     e#   Copy D and pop its first element
            e#   Stack: D N[1:] N[0] D[1:] D[0]
    @\/     e#   Bring N[0] to top, flip, divide
            e#   Stack: D N[1:] D[1:] N[0]/D[0]
    _p      e#   Print a copy
    W*f*.+  e#   Multiply by -1, multiply all, pointwise add
            e#   Stack: D N[1:]-(N[0]/D[0])*D[1:]
  1}g
}

0

수학, 86 79 바이트

f=x^Range@Length@#.#&;For[n=1,8>3,Print@SeriesCoefficient[f@#/f@#2,{x,0,n++}]]&

입력을 두 개의 개별 목록 (분자 계수, 분모 계수)으로 취합니다. 입력 값을 계수 목록이 아닌 다항식의 일부로 직접 가져올 수 있으면 크게 단축 될 수 있습니다.

Dov11에서는 무한 범위에서 작동 할 수있는 것 같습니다 . 로컬로 테스트 할 수는 없지만이 경우이 솔루션을 75 바이트 로 단축 할 수 있습니다 .

f=x^Range@Length@#.#&;Do[Print@SeriesCoefficient[f@#/f@#2,{x,0,n}],{n,∞}]&

마지막 테스트 사례는 0으로 시작하지 않습니다.
J42161217

@ Jenny_mathy : 쏴, 머리를 주셔서 감사합니다. 테스트 케이스는 0 대신에 처음부터 시작하는 것처럼 보입니다 ... 이것은 몇 바이트를 절약 할 수 있어야합니다.
Julian Wolf

@ Jenny_mathy : 테스트 사례가 기발한 것 같습니다. n대신 1 부터 시작 0하여 솔루션과 동일한 결과를 제공합니다. 그러나 두 번째에서 마지막 테스트 사례에서는 둘 다 실패합니다.이 솔루션은 n0 부터 시작할 때 통과 합니다.
Julian Wolf

0

Pyth , 23 바이트

JE#
KchQhJ=t-M.t,Q*LKJ0

온라인으로 사용해보십시오!

작동 원리

                       Q = eval(input())
JE                     J = eval(input())
  #                    infinite loop:
 chQhJ                   Q[0]/J[0]
K                        assign that to K (and print it, because of the preceding newline)
              *LKJ       K times every element of J
            ,Q           [Q, that]
          .t      0      transpose, padding with 0s
        -M               subtract each pair
       t                 remove the first element
      =                  assign that back to Q

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