我在 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)]
答案 0 :(得分:2)
以下以更自然的方式完成整个工作。当一个简单的最终列表推导式解决了它的问题时,一直使用参数 m
是没有意义的。在它下面成为匿名变量 _
。 (您的 field
和 K
变量在 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)})
示例:在 ℤ 上的 x1
、x2
中的 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]