• ベストアンサー

高機能な表計算ソフトを探しています

5000程度の階乗や順列を使った計算をしたいのですが、 例えば (aPn * bPn) / C! に a,b,C の値を与えて n=1,2...100 でそれぞれ計算して出力する。 EXCELでは、階乗の計算は170程度までしか出来ないので、他にソフトがないか探しています。 お金を出してまで...とは考えていないので、フリーに限ります。 何か、良いものはないでしょうか。よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

普通の倍精度浮動小数点の場合は質問者さんが書かれているように170!くらいまでしか計算でしません。 170!で7.257415615308e+306となります。 分母がc!となっていますので、式をうまく変形して大きな数字にならないようにしてやれば可能ですが、 多倍長整数(あるいは浮動小数点数)を扱えるソフトを使えば直接計算できます。 表計算ソフトでは見たことがありません。 例えば、(aPn * bPn) / c!の計算をRubyを使ったプログラムを示しますと a=200 b=300 c=100 (1..100).each{|n| puts (n..a).inject(:*)*(n..b).inject(:*)/(1..c).inject(:*) } のようになります。上の計算式は整数割る整数になっていますので、小数点以下が切り捨てられす。 それをしたくない時は require "rational" a=200 b=300 c=100 (1..100).each{|n| puts Rational((n..a).inject(:*)*(n..b).inject(:*), (1..c).inject(:*)) } とすれば分数計算してくれますし、 puts Rational((n..a).inject(:*)*(n..b).inject(:*), (1..c).inject(:*)).to_f としておけば浮動小数点表示できます。 5000!でも (1..5000).inject(:*) で全桁計算が可能です。ものすごい桁数になりますが。

zggwtyb
質問者

お礼

皆様、回答ありがとうございました。 「LM多倍長電卓」というソフトが見つかり、表計算ソフトではありませんがこれでほぼ目的は達成できるので、今回はこのソフトを使うことにしました。 少し時間ができたら、プログラミングを勉強し直して、これぐらいの計算ならサクサクできるようになりたいと思っています。 いろいろなアドバイスをありがとうございました。

その他の回答 (3)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.4

おはようございます。 Excelのようなものでできる方法を考えてみました。 あくまでも最終の答えがExcelで表示できる範囲であるという条件である必要がありますが。 exp(log(aPn * bPn) / c!) )=exp(log(aPn)+log(bPn)-log(c!)) 要するに一旦対数に変換して、expで戻す方法です。 c!が大きすぎて計算できないときには、 スターリングの近似式を使います。 http://ja.wikipedia.org/wiki/階乗 log(c!) -> 0.5*log(2*PI)+(c+0.5)*log(c)-c*log(E) となります。 あるいは c! -> c!/(c-m)!*(c-m)!/(c-m-k)!*(c-m-k)! -> cPm*(c-m)Pk*(c-m-k)! とオーバーフローしない程度にc!を分割して log(c!) -> log(cPm)+log((c-m)Pk)+log((c-m-k)!) かなりややこしいので計算ミスしている様な気もしますが、できないことはない。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

たびたびすみません。 Excelで順列の計算をするのにPERMUTが使えるようですね。 階乗をのようにすごく大きな数にはなりませんので、計算可能かもしれません。 c!はそのままでは 170!までしか計算できませんので、それより大きな場合は、かなり考えないと。 No.1、2に示した方法ではオーバーフローは発生しませんのでお手軽です。 Windowsの場合はRubyをインストールしないといけませんが。 Macの場合は最初から入っていますし、Linuxは簡単に入れられます。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

No.1です。式を大間違いしていますね。訂正。 (aPn * bPn) / c!の場合は (a-n+1..a).inject(:*)*(b-n+1..b).inject(:*)/(1..c).inject(:*) ですね。

関連するQ&A

  • 計算ソフトが欲しいので教えてください。

    ((A*70.2-891150)*0.8+(B*73.3-969464)*0.8)-49250=C この様な計算式でAとBの値が毎日変わります。二つの値を入力するだけで、Cの数値がポンと出てくるようなフリーソフトが欲しいのですがご存知の方、居られましたら教えてください。この式での計算のみでの使用なので、なるべく軽い物を希望しているのですが探し方が悪いのか中々見つかりません。何卒よろしくお願いいたします。

  • 表計算ソフトについて

    表計算ソフトでax^2+bx+c=0を満たす x を求める表を作成する方法を教えていただけないでしょうか? 入力 a、b、c がどのような値(0を含む) になっても正しい値が出るようにしないといけないみたいです。

  • 確率計算できるフリーソフト無いですか?

    例えば50C18(組み合わせ)や20P12(順列)など、複雑な計算が出来るソフトを探しています。 エクセルが入ってないんで、結構きついです・・・ PCはWINDOWS-XPです。

  • 計算ソフトを探しています。

    例えば、(A+(B+10))÷((C+(A÷50))+B×0.5) のように、四則演算(+,-,×,÷)程度の簡単な計算ですが、 数式が長い計算を、何種類かやっています。 電卓を使ってやっていますが、式が長いので時間がかかりますし、 計算間違いをしょっちゅう、します。 そこで、 こういうような式をいくつか登録しておき、 式にA、B,C の値を代入すれば、答えが出てくる、 というような計算ソフトはないでしょうか? 「小数点以下を切り捨てる/切り捨てない」の指定ができるものが、 いいです。 できれば、無料ソフトがいいです。  OSはWindows Vista です。

  • 表計算ソフト

    こんにちは。 フリーで、エクセルみたいな感じの表計算ソフトを探しています。高度な計算機能は必要無いんですが、フォントの色が簡単に変えられたり、並び順をソートしてくれるくらいのものが付いているとうれしいです。 ベクターで何種類かフリーの表計算ソフトを試しました。 シンプルなものが多くて良かったのですが、フォントを簡単に変えられない、表のコピー機能が貧弱すぎという感じで、なかなかこれぞと言うものに出会えていません。 ご存知の方いらっしゃいましたらどうぞよろしくお願いいたします。

  • フリーの表計算ソフト

    こんばんは。 エクセルみたいな感じのフリーの表計算ソフトってないでしょうか。 エクセルが高いのでできればフリーでいいのがないか探しています。 ご存知の方いらっしゃったら教えてください。 宜しくお願い致します。

  • パソコンで階乗を計算

    現在、fortran90を使って階乗を計算するプログラムを作っております。 プログラム内容は、(n !を求めえるプログラム) n=0 do i=1,100 n=n*i enddo このプログラムを実行すると、12!までは予想された値が得られるのですが、13!以降は電卓で計算した値と遙かに異なる値が得られました。 このプログラムは間違っているとは思えないですが、電卓の計算とパソコンの計算が異なる結果になった理由が分かりません。 どなたか、ヒントや参考情報だけでもいいので教えてください。 ちなみにパソコンによる計算結果は、 i n 1 1 2 2 3 6 4 24 5 120 6 720 7 5040 8 40320 9 362880 10 3628800 11 39916800 12 479001600 13 1932053504 14 1278945280 15 2004310016 16 2004189184 17 -288522240 18 -898433024 19 109641728 20 -2102132736 21 -1195114496 22 -522715136 23 862453760 24 -775946240 25 2076180480 26 -1853882368 27 1484783616 28 -1375731712 29 -1241513984 30 1409286144 31 738197504 32 -2147483648 33 -2147483648 34 0 35 0 36 0 36の階乗以降0です。 計算結果が正となるが、結果が違うモノ(例えば、13!や31!)は単精度で約10桁程度しか有効数字が得られないためであると思われるのですが、負になったり、0になる理由が分かりません。

  • C言語の質問

    「n の階乗 n! の計算を再帰式で表現したCプログラムを作成し、n=10, n=11, n=12 の出力結果を書きなさい。 プログラムではnの値は1から12までとせよ。 入出力については問わない。」です。お願いします。

  • Excelは表計算ソフトではないのか?

    以下の文は数年前に自分がA,Bさんと会話した内容です。 A「表計算ぐらい出来なきゃヤバイよ。」 自分「Excelなら習った事あるが・・・」 A「(Bさんに対して)Excelって何?」 B「知らない!!」 A「(自分に対して)Excelなんてのは無いよ!!」 自分「え?」 大体こんな感じだったと思います。 自分は今もExcelは表計算ソフトだと思っていますが、もしそうなら表計算ソフトを語る人がExcelを知らないなんて有り得ない気がします。 もしかしてExcelは表計算ソフトでは無かったのでしょうか?

  • 階乗のプログラム

    c言語初心者です。 13までの階乗の値を計算するプログラムを下のように書いたのですが、 #include <stdio.h> main() { int N, fact; fact=1; for(N=1; N<=13; ++N){ fact=fact*N; printf("%d!=%d\n",N, fact); } } このプログラムを実行してみると、12!までは正しい値が出力されるのですが、13!の値が1932053504と出力され、計算機の値と違います。 どこが間違っているのでしょうか。どなたかご教授お願いします。