diff options
Diffstat (limited to 'aberth/aberth_kernel.fut')
-rw-r--r-- | aberth/aberth_kernel.fut | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/aberth/aberth_kernel.fut b/aberth/aberth_kernel.fut index 9d0c59e..f868ee5 100644 --- a/aberth/aberth_kernel.fut +++ b/aberth/aberth_kernel.fut @@ -7,29 +7,29 @@ module uniform_real = uniform_real_distribution f32 rand_engine module cplx = mk_complex f32 type complex = cplx.complex -let N = 22i32 +let N = 22i64 let PolyN = N + 1 type poly = [PolyN]f32 -- First element of pair steps fastest -let iota2 (n: i32) (m: i32): [](i32, i32) = +let iota2 (n: i64) (m: i64): [](i64, i64) = flatten (map (\y -> map (\x -> (x, y)) (iota n)) (iota m)) -let evaln_c (p: poly) (nterms: i32) (pt: complex): complex = +let evaln_c (p: poly) (nterms: i64) (pt: complex): complex = foldr (\coef accum -> cplx.mk_re coef cplx.+ pt cplx.* accum) (cplx.mk_re p[nterms-1]) (take (nterms - 1) p) let eval_c (p: poly) (pt: complex): complex = evaln_c p (length p) pt -let evaln_d (p: poly) (nterms: i32) (pt: f32): f32 = +let evaln_d (p: poly) (nterms: i64) (pt: f32): f32 = foldr (\coef accum -> coef + pt * accum) p[nterms-1] (take (nterms - 1) p) let eval_d (p: poly) (pt: f32): f32 = evaln_d p (length p) pt let derivative (p: poly): *poly = - map2 (\i v -> f32.i32 (i32.bool (i != PolyN - 1) * (i + 1)) * v) + map2 (\i v -> f32.i64 (i64.bool (i != PolyN - 1) * (i + 1)) * v) (0..<PolyN) (rotate 1 p) -- Cauchy's bound: https://en.wikipedia.org/wiki/Geometrical_properties_of_polynomial_roots#Lagrange's_and_Cauchy's_bounds @@ -57,7 +57,7 @@ module aberth = { in (rng, approx) let compute_bound_poly (p: poly): *poly = - map2 (\coef i -> f32.abs coef * f32.i32 (4 * i + 1)) p (0..<PolyN) + map2 (\coef i -> f32.abs coef * f32.i64 (4 * i + 1)) p (0..<PolyN) let initialise (p: *poly): *context = let deriv = derivative p @@ -122,7 +122,7 @@ let next_derbyshire (p: *poly): *(bool, poly) = let derbyshire_at_index (index: i32): *poly = let bitfield = (index << 1) + 1 - in tabulate PolyN (\i -> f32.i32 (i32.get_bit i bitfield * 2 - 1)) + in tabulate PolyN (\i -> f32.i32 (i32.get_bit (i32.i64 i) bitfield * 2 - 1)) let calc_index (value: f32) (left: f32) (right: f32) (steps: i32): i32 = @@ -158,9 +158,9 @@ entry main_job in map (point_index width height bottom_left top_right) pts) (start_index ..< start_index + num_polys)) let filtered = filter (\i -> i != -1) indices - in reduce_by_index (replicate (width * height) 0) + in reduce_by_index (replicate (i64.i32 width * i64.i32 height) 0) (+) 0 - filtered + (map i64.i32 filtered) (map (const 1) filtered) entry main_all @@ -168,6 +168,6 @@ entry main_all (left: f32) (top: f32) (right: f32) (bottom: f32) (seed: i32) : []i32 = - main_job 0 (1 << N) width height left top right bottom seed + main_job 0 (i32.i64 (1 << N)) width height left top right bottom seed -entry get_N: i32 = N +entry get_N: i32 = i32.i64 N |