#!/usr/bin/perl

use 5.40.3;

# Medidad de estabilidad en el tiempo, pensado en criptobros
# Se toma la inversa de la varianza, pero se la añade azúcar
# *$n*$log($n)

# sample
my (@m, @n);
for (0..1_000){
    push @m, rand()*10;
    push @n, rand()*80;
}
for (1_001 .. 2_000){
    push @n, rand()*80;
}

# 

use Memoize;

memoize "mean";

my ($st1, $st2);

for (@m){
    $st2 += ($_ - mean(@m))**2; 
}
$st1 = scalar(@m) / variance(@m); 
$st2 = scalar(@m) * log(scalar(@m)) / $st2;

say "Corta y estable:      stat1 = $st1      stat2 = $st2";

for (@n){
    $st2 += ($_ - mean(@n))**2; 
}
$st1 = scalar(@n) / variance(@n); 
$st2 = scalar(@n) * log(scalar(@n)) / $st2;

say "Doble y variable:     stat1 = $st1      stat2 = $st2";

exit 3;

# Aparentemente $st2 es mejor porque debe haber menos diferencia 

sub mean {
    my @x = @_;
    my $n = scalar(@x);
    my $sum = 0;
    $sum += $_ for (@x);
    return $sum/$n;
}

sub variance {
    my @x = @_;
    my $n = scalar(@x);
    my $mean = mean (@x);
    my $variance = 0;
    $variance += ($_ - $mean)**2 for (@x);
    $variance /= $n-1;                               # variance of a sample 
    return $variance;
}

   
   

