mathematica
发表于 2011-3-11 09:52:50
22楼的wayne,我的Mathematica怎么没有你的图片上的TrigToRadicals函数?难道是版本问题?
wayne
发表于 2011-3-11 13:22:33
31# mathematica
看看你以前发的帖子吧:
http://bbs.emath.ac.cn/thread-2944-1-1.html
zgg___
发表于 2011-3-11 16:46:33
关于Map]]&,{{1,2,3,4,5},……,{1,5,3,4,2}}]:
如果s={a,b,c,d,e},那么s[[{1,5,3,4,2}]]就是{a,e,c,d,b}了。
Apply就相当于g了。
Map一下,就到所有的了。
关于TrigToRadicals:
它要加载库的,用Needs["Developer\`"]或者<<"Developer\`"。
关于出题:
或许大家可以试一试求解方程x^5-10x^2-10x-6=0,
在字体大小合适的情况下,它的解或许可以写在一页A4纸上。呵呵。
呵呵,那让我们继续吧。
如果我们愿意牺牲一些效率和严谨性,就可以用下面更加直白的方法来获得Galois群的信息。
在上一个帖子中提到了具有一些对称性的多项式g,或许它掩盖了一些“直白”,呵呵。
下面的方法将利用一个完全没有对称性的多项式h,这样我们要代入的置换就不是6个了,而是全部的5!=120个。我们取h=x1+2x2+3x3+4x4+5x5,可以看到120种置换后代入h得到的结果h1到h120是都不同的。我们构造一个120次多项式s使它的根是h1到h120,可以预见到s是首1整系数的,因此可以通过数值计算得到多项式s的精确表达。最后分解s就可以获得一些信息。还是用楼主的例子来演示吧。
f:=15377302441624829616294559439+73506723756638416711643x-146286378711462770x^2-742702101537x^3+209341x^4+x^5;
s0 = Permutations];
s1 = Table]&,i],10000],{i,5}];
s2 = Map;
s = Round],x]]].x^(Range-1);
Factor
其中s0是那120种置换,s1是方程的5个根,s2是计算h1到h120,s是那个120次多项式。
可以看到s分解后是20个5次多项式的乘积,就说明f的Galois群的阶是5,所以就是循环群C5了。
通过解这20个5次方程(也可以把h1到h120分别代入方程检测),就可以把h1到h120分为20组了,也就是把120个置换分为了20组,其中包括“不变”那一组置换就是f的置换群了。
mathematica
发表于 2011-3-11 18:23:09
把zgg__的在16#的东西啃了一天终于明白了,不过我还是要把我啃明白的发到上面来,因为
我写的对于初学者是有帮助的,我还是喜欢有注释的程序,我总觉得我改不了这个“坏习惯”
我把我的理解做如下:Clear["Global`*"];(*Clear all variables*)
(*由所有的置换找到其对于的多项式所组成的集合*)
(*定义一个四次多项式*)
g:=x1^2(x2*x5+x3*x4)+x2^2(x1*x3+x4*x5)+
x3^2(x1*x5+x2*x4)+x4^2(x1*x2+x3*x5)+
x5^2(x1*x4+x2*x3);
s={x1,x2,x3,x4,x5};
p1=Permutations[{1,2,3,4,5}]; (*产生所有的排列或者置换*)
p10=GatherBy&];(*根据置换的性质分组*)
p11=p10[];(*取出所有的偶置换*)
p2=Map]]&,p11]; (*把偶排列都带入到g产生各种多项式*)
p3=Union;(*对相同多项式合并只取其中一个*)
(*求解方程的100位数值根*)
(*定义多项式*)
eq1=15377302441624829616294559439 + 147013447513276833423286 x -
585145514845851080 x^2 - 5941616812296 x^3 + 3349456 x^4 + 32 x^5;
eq2=eq1/.x->x/2; (*通过变换把最高次项的系数变成1*)
eq3=NSolve; (*求解200位数值解*)
eq4=x/.eq3;(*只保留数值部分*)
(*把p3的每个元素作用到eq4上计算结果*)
Do[
gnew=p3[]; (*每次都重新定义一下函数,这是必要的*)
result=Apply;(*把新定义的函数作用到eq4这组数值解上去*)
Print, (*把作用的结果输出来*)
{k,1,Length@p3}
]
但是我觉得应该是偶置换,不是全部置换,我只是感觉应该这么写,不知道zgg__怎么看待我的观点.
如图1
zgg__在16楼注释如下:我把他的东西拆开了,这样更容易被人理解,当然我是
写给初学者看的,当然也是写给我自己看的(*zgg_的方法*)
Clear["Global`*"];(*Clear all variables*)
g:=x1^2(x2 x5+x3 x4)+x2^2(x1 x3+x4 x5)+
x3^2(x1 x5+x2 x4)+x4^2(x1 x2+x3 x5)+
x5^2(x1 x4+x2 x3);
p1=Permutations[{x1,x2,x3,x4,x5}]; (*产生所有置换*)
p2=Map]&,p1]; (*把所有置换对应的多项式都弄出来*)
p3=Sort;(*对多项式元素排序,使得相同的处于相邻的关系*)
p4=Split;(*把相同的多项式分在一组里*)
p5=Map[{First@#,Length@#}&,p4] (*把上面的相同的只取一个,并计算相同个数*)
如图2
mathematica
发表于 2011-3-11 18:27:20
关于Map]]&,{{1,2,3,4,5},……,{1,5,3,4,2}}]:
如果s={a,b,c,d,e},那么s[[{1,5,3,4,2}]]就是{a,e,c,d,b}了。
Apply就相当于g了。
Map一下,就到所有的了。
关于TrigT ...
zgg___ 发表于 2011-3-11 16:46 http://bbs.emath.ac.cn/images/common/back.gif
zgg_的手笔使我觉得他至少应该是数学系的硕士毕业的,而且对mathematica很熟悉,
我觉得现在的中国大学的那些教授很难同时能掌握那些群论又对mathematica玩得那么好!
mathematica
发表于 2011-3-11 18:46:47
关于Map]]&,{{1,2,3,4,5},……,{1,5,3,4,2}}]:
如果s={a,b,c,d,e},那么s[[{1,5,3,4,2}]]就是{a,e,c,d,b}了。
Apply就相当于g了。
Map一下,就到所有的了。
s = Round],x]]].x^(Range-1);
zgg___ 发表于 2011-3-11 16:46 http://bbs.emath.ac.cn/images/common/back.gif
不知道为什么,你和wayne一样,写程序总是那么多层的嵌套,不怎么好理解
mathematica
发表于 2011-3-11 19:01:25
其中s0是那120种置换,s1是方程的5个根,s2是计算h1到h120,s是那个120次多项式。
可以看到s分解后是20个5次多项式的乘积,就说明f的Galois群的阶是5,所以就是循环群C5了。
通过解这20个5次方程(也可以把h1到h120分别代入方程检测),就可以把h1到h120分为20组了,也就是把120个置换分为了20组,其中包括“不变”那一组置换就是f的置换群了。
再详细一点吧,其实我对群论只是懂那么一点点,抽象的东西需要具体的来描述!
zgg___
发表于 2011-3-14 14:20:20
在33层帖子的最后,我犯了一个错误,就是认为120/5=20了,所以在那个帖子最后两段话中的“20”,都应该改为“24”,呵呵。
由此可以证明,我的水平有时候不到小学2年级,呵呵。
下面再说明一下33层的帖子(基本上是33层的复述,呵呵)。
在16层的帖子中,讨论是围绕着多项式g展开的,大家或许会认为g是这个方法的核心,其实或许在某种意义上,g是理解这个问题的“障碍”。所以有了33层的帖子,在这个帖子中我们用“完全没有对称性的多项式h”替代了“具有一些对称性的多项式g”,得到了更加完整的结果(在牺牲效率的基础上)。这样做的目的之一就是更好的理解这种方法。没有对称性的多项式有很多,我们选取的是h=x1+2x2+3x3+4x4+5x5,它把x1到x5置换后代入,它的模样就变了,当然,我们也可以选取h=213123x1+522346523x2-2352x^3-97x^4+108x^5。(对h的要求其实是将f的5个根在120种置换后代入得到的120个数h1到h120都各不相同。)然后我们观察多项式s=(x-h1)*(x-h2)*……*(x-h119)*(x-h120),可以知道这个120次多项式是首1整系数的,因此,到这里,经过取整,我们的s不因为是数值计算而有误差。
接下来是实现上面的过程,输入是五次多项式f,输出是s的分解因式。
f:=15377302441624829616294559439+73506723756638416711643x-146286378711462770x^2-742702101537x^3+209341x^4+x^5;
上面一句是输入。
s0 = Permutations];
这个是那120种置换。
s1 = Table]&,i],10000],{i,5}];
这个是求5个根。
s2 = Map;
这个是计算h1到h120,把它们放到s2中,注意{x1,x2,x3}.{1,2,3}=x1+2x2+3x3,所以我就偷懒了。
s = Round],x]]].x^(Range-1);
这个是计算s,Apply就是(x-h1)*(x-h2)*……*(x-h119)*(x-h120),然后展开,然后求系数,然后四舍五入,然后再形成多项式。
Factor
最后是把s分解。
我想过程中如果那步不明确,是可以把分号去掉,改改参数,看看结果的。
代码短在可读性方面或许有一个优点,那就是“短”。我从不反对有层次和结构化,但要求它增加的开销是划算的。对于我这种兴奋时间长度很有限的人来说,长文档不容易找到重点,也许在判断文档有价值之前就已经退缩了,而且看了后面的就会忘记前面的内容。
因为s分解后的结果比较长,所以就不帖出来了,它是24个5次多项式的乘积,例如第1个因子是:19662576921652444608722007457321+40047843741929747640101680x-32476248486821421909x^2-13814515603361x^3+3140115x^4+x^5。
可以知道h1到h120分别属于这24个多项式(就是是它的根啦),这样,我们就把h1到h120这120个数分成了24组。还记得h1到h120这120个数是怎么来的么?是经过置换代入h得到的,所以h1到h120这120个数和那120种置换是一一对应的。这样就把那120个置换分为了24组(就是陪集coset了),其中具有{1,2,3,4,5}的那组就是那么想要的子群了,那组的5个置换就是群的所有元素,置换的乘,就是群的乘。因为只有循环群C5有5个元素,所以它就是C5了。
zgg___
发表于 2011-3-14 16:21:24
恩,让我们继续并且结束这个话题吧。
对于16层的g和33层的h,我们这里取一个新的多项式l=x1+w*x2+w^2*x3+w^3*x4+w^4*x5,也就是让x1到x5的系数恰好为方程x^5-1=0的5个根。然后进行33层的计算,只要将代码中的“s2=Map;”改为“s2=Map].rs&,s0];”,并且预先计算rs=Table,{i,5}];就可以了。分解s后会发现其中会有一个只有x^20、x^15、x^10、x^5和常数项的因子。因为我们可以符号求解4次方程,因此就可以得到这20个根的符号解了,然后一一对应到l中去,就可以得到原先5次方程根的符号表达了。
那个多项式l,就叫做“Lagrange预解式”,那个多项式h,就叫做“Galois预解式”。
mathematica
发表于 2011-3-14 16:29:57
方程式求解問題
http://episte.math.ntu.edu.tw/articles/mm/mm_08_4_01/index.html