maximaとか(2)

Q: こゆびが いたいです

A1: キーボードを捨てて、友達と外で遊ぶことで解決されます。

A2: 日本語キーボードの無変換・変換キーをCtrlに割り当てましょう。
    負荷分散はハイパフォーマンスの基本です。

A3: Vim を使いましょう。

A4: 小指で腕立て伏せをすればok

A5: 指をもう一本生やしてください

ははは、悩めるEmac Love な人の質問ね。なかなか鋭い回答をしてるなあ。2ch的なノリで 面白い。

これ、Qiitaと言う、プログラマ向け全国Web相談室へ寄せられた 質問と回答の一部です。

質問を見てると、何となく世相が分かって面白い。でも、軟弱な人が多いな。XXは何処で手に 入りますか? なんて事を聞く輩がいる。教科書に書いてないから分からないと言う事なのかな。

そんなの人に聞くよりGoogle様に聞いちゃった方が早いと思うんだけどなぁ。

Windowsでもmaxima

maximaは、FreeBSD上で動かしてたんだけど、FreeBSDはVMWARE上なんで、思い立ったらmaixmaとは 言い難かった。そんな訳なんで、WIndowsにも入れておいた。

インストールの最後に、XMaximaにするかwxMaximaにするか聞かれたけど、Xは、X Windowを 連想したんで、wxの方をデフォにした。メニューが日本語になってるので、知らない数学英語の 障壁が低くて嬉しい。やっぱり、使ってる人の多いOSは便利だな。(別にM$に寝返った訳では ありません。ただ使うだけなら便利って事です。)

(%i2) x^2 + y^2;
(%o2) y^2+x^2
(%i3) factor(%);
(%o3) y^2+x^2
(%i4) gfactor(%);
(%o4) (y-%i*x)*(y+%i*x)
(%i5) ? gfactor;
 -- Function: gfactor (<expr>)
     Factors the polynomial <expr> over the Gaussian integers (that is,
     the integers with the imaginary unit `%i' adjoined).  This is like
     `factor (<expr>, <a>^2+1)' where <a> is `%i'.
     Example:
          (%i1) gfactor (x^4 - 1);
          (%o1)           (x - 1) (x + 1) (x - %i) (x + %i)
  There are also some inexact matches for `gfactor'.
  Try `?? gfactor' to see them.
(%o5) true

で、因数分解なんだけど、普通にやると出来ないようなやつも、複素数用の関数を使うと さっと出来ちゃったりする。こういうの、マニュアルから探すのって面倒なんで、助かりますだ。

HELPメニューに、ビルド情報なんてのが有ったので、実行してみた。

(%i6) build_info()$
Maxima version: 5.25.0
Maxima build date: 12:0 8/2/2011
Host type: i686-pc-mingw32
Lisp implementation type: Clozure Common Lisp
Lisp implementation version: Version 1.7-r14925M  (WindowsX8632)

裏で頑張ってるのは、Clozure Common Lisp(略してccl) なんてやつだ。余り聞かない名前だなあ。 普通Windowsで動くclたら、clispぐらいかと思っていたよ。シビアな世界での土台を 支えているぐらいなんで、それなりに実績があるのだろう。

オープンソースって事は、cclのソースも付いているのだろうか?ちょいと調べてみる。 cclのソースは入ってなくて、35MByteのmaxima.imageファイルがポツンと置いてあった。 Lispの実行環境の中に、maximaが融合されてるって訳ね。

その代わりに、ちらっとLispについての説明が載ってた。

Notes on Lisp implementations for Maxima:

Clisp, CMUCL, Scieneer Common Lisp (SCL), GCL (ANSI-enabled only)
and SBCL can compile and execute Maxima.
Allegro Common Lisp and OpenMCL might also work, but have not
been fully tested.

Ports to other ANSI Common Lisps should be straightforward
and are welcome; please post a message on the Maxima mailing list
if you are interested in working on a port.

For specific Maxima and Lisp version number combinations,
see the ports page at the Maxima wiki:
http://maxima.sourceforge.net/wiki/index.php?Maxima%20ports

When Maxima is recompiled, the Lisp implementation is selected by
an argument of the form `--enable-foolisp' for the configure script.
`./configure --help' shows a list of the Lisp types recognized by
configure (among other options). Always specify the Lisp type;
configure tries to autodetect the Lisp type if it is not specified,
but it has been reported that autodetection can fail.

--------------------------------------------------------------------
Comparison of execution times for the run_testsuite function
All times are in elapsed seconds

Maxima      System                  GCL     SBCL    CMUCL   Clisp

pre-5.9.3   P2 450 MHz, Linux        75      91              301

P2とはえらい古いCPUだなあ。これじゃ、Lispによる差も本当に参考程度にしか ならんな。

ちなみに、VMWare上のFreeBSDで、SBCLのmaximaで、100000! には、5.1秒かかって いたけど、Windows上のmaximaでは、2.7秒だった。まあ、こんなのも気休め程度かな。

cclのソースは入っていなかったけど、maximaのやつは入っていた。折角なのでちょいと覗いてみる。 見たのは、solve.lisp

;;; -*-  Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;     The data in this file contains enhancments.                    ;;;;;
;;;                                                                    ;;;;;
;;;  Copyright (c) 1984,1987 by William Schelter,University of Texas   ;;;;;
;;;     All rights reserved                                            ;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;     (c) Copyright 1982 Massachusetts Institute of Technology         ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(in-package :maxima)

(macsyma-module solve)

(load-macsyma-macros ratmac strmac)

(declare-top (special var-list expsumsplit $dispflag checkfactors *g
		      $algebraic equations ;List of E-labels
		      *power *varb *flg $derivsubst $numer $float
		      $%emode genvar genpairs varlist broken-not-freeof
		      $factorflag
		      mult    ;Some crock which tracks multiplicities.
		      *roots ;alternating list of solutions and multiplicities
		      *failures	;alternating list of equations and multiplicities
		      *myvar $listconstvars
		      *has*var *var $dontfactor $linenum $linechar
		      linelable $keepfloat $ratfac
		      errrjfflag  ;A substitute for condition binding.
		      xm* xn* mul*))

(defmvar $breakup t
  "Causes solutions to cubic and quartic equations to be expressed in
	 terms of common subexpressions.")

(defmvar $multiplicities '$not_set_yet
  "Set to a list of the multiplicities of the individual solutions
	 returned by SOLVE, REALROOTS, or ALLROOTS.")

1000行もある冒頭部分、MITのクレジットがあるのね。それから、macsymaってのは、昔の名前って 事で宜しいのでしょうかね? それにしても、おいら、clはよく分からんなあ。 でも、これぐらいは分かるよ。asum.lispから。

;; factorial stuff

(setq $factlim 100000 ; set to a big integer which will work (not -1)
      makef nil)

(defmfun $genfact (&rest l)
  (cons '(%genfact) l))

(defun gfact (n %m i)
  (cond ((minusp %m) (improper-arg-err %m '$genfact))
	((= %m 0) 1)
	(t (prog (ans)
	      (setq ans n)
	      a (if (= %m 1) (return ans))
	      (setq n (m- n i) %m (1- %m) ans (m* ans n))
	      (go a)))))

;; From Richard Fateman's paper, "Comments on Factorial Programs",
;; http://www.cs.berkeley.edu/~fateman/papers/factorial.pdf
;;
;; k(n,m) = n*(n-m)*(n-2*m)*...
;;
;; (k n 1) is n!
;;
;; This is much faster (3-4 times) than the original factorial
;; function.

(defun k (n m) 
  (if (<= n m)
      n
      (* (k n (* 2 m))
	 (k (- n m) (* 2 m)))))

(defun factorial (n)
  (if (zerop n)
      1
      (k n 1)))

そんじゃ、cclをついでにつついてみる。

Clozure Common Lisp

調べてみたら、FreeBSDでもportsになってた。そのコマーシャル・メッセージでは

[sakae@cdr /usr/ports/lang/ccl]$ cat pkg-descr
Clozure CL (formerly known as OpenMCL) is a free Common Lisp
implementation. Features include:

  * A fast, precise, compacting, generational garbage collector
    written in hand-optimized C. The sizes of the generations are
    fully configurable.

  * Full native OS threads on all platforms. The API includes support
    for shared memory, locking, and blocking for OS operations such
    as I/O.

  * Full Unicode support.

  * Excellent debugging facilities. The names of all local variables
    are available in a backtrace.

  * A complete, mature foreign function interface.

  * Many extensions including: files mapped to Common Lisp vectors
    for fast file I/O; thread local hash tables and streams to
    eliminate locking overhead; cons hashing support.

WWW:    http://www.clozure.com/clozurecl.html

上のリンクは、ちとお堅いので、一般のユーザーは、 こちらのリンクがいいかも。ついでなので、Windows用に 落としてきた。FreeBSDも入れてあげた。古い古いNptePCにも入れようとしたら、SSE2を サポートしたマシンじゃなきゃ嫌と拒否されたよ。 骨の髄まで酷使してスピードを稼いでいるのね。

こちらでは、cclを題材にして講座が開かれているんで、 たまには参照してみるかな。参照透明性は、Lisp系には無いけど、そこは大人の論理って事で。 あの、Haskellだって、参照透明性を破るものが用意されてますんで、要は心がけ次第って事です。

ソースが付いてるはずだと覗いてみれば、ARM,PPC,X86(X8632,X8664)と言う具合に豪華だった。 糞石を見たってしょうがないので、ARM版でも見て、目の保養をば。

;;; Count the sign bits in the most significant digit of bignum;
;;; return fixnum count.
(defarmlapfunction %bignum-sign-bits ((bignum arg_z))
  (vector-length imm0 bignum imm0)
  (add imm0 imm0 (:$ (- arm::misc-data-offset 4))) ; Reference last (most significant) digit
  (ldr imm0 (:@ bignum imm0))
  (cmp imm0 (:$ 0))
  (mvnlt imm0 imm0)
  (clz imm0 imm0)
  (box-fixnum arg_z imm0)
  (bx lr))

本当にアセンブラで書いてあるよ。add命令って3オペランドなんだな。 オペランドの計算をS式で賄っているとは、Lispとアセンブラが融合してて、面白いな。

今、ふと思ったんだけど、ARM版が有るって事は、林檎マークの携帯電話でもcclが動くんかな? こりゃ、モトローラを買収したGoogleさんも、おちおち出来ませんぜ!(巷の噂では、特許が欲しかった だけらしい)

そして、林檎マークからは、 インテルへ警告と言うか脅しを かけてますなあ。世の中のためには、良い方向ですな。早く悪貨が廃れて良貨になって欲しいぞ。

cclのコードを見ると、ARMとかPPC版は、ふんだんに有るレジスターを伸び伸びと使って るんだけど、電卓上がりの石はレジスターが貧弱なもんで、いろいろと苦労の跡が伺える。 なんで、こう変な石が市場を席巻してるんですかね。プンプン!

循環器系におけるオームの法則

堅い話が続いたので、今度は柔らか目で行きます。

先週、図書館の話をチラっと書いた。あの時、何を借りてきたかと言うと、『沈まぬ太陽』 (山崎豊子)の大作だ。何でまたこんな大作かと言うと、夏休み課題図書に選ばれていたから。 小説なんで国民航空となってるけど、いわゆる ナショナル・キャリアな航空会社を舞台にした物語。

途中3巻目で、御巣鷹山の航空事故の話が出てくるんだけど、描写が酸鼻で読むのを憚られる ぐらいだった。520名の生体実験(結果的にですが)の結果を生かして、安全に役立てて欲しい と遺族が立ち上がるのが涙を誘いましたよ。今度飛行機に乗る時は、シートベルトが凶器に ならないように注意せねば!

全5巻なんだけど4巻までしかなく、最終巻は次回となったんだけど、借用枠がもう一冊残ってる。 新刊コーナーを見たら、『高血圧の医学』(中公新書)なんてのがあったので借りてきた。

家庭用血圧計は、オムロンのやつが良いらしい。 標準血圧計だけあって、 高いなあ。オシッコを我慢すると血圧が上昇してるので 排尿後に測りましょう。1回目の測定値は捨て、2回計って、平均値を記録しましょうだってさ。 へぇー、そんな事、主治医は教えてくれなかったよ。

血圧 = 血液量 X 末梢血管抵抗

で、計算されるそうです。これって、もろにオームの法則じゃん。 でも、ちゃんと次元方程式を満たすようになってるのかしらん。詳細は流体力学あたりを 調べればいいのかな? 単なるモデル化だったりして。

毛細血管も含めた人間の 血管の長さは、地球を何回りもするそうだから、確かに抵抗(流れにくさ)は有るわな。 それに逆らって、血を流すには、圧力が必要なのは肯ける。

血液にパワーの源が潜んでいる訳だから、人間(と言うロボット)を動かすには、体躯に よって決まる血液量が必要。血管が細くなったりすると抵抗が増えるんで、それにつれて血圧が 上がるんだな。

勿論、血流量は、常に一定じゃなくて、場合場合によって変わってくるんで、必要な量が 行き渡るように自動調整(血圧とか心拍数で)されるんだな。その調整が、数秒で応答する 因子から、数分、数時間、果ては、日周期に至るまでのいろいろな因子の総計になってるとな。 凄い、制御系だ事。

で、血圧を低くするには、血管の抵抗を少なくするしかない、血管を拡げて血が通りやすく するんだ。その為に、いろいろな薬が開発されてるのね。おいらが今飲んでる薬は、血管を拡げる 作用にプラスして、血圧上昇回路信号をアッテネートする機能が入ってます。ジェネリック品が 有るかと聞いてみたら、しっかり特許が有効な新薬でした。

循環器って、閉じた系だけど、血管っていろいろな所で枝別れしてる。脳コンピュータは 割と大飯くらいで、全血流の15%が流れるとか、心臓ポンプはは効率が良くて5%、化学工場の 肝臓とろ過器の腎臓へは、それぞれ20%づつ流れ、後は筋肉とか皮膚へ行くらしい。 これらは、抵抗値を自動調整してるんだな。

すると、体はオームの法則を知ってる訳だ。抵抗の直並列計算なんて、お手のものなんだな。 体の中にmaximaが仕込まれていたりして。

後は、オームの法則だけじゃなくて、鳳・テブナンの重ね合わせの定理とかキルヒホッフの 法則も知ってなきゃダメかな。