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

时间:2021-01-10 06:55:20

标签: python python-3.x sage

我在 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)]

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

final_expression_F

致:

    return final_expression

答案 3 :(得分:0)

重写函数的三种方法,从@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, n, R.gens())
    return (x * random_matrix(K, n, 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`, ... `x_n` over `K`.
    """
    R = PolynomialRing(K, [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, n):
    r"""
    Return a random polynomial of degree ≤ 2 in `x_1`, ... `x_n` over `K`.
    """
    R = PolynomialRing(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]