我正在查看向量 [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]
删除,但这并没有发生。如前所述,我想比较器需要改进,但我不确定如何改进!