首页 > 解决方案 > 如何获得没有括号的输出?

问题描述

我在 SageMath 中编写了以下代码来生成多项式方程的随机系统。

def quad_polynomial(field, n, m):
    Polynomial_Ring1 = PolynomialRing(K, ['x%s'%p for p in range(1, n + 1)])
    x1 = Polynomial_Ring1.gens()
    gen_Polynomial_Ring1 = matrix(x1)
    list_of_quadratic_part = [0 for i in range(m)]
    for i in range(m):
        list_of_quadratic_part[i] = gen_Polynomial_Ring1 * (random_matrix(K, n)) * gen_Polynomial_Ring1.transpose()
        # print(list_of_quadratic_part[i])
    return list_of_quadratic_part

def linear_and_constant_terms(field, n, m):
    a = []
    Polynomial_Ring1 = PolynomialRing(K, ['x%s'%p for p in range(1, n + 1)])
    varlist = (list(Polynomial_Ring1.gens()))
    v = matrix(varlist)
    LandC = [0 for i in range(m)]
    for i in range(m):
        im1 = matrix([K.random_element() for j in range(n)])
        expression = im1 * v.transpose()
        LandC[i] = expression
    return LandC

def final_expression_F(field, n, m):
    final_expression = [0 for i in range(m)]
    for i in range(m):
        final_expression[i] = quad_polynomial(field, n, m)[i] + linear_and_constant_terms(field, n, m)[i]
    return final_expression

当我运行代码时,我在方括号中得到多项式,这是我不想要的。

sage: P = final_expression_F(K, 2, 3)
sage: print(P)
[[(a)*x1^2 + x1*x2 + (a + 1)*x1],
 [(a)*x1^2 + (a)*x2^2 + x1 + (a + 1)*x2],
 [x1^2 + (a)*x1*x2 + (a)*x2^2 + (a)*x1 + x2]]

我希望我的输出是这样的

[(a)*x1^2 + x1*x2 + (a + 1)*x1,
 (a)*x1^2 + (a)*x2^2 + x1 + (a + 1)*x2,
 x1^2 + (a)*x1*x2 + (a)*x2^2 + (a)*x1 + x2]

有人可以帮忙吗?我在这方面花了太多时间,但我无法解决这个问题。

编辑:使用@U11-Forward 的答案,我得到了圆括号。

sage: P = final_expression_F(K, 2, 3)
sage: P = [j for i in P for j in i]
sage: print(P)
[((a + 1)*x1*x2 + x2^2 + (a + 1)*x1 + (a + 1)*x2),
 ((a + 1)*x1 + (a)*x2),
 ((a + 1)*x1^2 + (a)*x1*x2 + x2^2 + (a + 1)*x1 + (a)*x2)]

标签: pythonpython-3.xsage

解决方案


以下以更自然的方式完成整个工作。m当一个简单的最终列表推导解决了它的问题时,一直使用该参数是没有意义的。在它下面成为匿名变量_。(您的fieldK变量在 OP 中并没有真正固定。我会按照我认为有意义的方式进行。)

def quad_polynomial(K, n):
    R = PolynomialRing(K, [f'x{p}' for p in [1..n]])
    gens_R = matrix(R, 1, n, R.gens())
    return ( gens_R * random_matrix(K, n, n) * gens_R.transpose() +
             gens_R * random_matrix(K, n, 1) +
             random_matrix(K, 1, 1) )[0, 0]

P = [quad_polynomial(QQ, 2) for _ in [1..3]]

上面这次交付:

sage: P
[2*x1^2 - x1*x2 - 1/2*x1 + x2 - 1,
 -2*x1^2 - 2*x1*x2 + 2*x2^2 - 1/2*x1 + x2 - 1,
 x1*x2 + 2*x2^2 - 2*x1]
sage: 

该结果的条目是变量的二次随机多项式n,还包括一个常数项。(来自 1x1 随机矩阵。)

注意:在例程的返回值中quad_polynomial,形状为( ... )[0, 0],请注意该部分( ... )是一个 1x1 矩阵,要提取其唯一的条目,我们使用 that [0, 0]


推荐阅读