前几天有人通过电子邮件问我一个关于整数分区的问题(因为我发布了一个 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 (7),一个分区的长度为 7 (1 1 1 1 1 1 1)。有 4 个长度为 3 的分区:(5 1 1)、(4 2 1)、(3 3 1)、(3 2 2)。
对于较大数量的 N,如果您绘制分区长度的分布图,则会出现一条不对称曲线,向原点倾斜。如果您好奇,请绘制以下 N=40 的分区长度计数。
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 相交的时间来确定峰值。如何产生导数?我在网上搜索过,但我得到的只是深奥的数学论文。我只需要一些代码:)