【问题标题】:What's the fastest algorithm to represent a prime as sum of two squares?将素数表示为两个平方和的最快算法是什么?
【发布时间】:2011-03-21 16:06:35
【问题描述】:

我可以使用两个循环来检查两个小于p 素数的整数的所有组合,但它的效率非常低。有没有更好的算法来解决这个问题?任何的想法?

p mod 4 = 1.

谢谢,

【问题讨论】:

  • @sinelaw:嗨,我认为这类问题不适合那个网站,因为据我了解,cstheory 是针对研究级别的。如果我错了,请纠正我。
  • mathoverflow.net/questions/29644/… 可能有点用处。
  • @Chan:IIRC 我们在我的大学写了p == 1 (mod 4),这可能也让非数学家更容易阅读。其中== 是我们实际编写内容的最佳 ascii 表示,这是一个 ≡需要迂腐时的角色,或者只是=,如果它很明显并且你很懒惰。或者,如果您已经正式声明您完全在模 4 的整数环中工作,当然,但这不会导致非常有趣的分解成两个平方和...
  • p=1 (mod 4) 非常清晰,至少在我看来是这样。

标签: algorithm math number-theory


【解决方案1】:

您可以尝试使用Hermite-Serret 算法。

您还可以在这个 math.se 页面上找到一个很好的算法列表:https://math.stackexchange.com/questions/5877/efficiently-finding-two-squares-which-sum-to-a-prime

请特别注意 Robin Chapman 的回答:https://math.stackexchange.com/questions/5877/efficiently-finding-two-squares-which-sum-to-a-prime/5883#5883

【讨论】:

    【解决方案2】:

    您无需搜索所有组合。一个简单的幼稚实现的粗略轮廓是:

    • 考虑 [1..trunc(sqrt(p))] 范围内的每个整数 i。
    • 计算 sqrt(p-i^2) 并检查它是否为整数。如果是这样,您就完成了。
    • 如果没有继续下一个 i.

    这是否足以满足您的需求?它适用于相对较小的 p,但显然对于密码学中使用的那种大素数来说会很慢。

    【讨论】:

    • p-i^2 将始终是整数。我想你想要sqrt(p-i^2)
    【解决方案3】:

    我可以推荐你重读Fermat's 4n+1 Theorem

    如果软件工程师使用正确的工具来完成这项工作,那么您就有简单的解决方案。我的 Mathematica 函数:

    P[p_] := Reduce[-p + x^2 + y^2 == 0, {x, y}, Integers]
    

    示例:

    寻找前几个素数 p 的解,它们是 1 或 2 (mod 4)。

    P /@ {2, 5, 13, 17, 29, 37, 41, 53, 61}
    

    【讨论】:

    • 这是一种获得答案的方法,但它不是算法。
    • @Steve Jessop 算法是一组指令,它们结合起来完成一项任务。你可以说,我以自下而上的方法定义了我的算法,假设存在Reduce 函数——事实上,我不需要其他任何东西(这是构建查询的艺术)。 Reduce[expr, vars, dom] 函数通过求解 vars 的方程或不等式并消除域 dom 上的量词来简化语句 expr
    • @Margus:这不是“算法”的正确定义,算法不仅仅是任何一组指令。您的指示依赖于已经解决问题的工具(Mathematica)的存在。也许通过提问者已经提到的蛮力方法,也许通过更聪明的方法。无论哪种方式,“只使用 Mathematica”可能是个好建议,但它确实不会产生算法。如果你揭开 Mathematica 的面纱并解释它是如何实际解决这个问题的,那么就会产生一个算法。
    • 或者换一种说法:“复制你班上最聪明的人的答案”。那是算法吗?不,因为让你班上最聪明的人加入可以为这项任务假设的工具集是不合理的。我会对 Mathematica 说同样的话,因为这个问题显然是基本的,而 Mathematica 在一个不透明的步骤中解决了它。如果问题是“将两个 4 位数字相乘的最佳算法是什么”,那么同样我们会将 C 的乘法运算符排除在可用的算法步骤之外。
    • @Margus:这仍然可能是提问者得到他想要的最快的方式。只是取决于他问的原因。
    猜你喜欢
    • 2018-12-07
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2016-12-20
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多