I need to test an n-variable Boolean Function f = f(x0,...,xn-1)
. I need to fix x0, then run some tests for the g1 = f(x1,...,xn-1)
, then fix x1 and so on.
The problem is that I don't really understand how to do it with Sage.
At first, I tried to create a vector of values, that controls "fixing" of the variables
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
This works fine, but it doesn't fit my task because I want to be able to automate the fixing process.
I want to replace the "if
"s with a loop, but in this case, I don't know how to address variables inside the loop using indexes.
I'm new to Sage so I would appreciate any advice!
I'm not sure what
BooleanFunction
is, but:If at this point you do something like
x1 = 1
, thenx1
is no longer a generator of this ring, so let's try to avoid that.I think what you want is a good way to carry out the
substitute
part of this. A helpful observation: you can convert strings to variable names:So:
The code can now be made more compact in two ways.
Call
x
the list of generators and usex[i]
rather thanR('x' + str(i)')
:Use comprehension syntax rather than empty dictionary and for loop: