トップ «前の日記(2006-06-10(Sat)) 最新 次の日記(2006-06-12(Mon))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2006-06-11(Sun) どうもしよ

factor

書き忘れていたが、引数を因数分解する。
FreeBSDでは/usr/games/factor、 PlamoLinuxでは/usr/bin/factor。
Plamo4.2はbsdgamesパッケージにも入っているが、

Plamo4.2:$ /usr/games/factor:
/usr/games/factor: error while loading shared \
libraries: libcrypto.so.0.9.7: cannot open shared \
object file: No such file or directory

だった。GNUのsh-utilsか(Plamo-4.0.2)、coreutils(同4.2)由来に変っている。

どれも1以上で18446744073709551615以下の整数を受け付けるようだ。

$ factor 18446744073709551615
18446744073709551615: 3 5 17 257 641 65537 6700417
 
$ factor 18446744073709551616
factor: `18446744073709551616' is too large
詳しくは `factor --help' を実行して下さい.

plamo-4.2に入ってた/usr/games/factorもう少し。
/usr/lib# ln -s libcrypto.so.0.9.8 libcrypto.so.0.9.7 すると 動くようになった。
なぜか 、

$ /usr/games/factor `echo 2^64| bc`
18446744073709551616: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

はできたものの、

makoto@cel2g:~$ /usr/games/factor  `echo 2^64-2 | bc`
18446744073709551614: 2 7 7 73 127 337セグメンテーション違反です

などとやると(/usr/bin/factorは即答したが)、長い時間かけて演算した末に 落ちた。
キリのいい数ならもう少し大きくてもできるらしい。

$ /usr/bin/factor `echo 2^225 | bc`
factor: `53919893334301279589334030174039261347274\
288845081144962207220498432' is too large
&bnsp;
詳しくは `factor --help' を実行して下さい.
$ /usr/games/factor `echo 2^225| bc`
53919893334301279589334030174039261347274288845081\
144962207220498432: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \
2 2 2 2 2 2 2 2 2 2
 
$ /usr/games/factor `echo 7^80 | bc`
40536215597144386832065866109016673800875222251012\
083746192454448001: 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 \
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7

してくれた。
一旦ここまで。

GNU bc

2^64といった数字を正確に入力する為に、bc(1)の世話になったが、 ある程度桁が大きくなると変だ。勝手に"\"を入れて改行してしまう。
manを読むと、BC_LINE_LENGTHという環境変数を 見ているのだそうな。

$ bc --version
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Softwar\
e Foundation, Inc.
 
$ echo 2^64 | bc
18446744073709551616
 
$ export BC_LINE_LENGTH=5 ; echo 2^64 | bc
184\
467\
440\
737\
095\
516\
16

既定値は書いてなかった($COLUMNSでもないらしい)が、 適当にいじり回していると"70"のように思えた。

bc-1.06$ grep -nr BC_LINE_LENGTH *
bc/main.c:210:  env_value = getenv ("BC_LINE_LENGTH");
doc/bc.texi:1005:@item BC_LINE_LENGTH
doc/bc.1:770:.IP "BC_LINE_LENGTH"
doc/bc.info:966:`BC_LINE_LENGTH'
 
bc-1.06$ cat -n bc/main.c
(ry
   210    env_value = getenv ("BC_LINE_LENGTH");
   211    if (env_value != NULL)
   212      {
   213        line_size = atoi (env_value);
   214        if (line_size < 2)
   215          line_size = 70;
   216      }
   217    else
   218      line_size = 70
(ry

でも、これだと、

$ export BC_LINE_LENGTH=2 ; echo 2^64 | bc
\
18446744073709551616

になってしまう。214行目は"<"でなく"<="だろう。
と考えて書き換えると、

bc-1.06$ export BC_LINE_LENGTH=3 ; echo 2^64 | ./bc/bc 
1\
8\
4\
4\
6\
7\
4\
4\
0\
7\
3\
7\
0\
9\
5\
5\
1\
6\
1\
6
 
bc-1.06$ export BC_LINE_LENGTH=2 ; echo 2^64 | ./bc/bc 
18446744073709551616

となってくれた。
もっとも、それ以前に、埋め込まれた"70"をどうにかすべき のように思われる。

トイレから出てきて妄想が続く。
決め打ちで改行と"\"を入れるのは?だ。 この場合のように、パイプやリダイレクションを考えると邪魔でしかない。
流石にここの書き換えは...

-rwxr-sr-x

# ldd /usr/games/factorしても、何も出力されなかった。
のは、

$ ls -l /usr/games/factor
-rwxr-sr-x  1 root games 33272 2004-01-09 07:46 \
  /usr/games/factor

だったからだ。
Plamo4.2では(4.02も)、どういうわけか/usr/gamesの下にあるゲームプログラムの 多くで、ファイルの属性が2755になっている。setgidの意味は何なんだろうか。

snake(6)のゲームスコアは /var/lib/bsdgames/snake.logに 記録されている。スコアを守るためにsetgidされているのだろうか。
rain(6)みたいな単なる端末環境ソフトも2755なんだけど。

9223372036854775806

2^63-2 の因数分解の結果いろいろ。

FreeBSD-5.3 $ /usr/games/factor `echo 2^63-2 | bc`
9223372036854775806: 2 3 1537228672809129301
 
Plamo-4.2 $ /usr/games/factor `echo 2^63-2 | bc`
9223372036854775806: 2 3 1537228672809129301

でも、GNUのsh-utilsやcoreutilsに含まれるfactor(1)だと、 Plamo-4.2でも、MacOS X Tigerでも、  

./factor `echo 2^63-2 | bc`
9223372036854775806: 2 3 715827883 2147483647

だった。
bc以外にもrubyにも計算させてみたが、 1537228672809129301 は、素数ではなさそうだ。


リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。

index.htmlは ここから。