[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

25. 数値処理

以下のプログラムは数値に関する処理を行います.


25.1 factor: 素因数を出力

factorは素因数を出力します.概要です.

 
factor [number]…
factor option

コマンドラインにnumberが指定されない場合,factorは標準 入力から読み込み,それは,改行,タブ,またはスペースで区切られています.

オプションは,`--help'と`--version'のみです. See section 共通のオプション.

使用するアルゴリズムは,あまり洗練されたものではないので,入力によって はfactorの実行に時間がかかることがあります.factor にとって最も厳しいものは,大きな素数の乗数です.二つの大きな32ビットの 素数の乗数を素因数分解すると,1.6 GHz Athlonで80秒程度のCPU時間がかか ります.

 
$ p=`echo '4294967279 * 4294967291'|bc`
$ factor $p
18446743979220271189: 4294967279 4294967291

同様に,最大の64ビットの素数の"素因数分解"で,GNU factor (coreutils-5.1.2)で80秒程度かかります.

 
$ factor 18446744073709551557
  18446744073709551557: 18446744073709551557

反対に,factorは,大きな64ビットの数字を十秒ちょっとで素因数 分解します.

 
$ factor `echo '2^64-1'|bc`
18446744073709551615: 3 5 17 257 641 65537 6700417

終了ステータスのゼロは成功を示し,ゼロ以外の値は失敗を示します.


25.2 seq: 数列を出力

seqは,数字の列を標準出力に出力します.概要です.

 
seq [option]… last
seq [option]… first last
seq [option]… first increment last

seqは,firstからlastまでincrementおきに, 数字を出力します.デフォルトで,それぞれの数字は別々の行に出力されます. incrementが指定されていないとき,firstlastより大き いときでも,そのデフォルトは`1'になります.firstのデフォル トも`1'です.そのため,So seq 1は`1'を出力しますが, seq 0seq 10 5では出力しません.(小数部の前にピリオドを 使用している)浮動小数点の数字を指定してもかまいません.

プログラムは以下のオプションを受け入れます.共通のオプションも参照 してください.

` -f format'
` --format=format'

すべての数字をformatを使用して出力します.デフォルトは`%g' です.formatは,標準的な浮動小数点出力書式の,`%e', `%f',または`%g'の内,ただ一つだけを含んでいる必要があります.

` -s string'
` --separator=string'

数字をstringで分離します.デフォルトは改行です.出力は,常に改行 で終了します.

` -w'
` --equal-width'

すべての数字を同じ幅で出力し,ゼロを前置してパディングします.(他の種 類のパディングをするため,`--format'を使用してください).

大きな整数値の列を出力するためにseqを使用したい場合,精度が 悪くなるのでデフォルトの`%g'書式を使用しないで下さい.

 
$ seq 1000000 1000001
1e+06
1e+06

代わりに,指数も十進数の点も使用せずに十進数を出力するため,書式 `%1.f'を使用することが可能です.

 
$ seq --format=%1.f 1000000 1000001
1000000
1000001

16進数で出力したい場合,変換を実行するためにprintfを使用する ことが可能です.

 
$ printf %x'\n' `seq -f %1.f 1048575 1024 1050623`
fffff
1003ff
1007ff

非常に長い数字のリストに対しては,引数リストの長さにおけるシステムの制 限を避けるためxargsを使用して下さい.

 
$ seq -f %1.f 1000000 | xargs printf %x'\n' | tail -n 3
f423e
f423f
f4240

八進数を生成するために,%xの代わりにprintf%o 書式を使用して下さい.しかし,printfの使用は2^32未満 の整数でのみ動作することに注意して下さい.

 
$ printf "%x\n" `seq -f %1.f 4294967295 4294967296`
ffffffff
bash: printf: 4294967296: Numerical result out of range

ほとんどのシステムで,seqは最大2^53まで値ですべての数 字を生成することが可能なので,そのような大きな数をより強固に生成するた めに,基数変換のより一般的な手法として以下のものがあります.それは, bcを使用し,出力の基数の値を設定することで動作し,以下では16進 数の出力を行なう状況として,obaseを`16'にしています.

 
$ (echo obase=16; seq -f %1.f 4294967295 4294967296)|bc
FFFFFFFF
100000000

seqを小数のincrementで使用しているとき注意しないと,びっ くりするような結果になる可能性があります.以下の例では,最後の値が 0.3になることを,ほとんどの人が期待するでしょう.

 
$ seq -s' ' 0 .1 .3
0 0.1 0.2

しかし,seqが二進数の浮動小数点(Cのdouble型)で計算し ているため,ほとんどのシステムでそうはなりません - つまり,十進数の .1は正確に表現できないことを意味します.つまり,.1 * 3 > .3のような非直観的な条件式が,結局は正しいということを意味していま す.

上記の例を回避するため,lastの値にちょっと大きい数字を使用して下 さい.

 
$ seq -s' ' 0 .1 .31
0 0.1 0.2 0.3

一般的に,小数部分でincrementを使用しているとき,そして (last - first) / incrementが(数学的に)整数であっても lastが確実にseqで出力される最終値になるように, lastの値をわずかに大きい(またはincrementが負の場合は小さい) 値に指定して下さい.

終了ステータスのゼロは成功を示し,ゼロ以外の値は失敗を示します.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on June, 8 2005 using texi2html 1.70.