$ cat ana_2.pl #!/usr/bin/perl # # ana_2.pl N V X # # N=vector size (bits), V=number of vectors, X=sample number # use strict; use warnings; use feature ':5.10'; my $n=shift; $n = 1<<$n; my $v=shift; my $x=shift; my ($exp1, $exp2, $exp3); given ($v) { when ( 1) { $exp1=ex_1($n, $x), $exp2=ex_1($n, 0) } when ( 2) { $exp1=ex_2($n, $x), $exp2=ex_2($n, 0) } when ( 3) { $exp1=ex_3($n, $x), $exp2=ex_3($n, 0) } when ( 4) { $exp1=ex_4($n, $x), $exp2=ex_4($n, 0) } when (10) { $exp1=ex_10($n, $x), $exp2=ex_10($n, 0) } default { die "Need symbolic integral form for $v vectors!\n"; } } $exp3 = $exp1-$exp2; print "N=$n, V=$v, X=$x integral($x)=$exp1, integral(0)=$exp2\n"; print "Expected collisions: $exp3\n"; sub ex_1 { my ($N, $X) = @_; return $N *exp( -$X/$N) + $X; } sub ex_2 { my ($N, $X) = @_; return -$N/2*exp(-2*$X/$N) + 2*$N *exp( -$X/$N) + $X; } sub ex_3 { my ($N, $X) = @_; return $N/3*exp(-3*$X/$N) - 3*$N/2*exp(-2*$X/$N) + 3*$N *exp( -$X/$N) + $X; } sub ex_4 { my ($N, $X) = @_; return -$N/4*exp(-4*$X/$N) + 4*$N/3*exp(-3*$X/$N) - 3*$N *exp(-2*$X/$N) + 4*$N *exp( -$X/$N) + $X; } sub ex_10 { my ($N, $X) = @_; return -$N/10*exp(-10*$X/$N) + 10*$N/9 *exp( -9*$X/$N) - 45*$N/8 *exp( -8*$X/$N) + 120*$N/7 *exp( -7*$X/$N) - 35*$N *exp( -6*$X/$N) + 252*$N/5 *exp( -5*$X/$N) - 105*$N/2 *exp( -4*$X/$N) + 40*$N *exp( -3*$X/$N) - 45*$N/2 *exp( -2*$X/$N) + 10*$N *exp( -1*$X/$N) + $X; }