该代码实现了用于查找正整数n的因子的Pollard rho()函数的示例。我已经检查了Julia“Primes”包中的一些代码,它试图加快pollard_rho()函数的速度,但都无济于事。代码应该在大约100毫秒到30秒(Erlang,Haskell,Mercury,SWI Prolog)中执行n = 1524157897241274137,但在JuliaBox,IJulia和Julia REPL上需要大约3到4分钟。我怎样才能让这个过程更快?如何加快这个Julia代码?
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的类型,并在重复键入局部变量时收到警告。至少,这是我对警告报告的理解。 – dogwood
它看起来都很好。分析完全是由于'gcd'功能导致的问题:它占用了我大约85%的时间。也许朱莉娅在基地的'gcd'需要一些工作。你知道其他语言使用什么算法吗?这里是朱莉娅的:https://github.com/JuliaLang/julia/blob/master/base/intfuncs.jl#L3 –