perl編(ゲーリッツ不変量の計算)
#!/usr/bin/perl
use POSIX;
sub goeritz_main {
my ($cgi_arr) = @_;
my @arr = ();
my @arr2 = ();
@arr = split(/:/,$cgi_arr);
foreach (@arr) {
my @arr1 = ();
@arr1 = split(/,/,$_);
push(@arr2,\@arr1);
}
my $arr3;
$arr3 = [@arr2];
##1行1列目の削除;
my @arr4 = ();
for (my $i=1; $i<@$arr3; ++$i) {
push(@arr4,[@{$$arr3[$i]}[1..@{$$arr3[$i]}-1]]);
}
my $matrix = [@arr4];
for (my $start=0; $start<@$matrix; ++$start) {
&goeritz_part1_line_row($matrix,$start);
}
my @new_list;
@new_list = &goeritz_part3($matrix);
foreach (@new_list) {
if ($_ != 1) {
my $t = @new_list;
if ($t == 1) {
}else {
if ($t > 1) {
for(my $n=0; $n < $t; ++$n) {
if ($new_list[$n] != 1) {
print "$new_list[$n]";
if ($t > $n+1) {
print "+";
}
}
}
print "\n";
}else {
print "$new_list[0]\n";
}
}
}
}
exit;
}
sub goeritz_part1_line_row {
my ($matrix,$start) = @_;
my $d=-1;
my $i0 = $start;
my $j0 = $start;
my $e;
for (;;) {
$e = abs $matrix->[$start]->[$start];
for(my $i=$start; $i<@$matrix; ++$i) {
for (my $j=$start; $j<@{$matrix-<[$i]}; ++$j) {
if ($e == 0 || (($e > abs $matrix->[$i]->[$j]) && ($matrix->[$i]->[$j] != 0))) {
$e = abs $matrix->[$i]->[$j];
$i0 = $i;
$j0 = $j;
}
}
}
if ($e == 0 || $e == $d) {
last;
}
$d = $e;
if ($matrix->[$i0]->[$j0] < 0) {
for (my $j5=$start; $j5<@{$matrix->[$i0]}; ++$j5) {
$matrix->[$i0]->[$j5] = -$matrix->[$i0]->[$j5];
}
}
##基本変形;
my ($g,$n);
for (my $j1=$start; $j1 <@{$matrix->[$i0]}; ++$j1) {
if ($j1 == $j0) {
}else {
$g = $matrix->[$i0]->[$j1]/$matrix->[$i0]->[$j0];
for (my $i2=$start; $i2<@$matrix; ++$i2) {
$n = $matrix->[$i2]->[$j1]-$matrix->[$i2]->[$j0]*floor($g);
$matrix->[$i2]->[$j1] = $n;
}
}
}
my ($g0,$n0);
for (my $i3=$start; $i3 < @$matrix; ++$i3) {
if ($i3 == $i0) {
}else {
$g0 = $matrix->[$i3]->[$j0]/$matrix->[$i0]->[$j0];
for (my $j2=$start; $j2 < @{$matrix->[$i0]}; ++$j2) {
$n0 = $matrix->[$i3]->[$j2]-$matrix->[$i0]->[$j2]*floor($g0);
$matrix->[$i3]->[$j2] = $n0;
}
}
}
for (my $j2=$start; $j2 < @{$matrix->[$start]}; ++$j2) {
my $x = $matrix->[$start]->[$j2];
$matrix->[$start]->[$j2] = $matrix->[$i0]->[$j2];
$matrix->[$i0]->[$j2] = $x;
}
for (my $i2=$start; $i2 < @$matrix; ++$i2) {
my $y = $matrix->[$i2]->[$start];
$matrix->[$i2]->[$start] = $matrix->[$i2]->[$j0];
$matrix->[$i2]->[$j0] = $y;
}
}
return $matrix;
}
sub goeritz_part3 {
my ($matrix) = @_;
my @list_matrix =();
for (my $i = 0; $i < @$matrix; ++$i) {
push(@list_matrix,abs $$matrix[$i][$i]);
}
return @list_matrix;
}