Кто-то задал мне вопрос по электронной почте о целочисленных разделах на днях (так как я выпустил модуль 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 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
Если вы заинтересованы в создании этих подсчетов, вот код, который я использовал:
#! /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. Как я могу произвести производную? Я искал в Интернете, но все, что я получаю, - это сложные математические статьи. Мне просто нужен код:)