プロが教える店舗&オフィスのセキュリティ対策術

「1/2+1/3と引数を渡して、5/6という返り値を得る」という汎用のライブラリってありますでしょうか?

現状では1/2+1/3=0.5+0.33333333=0.833333333と計算
 ↓
continued fractions(http://mathforum.org/library/drmath/view/51886.h …
の手法で分数に変換してます。

しかし、近似解であり厳密解でないため、収束条件をかえると違う値を返してきます。

「MathematicaやMapleというalgebra softwareをC#から呼び出す」と簡単に実装できるのですが
単に分数計算するためだけなのに○十万円するのはちょっと、。。

で、
(1)商用であってもいいんだけど、できれば1万円以下
(2).netから呼べる。
(3)分数の厳密解を返す
みたいなものをご存知のかたがおられましたらよろしくご教示ください。

よろしくお願いします。

A 回答 (5件)

若干ずれた回答かもしれませんが、外部から他の数式処理システム呼び出してもよく、市販の数式処理ソフトが高価な事が問題なのであれば、Maximaのようなフリーのものを使うというのはダメでしょうか?


私はMaximaしか使ったことありませんし、外部から呼び出したことはないので、連携のしやすさなどはちょっとわからないのですが、フリーの数式処理ソフトは結構あるみたいですよ。
http://ja.wikipedia.org/wiki/%E6%95%B0%E5%BC%8F% …

この回答への補足

みなさんご回答ありがとうございました。

「Maximaにお伺いをたてる→答えをもらう」方式で解決させました。


後学のために記すと、
1.SocketServerを作って、任意のポート(m_PortNum)をlistenする。
2.1.のあと、maxima.bat -s m_PortNumとすると、MaximaがClientになってSocketServerに自動接続する(IPアドレスをどのように処理and/or指定するのかは不明だが、ローカルPC同士なので127.0.0.1で決め打ち?)
3.ServerとMaxima間でtalk開始。


MaximaがMathematicaやMapleに劣らない強力なツールであることも分かりました。

補足日時:2011/10/07 10:45
    • good
    • 0
この回答へのお礼

ありがとうございます。

Maximaには十分ポテンシャルがあるようですね。

ただ.netとの連携がMathematicaやMapleほどではないようです。

Googleすると http://www.math.utexas.edu/pipermail/maxima/2009 …
という記事をみつけました。

ややダサい連携方式のようにも思えますが、この方法とNo2さんご指摘のRuby方式と
両者を比較して実現可能性が高いもので作りこみたいと思います。

お礼日時:2011/10/04 15:01

C#なら、分子と分母を持ったクラスに定義して、演算子をオーバーロードして分数計算するようにすれば、そんなに難しいことでは無いと思うのですが。



例えば、class rとして定義。
コンストラクタとして
r(int 分子, int 分母)
r(int 分子) // 分母=1
とすれば

> {(5.5+25/15)÷73.7+12/15}-152 }
→ ( r(5,10) + r(25) / r(15) ) / r(737,10) + r(12)/r(15) - r(152) )

でいいはずです。
整数の桁を考えなければ、そんなに難しいことじゃないですよ。
    • good
    • 0

「式を (文字列かなにかで) 与えたら計算してくれる」というのと「(単に) 計算する」というのとでは難易度が違うのでねぇ.



後者は, 例えば Gnu MP のラッパーがあるみたいなのでそれでなんとかできないかな. 前者も, たぶん (構文解釈として) 調べればあるんじゃないかなぁ.
    • good
    • 0

rubyという言語はrationalという型(クラス)をもっています。


これは、分数を計算するための型です。
---------------------------------
a = Rational(1,2)
b = Rational(1,3)
c = a + b
p c
-------------------------
上記はrubyのコードですが
a = 1/2
b = 1/3
c = a+ b
cの内容を表示
を行なっています。
上記を実行すると
5/6が結果として得られます。
rubyのこの機能を使用すればよいかと思います。

尚、C#から直接呼び出したい場合は、
マイクロソフトからironruby(.NETで動作するruby互換のスクリプトエンジン)
が提供されています。
以下のURLを参照ください。
ironruby
http://ironruby.net/

Rational クラス
http://www.ruby-lang.org/ja/old-man/html/Rationa …

ruby本家
http://www.ruby-lang.org/ja/

C#からironrubyを呼び出す方法
http://www.m-tea.info/2009/12/c-ironruby-1.html
    • good
    • 0
この回答へのお礼

ご教示ありがとうございます!!

当方.net専従で、rubyは食わず嫌いしてたのですが、いい機会と考えてあたってみます。

お礼日時:2011/10/04 14:49

(b/a)+(d/c)=(ad+bc)/acですね。



そこで、分母と分子をメンバーとして持つような構造体を

typedef struct {
int bunbo;
int bunshi;
} bunsuu;

のように定義して、

bunsuu f(bunsuu x, bunsuu y);

というプロトタイプを持つ関数を書けばよいのではないでしょうか。

そういう話ではなくて、別のことをおっしゃっていますか?
    • good
    • 0
この回答へのお礼

早々の解答ありがとうございます。

>そういう話ではなくて、別のことをおっしゃっていますか?
質問文がやや誤解させるもので申し訳ございません。

構造型を定義して、自前で通分・約分する関数を作って、演算オペレータを解釈して、{}()の優先順位を判断して...は正しい方向性かと思います。

しかし、たとえば{(5.5+25/15)÷73.7+12/15}-152みたいな式を与えて、
分数での厳密解を得るものは難しくて、私には作れそうもありません。

で、{(5.5+25/15)÷73.7+12/15}を与えると答え=○○/△△を返す汎用ライブラリがあれば..
ということであります。

既述したように○十万円する数式処理システムは、一発で解答を出す由でありますが
如何せん庶民には手が届きません~~

お礼日時:2011/10/03 21:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!