Dc (Unix)
Encyclopedia
dc is a cross-platform
Cross-platform
In computing, cross-platform, or multi-platform, is an attribute conferred to computer software or computing methods and concepts that are implemented and inter-operate on multiple computer platforms...

 reverse-polish
Reverse Polish notation
Reverse Polish notation is a mathematical notation wherein every operator follows all of its operands, in contrast to Polish notation, which puts the operator in the prefix position. It is also known as Postfix notation and is parenthesis-free as long as operator arities are fixed...

 desk calculator which supports arbitrary-precision arithmetic
Arbitrary-precision arithmetic
In computer science, arbitrary-precision arithmetic indicates that calculations are performed on numbers whose digits of precision are limited only by the available memory of the host system. This contrasts with the faster fixed-precision arithmetic found in most ALU hardware, which typically...

. It is one of the oldest Unix
Unix
Unix is a multitasking, multi-user computer operating system originally developed in 1969 by a group of AT&T employees at Bell Labs, including Ken Thompson, Dennis Ritchie, Brian Kernighan, Douglas McIlroy, and Joe Ossanna...

 utilities, predating even the invention of the C programming language
C (programming language)
C is a general-purpose computer programming language developed between 1969 and 1973 by Dennis Ritchie at the Bell Telephone Laboratories for use with the Unix operating system....

; like other utilities of that vintage, it has a powerful set of features but an extremely terse syntax.
Traditionally, the more user-friendly (with its infix notation
Infix notation
Infix notation is the common arithmetic and logical formula notation, in which operators are written infix-style between the operands they act on . It is not as simple to parse by computers as prefix notation or postfix notation Infix notation is the common arithmetic and logical formula notation,...

) bc
Bc programming language
bc, for bench calculator, is "an arbitrary precision calculator language" with syntax similar to the C programming language. bc is typically used as either a mathematical scripting language or as an interactive mathematical shell....

 calculator program was implemented on top of dc, although more modern implementations are related in the opposite fashion: dc uses bc's library for arithmetic.

This article provides some examples in an attempt to give a general flavour of the language; for a complete list of commands and syntax, one should consult the man page for one's specific implementation.

Basic operations

To multiply four and five in dc (note that most of the whitespace is optional):

4 5 *
p

This translates into "push four and five onto the stack, then, with the multiplication operator, pop two elements from the stack, multiply them and push the result back on the stack." Then the 'p' command is used to examine (print out to the screen) the top element on the stack.

The arithmetic precision is changed with the command 'k', which sets the number of fractional digits (the number of digits following the point
Radix point
In mathematics and computing, a radix point is the symbol used in numerical representations to separate the integer part of a number from its fractional part . "Radix point" is a general term that applies to all number bases...

) to be used for arithmetic operations. Since the default precision is zero, this sequence of commands produces '0' as a result:

2 3 / p

By adjusting the precision with 'k', arbitrary number of decimal places can be produced. This command sequence outputs '.66666'.

5 k
2 3 / p

To evaluate : ('v' computes the square root of the top of the stack and '_' is used to input a negative number):

12 _3 4 ^ + 11 / v 22 -
p

To swap the top two elements of the stack, use the 'r' command. To duplicate the top element, use the 'd' command.

Input/Output

To read a line from stdin, use the '?' command. This will evaluate the line as if it were a dc command, and so it is necessary that it be syntactically correct and potentially be a security problem since the '!' dc command will allow arbitrary command execution.

As mentioned above, 'p' will print the top of the stack with a newline after it. 'n' will pop the top of the stack and output it without a trailing newline. 'f' will dump the entire stack with one entry per line.

dc also support arbitrary input and output radices
Radix
In mathematical numeral systems, the base or radix for the simplest case is the number of unique digits, including zero, that a positional numeral system uses to represent numbers. For example, for the decimal system the radix is ten, because it uses the ten digits from 0 through 9.In any numeral...

. The 'i' command will pop the top of the stack and use it for the input base. Hex digits must be in upper case to avoid collisions with dc commands and are not limited to A-F if the input radix is larger than 16. The 'o' command does the same for the output base, but keep in mind that the input base will affect the parsing of every numeric value afterwards so it is usually advisable to set the output base first. To read the values, the 'K', 'I' and 'O' will push the current precision, input radix and output radix on to the top of the stack.

As an example, to convert from hex to binary:

16i2o DEADBEEFp

outputs 11011110101011011011111011101111.

Registers

In addition to these basic arithmetic and stack operations, dc includes support for macros, conditionals and storing of results for later retrieval.

The mechanism underlying macros and conditionals is the register, which in dc is a storage location with a single character name which can be stored to and retrieved from: 'sc' pops the top of the stack and stores it in register c, and 'lc' pushes the value of register c onto the stack. For example:

3 sc 4 lc * p

Registers can also be treated as secondary stacks, so values can be pushed and popped between them and the main stack using the 'S' and 'L' commands.

Strings

String values are enclosed in '[' and ']' characters and may be pushed on the stack and stored in registers. The 'a' command will convert a the low order byte of the numeric value into an ASCII character, or if the top of the stack is a string it will replace it with the first character of the string. There are no ways to build up strings or perform string manipulation other than executing it with the 'x' command, or printing it with the 'P' command.

The '#' character begins a comment to the end of the line.

Macros

Macros are then implemented by allowing registers and stack entries to be strings as well as numbers. A string can be printed, but it can also be executed (i.e. processed as a sequence of dc commands). So for instance we can store a macro to add one and then multiply by 2 into register m:

[1 + 2 *] sm

and then (using the 'x' command which executes the top of the stack) we can use it like this:

3 lm x p

Conditionals

Finally, we can use this macro mechanism to provide conditionals. The command '=r' will pop two values from the stack, and execute the macro stored in register 'r' only if they are equal. So this will print the string 'equal' only if the top of the stack is equal to 5:

qual]p] sm 5 =m


Other conditionals are '>', '!>', '<', '!<', '!=', which will execute the specified macro if the top two values on the stack are greater, less than or equal to ("not greater"), less than, greater than or equal to ("not less than"), and not equals, respectively.

Loops

Looping is then possible by defining a macro which (conditionally) reinvokes itself. A simple factorial of the top of the stack might be implemented as:

# F(x): return x!
# if x-1 > 1
# return x * F(x-1)
# otherwise
# return x
[d1-d1
The '1Q' command will exit from a macro, allowing an early return. 'q' will quit from two levels of macros (and dc itself if there are less than two levels on the call stack). 'z' will push the current stack depth before the 'z' operation.

Examples

As an example of a relatively simple program in dc, this command (in 1 line):

dc -e 'nter a number (metres), or 0 to exit]psj]sh[q]sz[lhx?d0=z10k39.370079*.5+0k12~1/rn[ feet ]
Pn[ inches]P10Pdx]dx'


will convert distances from metres to feet and inches; the bulk of it is concerned with prompting for input, printing output in a suitable format and looping round to convert another number.

As an example, here is an implementation of the Euclidean algorithm
Euclidean algorithm
In mathematics, the Euclidean algorithm is an efficient method for computing the greatest common divisor of two integers, also known as the greatest common factor or highest common factor...

 to find the GCD
Greatest common divisor
In mathematics, the greatest common divisor , also known as the greatest common factor , or highest common factor , of two or more non-zero integers, is the largest positive integer that divides the numbers without a remainder.For example, the GCD of 8 and 12 is 4.This notion can be extended to...

:

dc -e '??[dSarLa%d0 dc -e '[a=]P?[b=]P?[dSarLa%d0

Computing the factorial
Factorial
In mathematics, the factorial of a non-negative integer n, denoted by n!, is the product of all positive integers less than or equal to n...

 of an input value,

dc -e '?[q]sQ[d1=Qd1-lFx*]dsFxp'


A more complex example performs Diffie-Hellman key exchange
Diffie-Hellman key exchange
Diffie–Hellman key exchange Synonyms of Diffie–Hellman key exchange include:*Diffie–Hellman key agreement*Diffie–Hellman key establishment*Diffie–Hellman key negotiation...

. This was popular as a signature block
Signature block
A signature block is a block of text automatically appended at the bottom of an e-mail message, Usenet article, or forum post. This has the effect of "signing off" the message and in a reply message of indicating that no more response follows...

 among cypherpunk
Cypherpunk
A cypherpunk is an activist advocating widespread use of strong cryptography as a route to social and political change.Originally communicating through the Cypherpunks electronic mailing list, informal groups aimed to achieve privacy and security through proactive use of cryptography...

s during the ITAR debates:
  1. !/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
  • La1=z\U$m%0]SX$e"[$g*]\EszlXx+p|dc`



  • A commented version is slightly easier to understand and shows how to use loops, conditionals, and the 'q' command to return from a macro. With a modern version of dc, the '|' command can be used to do arbitrary precision modular exponentiation without needing to write the X function.
    1. !/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 '
    1. Hex input and output

    16dio
    1. Read m, e and g from stdin on one line

    ?SmSeSg
    1. Function z: return g * top of stack

    [lg*]sz
    1. Function Q: remove the top of the stack and return 1

    [sb1q]sQ
    1. Function X(e): recursively compute g^e % m
    2. It is the same as Sm^Lm%, but handles arbitrarily large exponents.
    3. Stack at entry: e
    4. Stack at exit: g^e % m
    5. Since e may be very large, this uses the property that g^e % m

    6. if( e 0 )
    7. return 1
    8. x = (g^(e/2)) ^ 2
    9. if( e % 2

      1 )

    10. x *= g
    11. return x %

    [
    d 0=Q # return 1 if e0 (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
    '`;

    See also

    • bc programming language
      Bc programming language
      bc, for bench calculator, is "an arbitrary precision calculator language" with syntax similar to the C programming language. bc is typically used as either a mathematical scripting language or as an interactive mathematical shell....

    • Calculator input methods
      Calculator input methods
      There are various ways in which a calculator might interpret key strokes.One can categorize calculators into two main types: 1) single-step or immediate execution calculators and 2) expression or formula calculators....

    • HP calculators
      HP calculators
      HP calculators are various calculators manufactured by the Hewlett-Packard company over the years.- History :In the 1960s, Hewlett-Packard was becoming a diversified electronics company with product lines in electronic test equipment, scientific instrumentation, and medical electronics, and was...

    • Orpie
      Orpie
      Orpie is a command-line reverse polish notation calculator written in OCaml by Paul Pelzl, a graduate student at the University of Michigan. It is open source and available for a wide variety of Unix-like operating systems.- External links :*...

      , an RPN calculator
    • Stack machine
      Stack machine
      A stack machine may be* A real or emulated computer that evaluates each sub-expression of a program statement via a pushdown data stack and uses a reverse Polish notation instruction set....


    External links
    Native Windows port of bc
    Bc programming language
    bc, for bench calculator, is "an arbitrary precision calculator language" with syntax similar to the C programming language. bc is typically used as either a mathematical scripting language or as an interactive mathematical shell....

    , which includes dc.
    Category:cross-platform software
    Category:Unix software
    Category:free mathematics software
    Category:Numerical programming languages
    Category:stack-oriented programming languages

    cs:Dc (programovací jazyk)
    de:Dc (Unix)
    fr:Dc (logiciel)
    pl:Dc (informatyka)
    ru:Dc
    The source of this article is wikipedia, the free encyclopedia.  The text of this article is licensed under the GFDL.
     
    x
    OK