문제

누군가가 다른 날에 정수 파티션에 대한 이메일을 통해 나에게 질문을했는데 (나는 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)입니다. 길이가 3 : (5 1 1), (4 2 1), (3 3 1), (3 2 2) 인 4 개의 파티션이 있습니다.

더 많은 수의 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에 대해 어떻게 해결합니까? 고등학교에서 수학을 기억한다면 파생 상품이 교차 할 때 해결함으로써 피크를 결정할 수 있습니다. 웹을 검색했지만 다시 돌아 오는 것은 수학 논문입니다. 코드가 필요합니다 :)

도움이 되었습니까?

해결책

포아송 분포는 합리적인 추정치라고 생각합니다. 당신의 문제가 이제 당신의 문제가 최대 주파수 인 K, K, N.

  1. 수학적 관점에서 알아 봅니다 (나는 보면서 시작할 것입니다. 조합, 그러나 그것은 특히 좋은 조향이 아닐 수도 있습니다)
  2. Poisson이라고 가정하고 위와 같이 주어진 n에 대한 피크를 측정하십시오.

피크 (k)가 있으면 Lambda를 추정하는 것은 간단해야하며 (몇 개를 시도해보십시오) 곡선이 있습니다.

또 다른 접근법은 모든 것을 파이썬으로 작동시키고 Numpy 또는 Scipy 보드에 대해 물어 보는 것입니다 :-)

HTH

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top