• ベストアンサー

Math.pow

Javascriptでべき乗の余りを表で出力するスクリプトを書いているのですが、大きな値になると計算結果が正しく出力されません。 いろいろ検証してみたところ、大きな値になるとべき乗の計算結果が正しく出力されないことが判明しました。 例えば、31の11乗を計算すると 25408476896404831 ですが、Javascriptで31の11乗を計算すると a=Math.pow(31,11); document.write(a); で計算結果を出力すると 25408476896404830 になってしまいます。 結果としては、べき乗の余りを出力したいので 例えば、31の11乗を33で割った余り Math.pow(31,11)%33 が「31」と正しく出力されればよいのですが・・・。「32」と出力されてしまいます。大きな整数値の計算は、何か特別な工夫が必要なのでしょうか? アドバイスをよろしくお願いします。

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

  • ベストアンサー
回答No.2

特定の計算するだけなら function f(n,p,m){ // 本当は n,p,mが自然数かどうかチェックしたい。 if (p > 1){ var t = Math.pow(2,Math.floor(Math.log(p,2))); return ((f(n,p - t,m) * f(n,t,m)) % m); }else if(p == 1){ return n; }else if(p == 0){ return 1; } } alert(f(31,11,33)); //31 みたいな計算も出来るかな、と思う。 No.1のような汎用性はないけど。、とどうでもいい独り言を書いてみる。

whitetooth
質問者

お礼

いえいえ、参考になりますよ。ありがとうございます。 何だかよく分からないけれど、うまく動きます。 やりたいことに応用できそうです。 でも、対数を利用して・・・Math.log(p,2)というのはどういう意味だ?

その他の回答 (4)

回答No.5

私も全く同じ問題を調べていたのですが、 回答No.3のwikiのやつをそのままjavascriptに置き換えたら うまくいきました。

回答No.4

>でも、対数を利用して・・・Math.log(p,2)というのはどういう意味だ? マジですまん。無視してくれ。 >途中で剰余をとる をやろうとしたんだが,アルゴリズムも間違っている上に、 Math.log(a,b)を bを底としたlogだと思い込んでいた。 #関数がありませんって言われないんで #てっきり他の言語同様あるのかと思ってlog(8,2)で3を期待したら出てこなかったorz

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

このページの計算方法を見ればいいんじゃないかな。 べき剰余 - Wikipedia http://ja.wikipedia.org/wiki/%E3%81%B9%E3%81%8D%E5%89%B0%E4%BD%99

whitetooth
質問者

お礼

参考にさせていただきます。 ありがとうございます。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

javascriptでの整数の有効桁数は2^53(十進で16桁程度)らしいので、それ以上の桁数になると桁落ちする結果といえます。 これは、計算機がもっている限界で(大小あっても必ず有限)、単純に考えれば8桁の電卓で10桁の剰余を求める計算をすると、結果が正しくないと言っているようなもの。 なので、桁数を区切って、べき乗と剰余を計算する部分を自作するしかないのでは? (↓)このあたりが参考になりそう。  http://deztec.jp/x/05/faireal/25-index.html

whitetooth
質問者

お礼

なるほど・・・勉強してみます。 ありがとうございました。