对于使用Pollard 的 Rho 和 Brent 的算法在 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 天的研究和测试时间。