Cryptography 找出在Maple中一个数字的位数
我正在尝试实现一个生成RSA密钥的基本过程。该程序接受一系列数字a和b。必须检查a和b之间的间隔是否为“五位数” 所以我想出了一个解决办法:Cryptography 找出在Maple中一个数字的位数,cryptography,logarithm,maple,computer-algebra-systems,Cryptography,Logarithm,Maple,Computer Algebra Systems,我正在尝试实现一个生成RSA密钥的基本过程。该程序接受一系列数字a和b。必须检查a和b之间的间隔是否为“五位数” 所以我想出了一个解决办法: 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:
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 )
[...]
问题是:Maple似乎将p和q理解为函数类型的变量。为了计算一个安全的RSA密钥,我想使用log10来找出素数的位数。因此
evalb
失败,因为它无法确定两个对数???您不应该在进程定义之外加载包——这不是一个好的做法
使用if…then
时,不需要调用evalb
,因为它会自动执行此操作
您可以使用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:
或者你可以通过在
两侧应用evalf
来替换is
调用,除了宏碁的优秀回答:我认为对于你的应用,ilog10就足够了。基本上,ilog10(n)=floor(log10(n))
,因此您会丢失一些信息,但作为回报,它会立即计算为一个数字,而log10(n)将有一个剩余的未计算部分,用于不是10的精确幂的数字。这样做的一个效果是,对于ilog10,不会出现针对log10的评估问题。