如何在没有括号的情况下获得输出?

问题描述

我在 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,m):
    a = []
    polynomial_Ring1 = polynomialRing(K,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,m):
    final_expression = [0 for i in range(m)]
    for i in range(m):
        final_expression[i] = quad_polynomial(field,m)[i] + linear_and_constant_terms(field,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,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)]

解决方法

以下以更自然的方式完成整个工作。当一个简单的最终列表推导式解决了它的问题时,一直使用参数 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) * gens_R.transpose() +
             gens_R * random_matrix(K,1) +
             random_matrix(K,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 矩阵,要提取其唯一的条目,我们使用 [0,0]

,

您正在打印列表列表。您需要展平列表:

print([j for i in P for j in i])
,

[inputs.envelope | {source,message: .dataMessage.message,timestamp: .dataMessage.timestamp}] | group_by(.source) | [ .[] | max_by(.timestamp) | {source,message} ] 函数的最后一行,尝试更改它:

final_expression_F

致:

    return final_expression
,

重写函数的三种方法,从@dan_fulea 富有洞察力的回答开始。

我们可以直接产生一个标量(而不是产生 一个 1x1 矩阵并提取其单个条目):

def my_random_polynomial_a(K,n):
    r"""
    Return a random polynomial of degree ≤ 2 in variables `x_1`,... `x_n` over `K`.
    """
    R = PolynomialRing(K,[f'x{p}' for p in [1 .. n]])
    x = vector(R,R.gens())
    return (x * random_matrix(K,n) * x
            + random_vector(K,n) * x
            + K.random_element())

我们可以避免矩阵和向量,直接选择多项式的 n(n+1)/2 系数作为随机场元素(之前的方法 选取了 n^2 + n + 1 个随机字段元素):

def my_random_polynomial_b(K,n):
    r"""
    Return a random polynomial of degree ≤ 2 in `x_1`,[f'x{p}' for p in [1 .. n]])
    xx = (R.one(),) + R.gens()
    r = K.random_element
    return sum((r() * x * y for k,x in enumerate(xx) for y in xx[k:]),R.zero())

我们可以从(单项式,系数)对的字典中生成多项式, 使用 Sage 的 IntegerVectors 枚举可接受的单项式:

def my_random_polynomial_c(K,[f'x{p}' for p in [1 .. n]])
    r = K.random_element
    return R({tuple(v): r() for d in range(3) for v in IntegerVectors(d,n)})

示例:在 ℤ 上的 x1x2 中的 3 个次数≤ 2 的随机多项式的列表。

使用 my_random_polynomial_a

sage: P = [my_random_polynomial_a(ZZ,2) for _ in range(3)]
sage: P
[3*x1^2 + 6*x1*x2 - x2^2 + x1 - x2,-4*x1^2 + 3*x1*x2 + x2^2 - 4*x2 + 1,-28*x1^2 + 9*x1*x2 + 2*x1 + x2 - 3]

使用 my_random_polynomial_b

sage: P = [my_random_polynomial_b(ZZ,2) for _ in range(3)]
sage: P
[x1^2 + x1*x2 + 11*x2^2 - 2*x1 + x2 + 1,2*x1^2 - 3*x1*x2 - x2^2 - x1 - 6*x2 + 1,-16*x1*x2 - x2^2 - 2*x2 - 1]

使用 my_random_polynomial_c

sage: P = [my_random_polynomial_c(ZZ,2) for _ in range(3)]
sage: P
[-8*x1^2 - x2^2 - 12*x1 + 7*x2 - 6,2*x1^2 + x1*x2 - 2*x2^2 + 2*x1 + 120*x2 + 1,-2*x1*x2 - x2^2 - 2*x1 + 1]