Pergunta

Alguém me fez uma pergunta via e-mail sobre as partições inteiras no outro dia (como eu tinha lançado um módulo Perl, Integer :: Partition, para gerá-los), que eu era incapaz de responder.

Fundo: aqui estão todas as partições inteiras de 7 (a soma de cada linha é 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

Agora, se olharmos para os comprimentos de cada partição e contar quantos existem de cada comprimento:

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

... vemos uma partição tem um comprimento de 1 (7), tem um comprimento de 7 (1 1 1 1 1 1 1). Existem 4 divisórias que têm um comprimento de 3:. (5 1 1), (2 1 4), (3 3 1), (3) 2 2

Para maiores números de N, se representar graficamente a distribuição de comprimentos de partição, uma curva assimétrico emerge, desviada para a origem. Se você está curioso, o gráfico a seguinte contagem de comprimento de partição para N = 40.

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

Se você está interessado em gerar essas contagens de distribuição, aqui está o código que usei:

#! /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: no meu computador, N = 90 leva cerca de 10 minutos para gerar)

Então, minha pergunta é: o que a equação pode ser usado para coincidir com a curva de distribuição observado? É um Gauss (a distribuição de Gauss pode ser assimétrico?) Ou distribuição de Poisson, ou algo mais?

Como faço para resolver isso para N? Se bem me lembro a minha matemática do ensino médio, eu posso determinar o pico resolvendo quando cruza-se com derivativos 0. Como faço para produzir o derivado? Eu procurei na web, mas tudo o que eu voltar são abstrusas trabalhos matemáticos. Eu só preciso de algum código:)

Foi útil?

Solução

Eu acho que uma distribuição de Poisson é uma estimativa razoável. Dado que presunção seu problema agora se volta para um dos fnding a frequência máxima, k, dada N. eu acho que você tem duas abordagens:

  1. figura-o para fora do ponto de vista matemático (Gostaria de começar por olhar para combinatória , mas que não pode ser um particularmente bom boi)
  2. presumo que é poisson e medir o pico para qualquer N, como você tem acima.

Depois de ter o pico (k), estimando lambda deve ser simples (tentar um fora alguns) e você tem a sua curva.

Outra abordagem é trabalhar a coisa toda em python e perguntar sobre o numpy ou placas SciPy: -)

HTH

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top