1

我想遍历向量的所有不同排列。我已经尝试通过vecextract()结合使用numtoperm() 来创建排列向量并vecsort(,,,8)删除等效排列。

不幸的是,这不能很好地扩展:在我当前的 4GB 堆栈大小中,向量的最大大小小于 12!,而我的机器只有 16GB。

有没有办法在不耗尽内存的情况下做到这一点,也许是直接生成第k个不同的排列?

4

2 回答 2

2

PARI 中没有为此内置任何内容。我建议阅读如何生成多集的所有排列?.

于 2019-01-07T20:45:36.433 回答
1

使用forperm.

forperm([1,1,2,3], v, print(v))

生产

Vecsmall([1, 1, 2, 3])
Vecsmall([1, 1, 3, 2])
Vecsmall([1, 2, 1, 3])
Vecsmall([1, 2, 3, 1])
Vecsmall([1, 3, 1, 2])
Vecsmall([1, 3, 2, 1])
Vecsmall([2, 1, 1, 3])
Vecsmall([2, 1, 3, 1])
Vecsmall([2, 3, 1, 1])
Vecsmall([3, 1, 1, 2])
Vecsmall([3, 1, 2, 1])
Vecsmall([3, 2, 1, 1])

请注意,forperm应该对输入向量进行排序以获得正确的结果。

于 2021-09-14T14:33:20.027 回答