use Math::MatrixReal;
use Benchmark;
do 'funcs.pl';
my $matrix1 = random_matrix(15);
my $matrix2 = $matrix1->new_diag( [ 1,2,3,4,5,6,7,8,9,10 ] );


$det = $matrix1->det;
timethese( 10,
	{ 'LR' => sub { $matrix1->decompose_LR->invert_LR; },
	  'inverse' => sub { $matrix1->inverse(); },
	  'cofactor' => sub { (~$matrix1->cofactor)->each ( sub { (shift)/$det; } ) } 
	} );
	

exit;
srand;

my $n = rand() * (time() % 1000);
print "n = $n\n";
timethese( 50000,
	{ 'int' => sub { $n == int($n) } ,
	  're'  => sub { $n =~ m/^\d+$/ }
	}
);
exit;

timethese( 250,
	{ 'det' => sub { $matrix2->det },
	  'LR'  => sub { $matrix2->decompose_LR->det_LR }
	} );
exit;

timethese( 25,
	{ 'inverse' => sub { $matrix2->inverse() },
	  'toneg1'  => sub { $matrix2 ** -1 },
	  'LR'	    => sub { $matrix2->decompose_LR->invert_LR }
	}
);

timethese( 10,
	{ 'cofactor' => sub { $matrix2->cofactor() } }
);
exit;

timethese( 100,
	{ 'diag_exponent' => sub { $matrix2 ** 5; },
	'diag_mult'	   => sub { $matrix2 * $matrix2 * $matrix2 * $matrix2 * $matrix2; }
	});

timethese( 10,
        { 'exponent' => sub { $matrix1 ** 10; },
        'mult'     => sub { $matrix1 = $matrix1 * $matrix1 * $matrix1 * $matrix1 * $matrix1
				* $matrix1 * $matrix1 * $matrix1 * $matrix1 * $matrix1;
			     }
        });

	
