メープルのように数の数字の数を調べる
-
12-10-2019 - |
質問
RSAキーを生成するための基本的な手順を実装しようとしています。手順は、数字aとbの範囲を受け入れます。 AとBの間の間隔が「5桁」であることを確認する必要があります。
だから私は解決策を思いついた:
with (numtheory);
gen_rsa := proc(a, b)
local p, q, len_p, len_q, larger;
# the two prime-numbers
p:=safeprime(round(RandomTools[Generate](integer(range=a .. b))-1/2));
q:=safeprime(round(RandomTools[Generate](integer(rande=a .. b))-1/2));
if( evalb(log10(p) > log10(q)+5 )
[...]
事は次のとおりです。メープルは、型関数の変数としてPとQを理解しているようです。 Log10を使用して、安全なRSAキーを計算するために、Prime-Numberの数字の数を確認したいと思います。それで evalb
2つの対数を決定できないため、失敗しますか?
解決
PROC定義の外側にパッケージをロードしてはいけません。これは良い練習ではありません。
電話は必要ありません evalb
, 、使用するとき if...then
, 、それが自動的にそれを行うので。
どちらかを使用できます is
代わりに、または不平等をテストできるように、両方の数量を評価します。
例えば、
gen_rsa := proc(a, b)
local p, q, len_p, len_q, larger;
uses numtheory, RandomTools;
randomize();
# the two prime-numbers
p:=safeprime(round(Generate(integer(range=a .. b))-1/2));
q:=safeprime(round(Generate(integer(range=a .. b))-1/2));
if is(log10(p) > log10(q)+5) then
hi;
else
bye;
end if;
end proc:
または、それを交換することができます is
応募して電話をかけます evalf
の両側に <
不平等条件。 ( is
コマンドは実際に利用できます evalf
内部的には、おそらく経由 shake
, 、 を解決する。)
PとQの「5桁」の間の「間隔」が意味することは明確ではありません。つまり、1つはさらに5桁の数字を持っている必要がある場合は、他の桁を丸めたり、それらのlog10呼び出しを個別に呼び出したりすることをお勧めします。言葉遣いはあいまいなので、言うのは難しいです。
詩また、「範囲」の「ランデ」の誤りを修正し、その直後に不適切なオープンな親類を削除しました if
. 。そしてその randomize
コールは、RANDOMTOOLSコマンドが各再起動後または各新鮮なセッションで異なる回答を生成するようにします。