10 votos

Número de particiones de $50$

¿Alguien sabe el número de particiones del número entero $50$? ¿Quiero decir, de cuántas maneras puedo escribir $50$ como la suma de enteros positivos? Sé que hay una tabla por Euler, que es útil para saber de cuántas maneras se puede escribir $50$ como la suma de $m$ diferentes números, pero esta mesa se detiene en $m=11$, así que no puedo terminar el cálculo y calcular en cuántas maneras en que puedo escribir $50$ como la suma de (cualquier) números diferentes. Gracias

10voto

Es sabido --- y es difícil y famoso resultado demostrado por Hardy y Ramanujan --- que el número de particiones de $n$ es de aproximadamente (al $n$ es grande) dado por $p(n) \sim \frac{ e^{ \pi\sqrt{2n/3} } }{4n\sqrt{3} }$. Con $n = 50$, este yelds $p(50) \sim 217590$.

Malas noticias : no es útil la forma cerrada de $p(n)$. Pero también se puede calcular con la conocida fórmula de recurrencia

$$p(n) = p(n-1) + p(n-2) - p(n-5) - p(n-7) + p(n-12) - ... $$

donde $1,2,5,7,12$ el (generalizada) números pentagonales.

Para $n=50$ esto se podría hacer con la ayuda de una computadora.

(edit : bueno, como Théophile se mencionó, existen tablas de hasta el $p(250)$ y más. También, la señal de error en la de Euler recurrencia ha sido corregido. ¡Gracias !)

7voto

Théophile Puntos 7913

Según la tabla en OEISWiki, el número de partición de $50$ es $204226$.

5voto

justartem Puntos 13

Usted puede resolver este problema a través de Euler de la recursividad.

Ella le dice que $p_n=\sum\limits_{i\neq 0}^{}(-1)^{i-1} p_{n-i(3i-1)/2}$.

Por supuesto, la función de $f(x)=x(3x-1)/2$ es positivo en todas partes, excepto $(0,1/3)$, por lo que este es un buen recursividad. También tenga en cuenta que $p_n$ se define a ser $0$ para los valores negativos.

Podemos utilizar esta recursividad para calcular el $p_n$ a partir de los valores anteriores en el tiempo $\mathcal O(\sqrt n)$ , por lo que sin duda podemos obtener $P_n$ a partir de cero en el tiempo $\mathcal O(\sqrt n n)$

Here is some c++ code:


#include <bits/stdc++.h>
using namespace std;
typedef long long lli;

const int MAX=100;
lli P[MAX];

int main(){
    P[0]=1;
    for(int a=1;a<MAX;a++){
        for(int b=-2*sqrt(a); b<= 2*sqrt(a); b++){// do recursion with all possible pentagonal numbers
            if( (b*(3*b-1) )/2 > a || b==0  ) continue;
            if(b%2) P[a]+= P[a- (b*(3*b-1) )/2];
            else P[a]-= P[a- (b*(3*b-1) )/2];
        }
    }
    printf("%lld\n",P[50]);
}

El resultado es $204226$

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X