児玉 です.

From: IKEGAMI Daisuke <daisu-ik / is.aist-nara.ac.jp>
Subject: [ruby-math:00356] Re: one/zero for algebraic class
Date: Mon, 04 Sep 2000 14:29:42 +0900
Message-ID: <200009040529.AA21318 / rho.aist-nara.ac.jp>

> いけがみです.
> 
> 体や環を表現する上で,is_zero? とか is_identity? があればいいなと
> 僕も思います.

is_zero?  is_identity? もよさそう.


Polynomial では, 比較だけでなく, 
値として 1 や 0  を置きたい部分があるので,
値として使えるとありがたいです.

ただ, 値として持たせるのは問題があって,
1 を持たせてしまって,
これを足すと 任意に整数を作れてしまうので
結局, 環の方で, 1,0 だけでなく
整数を適当に同一視して扱う必要が出てしまう.
ここで, __整数を含まない環__ の演算, 
例えば, 有限体の商を意図したのに
# いや Rational の商を得たい場合とかでも問題だけど.
Integer での商になってしまうと矛盾が出るわけで,
coerce では吸収できないみたい.


> 児玉さんが言うように 0,1 を同一視できるのなら,
> そちらのほうがもっと綺麗だと思います.
> 
> > そこで, 四則演算のときに, 整数の 1, 0 を 
> > 環の 1元, 0元 と同一視するのが現実的なようです.
> このような同一視が ruby で表現可能でしょうか?
> どのようにしたらいいだろう…

わから----ん, です.

あるいは, 1,0 の同一視をあきらめて,
one(identity でも良いけど), zero を実装する.

インスタンスの生成時に,
こんな感じで係数環 クラスが何かを教えてやる事にして...

p=Polynomial(MY_RING); # インスタンス生成
             ^^^^^^^これはクラス名ね.

class Polynomial.... # クラス定義
  def initialize(ring)	
    @coeff_zero=ring::zero; # ring のクラスメソッドか定数参照
    @coeff_one=ring::one;
  ......
  attr :coeff_zero;
  attr :coeff_one;
....


# こんな風にクラスを(インスタンスでなく)引き渡す使い方って
# やったこと無いけど, こんな感じで良いのでしょうか?



4月ころから GNU/Sather もやりだしているんですが,こちらだと 
class POLYNOMIAL{RING} is .... -- クラス定義としておいて,
p::=#POLYNOMIAL{MY_RING}; -- インスタンス生成
のように 多項式クラスに 係数環が何かを教える事ができます.
っていうか, そんな風に実装しましたです.
環 RING クラスの方で one と zero を定義しておけば
RING.zero のように参照できるので one, zero の実装にかんする同意が
取れていれば問題はないはず.
一部のクラスでは既に one, zero がありますから,
これで問題が無いなら,(...と決心がつけば)
できるだけ実装するように提言してみようかと思っているところです.



> 例えば有限体のクラスが ruby で書けたとします.
> 有限体の元を成分とする行列を,付属の Matrix クラスをつかって表現するとき,
> rankなどのメソッドでは,「足し引きして'0'か?」 ということを使ってるので
> 有限体の零元 == 0 でないと困るのです.
> もっとも Numeric クラスには zero? がありますから,
> Matrix クラスのメソッドで 0 と比較している部分を
> 全部 zero? に置き換えれば同一視は必要ないのですが…
> 
> 全てのプログラマに,「0と比較するときは zero? をつかうこと」を強要するのは
> おかしいと思いますから,やはり同一視のほうがありがたいと思います.


Integer の 0 と 一般的な環の零元 との違いはあるわけで,
そういう使い方を想定したクラスに関しては,
つかえるメソッドに制限がつくのはしかたがないと思います.


> 単位元のほうは Numeric クラスに用意されてないので,
> 1 と同一視するという方法か,Numeric クラスに identity? を追加するか,
> どちらか(もしくは別の方法?)でしょうか.

上に書いた理由で, 1との同一視は,一般的にはやばそうな感じ.


> そうそう,スペルは長いですけど僕は単位元を呼ぶのに one よりは identity の
> ほうが好きです.(one はいろんな意味を持ちすぎると思います)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

まあ,それは云えるかも.
identity もなんとなく違和感はある.
unit じゃちょっと違うし.
何かないかな.


> 有限体のクラスがあればいいなー,いいなーと僕は強く思っている人で,
> 自分でも時間をみつけては挑戦しているのですが,まだできていません.
> 素体 Zp=Z/pZ は簡単に実装できるんですけど,
> Zp係数多項式 modulo 環 Zp[X]/(f(x)) の実装でつまずいています.
> 児玉さんの Polynomial クラスを使えば簡単に作れそうですか?

Integer係数で場当り的に Zp 係数とみなす演算は
Polynomial と PolynomialM クラスに入ってます.
# っていうか, 問題なのは 商だけかと思うけど. だめ?

Zp クラスを実装したなら,
これを普通に係数として与えれば,
( Zp クラスで 1, 0 の問題が無いなら )
Polynomial クラスで
+,-,* 等に関しては, 問題ないはず

/, %, divmod で
係数環が Integer, Rational を含むと考えている部分があったので.
商に問題が出るかも. この辺は考え直してみます.
ただ, Integer係数 と Rational/Float係数のつじつま合わせをやろうとして
妙な細工をしているので, 厄介です. 

見掛け上 Integer係数多項式で与えて Zp 係数とみなして割算を行う
divmodZp っていうのも入っていますが, これで転用できませんか?

Zp[x]/(f(x)) に関しては,
Zp[x] ができればなんとかなるのでは....と想像します.

Zp係数の多変数多項式でも
グレブナ base の計算とかもできるようになっているんで,(gbasem.rb)
興味があればそちらも見て下さい.
-- 
K.Kodama(kodama / kobe-kosen.ac.jp)