• ベストアンサー

ヒープサイズの限界

javaで 2.modPow(100000000, 1000); 2の100000000乗のmod1000を計算しようとしたらjava.lang.OutOfMemoryError: Java heap spaceとヒープサイズが限界のようでエラーがでます。 実行するときに-Xmx1400mがサイズを大きくできる限界のようでこれ以上大きくすることができません。 この計算をするのは物理的に無理なんでしょうか? 自分のパソコンのメモリは3.42Gです。

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

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.3

int や long (- 2^ 63 ~ 2^63 -1)の範囲外なだけでは? すべての数値をBigInteger にしたら、普通のメモリー指定でちゃんと計算してくれましたよ。 BigIntegerを既に使ってるなら、他のところでメモリーを浪費してるのでは?この計算だけなら余裕でできますよ。 String si = "2"; String se = "100000000"; String sm = "1000"; BigInteger j = new BigInteger(si).modPow( new BigInteger(se), new BigInteger(sm) ); System.out.println("("+ si+ " ^ " +se + ") mod "+sm +" = "+ j.toString() ); ちなみに以下の結果が出た。 (2 ^ 10) mod 1000 = 24 (2 ^ 100) mod 1000 = 376 (2 ^ 1000) mod 1000 = 376 (2 ^ 100000000) mod 1000 = 376 (2 ^ 1000000000000) mod 1000 = 376 376^10 = 56477888187717354967269376

vcxsdfrew
質問者

補足

実際にはBigInteger j に値を入力するのではなくBigInteger j []の配列に値を代入しています。BigInteger j []の配列にするとエラーが出ます。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

余談だけど, 手計算すると結果は 376 みたいだね. この数値でなきゃ, 手計算する気にもならんけど.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

2^100000000 mod 1000 = (2^10)^10000000 mod 1000 = 24^10000000 mod 1000 = (24^10)^1000000 mod 1000 = ... のようにちょっとずつ計算してはいけない何かがあるんでしょうか?