반복적 인 유리수 시퀀스를 생성하는 더 빠르고 우아한 방법 [닫기]
아래에서 재귀를 공부하고 있습니다.
$$B_{N,0}=1$$
$$B_{N,k}=-\binom{N+k}{k}^{-1}\sum_{j=0}^{k-1}\binom{N+k}{j}B_{N,j}$$
이제 저는 Mathematica로 글을 쓰는 데 능숙하지 않습니다. 내가 사용한 지 오래되었습니다. 그래서 저는 오래된 작업을 찾아 Mathematica에서이 방법을 발견했습니다. 그것은 코드의 "메모리"속성이거나 그것이 나에게 설명 된 것을 기억하는 방법입니다. 그래서 나는 그것을하고 아래 코드를 작성했습니다.
B[0]=1
B[k]=B[k_]:=Simplify[-1/(Binomial[N+k,k])*Sum[Binomial[N+k,j]*B[j]],{j,0,k-1}]
그리고 작동합니다! 대단하지 않습니다. 그래서 저는 처음 4 개 또는 5 개를 꽤 멋지게 얻습니다. 변수의 합리적 함수입니다.$N$. 그래서 처음 5 개는 아래에 게시됩니다 (Imgur를 사용했습니다, 죄송합니다)

그러나 코드가 깨집니다. 필요한 계산이 커짐에 따라 재귀가 너무 어려워 질 것이라고 확신합니다. 다음 두 숫자는 다음과 같이 주어집니다 (다시, 이미지 죄송합니다)

그리고 여기에 질문이 있습니다. 어떻게하면 6 번째 B [6], 7 번째 B [7], ..., k 번째 숫자 B [k]가 어설픈 이항식없이 이전 5에서와 같이 우아한 인수 형식으로 작성되거나 출력됩니다. 분모의 기능? 나는 분모의 분해 분포에 관심이 있습니다.
답변
ClearAll[B];
B[k_]:=B[k]=Simplify[FunctionExpand[-1/(Binomial[n+k,k])*Sum[Binomial[n+k,j]*B[j],{j,0,k-1}]]]
나를 위해 잘 작동합니다.
Table[{"B[" <> ToString[k] <> "]=", B[k]}, {k, 0, 7}] // TableForm
![]()
ClearAll[B]
값은에 의해 캐시되므로 정의를 변경할 때 확인하십시오 B[k]:=B[k]
. 계산 B[k]
하는 k=7
데 0.02 초가 걸렸고 최대 k=42
10.7 초가 걸렸 습니다 . 그것은 나에게 합리적인 것 같습니다.
OP의 정의와 N0va의 차이점을 지적하십시오.
잘못된 버전
B[k] = B[k_] := <RHS>
왼쪽에서 오른쪽으로 읽으면 첫 번째 할당은 단일 같음 (Set)이고 두 번째 할당은 콜론 같음 (SetDelayed)입니다. GUI에서 k
파란색으로 표시됩니다 (무료라고 가정). 의사 코드에서 :
- Mathematica는 먼저을보고
B[k] = <expression1>
" 즉시<expression1>
결과를에 할당하고 평가 하겠습니다."라고 말합니다B[k]
. - 매스 매 티카는보고
<expression1>
인B[k_] := <RHS>
, 그리고 말한다 "나는 지금 정의 할B[k_]
수<RHS>
,하지만 난 것이다 지연 의 평가<RHS>
내가의 실제 값을받을 때까지를k
."
두 번째 단계가 반환 Null
되고 바로이 단계에 Null
할당됩니다 B[k]
. 실제로 이것은하는 것과 동일합니다.
B[k_] := <RHS>
B[k] = Null
즉, 즉시 (그러나 쓸모없는) 할당이 뒤 따르는 기억되지 않은 정의.
올바른 버전
B[k_] := B[k] = <RHS>
왼쪽에서 오른쪽으로 읽으면 첫 번째 할당은 콜론 같음 (SetDelayed)이고 두 번째 할당은 단일 같음 (Set)입니다. 의사 코드에서 :
- Mathematica는 먼저를보고
B[k_] := <expression2>
"이제를로 정의B[k_]
할<expression2>
것이지만<expression2>
실제 값을받을 때까지 의 평가를 연기 할 것 입니다k
."라고 말합니다.
좋습니다. 실제 값을 받으면 어떻게됩니까 k
?
- 매스 매 티카는 평가
<expression2>
인B[k] = <RHS>
및 말한다, "나는 지금 즉시 평가합니다<RHS>
및 에 결과를 할당합니다B[k]
." 암기를 달성하는 것은이 두 번째 과제입니다.