わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

isProbalePrimeはJavaの素数判定メソッド

 いきなりですが没問題です.以下の文章の【 6 】~【 7 】に当てはまる語句を答えなさい.

素数判定は,【 6 】の使用の有無により「確率的手法」と「確定的手法」に大きく分けられるが,実用的なのは確率的手法のほうであり,Java言語で利用可能な【 7 】メソッドも該当する.

 番号が【 6 】から始まっているのは,かけ算の記号は,何でもいい?の続きと思ってください.さっそくですが解答です.

  • 【 6 】乱数
  • 【 7 】isProbablePrime

 授業では,素数生成,素数判定(フェルマーテスト)のあと,「Java素数生成」というスライドを設けて,https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/math/BigInteger.html#isProbablePrime(int)より説明を取り出し,BigIntegerのインスタンス生成とisProbablePrimeメソッドの呼び出しを含むコード例を掲載しています.
 しかしisProbablePrimeを書かせるのは,「重箱の隅」を問う問題のように思えてきました.「isProbable【 7 】」のように書いて「Prime」だけを答えさせるのも,何とも変です.
 そこでメソッド名を問題文に入れ,言語名を解答してもらうようにしました.といったところで修正案です(実際に試験で出題しました).

素数判定は,【 6 】の使用の有無により「確率的手法」と「確定的手法」に大きく分けられるが,実用的なのは確率的手法のほうであり,プログラミング言語の【 7 】で利用可能なisProbablePrimeも該当する.

 解答です.

  • 【 6 】乱数
  • 【 7 】Java

 採点をしていくと,【 6 】には「素因数分解」,【 7 】には「C」「Python」「Ruby」の誤答が目につきました.【 6 】は救いようがありません---素因数分解を使用しなければ「確定的手法」,というのは変です.また【 7 】についても,「isProbablePrime」の表記が,camelCaseになっているので,CやPythonRubyの関数(メソッド)名の慣例と違うことに気づいてほしいんだけどなあと,思ったものの,いずれも苦し紛れの解答と判断し,赤ペンを進めていきました.
 すべての小問の○×作業をとりあえず終えたところで,C言語で,素数判定をどのような(サードパーティの)ライブラリ関数で行うのがよいのかが気になり,OpenSSLまわりを調べてみました.
 以下のページが最もよさそうです.

 使用するとよい関数は,BN_check_primeです.他にもprimeを含む関数名はありますが,"BN_is_prime_ex(), BN_is_prime_fasttest_ex(), BN_is_prime() and BN_is_prime_fasttest() are deprecated."とあり,「非推奨」です.