[ホーム]-> [Emacs]-> [活用法]-> [calc]-> [example]

Calc の使用例



基本的な操作

起動は M-#。これに続けて c をタイプすると、逆ポーランド式の電卓 の画面が出ます。

--- Emacs Calculator Mode ---
1:  .
--------- Calculator --------

数字をタイプするとミニバッファにそれがエコーされます。例えば 123 とタイプして、 最後に SPCRTNを押すと、

--- Emacs Calculator Mode ---
1:  123
    .
--------- Calculator --------

という画面になります。同様に 789 を打込むと、

--- Emacs Calculator Mode ---
2:  123
1:  789
    .
--------- Calculator --------

このように新しく入力した数字がより新しいスタックに置かれます。この状態 で + を押すと、和が計算されて

--- Emacs Calculator Mode ---
1:  912
--------- Calculator --------

と表示されます。これが普通の電卓としての使い方です。このようにしてどん な演算が出来るかは、h を二回タイプすると分り ます。主な物を挙げておきますが、他にもあるので Info などで確かめるとよ いでしょう。

また、r d に続けて 2 から 36 までの数字 n を入れると、n 進表示をしてくれます。 数字の精度は p に続けて数字を打ち込むと、その 桁にしてくれます。この辺りを知っておけば、普通の計算に困ることはないでしょう。


単純化

単純化のためのコマンドには、次のようなものがあります。

a s だけでは展開まではやってくれないので、通 常は a xa s を組 み合わせて行うことになります。m A とすると、 自動的に整理してくれるようになるので、a s を 省略できるようになります。(もう一度 m Aとするとデフォルトに戻ります.)

部分的な単純化の阻止(その1)

例えば、sqrt(2) とかはそのまま残しておきたい、という場合には、Symbolic mode が 使えます。(続き)

部分的な単純化の阻止(その2)

明示的に特定の部分を指定して操作するには、選択の項を 参照して下さい。


変数と代入

単純に現在の式を保存するには, s に続けて数字 nをタイプします. こうする と, qnという変数に保存されます. この値を現在行に取り出すに は, r に続けてその数字nをタイプします. しかし, これでは他の式で 使ったりすることは出来ません.

特定の変数に数字を代入するには, s sに続けて変 数を入力します. 例えば,

--- Emacs Calculator Mode ---
1:  x-3
    .
--------- Calculator --------

という状態で, s s a とタイプすると, aという変数に x-3 という式が割当てられます. この状態で, algebraic modeを使って a^2-1 を入力します.

--- Emacs Calculator Mode ---
2:  x-3
1:  a^2-1
    .
--------- Calculator --------
そうして, = をタイプすると, この変数が展開されて,
--- Emacs Calculator Mode ---
2:  x-3
1:  (x-3)^2-1
    .
--------- Calculator --------

となります. 勿論 a^2-1 という式を書いた後に, a という変数に 式や値を代入しても構いません.


選択

まだです。御免なさい。

複素数の扱い

これは基本的には 5 - 3i なら (5,-3) と入力す るだけです。(algebraic modeで入力すると楽)。


数列の和

   5   1
  Σ -----
 i=1  n^2
を計算したいとします。それには、 a + n^-2 RTN  n RTN  1 RTN  5 と押します。a + が和を取る命令です。或いは algebraic modeを使って、
  ' sum(n^-2,n,1,5)
としてもよいです。詳しくは Info の Summation の項を参照して下さい。因みに公式 等を使ってうまく計算出来る場合なら、
  ' sum(.5^n,n,1,inf)
のような無限大までの和も計算してくれるようです。この場合は当然 1 が返ります。
また、
  ' sum((n+m)^2,n,1,10)
のように2変数の式で一つの変数の和を取るということも可能です。出てきた 結果が変だと思うかもしれませんが、a s とかし て整理してみると正しい結果だと分るでしょう。
  ' sum(x^n,n,0,inf)
等、いろいろ試してみると、どれだけ賢いか (或いはどこら辺が愚かか) が分ります。

ベクトルと行列

これは、algebraic mode を利用して入力するのが楽 でしょう。例えば、

  ' [[1 1 0][1 0 1][0 1 1]]
とタイプすれば、
--- Emacs Calculator Mode ---
1:  [ [ 1, 1, 0 ]
      [ 1, 0, 1 ]
      [ 0, 1, 1 ] ]
    .
--------- Calculator --------

のように表示してくれるはずです。これをいろいろ変形するには、ベクトルに分解する のが都合がよいですが、それには、v u (unpack) を使います。元の行列 に戻すには、C-u 3 v p (pack)です。(C-u 3 で、スタック三行を一つにまとめる。)

基本的に行列の演算も普通の演算も変わりません。例えば足し算や掛け算、逆 行列は、それぞれ +, *, & で計算出来ます。 行列特有の計算についてちょっと書いておくと、

なんかは良く使うでしょう。他の演算については h sh i でサマリやインフォを起動して調べて下さい。(手抜き〜)

行列モード

m v とタイプすると、行列モード matrix mode に入ることが出来ます。このモード では、例えば積は可換とは仮定されません。単純化のコマンドでもそのように 配慮されます。もう一度 m v とタイプすると、ま たスカラーモードに戻ります。


整数や組合せの計算

普通の計算は基本的な操作の所で説明した通りですが、整数の素数判定や因数分解なん かも出来ます。これらは単に計算したい整数(の組)がスタックのトップにある場合に

などとするだけです。ところで、この素数判定ですが、8,000,000 以上の数は 13 まで の数で割切れるかどうかを判定した後では、確率的な判定しかしません。もし Non prime であれば Non prime と出ますが、そうでない場合は Probably prime と表示さ れます。(判定に失敗している確率も出ます。)

順列組み合わせ計算は次のようなします。例えば、 30 RTN  20 RTN として

--- Emacs Calculator Mode ---
2:  30
1:  20
    .
--------- Calculator --------

のような状態で k c を押すと、30 の中から 20 を選ぶ combination の数を計算してくれます。同様に、 H k c で permutation の数が求まります。

他には、 などがあります。

多項式の計算

algebraic modeというのを使うと簡単に変数の入った 式を入力出来ます. 例えば,

' 9x^2+10x+1 RTN
と押すと,
--- Emacs Calculator Mode ---
1: 9 x^2 + 10 x + 1
   .
--------- Calculator --------

のように表示されるはずです. ここで例えば, a f とタイプすると, 因数分解してくれます. 簡単なものを列挙すると,

なお, 式の整理については, 単純化の所も参照.

さて, 複雑な式の場合, その一部を編集したり計算したりしたいと思うはずだ. そのた めの方法もいろいろ用意されている.


プログラミング

ある程度複雑な処理をしたい場合などは、いちいちインタラクティブに操作していては 日が暮れてしまいます。そこでプログラムを書いて実行する方法を説明しましょう。

例えばフィボナッチ数列を計算したいとします。これは、普通の Emacs Lisp でも一応 書くことが出来ます。例えば、

(defun myfib (n)
  "Calculate n-th Fibonacci number."
  (if (or (not (integerp n)) (< n 1))
      (message "ARG must be a positive integer.")
    (let ((a 1)
          (b 0)
          c
          (k 2))
      (while (< k n)
        (setq c b
              b a
              a (+ b c)
              k (+ k 1)))
      a))))

という感じです。しかし、これではあっという間に桁あふれが起きます。例えば、上の 関数を (myfib 157) などとして評価すると、6837577 などというとっても小さな数が 返されてしまいます。

実は上で、(a 1) となっているところを (a 1.0) とかすれば、浮動小数点数で計算し てくれるので、多少はましになりますが、やはり大きな整数は扱えません。 そこで Calc を利用します。実は、漸化式については Calc ではもっと簡単なプログラ ムの書き方がありますが、(Calc の Info で fib で regexp サーチをかけてみるとよ い) ともかくこの関数を Calc で使う方法を説明してみます。実は、単に defun を defmath に書換えるだけでよいのです。

(defmath myfib (n) ;; ここだけ書き換える
  "Calculate n-th Fibonacci number."
  (interactive "p")
  (if (or (not (integerp n)) (< n 1))
      (message "n must be a positive integer.")
    (let ((a 1)
          (b 0)
          c
          (k 2))
      (while (<= k n)
        (setq c b
              b a
              a (+ b c)
              k (+ k 1)))
      (message "fib(%s) is %s." n a)
      a)))

これで、myfib という関数が Calc の中で使えるようになります。Calc を起動して algebraic mode で、myfib(157) とかすると、

        289450641941273985495088042104137

という値が返るはずです。さて、これを Calc を離れて利用したいと思ったとします。 この場合は、calc-eval を使います。例えば *scratch* バッファに入り、

        (calc-eval "myfib(157)")
と書いて、この直後で C-jをタイプして、この式 を評価すると、
        "289450641941273985495088042104137"
が返されるはずです。これで例えば、
(defun myfib2 (n)
  "Calculate n-th Fibonacci number."
  (interactive "p")
  (if (or (not (integerp n)) (< n 1))
      (message "ARG must be a positive integer.")
    (progn
      (setq ans (calc-eval "myfib($)" nil n))
      (string-to-int ans)
      (message "fib(%d) is %s" n ans))))
を定義すると、C-u 157 M-x myfib2 でエコー領域に
        fib(157) is 289450641941273985495088042104137

と表示されます。途中の(calc-eval "myfib($)" nil n) では、myfib に 引数として n を渡しています。詳しくは Info の Programming の項を参照。

なお、直接 (calcFunc-myfib 157) を評価すると、

        (bigpos 137 104 42 88 495 985 273 941 641 450 289)

という値が返されます。Calc は大きな整数をこのような形で扱っているんですねー。


付録

algebraic mode
普通の状態で ' を押すと、algebraic mode というのになります. ミニバッファに "Algebraic: " と表示されるので, ここに式を入力します. れを使うとミニバッファ内で式を編集出来るので長い式を入力したい場合など に便利です.

[ホーム]-> [Emacs]-> [活用法]-> [calc]-> [example]