組みひもを絡み目の表記(交差点に数字を割り振って数字を並べる)へ変換するプログラムです。
組みひもと変換された絡み目の表記のコンウェイ多項式やジョーンズ多項式などの不変量の値が一致しますが、この変換だけでは素な絡み目の表記への変換とは限りません。
・準備
[Windowsの場合]コマンドプロンプトでperl -vを実行して、perl がインストールされてなければ、ActivePerlかStrawberryPerlをインストールします。
[Windowsの場合] C:\Users\usernameの下にjonesディレクトを作ります。[Linuxの場合] /home/usernameの下にjonesディレクトリを作ります。
jonesディレクトリにconvert_link.plファイルを置きます。
絡み目の表記を得るために、convert_link.plの4行目に変換したい組みひもを書き換えます。
コマンドプロンプトを起動し、プログラムを動かすカレントディレクトリに移動します。[Windowsの場合] cd C:\Users\username\jones [Linuxの場合] cd /home/username/jones
convert_link.pl プログラムを起動します。[Windowsの場合] perl convert_link.pl [Linuxの場合] convert_link.pl
出力結果には、絡み目の表記(交差点に数字を割り振って数字を並べる)が出力されます。
#!/usr/bin/perl
##knot_table:7_7
my $braid = "4/s+1/s-3/s+2/s-3/s+2/s-1/s+2/s-3/s+2/";
(my $link,my $sign) = &make_jones($braid);
print "braid is $braid\n";
print "link is ";
&print_matrix($link);
print "sign is ";
&print_matrix([$sign]);
sub make_jones {
my($origjones) = @_;
my(@origlink,$i,@sign,@link,@flag);
@origlink = split(/\//,$origjones);
for(my $i=1; $i<@origlink; ++$i) {
if (@origlink[$i] =~ /s([+,-])(\w*)/) {
if ($1 eq "+") {
push(@sign,1);
}else {
push(@sign,-1);
}
push(@link,$2);
}
}
@flag = (0) x @origlink[0];
&braid(\@link,\@sign,\@flag,$origjones);
}
sub braid {
my($link,$sign,$flag,$origjones) = @_;
(my $new_braid,my $new_sign) = &loop_braid($link,$sign,$flag,1,0,[],[]);
($new_braid,$new_sign);
}
sub loop_braid {
my($link,$sign,$flag,$r,$i,$braid,$ver_braid) = @_;
my($t);
##配列のi番目を見て、r番目の紐にいる;
if ($i < @$link) {
if ($i == 0) {
if ($$flag[$r-1] == 0) {
$$flag[$r-1] = 1;
&make_braid($link,$sign,$flag,$r,$i,$braid,$ver_braid);
}elsif ($$flag[$r-1] == 1) {
push(@$ver_braid,$braid);
if ($t = &nth_0($flag)){
&loop_braid($link,$sign,$flag,$t,0,[],$ver_braid);
}else {
($ver_braid,$sign);
}
}
}else {
&make_braid($link,$sign,$flag,$r,$i,$braid,$ver_braid);
}
}else {
&loop_braid($link,$sign,$flag,$r,0,$braid,$ver_braid);
}
}
sub make_braid {
my($link,$sign,$flag,$r,$i,$braid,$ver_braid) = @_;
if ($$link[$i] == $r) {
if ($$sign[$i] == 1) {
push(@$braid,-($i+1));
}else {
push(@$braid,$i+1);
}
&loop_braid($link,$sign,$flag,++$r,++$i,$braid,$ver_braid);
}elsif ($$link[$i]+1 == $r) {
if ($$sign[$i] == 1) {
push(@$braid,$i+1);
}else {
push(@$braid,-($i+1));
}
&loop_braid($link,$sign,$flag,--$r,++$i,$braid,$ver_braid);
}else {
&loop_braid($link,$sign,$flag,$r,++$i,$braid,$ver_braid);
}
}
sub nth_0 {
my($flag) = @_;
for (my $r=0; $r<@$flag; ++$r) {
if ($$flag[$r] == 0) {
return $r+1;
}
}
0;
}
sub print_matrix {
my($poly) = @_;
print "[";
foreach (@{$poly}) {
print "[";
foreach (@$_) {
print "$_, ";
}
print "],";
}
print "]\n";
}
1;