我正在尝试实施一个基本过程来生成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 ) 
  [...]

事实是:枫树似乎将p和q理解为类型函数的变量。我想使用Log10来找出Prime-number拥有的数字,以计算安全的RSA键。所以 evalb 失败,因为它无法确定两个对数?

有帮助吗?

解决方案

您不应该在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命令在每次重新启动或在每个新的会话中产生不同的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top