Я смотрю на векторы [a, b, c], для a, b, c в [-1,0,1], а также на функцию, цикл, которая сдвигает каждую запись вектора один в слева: cycle( v ) = [v[3], v[1], v[2]]
.
Я хочу рассматривать только такие векторы, чтобы никакие два вектора не были "эквивалентными циклу"; ie: если я смотрю на векторы x, y, я не хочу y = cycle( x )
.
Я пытался настроить вектор V, в котором были все 27 моих возможных векторов, а затем определить следующее:
removecycle( V, n ) = {
local( N );
N = setsearch( V, cycle( V[n] ) );
return( V[^N] );
}
Это позволяет мне указать указанный c вектор, применить функцию, а затем вернуть новый вектор с удаленным результатом, если он есть. Тогда, конечно, проблема заключается в том, что я должен повторить это с новым вектором, и повторять снова и снова и открыть себя для человеческой ошибки.
Как я могу автоматизировать это? Я полагаю, что возможно установить его так, чтобы у меня был вектор векторов V, проверить cycle( V[1] )
, отбросить результат, вернуть новый вектор W, затем проверить cycle( W[2] )
, et c et c до всех возможностей были проверены. Но я просто не знаю, как его настроить!
Редактировать: 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]
, но этого не произошло. Как уже говорилось, я думаю, что компаратор нуждается в улучшении, но я не уверен, как!