当前位置: 首页 > 面试题库 >

如何对多项式进行变量的复杂更改(在Mathematica中)

施敏达
2023-03-14
问题内容

我在四个变量(w,x,y和z)中都有一个整数多项式,我知道可以在这六个变量中将其写为整数多项式:

  • a = wz
  • b = xy
  • c = w ^ 3 + z ^ 3
  • d = x + y
  • e = w ^ 3 x + yz ^ 3
  • f = w ^ 3 y + xz ^ 3

如何使用Mathematica(或Java)轻松进行变量更改?


问题答案:

对于有利于使用af而不是wz的可变顺序,可以通过形成替换多项式的Groebner基来完成这种重写。然后使用PolynomialReduce相对于相同顺序重写多项式。

这是一个例子。我将从替换规则开始,以便构造一个多项式,以便我们知道预期的结果。

reprules = {a -> w*z, b -> x*y, c -> (w^3 + z^3), 
 d -> (x + y), e -> (w^3*x + y*z^3), f -> (w^3*y + x*z^3)};

现在重铸为多项式关系。

reppolys = Apply[Subtract, reprules, 1];

在这里,我们创建一个示例。

poly = 
 a^2*b + 3*b^2*c^3 - 2*d*e*f + 11*b*f^2 - 5 a*d^2*e /. reprules // Expand

Out[11]= -2*w^6*x^2*y - 2*w^6*x*y^2 + 3*w^9*x^2*y^2 + 11*w^6*x*y^3 - 
  5*w^4*x^3*z - 10*w^4*x^2*y*z - 5*w^4*x*y^2*z + w^2*x*y*z^2 - 2*w^3*x^3*z^3 - 
  2*w^3*x^2*y*z^3 - 2*w^3*x*y^2*z^3 + 22*w^3*x^2*y^2*z^3 + 9*w^6*x^2*y^2*z^3 - 
  2*w^3*y^3*z^3 - 5*w*x^2*y*z^4 - 10*w*x*y^2*z^4 - 5*w*y^3*z^4 -
  2*x^2*y*z^6 + 11*x^3*y*z^6 - 2*x*y^2*z^6 + 9*w^3*x^2*y^2*z^6 + 3*x^2*y^2*z^9

形成上面提到的Groebner基础。

gb = GroebnerBasis[reppolys, {w, x, y, z, a, b, c, d, e, f}];

用它来减少我们的投入以恢复预期的结果。

PolynomialReduce[poly, 
  gb, {w, x, y, z, a, b, c, d, e, f}][[2]]

Out[12]= a^2*b + 3*b^2*c^3 - 5*a*d^2*e - 2*d*e*f + 11*b*f^2

- -编辑 - -

注释询问有关Groebner基地的描述。对于我自己对Mathematica功能的理解,有一篇关于TMJ的老文章。可以在找到

http://library.wolfram.com/infocenter/Articles/2179/

在与该主题相关的更好的书籍中,有UTM系列文字

Cox,Lottle和O’Shea的理想,综艺和算法。

Adams和Loustaunau(AMS)对Gröbner基地的介绍也相当不错。

-–结束编辑-

丹尼尔·里奇布劳



 类似资料:
  • 我有一个从JSON解析的复杂“order”对象。在结构的深处,我有秩序日期。我只能把它提取成字符串!现在我尝试对订单列表进行排序。 我的想法是创建一个新的列表,其中数组由两个元素组成,首先是Order对象本身,其次是解析为Date对象的Date。例如new object[]{order,new Date(order.getOrderDate())}。然后按第二个元素排序,然后解析回一个列表并返回。

  • 问题内容: 在AngularJS中,我有一个指令来监视作用域变量。当变量包含某些数据时,我需要对该变量进行一些更改。问题是,当我更改变量时,将再次触发我。所以我最终陷入了持续的循环。 这会继续触发,这很有意义。但是我确实需要一种更改监视变量的方法。有没有办法做到这一点? 问题答案: 当使用监视变量的变化时,角度检查参考值是否已更改。如果具有,则执行处理程序以更新视图。 如果您打算在$ watch处

  • 上篇的标记算法中,谈到这个O(K)的算法是一个指数级复杂度的算法,其实对那道题目本身来说,K是固定的,既然不是输入,那也无所谓复杂度,之所以有O(K)这种说法,是把K当做一种输入了,这是看待输入的角度问题,倒不用深究。考虑一个更简化的算法(python代码,设输入n是正整数): def f(n): i = 0 while i < n: i += 1

  • 问题内容: 我在中创建一个变量,并根据条件更改值。但是值的范围仅保留在以下条件内: 在if条件内,我得到正确的值,但在外面。如何在外界条件下使用?有人可以帮我吗? 问题答案: Go 1.11添加了对更改模板变量值的支持。要定义变量,请使用: 要更改其值,请使用Assignment : 如果变量在块外创建但在块内更改,则更改将在块后可见。 像这样测试: 输出为(在Go Playground上尝试):

  • 在下面的代码中,我想给一个函数中的3个变量赋值。如果我只有一个变量,我可以简单地返回新值。有没有一种简单的方法可以在一个函数中使用多个变量(不使用复杂的方法,如将变量变成数组并返回数组)? 这是我的代码:

  • 问题内容: 我有一个脚本,可以导出环境变量并启动一些下标。 可用于下标中的进程开头。如何更改环境变量? 我试图用设置变量,但是那不起作用。 问题答案: 通常,您只能在流程启动时影响流程的环境变量。如果您需要将更改传达给正在运行的流程,则环境不是正确的工具。 编辑该问题的目的是为了补充讨论中的问题:将偶尔更改的设置传达给正在运行的进程的一种相当不错的方法是指定一个配置文件,在该文件中设置LOGLEV