Python 如何从SAGE加速因子的作用

Python 如何从SAGE加速因子的作用,python,sage,Python,Sage,我写了一个方法来得到GF(2^pp)[X0,…,X{nvars-1}]中多项式p的符号系数,并将其转换为GF(2)[t]。例如,pp=2。多项式p=X0*X1=(x_00+x_01*t)*(x_10+x_11*t)=(x_00*x_10+x_01*x_11)+(x_01*x_11+x_01*x_10+x_00*x_11)*t然后方法得到[(x_00*x_10+x_01*x_11+x_01*x_10+x_11]。我的问题是当pp和NVAR的数量很高时。我已经记下了时间和说明,需要更多的时间是p.f

我写了一个方法来得到GF(2^pp)[X0,…,X{nvars-1}]中多项式p的符号系数,并将其转换为GF(2)[t]。例如,pp=2。多项式p=X0*X1=(x_00+x_01*t)*(x_10+x_11*t)=(x_00*x_10+x_01*x_11)+(x_01*x_11+x_01*x_10+x_00*x_11)*t然后方法得到[(x_00*x_10+x_01*x_11+x_01*x_10+x_11]。我的问题是当pp和NVAR的数量很高时。我已经记下了时间和说明,需要更多的时间是p.factor()。那么我的问题是如何加速代码

pp = 2
nvars = 2
k.<t>=GF(2^pp)
vars_GF = []
vars_gf2 = []
for i in range(nvars):
    vars_GF.append(var("X"+str(i)))
    for j in range(pp):
    vars_gf2.append(var("x"+str(i)+str(j)))
vars_GF = None        
vars_GF = ["X%d"%i for i in range(nvars)]  
R=PolynomialRing(k,names=vars_gf2)
P=PolynomialRing(k,names=vars_GF)
p=P.random_element(degree=2)
subsvar=[sum((t^i*R.gen(i+pp*j) for i in range(pp))) for j in range(nvars)]        
p = p(subsvar)
print type(p)
var("t")
timeit('SR(p)')
p = SR(p)
p = p.factor()
timeit('p.factor()')
p = p.collect(t)
timeit('p.collect(t)')
print "p",p
print p.coefficients()
pp=2
nvars=2
k、 =GF(2^pp)
vars_GF=[]
vars_gf2=[]
对于范围内的i(NVAR):
变量附加(变量(“X”+str(i)))
对于范围内的j(pp):
vars_gf2.追加(var(“x”+str(i)+str(j)))
vars_GF=无
vars_GF=[“X%d”%i表示范围内的i(nvars)]
R=多项式环(k,name=vars_gf2)
P=多项式环(k,name=vars\u GF)
p=p.随机元素(度=2)
subsvar=[sum((t^i*R.gen(i+pp*j)表示范围内的i(pp)))表示范围内的j(nvars)]
p=p(子变量)
打印类型(p)
var(“t”)
timeit('SR(p)'
p=SR(p)
p=p.系数()
timeit('p.factor()'))
p=p.collect(t)
timeit('p.collect(t)'
打印“p”,p
打印p.系数()

似乎您只想获得
t
的幂系数,作为变量
x\u i\u j
中的多项式,所以我不清楚为什么您需要因子

建议:在适当的多项式环中工作,而不是在符号环中

sage: q = 2
sage: nvars = 2
sage: k.<t> = GF(2^q)
sage: x_i = []
sage: x_i_j = []
sage: for i in range(nvars):
....:     x_i.append(var('x_'+str(i)))
....:     for j in range(q):
....:         x_i_j.append(var('x_'+str(i)+'_'+str(j)))
....:         
sage: P = PolynomialRing(k,names=x_i)
sage: R = PolynomialRing(k,names=x_i_j)
sage: S = PolynomialRing(R,'t')
sage: subsvar = [sum((t^i*R.gen(i+q*j) for i in range(q))) for j in range(nvars)]
请注意将环
R
中的多项式转换为环
S
中的多项式的技巧:将其设置为字符串,并使
S
读取字符串

要使用您的示例进行说明,请执行以下操作:

sage: p = P('x_0 * x_1')
sage: p
x_0*x_1
sage: pp = p(subsvar)
sage: pp
x_0_0*x_1_0 + (t)*x_0_1*x_1_0 + (t)*x_0_0*x_1_1 + (t + 1)*x_0_1*x_1_1
sage: ppp = S(str(pp))
sage: ppp
(x_0_1*x_1_0 + x_0_0*x_1_1 + x_0_1*x_1_1)*t + x_0_0*x_1_0 + x_0_1*x_1_1
sage: ppp.coefficients()
[x_0_0*x_1_0 + x_0_1*x_1_1, x_0_1*x_1_0 + x_0_0*x_1_1 + x_0_1*x_1_1]
以下是我获得的组合操作的时间:

sage: timeit('S(str(p(subsvar))).coefficients()')
625 loops, best of 3: 1.31 ms per loop
作为参考,我正在使用Sage 6.3

sage: version()
'Sage Version 6.3, Release Date: 2014-08-10'

vars\u gf2.append(var(“x”+str(i)+str(j)))
将为i=11,j=1和i=1,j=11生成相同的变量。ok@AndrewJohnson,但这部分在我的代码中速度非常快,问题在于因子方法。因为我用了很多次。
sage: version()
'Sage Version 6.3, Release Date: 2014-08-10'