Question

Quelqu'un m'a posé une question par courrier électronique sur les partitions d'entiers l'autre jour (car j'avais publié un module Perl, Integer :: Partition, pour les générer), mais je n'ai pas pu y répondre.

Arrière-plan: voici toutes les partitions entières de 7 (la somme de chaque ligne est égale à 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

Maintenant, regardons la longueur de chaque partition et comptons le nombre de partitions de chaque longueur:

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

... nous voyons une partition a une longueur de 1 (7), une autre 7 (1 1 1 1 1 1 1). Il y a 4 partitions qui ont une longueur de 3: (5 1 1), (4 2 1), (3 3 1), (3 2 2).

Pour des nombres plus grands de N, si vous tracez un graphique de la distribution des longueurs de partition, une courbe asymétrique apparaît, orientée vers l’origine. Si vous êtes curieux, tracez graphiquement les comptes de longueur de partition suivants pour 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 vous souhaitez générer ces nombres de distribution, voici le code que j'ai utilisé:

#! /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;
}

(remarque: sur mon ordinateur, il faut environ 10 minutes pour générer N = 90).

Ma question est donc la suivante: quelle équation peut-on utiliser pour correspondre à la courbe de distribution observée? Est-ce une distribution de Gauss (une distribution gaussienne peut-elle être asymétrique?) Ou de Poisson, ou autre chose?

Comment puis-je le résoudre pour N? Si je me souviens de mes calculs au lycée, je peux déterminer le pic en résolvant le moment où la dérivée coupe 0. Comment puis-je produire la dérivée? J'ai fait des recherches sur le Web, mais je ne récupère que des papiers mathématiques abstrus. J'ai juste besoin de code:)

Était-ce utile?

La solution

Je pense qu'une distribution de poisson est une estimation raisonnable. Compte tenu de cette hypothèse, votre problème passe maintenant à la recherche de la fréquence maximale, k, à partir de N. Je pense que vous avez deux approches:

  1. comprendre cela d'un point de vue mathématique (je commencerais par regarder la la combinatoire , mais cela peut ne pas être un très bon volant)
  2. présumez qu'il s'agit d'un poisson et mesurez le pic pour un N donné, comme vous l'avez indiqué ci-dessus.

Une fois que vous avez le pic (k), l'estimation de lambda doit être simple (essayez-en quelques-uns) et vous avez votre courbe.

Une autre approche consiste à gérer le tout en python et à demander aux panneaux numpy ou scipy: -)

HTH

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top