【问题标题】:Find out how many digits a number as in Maple找出一个数字在 Maple 中的位数
【发布时间】:2011-01-18 20:22:14
【问题描述】:

我正在尝试实现生成 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失败了,因为它不能确定两个对数??

【问题讨论】:

  • 除了acer的优秀回答:我认为对于你的应用,ilog10就足够了。本质上,ilog10(n) = floor(log10(n)),所以你会丢失一些信息,但作为回报,它会立即计算为一个数字,而 log10(n) 将有剩余未计算的部分用于不是 10 的精确幂的数字。这样做的效果是ilog10 不会出现您对 log10 的评估问题。

标签: cryptography logarithm maple computer-algebra-systems


【解决方案1】:

您不应该在 proc 定义之外加载包——这不是一个好习惯。

在使用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 调用。 (is 命令实际上可以在内部使用evalf,可能通过shake 来解决。)

您所说的 p 和 q 之间的“间隔”是“5 位数”是什么意思并不清楚。如果您的意思是一个必须比另一个多五个十进制数字,那么您可能需要分别舍入或截断这些 log10 调用。很难说,因为措辞很模糊。

ps。我还更正了“range”的拼写错误“rande”,并在if 之后删除了不合适的左括号。而randomize 调用将使 RandomTools 命令在每次重启后或在每次新会话中产生不同的答案。

【讨论】:

    猜你喜欢
    • 2020-11-17
    • 2012-02-02
    • 1970-01-01
    • 2014-03-28
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多