Існує проста закрита формула з точки зору коренів многочлена 6-го ступеня.
Насправді трохи легше вважати загальну справедливу загибель d≥2 обличчя, позначені цифрами 1,2,…,d.
Дозволяє ek бути очікуваною кількістю рулонів, необхідних для вирівнювання або перевищення k. Для k≤0, ek=0. Інакше очікування на один більше, ніж очікування кількості рулонів, щоб досягти безпосередньо попереднього значення, яке було б серед к - д, к - д+ 1 , … , k - 1 , звідки
ек= 1 +1г(ек - д+ек - д+ 1+ ⋯ +еk - 1) .(1)
Це лінійне відношення рецидиву має рішення у вигляді
ек=2 кг+ 1+∑i = 1гаiλкi(2)
де λi є г складні корені многочлена
Тг-1г(Тг- 1+Тг- 2+⋯+T+1).(3)
Константи ai виявляються шляхом застосування розчину (2) до значень k = - ( d- 1 ) , - ( д- 2 ) , … , - 1 , 0 де ек= 0у кожному випадку. Це дає набірг лінійні рівняння в гконстанти і це унікальне рішення. Про те, що рішення працює, можна довести, перевіривши повторність( 1 ) використовуючи той факт, що кожен корінь задовольняє ( 3 ) :
1 +1г∑j = 1геk - j= 1 +1г∑j = 1г(2 ( k - j )г+ 1+∑i = 1гаiλk - ji)=2 кг+ 1+∑i = 1гаiλк - дi[1г( 1 +λi+ ⋯ +λг- 1i) ]=2 кг+ 1+∑i = 1гаiλк - дiλгi=2 кг+ 1+∑i = 1гаiλкi=ек.
Це рішення закритої форми дає нам хороші способи наблизити відповідь, а також точно оцінити її. (Для малих до скромних значеньk , пряме застосування рецидиву - ефективний обчислювальний прийом.) Наприклад, с г= 6 ми можемо легко обчислити
е1000000= 285714.761905 …
Для наближення буде унікальний найбільший корінь λ+= 1 тож зрештою (для досить великих к) термін λк+ буде домінувати над г терміни в ( 2 ) .Похибка зменшиться експоненціально відповідно до другої найменшої норми коренів. Продовжуючи приклад сk = 6 , коефіцієнт λ+ є а+= 0,4761905 а наступна-найменша норма - це 0.7302500. (До речі, інше аi мають тенденцію бути дуже близькими 1 за розміром.) Таким чином, ми можемо наблизити попереднє значення як
е1000000≈2 ×1066 + 1+ 0,4761905 = 285714,761905 …
з помилкою на порядок 0.7302500106≈10- 314368.
Щоб продемонструвати, наскільки практичним є це рішення, ось R
код, який повертає функцію для оцінкиек для будь-якого к (в межах подвійних точних обчислень з плаваючою комою) і не надто великі г (колись воно заграє г≫ 100):
die <- function(d, mult=1, cnst=1, start=rep(0,d)) {
# Create the companion matrix (its eigenvalues are the lambdas).
X <- matrix(c(0,1,rep(0,d-1)),d,d+1)
X[, d] <- mult/d
lambda <- eigen(X[, 1:d], symmetric=FALSE, only.values=TRUE)$values
# Find the coefficients that agree with the starting values.
u <- 2*cnst/(d+1)
a <- solve(t(outer(lambda, 1:d, `^`)), start - u*((1-d):0))
# This function assumes the starting values are all real numbers.
f <- Vectorize(function(i) Re(sum(a * lambda ^ (i+d))) + u*i)
list(f=f, lambda=lambda, a=a, multiplier=mult, offset=cnst)
}
Як приклад його використання, тут розраховується очікування на k = 1 , 2 , … , 16 :
round(die(6)$f(1:10), 3)
1.000 1.167 1.361 1.588 1.853 2.161 2.522 2.775 3.043 3.324 3.613 3.906 4.197 4.476 4.760 5.046
Об'єкт, який він повертає, включає корені λi та їх множники аiдля подальшого аналізу. Перший компонент масиву множників - корисний коефіцієнта+.
(Якщо вам цікаво, для чого призначені інші параметри die
, виконайте виконання die(2, 2, 0, c(1,0))$f(1:10)
та подивіться, чи визнаєте ви вихід ;-). Це узагальнення сприяло розробці та тестуванню функції.)