0

我正在查看向量 [a,b,c],对于 [-1,0,1] 中的 a,b,c 以及一个函数循环,它将向量的每个条目向左移动一个:cycle( v ) = [v[3], v[1], v[2]]

我只想考虑没有两个向量是“循环等效”的向量;即:如果我看向量 x,y,我不想要y = cycle( x ).

我尝试的是设置一个包含所有 27 个可能向量的向量 V,然后定义以下内容:

removecycle( V, n ) = {
local( N );
N = setsearch( V, cycle( V[n] ) );
return( V[^N] );
}

这允许我指定一个特定的向量,应用函数,然后返回一个带有结果的新向量,如果有,则删除。当然,问题是我必须用新的向量重复这个,一次又一次地重复,让自己面临人为错误。

我怎样才能自动化呢?我想可以将它设置为让我的向量向量 V、测试cycle( V[1] )、丢弃结果、返回一个新向量 W、然后测试cycle( W[2] )等等,直到所有可能性都得到测试。但我只是不确定如何设置它!


编辑:MNWE,为方便起见,将数字更改为上面。

V=[[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 1], [1, 2, 2], [1, 2, 3], [1, 3, 1], [1, 3, 2], [1, 3, 3], [2, 1, 1], [2, 1, 2], [2, 1, 3], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 3, 1], [2, 3, 2], [2, 3, 3], [3, 1, 1], [3, 1, 2], [3, 1, 3], [3, 2, 1], [3, 2, 2], [3, 2, 3], [3, 3, 1], [3, 3, 2], [3, 3, 3]];

vecsort(vecsort(V),are_cycles,8)
> [[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 2], [1, 2, 3], [1, 3, 2], [1, 3, 3], [2, 1, 1], [2, 1, 2], [2, 1, 3], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 3, 1], [2, 3, 3], [3, 1, 1], [3, 1, 2], [3, 1, 3], [3, 2, 1], [3, 2, 2], [3, 2, 3], [3, 3, 1], [3, 3, 3]]
#vecsort(vecsort(V),are_cycles,8)
> 23

在我的情况下,我会cycle( [1, 1, 2] ) = [2, 1, 1],所以我也想[2, 1, 1]删除,但这并没有发生。如前所述,我想比较器需要改进,但我不确定如何改进!

4

1 回答 1

3

您可以通过自定义比较器删除重复项vecsort(_, _, 8)。请参阅下面的 MWE:

all_cycles(v) = [[v[3], v[1], v[2]], [v[2], v[3], v[1]]];

contains(list, value) = {
    #select(n -> n == value, list) > 0
};

\\ your comparator here.
are_cycles(v1, v2) = {
    if(contains(all_cycles(v1), v2), 0, lex(v1, v2));
};


V = [];
vecsort(vecsort(V), are_cycles, 8)
> []

V = all_cycles([1, 2, 3]);
vecsort(vecsort(V), are_cycles, 8)
> [[2, 3, 1]]

V = concat([[1, 2, 3], [3, 2, 1]], all_cycles([1, 2, 3]));
vecsort(vecsort(V), are_cycles, 8)
> [[1, 2, 3], [3, 2, 1]]

V = concat(V, all_cycles([3, 2, 1]));
vecsort(vecsort(V), are_cycles, 8)
> [[1, 2, 3], [1, 3, 2]]

编辑:更简单的方法是将每个元素替换为它所属的等价类的代表。现在不需要自定义比较器。

all_cycles(v) = [v, cycle(v), cycle(cycle(v))];
representative(v) = vecsort(all_cycles(v))[1];

V=[[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 1], [1, 2, 2], [1, 2, 3], [1, 3, 1], [1, 3, 2], [1, 3, 3], [2, 1, 1], [2, 1, 2], [2, 1, 3], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 3, 1], [2, 3, 2], [2, 3, 3], [3, 1, 1], [3, 1, 2], [3, 1, 3], [3, 2, 1], [3, 2, 2], [3, 2, 3], [3, 3, 1], [3, 3, 2], [3, 3, 3]];

#vecsort(apply(representative, V),,8)
> 11
vecsort(apply(representative, V),,8)
> [[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 2], [1, 2, 3], [1, 3, 2], [1, 3, 3], [2, 2, 2], [2, 2, 3], [2, 3, 3], [3, 3, 3]]
于 2020-03-12T13:10:02.860 回答