Удаление элементов из вектора в al oop - PARI / GP - PullRequest
0 голосов
/ 12 марта 2020

Я смотрю на векторы [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], но этого не произошло. Как уже говорилось, я думаю, что компаратор нуждается в улучшении, но я не уверен, как!

1 Ответ

1 голос
/ 12 марта 2020

Вы можете удалить дубликаты с помощью пользовательского компаратора через 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]]
...