有序格点枚举

时间:2015-04-22 16:51:17

标签: sorting enumeration mathematical-lattices

设置:设ei是n维欧氏空间的正交基,但假设ei具有无理(L1)范数。设L是通过将ei与自然数(包括零)中的系数进行线性组合而获得的点集​​。现在首先按照L1范数对L中的点进行排序,然后按字典顺序排列。

问题:是否有一种有效的算法可以按升序生成L中的点,直到达到某个预定义的界限?请注意,我不想生成点然后对它们进行排序,而是我想按顺序遍历晶格。

观察:如果ei是标准正交基,这很容易做到。例如,此问题已解决here。原则上类似的东西可以在这里工作,但是确定迭代的半径几乎和解决枚举问题一样难,所以它不是很有用。

1 个答案:

答案 0 :(得分:0)

这个怎么样:

设L 1和L 2是矢量列表,其中L 1是访问/处理的点阵矢量列表,L 2是接下来将访问的矢量列表。

  1. 设置L 1 = {}和L 2 = {[0]},其中0是零向量。
  2. 设v是L 2中第一个列表的最小向量。
  3. 访问/处理矢量v。
  4. 将列表L = {v + e 1,...,v + e n }添加到L 2,以便列表按其最小元素排序。只要其范数小于预定范围,就生成v + e i
  5. 在L 1的末端插入v并将其从第一个列表L 2的前面移除。
  6. 如果第一个列表现在为空,请将其从L 2中删除。如果没有,请将其移至正确的位置。
  7. 如果L 2不为空,请转到2。
  8. 此算法要求e i 按小标准从小到大排序。

    该算法每轮最多将n个向量加到L 2。设B是你预定义的上界,那么你将访问最多n个 k -1个向量,其中k = 1 + B / || e 1 ||。第一个ca. n k&#39; 轮,列表的大小为n,其中k&#39; = B / || e n ||。因此总的来说,你必须存储少于N = n k&#39; +(n k -1)/(n k&#39; +1 < / sup>)列表。您可以在O(n)中生成一个新列表,并将其添加到L 2中的O(log N)中(二进制搜索正确的位置并将其插入到那里)。

    所以整体复杂性会像O(N⋅n⋅logN),但请注意N是你要找的向量的数量。

    注意:很可能有一个更快的算法,但这是你可以尝试的。