六面体の頂点をたどる(9)

次に、√2などの無理数固有値に対する固有ベクトルを求める。
そのために、例えば、42+17√3を[42,17,3]と配列のリファレンスで表す。そうやってPerlで組んでみたが、動かなくなってしまった。
これは、約分ができないために、どんどん数が大きくなってしまったためではないかと思われる。整数の範囲ならユークリッドの互除法で最大公約数を求められたが、代数的数にはそういった方法はない。そもそも素数というものがない。なぜなら、例えば、1ですら次のように分解できる。

1 = (-1 + √2)(1 + √2)

じゃあ、ということで、制限をかけて、符合は変わらないように分解しようとする。すなわち、35+23√3なら、a+b√3(a,bは正)ということにする。しかし、これでも、

35+23√3 = (1+√3)(17+6√3) = (2+√3)(1+11√3)

と2通りに分解できる(最初のは例が悪かったので差し替え)。
しかし、これなら分解の種類は有限に収まるので、Perlで組んでみた。
これで、855+581√3を割り切れる数は次のように出てきた。

7+5√3 105+8√3 46+5√3 15+11√3 25+3√3 27+20√3 33+7√3
17+14√3 9+2√3 61+51√3 4+√3 129+113√3 1+√3 444+137√3
3+√3 137+148√3 3+4√3 113+43√3 2+3√3 153+61√3 7+11√3
42+17√3 20+9√3 9+25√3 11+5√3 15+46√3 15+7√3 8+35√3



sub alg_resolve {
my @result;
my ($a, $b, $c) = @{$_[0]};
for(my $b1b2 = 1; 1 + $b1b2 * $c <= $a; $b1b2++) {
my $a1a2 = $a - $b1b2 * $c;
my $det = $b * $b - 4 * $b1b2 * $a1a2;
next if $det < 0;
my $r = sqrt($det);
next if $r * $r != $det;

for(my $b1 = 1; $b1 * $b1 <= $b1b2; $b1++) {
if($b1b2 % $b1 == 0) {
my $b2 = $b1b2 / $b1;
my ($a1, $a2);
if(($b - $r) % (2 * $b2) == 0) {
$a1 = ($b - $r) / (2 * $b2);
if($a1a2 % $a1 == 0) {
$a2 = $a1a2 / $a1;
alg_push(\@result, [ $a1, $b1, $c ]);
alg_push(\@result, [ $a2, $b2, $c ]);
}
}

if(($b + $r) % (2 * $b2) == 0) {
$a1 = ($b + $r) / (2 * $b2);
if($a1a2 % $a1 == 0) {
$a2 = $a1a2 / $a1;
alg_push(\@result, [ $a1, $b1, $c ]);
alg_push(\@result, [ $a2, $b2, $c ]);
}
}
}
}
}

return \@result;
}

sub alg_push {
my ($ary, $a) = @_;
for my $e(@{$ary}) {
if($e->[0] == $a->[0] && $e->[1] == $a->[1]) {
return;
}
}
push @{$ary}, $a;
}