Reduce のオープン・ソース化

Reduceは modified BSD license のオープンソースになりました。 FreeBSD-6.1 では https://sourceforge.net/projects/reduce-algebra から reduce-source-20090226.tar.bz2 を取得展開して、下記のようにコンパイル、 インストールすれば使えます。

  cd openreduce-20090226
  ./configure --with-csl
  gmake
  cd cslbuild/i386-unknown-freebsd6.1/csl
  cp reduce reduce.img /usr/local/bin
FreeBSD-8.0 では、ports/devel/subversion をインストールしてから、 http://www.reduce-algebra.com/downloading.htm に従って、
1) ソースコードを入手

  svn co https://reduce-algebra.svn.sourceforge.net/svnroot/reduce-algebra reduce-algebra

2) コンパイル

  cd reduce-algebra/trunk
  ./configure --with-csl
  gmake
で reduce-algebra/trunk/bin/redcsl ができます。

FreeBSD-8.1 では reduce-algebra-20091021.tar.bz2 を取得、解凍して、

  cd reduce-algebra/trunk
  ./configure --with-csl
  gmake
  cd cslbuild/i386-unknown-freebsd8.1/csl
  cp reduce reduce.img /usr/local/bin
で済みますが、csl の問題で、reduce を起動したら最初に
  off fancy;
を実行するか、
  reduce -w 
として実行しないと、数式の表示がおかしくなします。

2011-11-08 追記

2011-11-08 に FreeBSD-8.2 でコンパイルしてみたところ、 Linux と FreeBSD の違いを吸収するための、いくつかパッチが必要でした。

基本的な手順は http://reduce-algebra.com/downloading.htmに書いてありますが、

  svn co https://reduce-algebra.svn.sourceforge.net/svnroot/reduce-algebra reduce-algebra
でソースコードを取得した後、reduce-algebra ディレクトリで、 このパッチをあててから、
  cd trunk
  ./configure --with-csl
  make
を実行すれば、 trunk/cslbuild/i386-unknown-freebsd8.2/csl ディレクトリに
  reduce
  reduce.img
  reduce.fonts/
ができますから、この3つ(reduce.fonts ディレクトリと src 以下を除くすべてのファイル)を /usr/local/bin にコピーすれば reduce コマンドとして起動できるようになります。 ドキュメントは reduce.doc/ にあります。 なお、新しいウインドウを開かずに、コマンドラインで使うときは、reduce -w として起動します。

パッチの内容はすぐわかると思いますが、FreeBSD では、

 1)  で RLIM_SAVED_MAX, RLIM_SAVED_CUR が定義されていない
 2) struct timeval が <sys/time.h> で定義されている
 3) /bin/sh が bash ではない
ことが原因です。

2013-04-09 追記

FreeBSD-9.1 では、下記の操作だけでコンパイルできるようになりました。

  cd trunk
  ./configure --with-csl
  gmake

以上のように、reduce がオープンドメインになった結果、 以下の情報は古くなりましたが、しばらく残しておきます。


FreeBSD で動く Reduce

PC-Unix の中でも Linux ですとユーザが多いため「Mathematica」を始めとして、 多くの数式処理システムが市販されていますが、FreeBSD については市販品がな く、しばらくの間、REDUCE (ZIB 社の製品) を動かすためだけに Linux を使って いたことがありました。

その後、イギリスの「Codemist Ltd」の Unix 汎用のソースを購入してみたとこ ろ、FreeBSD でも REDUCE が使えるようになりましたが、オリジナルのソースで は FreeBSD をサポートしていませんので、移植の注意点をまとめておきます。

1. ソースコードの購入

http://www.codemist.co.uk/reduce/index.html を見て、「Professional Reduce」(REDUCE 3.7 system for Generic) を購入します。 価格は 350 pounds sterling でした。これには「Reduce」と「Codemist Standard LISP (CSL)」のソースコードが含まれていて、メディアは

  floppy disks
  DOS format CD-R
  DDS/DAT tape (2GB format)
  FTP
から選択できます。私は CD-R で購入しました。3.6 のときは分厚い印刷された マニュアルが付いていて便利でしたが、3.7 からは HTML 版のマニュアルだけに なっています。

2. インストール

以下、ソースコードを展開する作業ディレクトリを /usr/local/r37 として説明 します。

1) 作業ディレクトリの作成

  # mkdir /usr/local/r37

2) ソースコードの展開と行末コードの修正

入手したソースコードを /usr/local/r37 ディレクトリに展開します。3.6 のとき
は、すべてのファイルの行末の CR+LF を LF に変換する必要がありましたが、3.7
では直っています。

3) makefile の用意

  # cd /usr/local/r37/lisp/csl
  # mkdir bsd
  # cd bsd
  # cp ../linux/Makefile .	# Linux 用 Makefile をコピー

4) パッチ

  # cd /usr/local/r37

で下記のパッチをあてます。

*** lisp/csl/cslbase/ORGcsl.c   Wed Jul 12 11:52:23 2000
--- lisp/csl/cslbase/csl.c      Wed Jul 12 15:58:58 2000
***************
*** 50,55 ****
--- 50,59 ----
  #include 
  #endif
  
+ #ifdef __FreeBSD__
+ #include <floatingpoint.h>
+ #endif
+ 
  static int port_number, remote_store, current_users, max_users;
  SOCKET socket_server;
  int sockets_ready;
***************
*** 585,590 ****
--- 589,597 ----
   * floating point exceptions.
   */
      jmp_buf this_level, *save_level = errorset_buffer;
+ #endif
+ #ifdef __FreeBSD__
+     fpsetmask(fpgetmask() & ~FP_X_INV);
  #endif
      tty_count = 0;
      while (YES)
*** lisp/csl/linux/Makefile     Wed Jun 16 17:48:19 1999
--- lisp/csl/bsd/Makefile       Wed Jul 12 15:40:14 2000
***************
*** 22,29 ****
  # scanned in the link-phase.
  
  CC        = gcc
! OPTFLAGS  = -O3
! MPIFLAGS  =
  CFLAGS    = -c $(OPTFLAGS) -ansi -I$(CSLBASE) $(MPIFLAGS)
  LIBS      = -lm -lc -lcurses
  
--- 22,29 ----
  # scanned in the link-phase.
  
  CC        = gcc
! OPTFLAGS  = -O
! MPIFLAGS  = -DBSD_LIB
  CFLAGS    = -c $(OPTFLAGS) -ansi -I$(CSLBASE) $(MPIFLAGS)
  LIBS      = -lm -lc -lcurses

lisp/csl/bsd/Makefile については、REDUCE の image file を /usr/local/lib/reduce
という名前に固定したいとき「-DPUBLIC」を追加、ダイナミックリンクライブラリの違い
から起きる面倒を避けたいときは、-static を追加して static link にします。

lisp/csl/cslbase/csl.c のパッチは FreeBSD 固有の浮動小数点演算例外処理の対策
です。最近の FreeBSD はこの扱いが少しへそ曲がりになっています。

5) コンパイル

lisp/csl/readme.txt を見ながらコンパイルすれば良いのですが、下記のようになり
ます。

  # cd lisp/csl/util
  # sh setexec
  # cd ../bsd

を実行してから

  # make slowr37
  # ../util/boot37
  # ../util/profile
  # cp profile.dat ../csl-c/profile.dat
  # ../util/c-code37
  # make r37
  # ../util/full37

かなり長い処理時間がかかるステップがありますが、途中の進行状況を見たいときは

  # tail -f log/slowr37.log
  # tail -f log/boot37.log
  # tail -f log/profile.log
  # tail -f log/c-code.log
  # tail -f log/full.log

等と、log ディレクトリの下に作られる log file を監視します。

6) テスト

  # ./r37

で「Reduce」を起動し、

  factorial 200;
  (x+y)^4;
  int(x^6*log x,x);
  z := mat((0,1),(1,1));
  z^40;
  solve(a*x^2+b*x+c,x);
  on rounded; precision 70;
  pi;
  bye;

等をテストします。これで、とりあえずの動作確認ができますが、もっと完全な検査
をしたいときは、

  # ../util/testall

等を使います。

7) バイナリのインストール

  # mv r37 /usr/local/bin/reduce
  # mv r37.img /usr/local/bin/reduce.img
 
以上で、「reduce」コマンドとして起動できるようになります。/usr/bin/reduce 
と /usr/local/lib/reduce 以外は消去してもかまいません。

Makefile で「-DPUBLIC」が指定されていれば、最後のステップで、r37.img が /usr/local/lib/reduce に移動しますので、 # mv r37 /usr/local/bin/reduce だけ実行してください。

なお、グラフィック表示には「gnuplot」を使うようになっていますので注意して ください。

2.1. FreeBSD 4.2 の注意

FreeBSD 4.2 ではコンパイル不能になってしまいました。 原因は /usr/include/curces.h の boot の扱いが、以前の

  #define bool char
から

  typedef char bool;
に変わったため、CSL の

  typedef int bool;
との競合を避けるための r37/lisp/csl/cslbase/fasl.c の細工が効かなくなったこと にあって、とりあえず、下記のようにごまかしましたが、時間が取れたら、 もう少しましな方針を考えてみたいと思います。

1) /usr/include/curses.h を r37/lisp/csl/cslbase/curses_bsd.h にコピーして、
   下記の変更を加える

*** /usr/include/curses.h       Mon Nov 20 20:58:52 2000
--- curses_bsd.h        Fri Feb  9 16:12:38 2001
***************
*** 93,99 ****
--- 93,103 ----
  
  #if (!defined(__cplusplus) || !1) && (!0)
  #undef bool
+ #if 0 /* CLS */
  typedef char bool;
+ #else
+ #define bool char
+ #endif
  #endif
  
  #ifdef __cplusplus

2) r37/lisp/csl/cslbase/fasl.c を下記のように変更する

*** ORGfasl.c   Fri Feb  9 15:45:55 2001
--- fasl.c      Fri Feb  9 16:13:49 2001
***************
*** 3007,3015 ****
  #define bool alternative_bool
  
  #ifdef __FreeBSD__
! #undef bool
! #endif
  #include 
  
  /*
   * In fact for the curses-Unix style interface I do not support a mouse,
--- 3007,3016 ----
  #define bool alternative_bool
  
  #ifdef __FreeBSD__
! #include "curses_bsd.h"
! #else
  #include 
+ #endif
  
  /*
   * In fact for the curses-Unix style interface I do not support a mouse,
---< cut >---
つまり、reduce のコンパイルのときだけ、curses.h を昔の bool 定義に戻している だけです。

3. Reduce 3.8

2004-04 に REDUCE 3.8 (Professional System) というアップデート版が出ましたが、 これを FreeBSD-4.9 にインストールする場合は、 下記のパッチをあてて、トップ・ディレクトリで、

  # sh compile.sh
を実行するだけで済みます。

*** /cdrom/lisp/csl/cslbase/configure   Mon Aug 16 20:41:30 2004
--- /var/local/src/r38/lisp/csl/cslbase/configure      Sun Aug 29 15:03:20 2004
***************
*** 2114,2119 ****
--- 2114,2124 ----
  fi
  
      LDFLAGS="$LDFLAGS -L/usr/X11R6/$XLL"
+     case $host in
+     *-freebsd*)
+	LDFLAGS="$LDFLAGS -L/usr/X11R6/$XLL -pthread"
+     ;;
+     esac
      XLIBS="-lXext -lX11"
      ;;
  esac

FreeBSD-8.3 までは、これでコンパイルできますが、 FreeBSD-9.x/8.4 から /usr/X11R6 がなくなって /usr/local に移動しましたので、 下記のようにパッチします。

*** /cdrom/lisp/csl/cslbase/configure   Mon Aug 16 20:41:30 2004
--- /var/local/src/r38/lisp/csl/cslbase/configure      Sun Aug 29 15:03:20 2004
***************
*** 2114,2119 ****
--- 2114,2124 ----
  fi
  
      LDFLAGS="$LDFLAGS -L/usr/X11R6/$XLL"
+     case $host in
+     *-freebsd*)
+	LDFLAGS="$LDFLAGS -L/usr/local/$XLL -pthread"
+     ;;
+     esac
      XLIBS="-lXext -lX11"
      ;;
  esac
コンパイルが終わったら、 lisp/csl/local-build/r38,r38.img の 2 つを /usr/local/bin のコピーすれば、 r38 として起動できます。 r38,r38.img を reduce, reduce.img に rename してもかまいません。

4. 参考書

「Reduce」の参考書はたくさんありますが、手もとにあるものをリストしておきま す。始めての人には、 [1], [2], [3], [11] あたりがよいかもしれません。

[1] 広田良吾,伊藤雅明-「REDUCE 入門」
        (サイエンス社)ISBN 4-7819-0546-3

[2] 守谷良二,-「例題でわかる REDUCE」
        (海文堂出版) ISBN 4-303-72320-7

[3] 大河内茂美,- REDUCEで数学を
        (森北出版) ISBN4-627-83260-5

[4] 後藤英一,一松信,広田良吾編,- 計算機による数式処理のすすめ
        (共立出版)

[5] 落合豊行,永友清和,- REDUCEによる線形代数
        (近代科学社) ISBN4-7649-0164-1

[6] A.C.ハーン,- REDUCE ユーザーズマニュアル
        (マグロウヒル) ISBN4-89501-287-5

[7] A.C.ハーン,- Reduceユーザーズマニュアル
	(マグロウヒル出版) ISBN 4-89501-327-8

    いづれも少し前のバージョンですが、REDUCE のマニュアルの和訳です。
REDUCE のマニュアルはかなりのボリウムですが、TeX の原稿で配布されています。

[8] 佐々木建昭,元吉文男,渡辺隼郎,- 数式処理
	(昭晃堂)

[9] 守谷良二,-数式処理システムREDUCEによる数学入門 線形代数編
	(日本理工出版会) ISBN 4-89019-019-8

[10] 中村秀治,松井正一,- REDUCEによる構造力学の数式処理
	(技報堂出版) ISBN 4-7655-1491-9

[11] 小林英恒,- 高校数学によるREDUCE入門
	(サイエンティスト社) ISBN 4-914903-06-7 

[12] 大河内茂美,- REDUCEで数学を 〜数式処理ソフト〜
	(森北出版) ISBN 4-627-83260-5

[13] 牧野潔夫,- 整数論の数式処理
	(サイエンティスト社) 

[14] 下地貞夫,- 数式処理 叢書名:基礎情報工学シリ−ズ
	(森北出版) ISBN 4-627-80630-2

[15] 森本光生,- パソコンによる数式処理
	(朝倉書店) ISBN 4-254-12072-9 

[16] 渡辺隼郎,- 微分方程式の数式処理 叢書名:シリ−ズ新しい応用の数学
	(教育出版) ISBN 4-316-37550-4 

[17] D.Stauffer,F.W.Hehl,N.Ito,V.Winkelmann,J.G.Zabolitzky,-
        Computer Simulation and Computer Algebra
                (Springer-Verlag) ISBN3-540-56530-2

[18] Malcolm A.H. MacCallum, Francis J. Wright,- Algebraic Computing
    With Reduce : Lecture Notes from the First Brazilian School
    on Computer Algebra
        (Oxford Science Publications)

[19] Gerhard Rayna,- Reduce : Software for Algebraic Computation
        (Springer Series Symbolic Computation-Artificial Intelligence)

[20] N. MacDonald,- Reduce for Physicists
	(Institute of Physics Publishing) ISBN 0-7503-0277-1

5. REDUCE の情報

インタネットでは下記のサイトがよくまとまっています。

  http://www.reduce-algebra.com/
  http://www.uni-koeln.de/REDUCE/
  REDUCE ユーザーズマニュアル

連絡先

念のため、上記の WEB サイトから連絡先を転記しておきます。

Codemist Limited "Alta", Horsecombe Vale Combe Down Bath BA2 5QR England Tel/Fax: +44-225-837430 Electronic Mail: jpff@codemist.tc or jpff@maths.bath.ac.uk

6. 旧バージョンの情報

CSL/REDUCE 3.6 をお持ちのかたのために、 昔書いた情報 もしばらく残しておきます。

平林浩一