私はMiller Rabin primalityテストの独自の実装を作成しようとしています。 私はそれを動作させることができましたが、64ビットを超える値では非常に遅かったです。未処理の例外:NoSuchMethodException
ドラフト規格ANSI X9.80「PRIME NUMBER GENERATION、PRIMALITY TESTING、PRIMALITY CERTIFICATES」では、1024ビットまでの動作を指定しています。私のプログラム(i7 6700k上)は、単一の1024ビット整数で動作するのに最高で数か月かかるでしょう。
Miller RabinテストのJava実装に目を向けて、パフォーマンスを向上させるためにどのようなマイクロ最適化を使用したかを確認しました。
私はソースコードを使って作業していますが、私は壁に立ち向かっています。彼らが使用するメソッドの多くはプライベートであり、実行できないコードに対してコードの振る舞いをテストすることは非常に難しいです。まず、私が呼びたい最初の内部メソッドはBigInteger.mod2(int)
私は広範囲にプログラムしていませんJavaは前に、しかし、ここで私が捕まってしまったところです:
import java.lang.reflect.*;
import java.math.BigInteger;
public class HelloWorld
{
public static void main(String[] args)
{
BigInteger a = new BigInteger("123456789101112");
Method mod2 = BigInteger.class.getDeclaredMethod("mod2", int.class);
//Class[] arg_types = new Class[1];
//arg_types[0] = int.class;
//Method mod2 = BigInteger.class.getDeclaredMethod("mod2", arg_types);
mod2.setAccessible(true);
Object b = mod2.invoke(a, 32);
System.out.print(b);
}
}
「getDeclaredMethod」コールスローないNoSuchMethodException例外の両方のバージョン。私は 'getDeclaredMethod'のドキュメントを見て、人々がこの関数を動作させる方法を尋ねているときに、私が現在やっていることを正確に行うと言っています。
BigIntegerのプライベートメソッドを呼び出す方法については、特にBigInteger.mod2(int)
を参考にしてください。ありがとう!
どういうわけか私は[プライベート](https://en.oxforddictionaries)の全ポイントを見逃してしまったと思います。com/definition/private)のメソッドです。 –
どういう意味ですか?私は自分のプライベートメソッドの実装をJavaクラスに記述しようとしています。私は直接私のコードの出力をプライベートメソッドと比較するためにそのメソッドを呼び出すことができるようにしたいと思います。 –
それだけでなく、 'BigDecimal'のような場所でプライベートメソッドを使って行う最適化は、あなたのリフレクションの使用によって3回無効になります。 –