[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のプログラムは数値に関する処理を行います.
25.1 factor : 素因数を出力 | Show factors of numbers. | |
25.2 seq : 数列を出力 | Print sequences of numbers. |
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 |
終了ステータスのゼロは成功を示し,ゼロ以外の値は失敗を示します.
seq
: 数列を出力 seq
は,数字の列を標準出力に出力します.概要です.
seq [option]… last seq [option]… first last seq [option]… first increment last |
seq
は,firstからlastまでincrementおきに,
数字を出力します.デフォルトで,それぞれの数字は別々の行に出力されます.
incrementが指定されていないとき,firstがlastより大き
いときでも,そのデフォルトは`1'になります.firstのデフォル
トも`1'です.そのため,So seq 1
は`1'を出力しますが,
seq 0
とseq 10 5
では出力しません.(小数部の前にピリオドを
使用している)浮動小数点の数字を指定してもかまいません.
プログラムは以下のオプションを受け入れます.共通のオプションも参照 してください.
すべての数字をformatを使用して出力します.デフォルトは`%g' です.formatは,標準的な浮動小数点出力書式の,`%e', `%f',または`%g'の内,ただ一つだけを含んでいる必要があります.
数字をstringで分離します.デフォルトは改行です.出力は,常に改行 で終了します.
すべての数字を同じ幅で出力し,ゼロを前置してパディングします.(他の種 類のパディングをするため,`--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.