我正在用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-u-local-size在fftw中实现了一种计算s的算法。不过,我希望能够使用python自己计算。也就是说,我正在寻找一个解决我的问题的算法,或者更好的是一个现有的Python函数来完成这个任务。
最佳答案
我的方法是找到平均分布在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]