起動は M-#。これに続けて c をタイプすると、逆ポーランド式の電卓 の画面が出ます。
--- Emacs Calculator Mode --- 1: . --------- Calculator --------
数字をタイプするとミニバッファにそれがエコーされます。例えば 123 とタイプして、 最後に SPC か RTNを押すと、
--- 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 に続けて数字を打ち込むと、その 桁にしてくれます。この辺りを知っておけば、普通の計算に困ることはないでしょう。
単純化のためのコマンドには、次のようなものがあります。
(calc-apart)
有理式を部分分数展開
(calc-collect)
多項式を特定の変数について整理
(calc-simplify)
単純化
(calc-expand)
多項式の展開
(calc-normalize-rat)
有理式の正規化
a s だけでは展開まではやってくれないので、通 常は a x と a s を組 み合わせて行うことになります。m A とすると、 自動的に整理してくれるようになるので、a s を 省略できるようになります。(もう一度 m Aとするとデフォルトに戻ります.)
例えば、sqrt(2) とかはそのまま残しておきたい、という場合には、Symbolic mode が 使えます。(続き)
明示的に特定の部分を指定して操作するには、選択の項を 参照して下さい。
単純に現在の式を保存するには, 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)
' sum(.5^n,n,1,inf)
' sum((n+m)^2,n,1,10)
' 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 s や h 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)")
"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))))
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 は大きな整数をこのような形で扱っているんですねー。