我正在使用Python,MPI和FFTW进行一些并行编程。我需要在N个进程中平均分配长度为G的向量(或尽可能接近均等)。这导致了以下数学问题:
给定两个整数G,N,其中G> N,我想找到N个整数的集合S,其总和等于G,其中"所有整数尽可能大"
示例:
G = 14,N = 3 - > S = {5,5,4}
G = 15,N = 3 - > S = {5,5,5}
G = 16,N = 3 - > S = {6,5,5}
通过函数fftw_mpi_local_size在FFTW中实现计算S的算法。我希望能够使用Python自己计算。也就是说,我正在寻找一种解决我的问题的算法,或者更好的是现有的Python函数来完成这项工作。
答案 0 :(得分:2)
我这样做的方法是找到在N
元素中均匀分布的最小值,你可以使用整数除法。然后使用%
查找余数,并将1
添加到该数量的元素中。
def makeValues(G,N):
val = G//N
rem = G%N
return [val]*(N-rem) + [val+1]*rem
>>> makeValues(14,3)
[4, 5, 5]
>>> makeValues(15,3)
[5, 5, 5]
>>> makeValues(16,3)
[5, 5, 6]