我将此问题可视化为矩阵M,其中M(i,j) = 2^i * 5^j。这意味着行和列都在增加。
考虑以递增的顺序在条目中画一条线,显然从条目(1,1) 开始。当您访问条目时,行和列增加条件确保由这些单元格形成的形状将始终为integer partition(英文表示法)。跟踪这个分区(mu = (m1, m2, m3, ...) 其中mi 是行中较小条目的数量i - 因此m1 >= m2 >= ...)。然后,您需要比较的唯一条目是那些可以添加到分区的条目。
这是一个粗略的例子。假设你已经访问了所有xs (mu = (5,3,3,1)),那么你只需要查看@s:
x x x x x @
x x x @
x x x
x @
@
因此,检查的数量是可添加单元格的数量(如果您想以姿势来思考,则相当于在 Bruhat order 中上升的方式数量)。
给定一个分区mu,很容易确定可添加的状态是什么。在最后一个肯定条目之后绘制一个无限的0s 字符串。然后你可以将mi 增加1 当且仅当m(i-1) > mi。
回到示例,对于mu = (5,3,3,1),我们可以增加m1 (6,3,3,1) 或m2 (5,4,3,1) 或m4 (5,3,3,2) 或m5 (5,3,3,1,1)。
问题的解决方案然后找到正确的分区序列(饱和链)。在伪代码中:
mu = [1,0,0,...,0];
while (/* some terminate condition or go on forever */) {
minNext = 0;
nextCell = [];
// look through all addable cells
for (int i=0; i<mu.length; ++i) {
if (i==0 or mu[i-1]>mu[i]) {
// check for new minimum value
if (minNext == 0 or 2^i * 5^(mu[i]+1) < minNext) {
nextCell = i;
minNext = 2^i * 5^(mu[i]+1)
}
}
}
// print next largest entry and update mu
print(minNext);
mu[i]++;
}
我在 Maple 中写了这个,在 12 次迭代后停止:
1, 2, 4, 5, 8, 10, 16, 20, 25, 32, 40, 50
和输出的细胞序列相加得到:
1 2 3 5 7 10
4 6 8 11
9 12
对应这个矩阵表示:
1, 2, 4, 8, 16, 32...
5, 10, 20, 40, 80, 160...
25, 50, 100, 200, 400...