【发布时间】:2015-08-13 11:18:52
【问题描述】:
我有一个使用 Pollard's Rho and Brent's algorithms 在 VB.Net 中使用 BigInteger 实现素数分解的好解决方案(请参阅:https://stackoverflow.com/a/31978350/44080)
对于N< 2^63,我相信UInt64 应该足够大,并且可能(很多?)更快。
但是我的UInt64 转换在此行失败:
y = ((y^2) Mod n + c) Mod n 'fails when y^2 > UInt64.Max
将此行改为
y = CULng((CDbl(y^2) Mod n + c) Mod n)
由于类型转换处于循环中,因此会降低性能。
请问我该如何解决这个问题?
如果我们能绕过上述问题,我仍然认为 UInt64 将胜过 BigInteger。
编辑:
我刚刚发现:Dirichlet .NET Number Theory Library,它声称 Int128 和 Int256 的性能优于 .Net BigInteger。
它甚至有几个优化的素数分解算法。本可以为我节省 2 天的研究和测试时间。
【问题讨论】:
-
@WDS 再次感谢您在链接的 SO 解决方案中向我指出 Pollard 的 Rho 算法
-
基本上你不能,但是你可以改变 N 的限制来让它工作。
-
您不能使用
double...它们没有所需的精度。如果 y 是 64 位,则 y^2 最多为 128 位。没有 128 位的整数数据类型。你可以限制自己分解 Int32 数字,那么你不会有任何问题。 -
@CharlesO 好吧,不是真的。
-
(y^2) Mod n- 我不是数学家,但直觉表明这可以通过某种方式进行优化。
标签: .net algorithm biginteger prime-factoring uint64