首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解一个数字有多少位,如在Maple中

了解一个数字有多少位,如在Maple中
EN

Stack Overflow用户
提问于 2011-01-19 04:22:15
回答 1查看 1.8K关注 0票数 1

我正在尝试实现一个生成RSA密钥的基本过程。该过程接受一个数字a和b的范围。它必须检查a和b之间的间隔是否为“五位数”。

所以我想出了一个解决方案:

代码语言:javascript
复制
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失败了,因为它不能确定两个对数??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-19 20:37:10

您不应该在proc定义之外加载包--这不是一个好的实践。

在使用if...then时,您不需要调用evalb,因为它会自动调用。

您可以使用is代替,或者计算两个量的值,以便可以测试不等式。

例如,

代码语言:javascript
复制
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。我还将"rande“的拼写错误更正为"range",并删除了紧跟在if后面的不适当的左括号。randomize调用将使RandomTools命令在每次重新启动后或在每次新会话中产生不同的答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4728626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档