Problem 3

(require 'calc-ext)
(defvar calc-command-flags nil)

(defun find-factor (num)
  (catch 'found
    (let ((i 2))
      (while (math-lessp (math-sub i 1) (math-floor (math-sqrt num)))
	(if (math-equal (math-mod num i) 0)
	    (throw 'found i)
	  (setq i (math-add i 1))) ))))

(let ((num (math-read-number (car argv))) factor rst)
  (while (setq factor (find-factor num))
    (setq num (math-div num factor)) )
  (princ num)
  (princ "\n") )
メモ
  • calc-ext は calc-command-flags を定義していないと動作しないらしい.
  • calc-ext の math- 系の関数を使えば, 多倍長計算ができる.
  • math-read-number で文字列から多倍長型に変換.
  • 多倍長計算用の関数は calc の manual の 18.5.7 Calculator Internals を参考にすればよい.

http://www.delorie.com/gnu/docs/calc/calc_355.html