僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
書き忘れていたが、引数を因数分解する。
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
してくれた。
一旦ここまで。
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"をどうにかすべき
のように思われる。
トイレから出てきて妄想が続く。
決め打ちで改行と"\"を入れるのは?だ。
この場合のように、パイプやリダイレクションを考えると邪魔でしかない。
流石にここの書き換えは...
# 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なんだけど。
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や内容が変った場合はあしからず。