2017-01-22 21 views
0

私は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)を参考にしてください。ありがとう!

+1

どういうわけか私は[プライベート](https://en.oxforddictionaries)の全ポイントを見逃してしまったと思います。com/definition/private)のメソッドです。 –

+0

どういう意味ですか?私は自分のプライベートメソッドの実装をJavaクラスに記述しようとしています。私は直接私のコードの出力をプライベートメソッドと比較するためにそのメソッドを呼び出すことができるようにしたいと思います。 –

+1

それだけでなく、 'BigDecimal'のような場所でプライベートメソッドを使って行う最適化は、あなたのリフレクションの使用によって3回無効になります。 –

答えて

1

あなたは正しい方向にあります。 Javaでプライベートメソッドを呼び出す唯一の方法は、リフレクションAPIを使用することです。あなたはすでにそれを使用しています。プログラムの唯一のエラーは、チェックされた例外を処理していないことです。ちょうどあなたのgetDeclaredMethod呼び出しを囲み、try-catchでメソッド呼び出しを呼び出すと良いです。

BigInteger a = new BigInteger("123456789101112"); 
    Method mod2 = null; 
    try { 
     mod2 = BigInteger.class.getDeclaredMethod("mod2", int.class); 
    } catch (NoSuchMethodException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    //Class[] arg_types = new Class[1]; 
    //arg_types[0] = int.class; 
    //Method mod2 = BigInteger.class.getDeclaredMethod("mod2", arg_types); 
    mod2.setAccessible(true); 
    Object b; 
    try { 
     b = mod2.invoke(a, 32); 
      System.out.print(b); 
    } catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

メソッドクラスのJavadocを読む:: getDeclaredMethodを。このメソッドは、(1)NoSuchMethodExceptionと(2)SecurityExceptionの2つの例外をスローします。

同様に、Method :: invokeメソッドのJavadocを読んでください。このメソッドは3つの例外をスローします。(1)IllegalAccessException(2)IllegalArgumentException(3)InvocationTargetException。

これらのメソッドの呼び出しメソッドは、これらの例外をキャッチするか、または処理していない例外をすべてリストする独自のメソッドシグネチャにthrows句を追加する必要があります。

+0

これは正しい答えだと思います。 OPはそれをはっきりさせませんが、彼のコードはコンパイルされないので、彼の実際の問題は「未処理の例外」コンパイルエラーである可能性があります。 – EJP

+0

'main'メソッドで' throws Exception'を追加してください。それが探検のためのものなら、そうすることに害はない。本当のアプリのために、それを避けてください! –

+0

@OlivierGrégoireはい、そのオプションは常にそこにあります。私はすでに私の答えの最後の行でそれを言及しています。たぶん私はそれを強調する必要があります。これらの個々の例外を捕捉するのではなく、OPは単純に 'main'メソッドに' throws 'を追加することができます。しかし、私は正しい方法をJavaを学ぼうとしている人にこれをお勧めしません。彼が例外処理に慣れれば、素早くテストするために 'スロー 'を使うことができます。 – VHS

0

例では、getDeclaredMethodが発生する可能性のあるチェック例外を処理できませんでした。署名を

public static void main(String[] args) throws Exception { 

に変更します。その後、コードが機能しているはずです。 getDeclaredMethodがまだNoSuchMethodExceptionを提出している場合は、BigIntegerには、実際にはmod2メソッドがありません。

これは、の署名付きメソッドがない012DKのJDKに対して実行すると発生します。たとえば、Gnuのクラスパスには1つもありません。

+0

私は両方の答えを正しいものにすることができたらいいと思う。私は基本的にJavaの新しいブランドで、何年もC/C++の人でした...例外の背後にある余分な要件を理解していませんでした。私は彼がチェックマークを得ると思いますので、他の人は最初に答えました –

+0

私はまだCの男だったと思っています。あなたがそれを使用しなければならない場合、よいIDEがJavaの痛みの大部分を取ります。無料のものがたくさんあります。おそらくintellijコミュニティー・エディションが最も人気があります。 – teppic