Frage

Jemand fragte mich eine Frage per E-Mail über Integer-Partitionen den anderen Tag (wie ich ein Perl-Modul veröffentlicht hatte, Integer :: Partition, erzeugen sie), dass ich nicht in der Lage zu beantworten.

. Hintergrund: hier sind alle ganzzahligen Partitionen von 7 (die Summe jeder Zeile ist gleich 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

Nun, wenn wir die Längen der einzelnen Partitionen suchen und zählen, wie viele es von jeder Länge sind:

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

... wir sehen eine Partition mit einer Länge von 1 (7), ein eine Länge von 7 hat (1 1 1 1 1 1 1). Es gibt 4 Partitionen, die eine Länge von 3 haben. (5 1 1), (4 2 1), (3 3 1) (3 2 2)

Für eine größere Anzahl von N, wenn Sie die Verteilung der Teilungslängen grafisch darstellen, eine asymetrisch Kurve ergibt sich, schräg gegenüber dem Ursprung. Wenn Sie neugierig sind, Graph, der die folgende Partitionslänge zählt für 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

Wenn Sie bei der Erzeugung dieser Verteilung zählt interessiert sind, hier ist der Code, den ich verwendet:

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

. (Anmerkung: auf meinem Computer, N = 90 dauert etwa 10 Minuten zu erzeugen)

Also meine Frage ist: Welche Gleichung verwendet werden kann, um die beobachtete Verteilungskurve übereinstimmen? Ist es ein Gauss (kann eine Gauß-Verteilung seine asymmetrische?) Oder Poisson-Verteilung, oder etwas anderes?

Wie kann ich es für N lösen? Wenn ich meine Mathe von High-School erinnern, kann ich die Spitze durch die Lösung bestimmen, wann die Ableitung 0 schneidet Wie produziere ich die Ableitung? Ich habe das Web durchsucht, aber alles, was ich zurück sind abstruse mathematische Papiere. Ich brauche nur einige Codes:)

War es hilfreich?

Lösung

Ich denke, eine Poisson-Verteilung eine vernünftige Schätzung ist. Da die Vermutung Ihr Problem wendet sich nun einer der fnding die maximale Frequenz, k, gegeben N. Ich glaube, Sie haben zwei Möglichkeiten:

  1. es herauszufinden, aus mathematischer Sicht (ich würde mit der Suche beginnt bei Kombinatorik , aber das kann nicht ein besonders guter Lenk sein)
  2. vermuten, es poisson ist und die Spitze für einen bestimmten N messen, wie Sie oben haben.

Sobald Sie die Spitze (k), Lambda-Schätzung sollte einfach sein (versuchen, ein paar aus) und Sie haben Ihre Kurve.

Ein weiterer Ansatz ist die ganze Sache in Python zu arbeiten und stellt auf dem numpy oder scipy Gremien: -)

HTH

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top