Sage中变量的使用方式(赋值)

3
我需要测试一个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

这个方法可以正常工作,但不符合我的需求,因为我想要自动化修复过程。我想用循环代替“if”,但在这种情况下,我不知道如何使用索引来访问循环内的变量。

我对Sage还很陌生,所以非常感谢任何建议!

1个回答

2

我不确定什么是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

我认为您想要的是一种好的方法来执行此操作的替换部分。 一个有帮助的观察:您可以将字符串转换为变量名:

sage: R('x0')
x0

所以:
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

谢谢!那帮了我很多。我以为没有 BooleanFunction 我就不能通过它的 ANF 创建布尔函数。有趣的事实是:如果 f 是一个 BooleanFunction,你不能使用 f.subs,但如果像你所写的那样编写,你可以使用它。 - Mikhail Kivi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接