找回密码
 注册
Simdroid-非首页
查看: 233|回复: 15

[符号计算] mathematica多项式降幂排列问题

[复制链接]
发表于 2011-4-11 19:27:39 | 显示全部楼层 |阅读模式 来自 北京
有人问这么一个问题,把 x^8-1 进行分解因式,得到结果 (-1 + x) (1 + x) (1 + x^2) (1 + x^4)那么有没有办法使结果降幂排列呢?
 楼主| 发表于 2011-4-11 19:53:37 | 显示全部楼层 来自 北京
Simdroid开发平台
1# guocong89
我最初的想法和他是一致的,就是降幂排列是Factor的一个选项,但看一下帮助就知道并不是这么回事。

我觉得这是由Times本身的Orderless属性决定的。
通过以下函数我们可以得到降序排列的因子序列

  1. res = Factor[x^8 - 1];
  2. res = Sort[Evaluate[res /. Times -> List],
  3.   Exponent[#1, x] > Exponent[#2, x] &]
复制代码


  1. {1 + x^4, 1 + x^2, 1 + x, -1 + x}
复制代码



但是把Times Apply 到上述结果后,结果又还原为(-1 + x) (1 + x) (1 + x^2) (1 + x^4)

为了解决这个问题,我只能想到一个曲线救国的方针,

  1. Unprotect[Times];
  2. oldAtt = Attributes[Times];
  3. ClearAttributes[Times, Orderless];
  4. Times@@res
  5. Attributes[Times] = oldAtt;
  6. Protect[Times];
复制代码


但是感觉这么做好山寨,请问有没有更好的方式呢?
回复 不支持

使用道具 举报

发表于 2011-4-12 08:47:24 | 显示全部楼层 来自 黑龙江哈尔滨
我不认为有什么其他办法了。
回复 不支持

使用道具 举报

发表于 2011-4-12 08:55:19 | 显示全部楼层 来自 江苏南京
个人认为还有好方法,用Unprotect肯定不是最好方法!
晚上我来试试••••••••
回复 不支持

使用道具 举报

发表于 2011-4-12 15:26:23 | 显示全部楼层 来自 黑龙江哈尔滨
4# esetlzn

期待 :)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2011-4-12 18:47:07 | 显示全部楼层 来自 河北唐山
  • Clear["Global`*"]
  • res = Factor[x^8 - 1];
  • antires = Sort[Evaluate[List @@ res], Exponent [#1, x] > Exponent [#2, x] &];
  • wow[HoldPattern[{a_, b_, c_, d_}]] = HoldForm[a*b*c*d];
  • wow[antires]
回复 不支持

使用道具 举报

发表于 2011-4-12 18:50:30 | 显示全部楼层 来自 河北唐山
我的答案还不够完美,有点定制的感觉!
对了大家教教我如何才能像2楼一样以代码的方式回复或发表主题?
回复 不支持

使用道具 举报

发表于 2011-4-12 18:54:53 | 显示全部楼层 来自 河北唐山
lz问的问题咋这么怪呢?
这个问题不实用哦!
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-12 20:26:55 | 显示全部楼层 来自 北京
7# esetlzn
在回复时用 [code] 把语句段包起来就行了,工具栏里那个 <> 符号就是快捷键
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-12 20:28:10 | 显示全部楼层 来自 北京
8# esetlzn
这个问题是QQ群里别人问的,不过多项式降幂排列问题确实是挺常见的,而且没有完美解决方案.
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-12 20:31:57 | 显示全部楼层 来自 北京
6# esetlzn
但是HoldForm并不好,因为这仅仅是强制mathematica不进行表达式化简,而且产生的结果不能够再参与运算了,比如
  1. Expand[wow[antries]]
复制代码
回复 不支持

使用道具 举报

发表于 2011-4-12 20:44:43 | 显示全部楼层 来自 河北唐山
在我看来这问题只是最终结果表达格式的改变而已,结果不会再被用到了!
回复 不支持

使用道具 举报

发表于 2011-4-12 20:49:49 | 显示全部楼层 来自 河北唐山
11# guocong89
如果你实在要再用结果,把我的HoldForm改成Defer!
回复 不支持

使用道具 举报

发表于 2011-8-31 01:31:24 | 显示全部楼层 来自 上海
恩,要用结果也可以ReleaseHold一下,另外我也常遇到排版的问题,经常花大力气弄成想要的样式,然后复制到别的地方,或输出或截图。
"(-1+x) (1+x) (1+x^2) (1+x^4)" // StringSplit[#, " "] & //
  Reverse // StringJoin
只是输出或显示用字符串也方便,另外也可以用HoldForm等写个小函数使得不用手动输入两个双引号。
也可以通过输入输出实现。
当然其他Print,Do,Table等等等来实现表面的降幂排列也有许多吧

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-8-31 21:31:45 | 显示全部楼层 来自 台湾
本帖最后由 chungyuandye 于 2011-8-31 22:24 编辑

可把1+x^4也改成x^4+1嗎?

自問自答
ClearAttributes[Plus, Orderless];
Apply[Times,  Sort[res /. Times -> List, Exponent[#1, x] > Exponent[#2, x] &] /.
  Plus[a__, b__] :> HoldForm[b + a]]



评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-9-3 11:24:20 | 显示全部楼层 来自 河南开封
高手啊都是。。。开眼界。。。。。。服了,谢谢啦
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-3 18:08 , Processed in 0.057785 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表