Cryptography 找出在Maple中一个数字的位数

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:

我正在尝试实现一个生成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:=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的评估问题。