Análise
Vamos adivinhar e depois melhorar sistematicamente o palpite até que esteja correto.
Comece adivinhando que a resposta é . Claro que está errado. Para ver o quão errado, rotule um parceiro em cada par como "Vermelho" e o outro como "Azul". Da perspectiva de qualquer indivíduo vermelho, existe uma chance de que o parceiro (azul) fique sentado à frente deles. Como não há indivíduos vermelhos, vamos subtrair desse palpite inicial.11/(2n−1)nn×1/(2n−1)
Mas espere - isso ainda não está certo, porque todos os pares de casais foram contados duas vezes. Se um casal estiver sentado do lado oposto, restam casais, lugares e, do ponto de vista de qualquer indivíduo vermelho, a chance de fazer parte de um segundo casal é . Portanto, precisamos adicionar novamente .n−12n−21/(2n−3)(n2)×1/(2n−1)×1/(2n−3)
Mas agora temos contribuições subestimadas para o resultado de triplos casais, que precisamos corrigir. E assim continua, até que finalmente acomodamos todos os casais na fórmula. (Obviamente, este é apenas o Princípio da Inclusão-Exclusão em ação.) n
A fórmula resultante é
∑i=0n(−1)i(ni)1(2n−1)(2n−3)…(2n−2i+1)=1F1(−n,−n+12,−12).(1)
Computação
Para números inteiros positivos , a função hipergeométrica confluente de Kummer é um polinômio de grau em . Da Transformação Kummern 1F1(−n,−n+12,z)nz
1F1(−n,−n+12,−12)=e−1/2 1F1(12,−n+12,12)
é fácil deduzir que o valor limite da probabilidade conforme cresce é . A convergência é lenta: você precisa multiplicar por para obter um dígito decimal adicional. No entanto, valores precisos (precisão dupla) podem ser calculados rapidamente para qualquer , observando que os termos na soma esquerda de crescem mais lentamente que as potências de . Assim, quando chegar aos , os novos valores serão essencialmente zero em comparação com (e, de fato, uma análise mais detalhada sugere que interromper a soma porne−1/2≈0.6065306597…n10n(1)−1/2i52e−1/2i=45 vai funcionar).
Essa fórmula será dividida em superior a 10.000.000 em determinados ambientes de computação devido a imprecisões na função Gamma do log. O problema surge do cancelamento das diferenças que surgem ao calcular os termos da série. Uma excelente aproximação a essas diferenças quando é suficientemente grande pode ser encontrada em termos de , onde é a derivada de (a função digamma ). Isso é implementado no código abaixo, a um pequeno custo no tempo de computação.nnψ(n−1/4)ψlogΓ
Implementação
O Rcódigo a seguir calcula cerca de 20.000 valores de precisão dupla por segundo.
f <- function(n) {
h <- function(n) {
ifelse(n < 1e6, lfactorial(n) - lfactorial(n-1/2), digamma(n+3/4)/2)
}
m <- min(n, 46)
k <- 0:m
x <- exp(h(n) - h(n-k) - lfactorial(k) - k*log(2)) * (-1)^k
sum(x)
}
Como um exemplo, vamos acompanhar o quão estreitamente se log(f(n))aproxima seu valor-limite de para o grande . Como reivindicado acima, cada fator de em adiciona uma casa decimal de precisão limitadora. Vejamos, portanto, a decimal no logaritmo da razão de para , para potências inteiras de de a :−1/2n10nnthf(n)e−1/210n=101n=1014
> round(sapply(1:14, function(n) 10^n * (log(f(10^n)) + 1/2)), 3)
[1] -0.255 -0.251 -0.250 ... -0.250 -0.249 -0.249 -0.400
(Sete valores foram omitidos do meio, todos iguais a -0.250.) O padrão constante é claro. No final, com , começa a quebrar, indicando perda de precisão. Melhorar isso provavelmente exigiria aritmética de alta precisão.n=1014