Способы использования (назначения) переменных в Sage

Мне нужно протестировать n-переменную логическую функцию f = f(x0,...,xn-1). Мне нужно исправить x0, затем запустить несколько тестов для g1 = f(x1,...,xn-1), затем исправить x1 и так далее. Проблема в том, что я не очень понимаю, как это сделать с Sage.

Сначала я попытался создать вектор значений, управляющий фиксацией переменных


R.<x0,x1,x2,x3> = BooleanPolynomialRing()

v = [None,1,None, 0]

if v[0] != None:
    x0=v[0]
if v[1] != None:
    x1=v[1]
if v[2] != None:
    x2=v[2]
if v[3] != None:
    x3=v[3]

f = BooleanFunction(x0+x3+x0*x1+x0*x1*x2)


print(f.algebraic_normal_form())

output:x0*x2

Это прекрасно работает, но не подходит для моей задачи, потому что я хочу автоматизировать процесс исправления. Я хочу заменить ifs циклом, но в этом случае я не знаю, как обращаться к переменным внутри цикла с помощью индексов.

Я новичок в Sage, поэтому буду признателен за любой совет!


person Mikhail Kivi    schedule 21.11.2020    source источник


Ответы (1)


Я не уверен, что такое BooleanFunction, но:

sage: R.<x0, x1, x2, x3> = BooleanPolynomialRing()

Если в этот момент вы сделаете что-то вроде x1 = 1, то x1 больше не будет генератором этого кольца, так что давайте постараемся этого избежать.

sage: f = x0 + x3 + x0*x1 + x0*x1*x2  # f is in R
sage: f.substitute({x1: 1})
x0*x2 + x3

Я думаю, то, что вы хотите, это хороший способ выполнить substitute часть этого. Полезное наблюдение: вы можете преобразовывать строки в имена переменных:

sage: R('x0')
x0

So:

sage: d = {}
sage: for i in range(len(v)): 
....:     if v[i] is not None: 
....:         d[R('x' + str(i))] = v[i] 
....:
sage: d
{x1: 1, x3: 0}
sage: f.substitute(d)
x0*x2

Теперь код можно сделать более компактным двумя способами.

Вызовите x список генераторов и используйте x[i] вместо R('x' + str(i)'):

sage: R.<x0, x1, x2, x3> = BooleanPolynomialRing()
sage: x = R.gens()
sage: x[0]*x[3] + x[1]*x[2]*x[3]
x0*x3 + x1*x2*x3

Используйте синтаксис понимания, а не пустой словарь и цикл for:

sage: f = x0 + x3 + x0*x1 + x0*x1*x2
sage: v = [None, 1, None, 0]
sage: f.subs({x[i]: vi for i, vi in enumerate(v) if vi is not None})
x0*x2
person John Palmieri    schedule 21.11.2020
comment
Спасибо! Это очень помогло. Я думал, что без BooleanFunction я не могу не создать логическую функцию по ее ANF. Забавный факт: вы не можете использовать f.subs, если f является BooleanFunction, но вы можете использовать его, если написали так же, как и вы. - person Mikhail Kivi; 23.11.2020