使用Maxima对整数进行素数分解

时间:2019-10-22 11:12:38

标签: maxima

我想使用Maxima来获得随机正整数的素数分解,例如12 = 2 ^ 2 * 3 ^ 1。

到目前为止,我已经尝试过:

a:random(20);
aa:abs(a);
fa:ifactors(aa);
ka:length(fa);
ta:1;
pfza: for i:1 while i<=ka do ta:ta*(fa[i][1])^(fa[i][2]);
ta;

这将在MACK的STACK中实现,作为学生在线练习的一部分,因此确切的实现会有所不同,但我将其细分为这7行。

我生成一个随机数a,通过使用aa = | a | +1来确保它是一个正整数,并且想要使用ifactors命令来获取aa的素数。 ka告诉我成对的不同素数的数量,然后将它们用于pfza中的while循环。如果我让这段代码运行,它将返回一切正常,并执行execpt以简化ta,也就是说,我不会将ta作为带有某些指数的质数的乘积,而只会得到ta = aa。

然后我尝试关闭简化器,手动简化我需要的其他所有内容:

simp:false$
a:random(20);
aa:ev(abs(a),simp);
fa:ifactors(aa);
ka:ev(length(fa),simp);
ta:1;
pfza: for i:1 while i<=ka do ta:ta*(fa[i][1])^(fa[i][2]);
ta;

但是,它不会编译;我认为问题出在pfza,但我不知道为什么。

有关如何解决此问题的任何意见?还是以非简化形式获取因式分解的另一种方法?

1 个答案:

答案 0 :(得分:1)

(1)for循环失败,因为在i上加1需要将1 + 1简化为2,但是无法进行简化。这是一种无需算术即可使循环工作的方法。

(%i10) for f in fa do ta:ta*(f[1]^f[2]);
(%o10)                          done
(%i11) ta;
                                2   2   1
(%o11)                     ((1 2 ) 2 ) 3

嗯,这很奇怪,同样是因为缺乏简化。怎么样:

(%i12) apply ("*", map (lambda ([f], f[1]^f[2]), fa));
                                 2  1
(%o12)                          2  3

总的来说,我认为最好还是避免显式索引。

(2)但也许您根本不需要它。 factor返回您尝试构造的那种未经简化的表达式。

(%i13) simp:true;
(%o13)                          true
(%i14) factor(12);
                                 2
(%o14)                          2  3

我认为factor返回未简化的概念在概念上是不一致的,但是无论如何似乎在这里起作用。

相关问题