dc (UNIX)
ロバート・H・モリス (ベル | |
プログラミング |
B |
UNIX, Unix | |
プラットフォーム | クロスプラットフォーム |
コマンド | |
ライセンス | GPL 3.0 |
dc (desk calculator;
ここでは、
歴史
[dc は
基本 的 な演算
[
dc で を
$ cat << EOF > cal.txt
4 5 *
p
EOF
$ dc cal.txt
20
$
$ echo "4 5 * p" | dc
あるいは:
$ dc -
4 5*pq
20
$ dc
4 5 *
p
20
q
$ dc -e '4 5 * p'
これらの*
) によってスタックからp
コマンドはスタックのq
コマンドは dc プログラムを3.14
や .318
などの
k
コマンドを0
となる:
2 3 / p
k
コマンドを.66666
となる:
5 k 2 3 / p
v
コマンドはスタックの_
は
12 _3 4 ^ + 11 / v 22 - p
そのr
コマンドやスタックのd
コマンドなどがある。
入出力
[?
コマンドを!
コマンドを
p
コマンドはスタックのn
コマンドはスタックからポップしたf
コマンドはスタックの
dc はまた、i
コマンドはo
コマンドはK
・I
・O
コマンドを
$ echo 16i2o DEADBEEF p | dc
11011110101011011011111011101111
言語 の特徴 的 な機能
[dc は、
レジスタ
[dc におけるレジスタは、マクロやsc
コマンドはスタックからポップしたlc
コマンドは c レジスタの
3 sc 4 lc * p
レジスタをスタックとしてS
・L
コマンドを
文字 列
[dc では [
と ]
でa
コマンドはスタックからx
コマンドでマクロとしてP
コマンドで
また、dc では #
から
マクロ
[dc ではレジスタやスタックに
[1 + 2 *] sm
そしてx
コマンドはスタックからポップした
3 lm x p
条件 分岐
[マクロの=r
コマンドはスタックからEqual
と
[[Equal]p]sm 5 =m
その>
(もともとの!>
(<
(!<
(!=
(
ループ
[dc でループそのものを
# F(x): return x! # if x-1 > 1 # return x * F(x-1) # otherwise # return x [d1-d1<F*]dsFxp
1Q
コマンドはマクロからq
コマンドはそのマクロとそのマクロをz
コマンドはz
コマンドの
例
[スタック全体 の合計
[これはレジスタ a に+
)、スタックの1z<a
) ものである。マクロ0d
は
1 2 4 8 16 100 #加算 したい数 をスタックに積 む 0d[+z1<a]dsaxp # すべて加算 して表示
131
となる。
ファイル中 の dc コマンドの合計
[ファイルの
これも
$ cat file | dc -e '0d[?+z1<a]dsaxp'
?
コマンドは
$ { echo "5"; echo "7"; } | dc -e '0d[?+z1<a]dsaxp'
この12
となる。
$ { echo "3 5 *"; echo "4 3 *"; echo "5dd++"; } | dc -e '0d[?+z1<a]dsaxp'
この42
となる。
この
_
に?
には
単位 変換
[
$ dc -e '[[Enter a number (metres), or 0 to exit]psj]sh[q]sz[lhx?d0=z10k39.370079*.5+0k12~1/rn[ feet ]Pn[ inches]P10Pdx]dx'
この
最大公約数
[
$ dc -e '??[dSarLa%d0<a]dsax+p' # 最短 実装
$ dc -e '[a=]P?[b=]P?[dSarLa%d0<a]dsax+[GCD:]Pp' # 読 みやすくしたもの
階 乗
[
$ dc -e '?[q]sQ[d1=Qd1-lFx*]dsFxp'
Quine
[
dc にも quine が
$ dc -e '[91Pn[dx]93Pn]dx'
$ dc -e '[91PP93P[dx]P]dx'
すべての素数 を求 める
[$ echo '2p3p[dl!d2+s!%0=@l!l^!<#]s#[s/0ds^]s@[p]s&[ddvs^3s!l#x0<&2+l.x]ds.x' | dc
このプログラムは Michel Charpentier によって
$ echo '2p3p[dl!d2+s!%0=@l!l^!<#]s#[0*ds^]s@[p]s&[ddvs^3s!l#x0<&2+l.x]ds.x' | dc
素因数 分解
[
これもまた Michel Charpentier によって
$ dc -e '[n=]P?[p]s2[lip/dli%0=1dvsr]s12sid2%0=13sidvsr[dli%0=1lrli2+dsi!>.]ds.xd1<2'
$ dc -e "[n=]P?[lfp/dlf%0=Fdvsr]sF[dsf]sJdvsr2sf[dlf%0=Flfdd2%+1+sflr<Jd1<M]dsMx"
より2 200^1-
を
$ dc -e "[n=]P?[lfp/dlf% 0=Fdvsr]sFdvsr2sfd2%0=F3sfd3%0=F5sf[dlf%0=Flfd4+sflr>M]sN[dlf%0=Flfd2+sflr>N]dsMx[p]sMd1<M"
これを
$ dc -e "[n=]P?[lfp/dlf%l0=Fdvsr]sF2s2dvsr2sf4s4d2%0=F3sfd3%0=F5sf[dlf%l0=Flfdl4+sflr>M]sN[dlf%l0=Flfdl2+sflr>N]dsMx[p]sMd1<M"
Diffie–Hellman 鍵 交換
[
より
#!/usr/bin/perl -- -export-a-crypto-system-sig Diffie-Hellman-2-lines
($g, $e, $m) = @ARGV, $m || die "$0 gen exp mod\n";
print `echo "16dio1[d2%Sa2/d0<X+d*La1=z\U$m%0]SX$e"[$g*]\EszlXx+p | dc`
これのコメントq
コマンドなどの|
コマンドで
#!/usr/bin/perl
my ($g, $e, $m) = map { "\U$_" } @ARGV;
die "$0 gen exp mod\n" unless $m;
print `echo $g $e $m | dc -e '
# Hex input and output
16dio
# Read m, e and g from stdin on one line
?SmSeSg
# Function z: return g * top of stack
[lg*]sz
# Function Q: remove the top of the stack and return 1
[sb1q]sQ
# Function X(e): recursively compute g^e % m
# It is the same as Sm^Lm%, but handles arbitrarily large exponents.
# Stack at entry: e
# Stack at exit: g^e % m
# Since e may be very large, this uses the property that g^e % m ==
# if( e == 0 )
# return 1
# x = (g^(e/2)) ^ 2
# if( e % 2 == 1 )
# x *= g
# return x %
[
d 0=Q # return 1 if e==0 (otherwise, stack: e)
d 2% Sa # Store e%2 in a (stack: e)
2/ # compute e/2
lXx # call X(e/2)
d* # compute X(e/2)^2
La1=z # multiply by g if e%2==1
lm % # compute (g^e) % m
] SX
le # Load e from the register
lXx # compute g^e % m
p # Print the result
'`;
関連 項目
[脚注 ・出典
[- ^
dc(1)
: an arbitrary precision calculator – Linux User Commands Manual (en) - ^ a b Brian Kernighan and Ken Thompson. A nerdy delight for any Vintage Computer Fest 2019 attendee: Kernighan interviewing Thompson about Unix. YouTube.
該当 時間 : 29m45s. 2019年 9月 3日 閲覧 。 - ^ “The sources for the manual page for 7th Edition Unix dc (Internet Archive)”. 2021
年 3月 16日 閲覧 。 - ^ Ritchie, Dennis M. (Sep 1979). “The Evolution of the Unix Timesharing System”. 2010
年 5月 6日 時点 のオリジナルよりアーカイブ。2021年 3月 16日 閲覧 。 - ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139。
- ^ “Advanced Bash-Scripting Guide, Chapter 16, Example 16-52 (Factorization)”. 2020
年 9月 20日 閲覧 。 - ^ Adam Back. “Diffie–Hellman in 2 lines of Perl”. 5 Jan 2009
閲覧 。
外部 リンク
[- Debian GNU/Linux レポジトリの dc パッケージ
- dc(1) – Plan 9 Programmer's Manual, Volume 1
- Man page of DC – JM Project
- Bc for Windows (dc を
含 む) - dc の web
実装 : http://dc.pr0.uk/