@@ -99,30 +99,30 @@ function factor{T<:Integer}(n::T)
99
99
isprime (n) && (h[n] = 1 ; return h)
100
100
end
101
101
end
102
- pollardfactors! (n, h)
102
+ T <: BigInt || widemul (n - 1 ,n - 1 ) <= typemax (n) ? pollardfactors! (n, h) : pollardfactors! ( widen (n) , h)
103
103
end
104
104
105
- function pollardfactors! {T<:Integer} (n:: T , h:: Dict{T ,Int} )
105
+ function pollardfactors! {T<:Integer,K<:Integer } (n:: T , h:: Dict{K ,Int} )
106
106
while true
107
- local c:: T = rand (1 : (n- 1 )), G:: T = 1 , r:: T = 1 , y:: T = rand (0 : (n- 1 )), m:: T = 1900
107
+ local c:: T = rand (1 : (n- 1 )), G:: T = 1 , r:: K = 1 , y:: T = rand (0 : (n- 1 )), m:: K = 1900
108
108
local ys:: T , q:: T = 1 , x:: T
109
109
while c == n - 2
110
110
c = rand (1 : (n- 1 ))
111
111
end
112
112
while G == 1
113
113
x = y
114
114
for i in 1 : r
115
- y = widemul (y, y)% n
116
- y = (widen (y) + widen (c) )% n
115
+ y = (y * y)% n
116
+ y = (y + c )% n
117
117
end
118
- local k:: T = 0
118
+ local k:: K = 0
119
119
G = 1
120
120
while k < r && G == 1
121
121
for i in 1 : (m> (r- k)?(r- k): m)
122
122
ys = y
123
- y = widemul (y, y)% n
124
- y = (widen (y) + widen (c) )% n
125
- q = widemul (q, x> y?x- y: y- x)% n
123
+ y = (y * y)% n
124
+ y = (y + c )% n
125
+ q = (q * ( x> y?x- y: y- x) )% n
126
126
end
127
127
G = gcd (q,n)
128
128
k = k + m
@@ -131,8 +131,8 @@ function pollardfactors!{T<:Integer}(n::T, h::Dict{T,Int})
131
131
end
132
132
G == n && (G = 1 )
133
133
while G == 1
134
- ys = widemul (ys, ys)% n
135
- ys = (widen (ys) + widen (c) )% n
134
+ ys = (ys* ys)% n
135
+ ys = (ys + c )% n
136
136
G = gcd (x> ys?x- ys: ys- x,n)
137
137
end
138
138
if G != n
0 commit comments