3

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!

1 Answers1

2

I'm not sure what BooleanFunction is, but:

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

If at this point you do something like x1 = 1, then x1 is no longer a generator of this ring, so let's try to avoid that.

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

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:

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

The code can now be made more compact in two ways.

Call x the list of generators and use x[i] rather than 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

Use comprehension syntax rather than empty dictionary and for loop:

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
Samuel Lelièvre
  • 3,212
  • 1
  • 14
  • 27
John Palmieri
  • 1,531
  • 8
  • 13
  • Thanks! That helped a lot. I though that without ```BooleanFunction``` I can't not create a boolean function by its ANF. Fun fact: you can't use ```f.subs``` if ```f``` is a ```BooleanFunction```, but you can use it if have written just like you did. – Mikhail Kivi Nov 22 '20 at 22:36