【问题标题】:Ways of using(assigning) variables in Sage在 Sage 中使用(分配)变量的方法
【发布时间】:2021-03-04 19:59:53
【问题描述】:

我需要测试一个 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 的新手,如果有任何建议,我将不胜感激!

【问题讨论】:

    标签: math sage boolean-algebra


    【解决方案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
    

    【讨论】:

    • 谢谢!这有很大帮助。我虽然没有BooleanFunction,但我不能不通过它的 ANF 创建一个布尔函数。有趣的事实:如果fBooleanFunction,则不能使用f.subs,但如果像以前一样编写,则可以使用它。
    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多