先日、ある人から整数パーティションについて電子メールで質問されましたが (私は整数パーティションを生成するために Perl モジュール Integer::Partition をリリースしていたため)、答えることができませんでした。
背景: ここに 7 のすべての整数パーティションがあります (各行の合計は 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
ここで、各パーティションの長さを見て、各長さの数を数えると、次のようになります。
1 1
2 3
3 4
4 3
5 2
6 1
7 1
... 1 つのパーティションの長さは 1 (7) で、もう 1 つのパーティションの長さは 7 (1 1 1 1 1 1 1) です。長さ 3 の 4 つのパーティションがあります: (5 1 1)、(4 2 1)、(3 3 1)、(3 2 2)。
N の数が大きい場合、分割長の分布をグラフにすると、原点に向かって歪んだ非対称曲線が現れます。興味がある場合は、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 2 1 1 1 1 1 1 1 1
これらの分布カウントの生成に興味がある場合は、私が使用したコードを次に示します。
#! /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;
}
(注: 私のコンピューターでは、N=90 の生成に約 10 分かかります)。
私の質問は、観測された分布曲線を一致させるために使用できる式は何ですか? それはガウス(ガウス分布は非対称になることができますか?)またはポアソン分布ですか、それとも何か他のものですか?
Nについてどうやって解くのですか?高校の数学を思い出せば、導関数が 0 と交差するときを解くことでピークを特定できます。私はウェブを検索しましたが、戻ってくるのは難解な数学論文だけです。私はいくつかのコードが必要です:)