在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

这很好,但不适合我的任务,因为我希望能够自动化修复过程。我想把";CCD_ 3";s有一个循环,但在这种情况下,我不知道如何使用索引来处理循环中的变量。

我是Sage的新手,所以如果有任何建议,我将不胜感激!

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

因此:

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

相关内容

  • 没有找到相关文章

最新更新