找出Maple中的数字位数

时间:2011-01-18 20:22:15

标签: 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:=safeprime(round(RandomTools[Generate](integer(rande=a .. b))-1/2));
  if( evalb(log10(p) > log10(q)+5 ) 
  [...]

事情是:Maple似乎将p和q理解为类型函数的变量。我想使用log10来找出素数有多少位数来计算安全的RSA密钥。所以evalb失败了,因为它无法确定两个对数??

1 个答案:

答案 0 :(得分: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位数”的意思不明确。如果你的意思是一个必须有另外五个十进制数字,那么你可能想要分别舍入或截断这些log10调用。很难说,因为措辞很模糊。

PS。我还纠正了“范围”的拼写错误“rande”,并在if之后删除了不合适的开括号。 randomize调用将使RandomTools命令在每次重启或每个新鲜会话后产生不同的答案。