数据科学中的算法、复杂性与智能探索
可整除数字计数问题与并行计算
在处理寻找区间 [a, b]
(其中 0 < a < b < 10^18
)内可被自然数 c ≤ 10^18
整除的所有自然数的任务时, num_divisible
函数能有效解决该问题。以下是该函数的代码实现:
import numpy as np
import dask.array as da
def num_divisible(a, b, c):
r = a % c
if r == 0:
start = a
else:
start = a + (c - r)
if start > b:
return 0
else:
return 1 + (b - start) // c
num_divisible_vect = np.vectorize(num_divisible)
x = da.asanyarray([(1, 100, 10), (16789, 445267839, 7), (34, 10**18, 3000), (3, 7, 9)])
x = x.rechunk(chunks=(2, -1))
y = x.map_blocks(lambda block: num_divisible_vect(*block.T),
chunks=(-1,),
drop