Pregunta

Alguien me hizo una pregunta por correo electrónico sobre particiones enteras el otro día (ya que había lanzado un módulo Perl, Integer :: Partition, para generarlas), que no pude responder.

Antecedentes: aquí están todas las particiones enteras de 7 (la suma de cada fila es igual a 7).

7
6 1
5 2
5 1 1
4 3
4 2 1
4 1 1 1
3 3 1
3 2 2
3 2 1 1
3 1 1 1 1
2 2 2 1
2 2 1 1 1
2 1 1 1 1 1
1 1 1 1 1 1 1

Ahora, si observamos las longitudes de cada partición y contamos cuántos hay de cada longitud:

1 1
2 3
3 4
4 3
5 2
6 1
7 1

... vemos que una partición tiene una longitud de 1 (7), una tiene una longitud de 7 (1 1 1 1 1 1 1). Hay 4 particiones que tienen una longitud de 3: (5 1 1), (4 2 1), (3 3 1), (3 2 2).

Para números mayores de N, si grafica la distribución de las longitudes de partición, emerge una curva asimétrica, sesgada hacia el origen. Si tienes curiosidad, grafica los siguientes conteos de longitud de partición para N = 40.

1 20 133 478 1115 1945 2738 3319 3589 3590 3370 3036 2637 2241 1861 1530 1236 995 790 627 490 385 297 231 176 135 101 77 56 42 30 22 15 11 7 5 3 2 1 1

Si está interesado en generar estos conteos de distribución, aquí está el código que utilicé:

#! /usr/local/bin/perl

use strict;
use warnings;

use Integer::Partition;

my $n = shift || 1;

while (1) {
    my $start = time;
    my $i = Integer::Partition->new($n);
    my %size;
    while (my $p = $i->next) {
        $size{scalar @$p}++;
    }

    open my $out, '>>', "bucket-count.out";
    for my $s (sort {$a <=> $b} keys %size) {
        print $out "$n\t$s\t$size{$s}\n";
    }
    close $out;
    my $delta = time - $start;
    print "$n\t$delta secs\n";
    ++$n;
}

(nota: en mi computadora, N = 90 tarda unos 10 minutos en generarse).

Entonces, mi pregunta es: ¿qué ecuación se puede usar para igualar la curva de distribución observada? ¿Es un Gauss (¿puede una distribución gaussiana ser asimétrica?) O una distribución de Poisson, o algo más?

¿Cómo lo resuelvo para N? Si recuerdo mis matemáticas de la secundaria, puedo determinar el pico resolviendo cuándo la derivada se cruza con 0. ¿Cómo produzco la derivada? He buscado en la web, pero todo lo que recibo son documentos matemáticos abstractos. Solo necesito un código :)

¿Fue útil?

Solución

Creo que una distribución de Poisson es una estimación razonable. Dada la presunción, su problema ahora se convierte en uno de encontrar la frecuencia máxima, k, dado N. Creo que tiene dos enfoques:

  1. descifrelo desde un punto de vista matemático (yo empezaría mirando combinatorics , pero eso puede no ser un novillo particularmente bueno)
  2. suponga que es poisson y mida el pico para cualquier N dada, como lo ha hecho anteriormente.

Una vez que tenga el pico (k), estimar lambda debería ser sencillo (pruebe algunos) y tendrá su curva.

Otro enfoque es trabajar todo en Python y preguntar en los tableros numpy o scipy :-)

HTH

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top