【发布时间】:2017-04-05 17:06:18
【问题描述】:
代码实现了 Pollard rho() 函数的示例,用于查找正整数 n 的因子。我检查了 Julia "Primes" 包中的一些代码,这些代码快速运行以试图加速 pollard_rho() 函数,但都无济于事。代码应在大约 100 毫秒到 30 秒(Erlang、Haskell、Mercury、SWI Prolog)内执行 n = 1524157897241274137,但在 JuliaBox、IJulia 和 Julia REPL 上大约需要 3 到 4 分钟。我怎样才能让它快速运行?
pollard_rho(1524157897241274137) = 1234567891
__precompile__()
module Pollard
export pollard_rho
function pollard_rho{T<:Integer}(n::T)
f(x::T, r::T, n) = rem(((x ^ T(2)) + r), n)
r::T = 7; x::T = 2; y::T = 11; y1::T = 11; z::T = 1
while z == 1
x = f(x, r, n)
y1 = f(y, r, n)
y = f(y1, r, n)
z = gcd(n, abs(x - y))
end
z >= n ? "error" : z
end
end # module
【问题讨论】:
-
您可以在不同的线程上调用
x = f(x, r, n)和y1 = f(y, r, n)。另外,r和x不是T类型是否有原因? -
谢谢。我在定义 f 时声明了 r 和 x 的类型,并且在我重复输入局部变量时收到了警告。至少,这是我对警告所报告内容的理解。
-
看起来都输入得很好。分析时的问题完全是由于
gcd函数:它占用了我大约 85% 的时间。也许 Julia 在 Base 中的gcd需要一些工作。你知道其他语言使用什么算法吗?这是 Julia 的:github.com/JuliaLang/julia/blob/master/base/intfuncs.jl#L3 -
是的,我用其他语言编写了我使用的那些。它们是此处使用的命令式代码的尾递归版本。 Julia 的“factor()”在一秒钟内运行 n 的值。我上面的代码在大约 200 秒内运行它。有些东西很不对劲,但不知道是什么。感谢您反馈代码输入正确。
-
你可能想在 Julia 的 Github 上打开一个问题。 github.com/JuliaLang/julia/issues
标签: performance julia number-theory