提问人:Mikhail Kivi 提问时间:11/22/2020 最后编辑:Mikhail Kivi 更新时间:11/24/2020 访问量:314
在Sage中使用(分配)变量的方法
Ways of using(assigning) variables in Sage
问:
我需要测试一个 n 变量布尔函数。我需要修复 x0,然后对 运行一些测试,然后修复 x1 等等。
问题是我真的不明白如何使用 Sage 做到这一点。f = f(x0,...,xn-1)
g1 = f(x1,...,xn-1)
起初,我试图创建一个值向量,用于控制变量的“固定”
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
这工作正常,但它不适合我的任务,因为我希望能够自动执行修复过程。
我想用循环替换“”s,但在这种情况下,我不知道如何使用索引处理循环内的变量。if
我是 Sage 的新手,所以我将不胜感激任何建议!
答:
2赞
John Palmieri
11/22/2020
#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
所以:
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
评论
0赞
Mikhail Kivi
11/23/2020
谢谢!这很有帮助。我虽然没有,但我不能不通过它的 ANF 创建一个布尔函数。有趣的事实:你不能使用 if is a ,但你可以使用它 if have written 就像你一样。BooleanFunction
f.subs
f
BooleanFunction
评论