我可以使用两个循环来检查小于p
素数的两个整数的所有组合,但效率非常低。有没有更好的算法来解决这个问题?任何的想法?
p mod 4 = 1
。
谢谢,
答案 0 :(得分:5)
您可以尝试使用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
答案 1 :(得分:2)
您无需搜索所有组合。一个简单的天真实现的大致轮廓将是:
这是否足以满足您的需求?对于相对较小的p,它可以正常工作,但对于密码学中使用的大型素数来说显然会很慢。
答案 2 :(得分:0)
我建议你重读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}